From f3fe9cbfacaf465f266d091ab7152b1fccf8c82b Mon Sep 17 00:00:00 2001 From: Alexandre Morignot <erdnaxeli@gmail.com> Date: Tue, 1 Jan 2013 19:49:27 +0100 Subject: [PATCH] Documentation RDoc --- Logging.pm | 606 --------------------------------- PlayBot.html | 252 ++++++++++++++ PlayBot.pl | 366 -------------------- README.md | 72 ---- SitePlugin.html | 278 +++++++++++++++ TestPlugin.html | 202 +++++++++++ TestPlugin1.html | 170 +++++++++ TestPlugin2.html | 170 +++++++++ bdd.sql | 34 -- images/add.png | Bin 0 -> 733 bytes images/brick.png | Bin 0 -> 452 bytes images/brick_link.png | Bin 0 -> 764 bytes images/bug.png | Bin 0 -> 774 bytes images/bullet_black.png | Bin 0 -> 211 bytes images/bullet_toggle_minus.png | Bin 0 -> 207 bytes images/bullet_toggle_plus.png | Bin 0 -> 209 bytes images/date.png | Bin 0 -> 626 bytes images/delete.png | Bin 0 -> 715 bytes images/find.png | Bin 0 -> 659 bytes images/loadingAnimation.gif | Bin 0 -> 5886 bytes images/macFFBgHack.png | Bin 0 -> 207 bytes images/package.png | Bin 0 -> 853 bytes images/page_green.png | Bin 0 -> 621 bytes images/page_white_text.png | Bin 0 -> 342 bytes images/page_white_width.png | Bin 0 -> 309 bytes images/plugin.png | Bin 0 -> 591 bytes images/ruby.png | Bin 0 -> 592 bytes images/tag_blue.png | Bin 0 -> 1880 bytes images/tag_green.png | Bin 0 -> 613 bytes images/transparent.png | Bin 0 -> 97 bytes images/wrench.png | Bin 0 -> 610 bytes images/wrench_orange.png | Bin 0 -> 584 bytes images/zoom.png | Bin 0 -> 692 bytes index.html | 77 +++++ js/darkfish.js | 153 +++++++++ js/jquery.js | 18 + js/navigation.js | 142 ++++++++ js/search.js | 94 +++++ js/search_index.js | 1 + js/searcher.js | 228 +++++++++++++ lib/playbot.rb | 70 ---- lib/site_plugin.rb | 15 - mixcloud.pm | 71 ---- run.rb | 50 --- soundcloud.pm | 35 -- spec/site_plugin_spec.rb | 28 -- table_of_contents.html | 78 +++++ youtube.pm | 76 ----- zippy.pm | 70 ---- 49 files changed, 1863 insertions(+), 1493 deletions(-) delete mode 100644 Logging.pm create mode 100644 PlayBot.html delete mode 100755 PlayBot.pl delete mode 100644 README.md create mode 100644 SitePlugin.html create mode 100644 TestPlugin.html create mode 100644 TestPlugin1.html create mode 100644 TestPlugin2.html delete mode 100644 bdd.sql create mode 100644 images/add.png create mode 100644 images/brick.png create mode 100644 images/brick_link.png create mode 100644 images/bug.png create mode 100644 images/bullet_black.png create mode 100644 images/bullet_toggle_minus.png create mode 100644 images/bullet_toggle_plus.png create mode 100644 images/date.png create mode 100644 images/delete.png create mode 100644 images/find.png create mode 100644 images/loadingAnimation.gif create mode 100644 images/macFFBgHack.png create mode 100644 images/package.png create mode 100644 images/page_green.png create mode 100644 images/page_white_text.png create mode 100644 images/page_white_width.png create mode 100644 images/plugin.png create mode 100644 images/ruby.png create mode 100644 images/tag_blue.png create mode 100644 images/tag_green.png create mode 100644 images/transparent.png create mode 100644 images/wrench.png create mode 100644 images/wrench_orange.png create mode 100644 images/zoom.png create mode 100644 index.html create mode 100644 js/darkfish.js create mode 100644 js/jquery.js create mode 100644 js/navigation.js create mode 100644 js/search.js create mode 100644 js/search_index.js create mode 100644 js/searcher.js delete mode 100644 lib/playbot.rb delete mode 100644 lib/site_plugin.rb delete mode 100644 mixcloud.pm delete mode 100755 run.rb delete mode 100644 soundcloud.pm delete mode 100644 spec/site_plugin_spec.rb create mode 100644 table_of_contents.html delete mode 100644 youtube.pm delete mode 100644 zippy.pm diff --git a/Logging.pm b/Logging.pm deleted file mode 100644 index 6b7085b..0000000 --- a/Logging.pm +++ /dev/null @@ -1,606 +0,0 @@ -package Logging; - -# ==============[ Classe pour gérer les logs correctement ]============== # -# Date : 29/10/2010 # -# Auteur : TC # -# ======================================================================= # - -use strict; -use warnings; - -use Fcntl ':mode'; - - -# ### -# new -# Instancie la classe - un constructeur en somme -# ### -sub new -{ - my $class = shift; - my $self = { - _file => shift, - _colored => 0, - _pending => 0, - _utf8 => 0, - _right_align => shift, - }; - - bless $self, $class; - - # On active la couleur que si on est sur un terminal - # C'est moche après pour les fichiers ou un less - if($self->file eq "STDOUT") - { - $self->{"_colored"} = 1 if((stat(STDOUT))[2] & S_IFCHR); - } - elsif($self->file eq "STDERR") - { - $self->{"_colored"} = 1 if((stat(STDERR))[2] & S_IFCHR); - } - else - { - $self->{"_colored"} = 1 if((stat($self->file))[2] & S_IFCHR); - } - - - unless(defined $self->{"_right_align"}) - { - $self->{"_right_align"} = 0; - } - - return $self; -} # Fin new - - -# ### -# file -# Renvoie/maj $self->{'_file'} -# ### -sub file -{ - my $self = shift; - $self->{"_file"} = $_[0] if(defined($_[0])); - return $self->{"_file"}; -} # Fin file - - -# ### -# colored -# Renvoie/maj $self->{'_colored'} -# ### -sub colored -{ - my $self = shift; - $self->{"_colored"} = $_[0] if(defined($_[0])); - return $self->{"_colored"}; -} # Fin colored - - -# ### -# pending -# Renvoie/maj $self->{'_pending'} -# ### -sub pending -{ - my $self = shift; - $self->{"_pending"} = $_[0] if(defined($_[0])); - return $self->{"_pending"}; -} # Fin pending - - -# ### -# utf8 -# Renvoie/maj $self->{"_utf8"} -# ### -sub utf8 -{ - my $self = shift; - $self->{"_utf8"} = $_[0] if(defined($_[0])); - return $self->{"_utf8"}; -} # Fin utf8 - - -# ### -# right_align -# Renvoie/maj $self->{"_right_align"} -# ### -sub right_align -{ - my $self = shift; - $self->{"_right_align"} = $_[0] if(defined($_[0])); - return $self->{"_right_align"}; -} # Fin right_align - - -# ### -# debug -# Fonction gérant les logs du niveau debug (1) -# ### -sub debug -{ - my ($self, $text) = @_; - return unless(defined $text); - - chomp $text; - - my $parent = ( caller(1) )[3]; - $parent = "" if(!defined($parent)); - - if($self->colored) - { - $text = "\e[36mDEBUG\e[0m:$parent:$text"; - } - else - { - $text = "DEBUG:$parent:$text"; - } - - return $self->print_in_file($text, $self->DEBUG); -} # Fin debug - - -# ### -# pending_debug -# Fonction gérant les logs du niveau debug (1) -# ### -sub pending_debug -{ - my ($self, $text) = @_; - chomp $text; - - my $parent = ( caller(1) )[3]; - $parent = "" if(!defined($parent)); - - if($self->colored) - { - $text = "\e[36mDEBUG\e[0m:$parent:$text"; - } - else - { - $text = "DEBUG:$parent:$text"; - } - - return $self->pending_in_file($text, $self->DEBUG); -} # Fin pending_debug - - -# ### -# info -# Fonction gérant les logs du niveau info (2) -# ### -sub info -{ - my ($self, $text) = @_; - return unless(defined $text); - - chomp $text; - - my $parent = ( caller(1) )[3]; - $parent = "" if(!defined($parent)); - - if($self->colored) - { - $text = "\e[33;1mINFO\e[0m:$parent:$text"; - } - else - { - $text = "INFO:$parent:$text"; - } - - return $self->print_in_file($text, $self->INFO); -} # Fin info - - -# ### -# pending_info -# Fonction gérant les logs du niveau info (2) -# ### -sub pending_info -{ - my ($self, $text) = @_; - return unless(defined $text); - - chomp $text; - - my $parent = ( caller(1) )[3]; - $parent = "" if(!defined($parent)); - - if($self->colored) - { - $text = "\e[33;1mINFO\e[0m:$parent:$text"; - } - else - { - $text = "INFO:$parent:$text"; - } - - return $self->pending_in_file($text, $self->INFO); -} # Fin pending_info - - -# ### -# warning -# Fonction gérant les logs du niveau warning (3) -# ### -sub warning -{ - my ($self, $text) = @_; - return unless(defined $text); - - chomp $text; - - my $parent = ( caller(1) )[3]; - $parent = "" if(!defined($parent)); - - if($self->colored) - { - $text = "\e[33mWARNING\e[0m:$parent:$text"; - } - else - { - $text = "WARNING:$parent:$text"; - } - - return $self->print_in_file($text, $self->WARNING); -} # Fin warning - - -# ### -# pending_warning -# Fonction gérant les logs du niveau warning (3) -# ### -sub pending_warning -{ - my ($self, $text) = @_; - return unless(defined $text); - - chomp $text; - - my $parent = ( caller(1) )[3]; - $parent = "" if(!defined($parent)); - - if($self->colored) - { - $text = "\e[33mWARNING\e[0m:$parent:$text"; - } - else - { - $text = "WARNING:$parent:$text"; - } - - return $self->pending_in_file($text, $self->WARNING); -} # Fin pending_warning - - -# ### -# error -# Fonction gérant les logs du niveau error (4) -# ### -sub error -{ - my ($self, $text) = @_; - return unless(defined $text); - - chomp $text; - - my $parent = ( caller(1) )[3]; - $parent = "" if(!defined($parent)); - - if($self->colored) - { - $text = "\e[31mERROR\e[0m:$parent:$text"; - } - else - { - $text = "ERROR:$parent:$text"; - } - - return $self->print_in_file($text, $self->ERROR); -} # Fin error - - -# ### -# pending_error -# Fonction gérant les logs du niveau error (4) -# ### -sub pending_error -{ - my ($self, $text) = @_; - return unless(defined $text); - - chomp $text; - - my $parent = ( caller(1) )[3]; - $parent = "" if(!defined($parent)); - - if($self->colored) - { - $text = "\e[31mERROR\e[0m:$parent:$text"; - } - else - { - $text = "ERROR:$parent:$text"; - } - - return $self->pending_in_file($text, $self->ERROR); -} # Fin pending_error - - -# ### -# critical -# Fonction gérant les logs du niveau critical (5) -# ### -sub critical -{ - my ($self, $text) = @_; - return unless(defined $text); - - chomp $text; - - my $parent = ( caller(1) )[3]; - $parent = "" if(!defined($parent)); - - if($self->colored) - { - $text = "\e[31;1mCRITICAL\e[0m:$parent:$text"; - } - else - { - $text = "CRITICAL:$parent:$text"; - } - - return $self->print_in_file($text, $self->CRITICAL); -} # Fin critical - - -# ### -# pending_critical -# Fonction gérant les logs du niveau critical (5) -# ### -sub pending_critical -{ - my ($self, $text) = @_; - return unless(defined $text); - - chomp $text; - - my $parent = ( caller(1) )[3]; - $parent = "" if(!defined($parent)); - - if($self->colored) - { - $text = "\e[31;1mCRITICAL\e[0m:$parent:$text"; - } - else - { - $text = "CRITICAL:$parent:$text"; - } - - return $self->pending_in_file($text, $self->CRITICAL); -} # Fin pending_critical - - -# ### -# print_in_file -# Écrit dans le fichier -# ### -sub print_in_file -{ - my ($self, $text, $level) = @_; - return unless(defined $text); - - chomp $text; - $text = "[\e[32m" . (scalar localtime time) . "\e[0m] $text"; - - $self->end_pending(0, $level) if($self->pending); - - if($self->file eq "STDOUT") - { - print STDOUT $text."\n"; - } - elsif($self->file eq "STDERR") - { - print STDERR $text."\n"; - } - else - { - open LOG, ">>", $self->file or return 0; - print LOG $text."\n"; - close LOG; - - print $text."\n" if(defined($level) && $Config::debug >= $level); - } - - return 1; -} # Fin print_in_file - - -# ### -# pending_in_file -# Écrit dans le fichier en attendant de savoir si ça a réussi ou pas -# ### -sub pending_in_file -{ - my ($self, $text, $level) = @_; - return unless(defined $text); - - chomp $text; - $text = "[" . (scalar localtime time) . "] $text"; - - if($self->file eq "STDOUT") - { - if($self->right_align) - { - printf STDOUT "%-90s", $text; - } - else - { - print STDOUT $text; - } - } - elsif($self->file eq "STDERR") - { - if($self->right_align) - { - printf STDERR "%-90s", $text; - } - else - { - print STDERR $text; - } - } - else - { - if($self->right_align) - { - open LOG, ">>", $self->file or return 0; - printf LOG "%-90s", $text; - close LOG; - - printf "%-90s", $text if(defined($level) && $Config::debug >= $level); - } - else - { - open LOG, ">>", $self->file or return 0; - print LOG $text; - close LOG; - - print $text if(defined($level) && $Config::debug >= $level); - } - } - - $self->pending(1); - - return 1; -} # Fin pending_in_file - - -# ### -# end_pending -# Écrit dans le fichier le résultat de l'attente -# ### -sub end_pending -{ - my ($self, $done_or_error, $level) = @_; - - my $done = ""; - - if($done_or_error) - { - if($self->colored) - { - $done = sprintf "%c[32m Done ", 0x1B; - } - else - { - $done = sprintf " Done \n"; - } - - $done .= "☑" if($self->utf8); - } - else - { - if($self->colored) - { - $done = sprintf "%c[31m Error ", 0x1B; - } - else - { - $done = sprintf " Error \n"; - } - - $done .= "☒" if($self->utf8); - } - - $done .= "\e[0m\n" if($self->colored); - - - # À partir d'ici, $done peut vouloir dire que c'est bon, ou pas - if($self->file eq "STDOUT") - { - printf STDOUT $done; - } - elsif($self->file eq "STDERR") - { - printf STDERR $done; - } - else - { - open LOG, ">>", $self->file or return 0; - printf LOG $done; - close LOG; - - printf $done if(defined($level) && $Config::debug >= $level); - } - - - $self->pending(0); - - return 1; -} # Fin end_pending - - -# -# Fonctions pour récupérer les différents niveaux de debug -# -sub DEBUG { return 3; } -sub INFO { return 2; } -sub WARNING { return 1; } -sub ERROR { return 0; } -sub CRITICAL { return -1; } -# Pour ceux qui préfèrent utiliser des variables... -our $DEBUG = 3; -our $INFO = 2; -our $WARNING = 1; -our $ERROR = 0; -our $CRITICAL = -1; -our %LVL_NAME = ( - "DEBUG" => 3, - "INFO" => 2, - "WARNING" => 1, - "ERROR" => 0, - "CRITICAL" => -1 -); - -# Et dans l'autre sens -sub LVL -{ - my ($self, $num) = @_; - - my %LVL = ( - 3 => "DEBUG", - 2 => "INFO", - 1 => "WARNING", - 0 => "ERROR", - "-1" => "CRITICAL" - ); - - return $LVL{$num}; -} -our %LVL = ( - 3 => "DEBUG", - 2 => "INFO", - 1 => "WARNING", - 0 => "ERROR", - "-1" => "CRITICAL" -); - - -# ### -# dbg -# Imprime des infos de debug à l'écran (STDOUT) -# ### -sub dbg -{ - my $self = shift; - - require Data::Dumper; - print Data::Dumper->Dump([$self], [qw(Logging)]); -} # Fin dbg - - -1; - -__END__ - diff --git a/PlayBot.html b/PlayBot.html new file mode 100644 index 0000000..dbae35e --- /dev/null +++ b/PlayBot.html @@ -0,0 +1,252 @@ +<!DOCTYPE html> + +<html> +<head> +<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> + +<title>class PlayBot - RDoc Documentation</title> + +<link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet"> + +<script type="text/javascript"> + var rdoc_rel_prefix = "./"; +</script> + +<script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/search.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script> + + +<body id="top" class="class"> +<nav id="metadata"> + <nav id="home-section" class="section"> + <h3 class="section-header"> + <a href="./index.html">Home</a> + <a href="./table_of_contents.html#classes">Classes</a> + <a href="./table_of_contents.html#methods">Methods</a> + </h3> +</nav> + + + <nav id="search-section" class="section project-section" class="initially-hidden"> + <form action="#" method="get" accept-charset="utf-8"> + <h3 class="section-header"> + <input type="text" name="search" placeholder="Search" id="search-field" + title="Type to search, Up and Down to navigate, Enter to load"> + </h3> + </form> + + <ul id="search-results" class="initially-hidden"></ul> +</nav> + + + <div id="file-metadata"> + <nav id="file-list-section" class="section"> + <h3 class="section-header">Defined In</h3> + <ul> + <li>lib/playbot.rb + </ul> +</nav> + + + </div> + + <div id="class-metadata"> + + <nav id="parent-class-section" class="section"> + <h3 class="section-header">Parent</h3> + + <p class="link">IRCBot + +</nav> + + + <!-- Method Quickref --> +<nav id="method-list-section" class="section"> + <h3 class="section-header">Methods</h3> + + <ul class="link-list"> + + <li><a href="#method-c-new">::new</a> + + <li><a href="#method-i-add_custom_handlers">#add_custom_handlers</a> + + </ul> +</nav> + + </div> + + <div id="project-metadata"> + + <nav id="classindex-section" class="section project-section"> + <h3 class="section-header">Class and Module Index</h3> + + <ul class="link-list"> + + <li><a href="./PlayBot.html">PlayBot</a> + + <li><a href="./SitePlugin.html">SitePlugin</a> + + <li><a href="./TestPlugin.html">TestPlugin</a> + + <li><a href="./TestPlugin1.html">TestPlugin1</a> + + <li><a href="./TestPlugin2.html">TestPlugin2</a> + + </ul> +</nav> + + </div> +</nav> + +<div id="documentation"> + <h1 class="class">class PlayBot</h1> + + <div id="description" class="description"> + + </div><!-- description --> + + + + + <section id="5Buntitled-5D" class="documentation-section"> + + + + + + <!-- Constants --> + <section id="constants-list" class="section"> + <h3 class="section-header">Constants</h3> + <dl> + + <dt id="BOTNAME">BOTNAME + + <dd class="description"> + + + </dl> + </section> + + + + + <!-- Methods --> + + <section id="public-class-5Buntitled-5D-method-details" class="method-section section"> + <h3 class="section-header">Public Class Methods</h3> + + + <div id="method-c-new" class="method-detail "> + + <div class="method-heading"> + <span class="method-name">new</span><span + class="method-args">(options = {})</span> + <span class="method-click-advice">click to toggle source</span> + </div> + + + <div class="method-description"> + + <p>Start a new instance</p> + +<p>Options:</p> +<ul><li> +<p><code>:address</code>: irc server</p> +</li><li> +<p><code>:port</code>: port number, default to 6667</p> +</li><li> +<p><code>:nicknames</code>: array of nicknames to cycle through</p> +</li><li> +<p><code>:nick_passwd</code>: password for the first nick of :nicknames</p> + +<pre>if we are not connected with this nick, we will use ghost and take this nick</pre> +</li><li> +<p><code>:channels</code>: the channels we are going to connect to</p> +</li><li> +<p><code>:admin</code>: the nick of the user who can command the bot</p> +</li></ul> + + + + <div class="method-source-code" id="new-source"> + <pre><span class="ruby-comment"># File lib/playbot.rb, line 26</span> +<span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">options</span> = {}) + <span class="ruby-ivar">@admin</span> = <span class="ruby-identifier">options</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-value">:admin</span>) + <span class="ruby-identifier">raise</span> <span class="ruby-string">"You must provide an admin !"</span> <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@admin</span> + + <span class="ruby-keyword">if</span> <span class="ruby-identifier">options</span>[<span class="ruby-value">:nick_passwd</span>] + <span class="ruby-ivar">@nick</span> = <span class="ruby-identifier">options</span>[<span class="ruby-value">:nicknames</span>].<span class="ruby-identifier">first</span> + <span class="ruby-ivar">@nick_paswd</span> = <span class="ruby-identifier">options</span>.<span class="ruby-identifier">delete</span>[<span class="ruby-value">:nick_passwd</span>] + <span class="ruby-keyword">end</span> + + <span class="ruby-identifier">options</span>[<span class="ruby-value">:username</span>] = <span class="ruby-constant">BOTNAME</span> + <span class="ruby-identifier">options</span>[<span class="ruby-value">:realname</span>] = <span class="ruby-constant">BOTNAME</span> + +<span class="ruby-keyword">super</span>(<span class="ruby-identifier">options</span>) + <span class="ruby-keyword">self</span>.<span class="ruby-identifier">connect_socket</span> + <span class="ruby-keyword">self</span>.<span class="ruby-identifier">start_listening</span> +<span class="ruby-keyword">end</span></pre> + </div><!-- new-source --> + + </div> + + + + + </div><!-- new-method --> + + + </section><!-- public-class-method-details --> + + <section id="public-instance-5Buntitled-5D-method-details" class="method-section section"> + <h3 class="section-header">Public Instance Methods</h3> + + + <div id="method-i-add_custom_handlers" class="method-detail "> + + <div class="method-heading"> + <span class="method-name">add_custom_handlers</span><span + class="method-args">()</span> + <span class="method-click-advice">click to toggle source</span> + </div> + + + <div class="method-description"> + + <p>This metod is called by IRCBot#connect_socket</p> + + + + <div class="method-source-code" id="add_custom_handlers-source"> + <pre><span class="ruby-comment"># File lib/playbot.rb, line 44</span> +<span class="ruby-keyword">def</span> <span class="ruby-identifier">add_custom_handlers</span>() + <span class="ruby-ivar">@irc</span>.<span class="ruby-identifier">hearing_welcome</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">method</span>(<span class="ruby-value">:_in_welcome</span>) + <span class="ruby-ivar">@irc</span>.<span class="ruby-identifier">on_msg</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">method</span>(<span class="ruby-value">:_in_msg</span>) +<span class="ruby-keyword">end</span></pre> + </div><!-- add_custom_handlers-source --> + + </div> + + + + + </div><!-- add_custom_handlers-method --> + + + </section><!-- public-instance-method-details --> + + </section><!-- 5Buntitled-5D --> + +</div><!-- documentation --> + + +<footer id="validator-badges"> + <p><a href="http://validator.w3.org/check/referer">[Validate]</a> + <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12. + <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3. +</footer> + diff --git a/PlayBot.pl b/PlayBot.pl deleted file mode 100755 index 9f6e042..0000000 --- a/PlayBot.pl +++ /dev/null @@ -1,366 +0,0 @@ -#!/usr/bin/perl -w -use strict; -use warnings; -use POE; -use POE::Component::IRC; -use POSIX 'strftime'; -use DBI; -use Tie::File; -use JSON; - -use Logging; -use youtube; -use soundcloud; -use mixcloud; -use zippy; - - -# nom du fichier -my $bot = $0; - -my $log = Logging->new('STDOUT', 1); - -# config -my $serveur = 'IRC.iiens.net'; -my $nick = 'PlayBot'; -my $port = 6667; -my $ircname = 'nightiies'; -my $username = 'nightiies'; -my @channels = qw(#nightiies #bigphatsubwoofer); -my $admin = 'moise'; -my $baseurl = 'http://nightiies.iiens.net/links/'; -my @nicksToVerify; -my @codesToVerify; -my $lastID; - -my $debug = 0; - -# mode debug -if ($#ARGV + 1) { - @channels = qw(#hormone); - $nick = 'kikoo'; - $debug = 1; -} - - -local $/; -open CONF, '<', 'playbot.conf'; -my $json = <CONF>; -my $conf = decode_json($json); - - -## CONNEXION -my ($irc) = POE::Component::IRC->spawn(); -my $dbh = DBI->connect('DBI:mysql:'.$conf->{'bdd'}.';host='.$conf->{'host'}, $conf->{'user'}, $conf->{'passwd'}, { - PrintError => 0, - AutoCommit => 1, - mysql_auto_reconnect => 1 - }) - or die("Couldn't connect to database: ".DBI->errstr); - - -# Evenements que le bot va gérer -POE::Session->create( - inline_states => { - _start => \&bot_start, - irc_001 => \&on_connect, - irc_public => \&on_speak, - irc_msg => \&on_query, - irc_notice => \&on_notice, - _flux => \&flux, - _later => \&later - }, -); - - -my %commandes_admin = ("cycle" => \&cycle); - - - -### FONCTIONS -sub flux -{ - my $kernel = $_[ KERNEL ]; - my $date = strftime ("%Y-%m-%d", localtime(time - 3600*24)); - - my $sth = $dbh->prepare_cached('SELECT COUNT(*) FROM playbot WHERE date = ?'); - $log->error("Couldn't prepare querie; aborting") unless (defined $sth); - $sth->execute($date) - or $log->error("Couldn't finish transaction: " . $dbh->errstr); - my ($nbr) = $sth->fetchrow_array; - - if ($nbr) { - $irc->yield(privmsg => $_ => $nbr.' liens aujourd\'hui : '.$baseurl.$date) foreach (@channels); - } - - $kernel->delay_set('_flux', 3600*24); -} - - -sub addTag -{ - my ($id, $tag) = @_; - - my $sth = $dbh->prepare_cached('INSERT INTO playbot_tags (id, tag) VALUES (?, ?)'); - $log->error("Couldn't prepare querie; aborting") unless (defined $sth); - - $sth->execute($id, $tag) - or $log->error("Couldn't finish transaction: " . $dbh->errstr); -} - - -sub later -{ - my ($nick, $id) = @_[ARG0,ARG1]; - - my $sth = $dbh->prepare_cached('SELECT url, sender, title FROM playbot WHERE id = ?'); - $log->error("Couldn't prepare querie; aborting") unless (defined $sth); - - $sth->execute($id) - or $log->error("Couldn't finish transaction: " . $dbh->errstr); - - if ($sth->rows) { - my @donnees = $sth->fetchrow_array; - - $irc->yield(privmsg => $nick => '['.$id.'] '.$donnees[2].' | '.$donnees[1]); - $irc->yield(privmsg => $nick => $donnees[0]); - } -} - - -sub cycle -{ - my ($arg) = @_; - - $log->info("restarting"); - $irc->yield(quit => 'goodbye'); - sleep 1; - exec $bot; -} - - -## GESTION EVENTS - -# Au démarrage -sub bot_start { - $irc->yield(register => "all"); - $irc->yield( - connect => { - Nick => $nick, - Username => $username, - Ircname => $ircname, - Server => $serveur, - Port => $port, - } - ); -} - - -# A la connection -sub on_connect -{ - my $kernel = $_[ KERNEL ]; - $irc->yield(join => $_) foreach (@channels); - $log->info('connected'); - - my $hour = strftime ('%H', localtime); - my $min = strftime ('%M', localtime); - - $kernel->delay_set('_flux', (23-$hour)*3600 + (60-$min)*60); -} - - -# Discussion privée -sub on_query -{ - my ($user,$msg) = @_[ARG0, ARG2]; - my ($nick) = split (/!/,$user); - print $msg."\n"; - - if ($msg =~ m/^!/ && $nick eq $admin) { - my $commande = ( $msg =~ m/^!([^ ]*)/ )[0]; - my @params = grep {!/^\s*$/} split(/\s+/, substr($msg, length("!$commande"))); - - foreach (keys(%commandes_admin)) { - if ($commande eq $_) { - $commandes_admin{$_}->(@params); - last; - } - } - } - elsif ($msg =~ /^PB/) { - # on vérifie si le nick est register - push (@nicksToVerify, $nick); - push (@codesToVerify, $msg); - $irc->yield(privmsg => $nick => 'Vérification en cours…'); - $irc->yield(privmsg => nickserv => 'info '.$nick); - } -} - - -sub on_notice -{ - my ($user, $msg) = @_[ARG0, ARG2]; - my ($nick) = split(/!/,$user); - - return unless ($nick =~ /^NickServ$/i); - - my $nickToVerify = shift @nicksToVerify; - my $code = shift @codesToVerify; - - return unless (defined($nickToVerify)); - - if ($msg !~ /$nickToVerify/) { - push (@nicksToVerify, $nickToVerify); - push (@codesToVerify, $code); - } - elsif ($msg =~ /isn't registered/) { - $irc->yield(privmsg => $nickToVerify => "Il faut que ton pseudo soit enregistré auprès de NickServ"); - } - else { - my $sth = $dbh->prepare_cached('SELECT user FROM playbot_codes WHERE code = ?'); - $log->error("Counldn't prepare querie; aborting") unless (defined $sth); - $sth->execute($code); - - if ($sth->rows) { - my $sth = $dbh->prepare_cached('UPDATE playbot_codes SET nick = ? WHERE code = ?'); - $log->error("Couldn't prepare querie; aborting") unless (defined $sth); - - $sth->execute($nickToVerify, $code) - or $log->error("Couldn't finish transaction: " . $dbh->errstr); - - $irc->yield(privmsg => $nickToVerify => 'Association effectuée'); - $irc->yield(privmsg => $nickToVerify => 'pour enregistrer un lien dans tes favoris : !fav <id>'); - } - else { - $irc->yield(privmsg => $nickToVerify => "Ce code n'existe pas"); - } - } -} - - -# Quand un user parle -sub on_speak -{ - my ($kernel, $user, $chan, $msg) = @_[KERNEL, ARG0, ARG1, ARG2]; - my ($nick,$mask) = split(/!/,$user); - my $site; - my %content; - - if ($msg =~ m#(^|[^!])https?://(www.youtube.com/watch\?[a-zA-Z0-9_=&-]*v=|youtu.be/)([a-zA-Z0-9_-]+)#) { - my $url = 'https://www.youtube.com/watch?v='.$3; - eval { %content = youtube($url) }; - $site = 'youtube'; - } - elsif ($msg =~ m#(^|[^!])https?://soundcloud.com/([a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+)#) { - my $url = 'https://www.soundcloud.com/'.$2; - eval { %content = soundcloud($url) }; - $site = 'soundcloud'; - } - elsif ($msg =~ m#(^|[^!])https?://www.mixcloud.com/([a-zA-Z0-9-_]+/[a-zA-Z0-9-_]+)#) { - my $url = 'https://www.mixcloud.com/'.$2; - eval { %content = mixcloud($url) }; - $site = 'mixcloud'; - } - elsif ($msg =~ m#((^|[^!])http://www[0-9]+.zippyshare.com/v/[0-9]+/file.html)#) { - my $url = $1; - eval { %content = zippy($url) }; - $site = 'zippyshare'; - } - elsif ($msg =~ /^!fav( ([0-9]+))?/) { - my $id = ($2) ? $2 : $lastID; - - my $sth = $dbh->prepare_cached('SELECT user FROM playbot_codes WHERE nick = ?'); - $sth->execute($nick) - or $log->error("Couldn't finish transaction: " . $dbh->errstr); - - unless ($sth->rows) { - $irc->yield(privmsg => $nick => "Ce nick n'est associé à aucun login arise. Va sur http://nightiies.iiens.net/links/fav pour obtenir ton code personel."); - return; - } - - my $sth2 = $dbh->prepare_cached('INSERT INTO playbot_fav (id, user) VALUES (?, ?)'); - $sth2->execute($id, $sth->fetch->[0]) - or $log->error("Couldn't finish transaction: " . $dbh->errstr); - - return; - } - elsif ($msg =~ /^!later( ([0-9]*)( in ([0-9]*)(h|m|s)?)?)?/) { - my ($id, $time, $unit) = ($2, $4, $5); - - $id = $lastID if (!$id); - $time = 6 if (!$time); - $time *= ($unit eq 's') ? 1 : ($unit eq 'm') ? 60 : 3600; - print "$time eq\n"; - $kernel->delay_set('_later', $time, $nick, $id); - - return; - } - elsif ($msg =~ /^!tag( +([0-9]+))?/) { - my $id = ($2) ? $2 : $lastID; - while ($msg =~ /#([a-zA-Z0-9_-]+)/g) { - addTag($id, $1); - } - - return; - } - else { - return; - } - - if ($@) { - $log->warning ($@); - return; - } - - if ($debug) { - $log->debug($content{'url'}); - } - else { - # insertion de la vidéo dans la bdd - - my $sth = $dbh->prepare_cached('INSERT INTO playbot (date, type, url, sender_irc, sender, title, chan) VALUES (NOW(),?,?,?,?,?,?)'); - $log->error("Couldn't prepare querie; aborting") unless (defined $sth); - - $sth->execute($site, $content{'url'}, $nick, $content{'author'}, $content{'title'}, '#nightiies') - or $log->error("Couldn't finish transaction: " . $dbh->errstr); - } - - # sélection de l'id de la vidéo insérée - my $id = $dbh->{mysql_insert_id}; - if (!$id) { - my $sth = $dbh->prepare_cached('SELECT id FROM playbot WHERE url = ?'); - $log->error("Couldn't prepare querie; aborting") unless (defined $sth); - - $sth->execute($content{'url'}) - or $log->error("Couldn't finish transaction: " . $dbh->errstr); - - $id = $sth->fetch->[0]; - } - $lastID = $id; - - - # insertion des éventuels tags - while ($msg =~ /#([a-zA-Z0-9_-]+)/g) { - if ($debug) { - $log->debug($1); - next; - } - - addTag ($lastID, $1); - } - - - # message sur irc - if (defined $content{'author'}) { - $irc->yield(privmsg => $chan => '['.$id.'] '.$content{'title'}.' | '.$content{'author'}) ; - } - else { - $irc->yield(privmsg => $chan => '['.$id.'] '.$content{'title'}) ; - } -} - - -# Boucle des events -$poe_kernel->run(); -exit 0; diff --git a/README.md b/README.md deleted file mode 100644 index 77b81fa..0000000 --- a/README.md +++ /dev/null @@ -1,72 +0,0 @@ -# PlayBot - -## ATTENTION - -Cette branche a pour but la réécriture du PlayBot en ruby. Avec cette réécriture, un système de plugin et des tests unitaires seront de la partie. - -Les dépendances nécéssaires sont : - * net-yail - * rspec - - - -## Description - -PlayBot est un bot IRC permettant de manipuler des liens audio : -+ enregistrement des liens dans une base de données ; -+ récupération et publication sur le chan des informations (titre, posteur) ; -+ normalisation du lien ; -+ sauvegarde de liens en favoris ; -+ rappel du lien en query. - - -## Installation - - -### Dépendances - -PlayBot est codé en Perl. Il dépend des modules suivant : -+ DBI ; -+ DBD::mysql ; -+ JSON ; -+ LWP::UserAgent ; -+ HTML::Parser ; -+ HTML::Entities ; -+ POE ; -+ POE::Component::IRC ; -+ Tie::File. - - -### Configuration - -Pour l'instant, seule la configuration de la base de donnée est externalisée. Vous devez créer un fichier *playbot.json* dans le même dossier que le fichier *PlayBot.pl* contenant les attributs suivant (les noms devraient être assez explicites) : -+ bdd ; -+ host ; -+ user ; -+ passwd. - -Le reste de la configuration s'effectue encore directement dans le fichier *PlayBot.pl*. Les variables suivantes sont modifiables : -+ $serveur ; -+ $port ; -+ $nick ; -+ $ircname ; -+ $username ; -+ @channels ; -+ $admin ; -+ $baseurl. - -Les noms des variables sont plutôt explicites. *$admin* contient le nick du l'utilisateur qui aura le droit d'administrer le bot (attention, aucune vérification autre que le nick n'est pour l'instant faîte, il est recommandé de l'enregistrer). *$baseurl* contient l'url racine du site permettant de consulter le contenu de la base de données. - -Les schémas des tables nécéssaire pour la base de données sont dans le fichier *bdd.sql*. - - -## Utilisation - -Dès qu'un lien est posté, le bot récupère le nom du contenu et de la personne l'ayant posté, et l'insère dans la base de données (grâce à l'unicité du lien et à sa normalisation, un même contenu ne peut être enregistré deux fois). Il poste ensuite sur le channel les informations récupérées avec l'id du contenu. - -Lors du poste du lien, on peut ajouter des tags en les préfixant par le symbole « # ». - -Les différentes commandes utilisables sont les suivantes sur le channel où se trouve le PlayBot : -+ !fav [id] : enregistre en favoris le contenu possédant l'identifiant *id*. Si l'identifiant n'est pas préciser, le dernier contenu posté (et non inséré) est utilisé. -+ !later [id [in [Xs|Xm|Xs]]] : demande au PlayBot de rappeler en query un contenu. La durée par défaut est de 6h. Si l'identifant n'est pas précisé, le dernier contenu posté est utilisé. -+ !tag [id] #tag1 #tag2 … : permet de taguer un contenu. diff --git a/SitePlugin.html b/SitePlugin.html new file mode 100644 index 0000000..997ceb4 --- /dev/null +++ b/SitePlugin.html @@ -0,0 +1,278 @@ +<!DOCTYPE html> + +<html> +<head> +<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> + +<title>class SitePlugin - RDoc Documentation</title> + +<link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet"> + +<script type="text/javascript"> + var rdoc_rel_prefix = "./"; +</script> + +<script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/search.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script> + + +<body id="top" class="class"> +<nav id="metadata"> + <nav id="home-section" class="section"> + <h3 class="section-header"> + <a href="./index.html">Home</a> + <a href="./table_of_contents.html#classes">Classes</a> + <a href="./table_of_contents.html#methods">Methods</a> + </h3> +</nav> + + + <nav id="search-section" class="section project-section" class="initially-hidden"> + <form action="#" method="get" accept-charset="utf-8"> + <h3 class="section-header"> + <input type="text" name="search" placeholder="Search" id="search-field" + title="Type to search, Up and Down to navigate, Enter to load"> + </h3> + </form> + + <ul id="search-results" class="initially-hidden"></ul> +</nav> + + + <div id="file-metadata"> + <nav id="file-list-section" class="section"> + <h3 class="section-header">Defined In</h3> + <ul> + <li>lib/site_plugin.rb + </ul> +</nav> + + + </div> + + <div id="class-metadata"> + + <nav id="parent-class-section" class="section"> + <h3 class="section-header">Parent</h3> + + <p class="link">Object + +</nav> + + + <!-- Method Quickref --> +<nav id="method-list-section" class="section"> + <h3 class="section-header">Methods</h3> + + <ul class="link-list"> + + <li><a href="#method-c-for_site">::for_site</a> + + <li><a href="#method-c-inherited">::inherited</a> + + <li><a href="#method-c-repository">::repository</a> + + <li><a href="#method-i-can_handle-3F">#can_handle?</a> + + </ul> +</nav> + + </div> + + <div id="project-metadata"> + + <nav id="classindex-section" class="section project-section"> + <h3 class="section-header">Class and Module Index</h3> + + <ul class="link-list"> + + <li><a href="./PlayBot.html">PlayBot</a> + + <li><a href="./SitePlugin.html">SitePlugin</a> + + <li><a href="./TestPlugin.html">TestPlugin</a> + + <li><a href="./TestPlugin1.html">TestPlugin1</a> + + <li><a href="./TestPlugin2.html">TestPlugin2</a> + + </ul> +</nav> + + </div> +</nav> + +<div id="documentation"> + <h1 class="class">class SitePlugin</h1> + + <div id="description" class="description"> + +<p>Implement a plugin system.</p> + +<p>Each plugin have to inherite from this class and implement a +can_handle?(site) method.</p> + + </div><!-- description --> + + + + + <section id="5Buntitled-5D" class="documentation-section"> + + + + + + + + + <!-- Methods --> + + <section id="public-class-5Buntitled-5D-method-details" class="method-section section"> + <h3 class="section-header">Public Class Methods</h3> + + + <div id="method-c-for_site" class="method-detail "> + + <div class="method-heading"> + <span class="method-name">for_site</span><span + class="method-args">(site)</span> + <span class="method-click-advice">click to toggle source</span> + </div> + + + <div class="method-description"> + + <p>Return the plugin that can handle a given site.</p> + + + + <div class="method-source-code" id="for_site-source"> + <pre><span class="ruby-comment"># File lib/site_plugin.rb, line 16</span> +<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">for_site</span>(<span class="ruby-identifier">site</span>) + <span class="ruby-identifier">@@repository</span>.<span class="ruby-identifier">find</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">handler</span><span class="ruby-operator">|</span> <span class="ruby-identifier">handler</span>.<span class="ruby-identifier">can_handle?</span> <span class="ruby-identifier">site</span> } +<span class="ruby-keyword">end</span></pre> + </div><!-- for_site-source --> + + </div> + + + + + </div><!-- for_site-method --> + + + <div id="method-c-inherited" class="method-detail "> + + <div class="method-heading"> + <span class="method-name">inherited</span><span + class="method-args">(target)</span> + <span class="method-click-advice">click to toggle source</span> + </div> + + + <div class="method-description"> + + + + + + <div class="method-source-code" id="inherited-source"> + <pre><span class="ruby-comment"># File lib/site_plugin.rb, line 11</span> +<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">inherited</span>(<span class="ruby-identifier">target</span>) + <span class="ruby-identifier">@@repository</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">target</span> +<span class="ruby-keyword">end</span></pre> + </div><!-- inherited-source --> + + </div> + + + + + </div><!-- inherited-method --> + + + <div id="method-c-repository" class="method-detail "> + + <div class="method-heading"> + <span class="method-name">repository</span><span + class="method-args">()</span> + <span class="method-click-advice">click to toggle source</span> + </div> + + + <div class="method-description"> + + + + + + <div class="method-source-code" id="repository-source"> + <pre><span class="ruby-comment"># File lib/site_plugin.rb, line 7</span> +<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">repository</span> + <span class="ruby-identifier">@@repository</span> +<span class="ruby-keyword">end</span></pre> + </div><!-- repository-source --> + + </div> + + + + + </div><!-- repository-method --> + + + </section><!-- public-class-method-details --> + + <section id="public-instance-5Buntitled-5D-method-details" class="method-section section"> + <h3 class="section-header">Public Instance Methods</h3> + + + <div id="method-i-can_handle-3F" class="method-detail "> + + <div class="method-heading"> + <span class="method-name">can_handle?</span><span + class="method-args">(site)</span> + <span class="method-click-advice">click to toggle source</span> + </div> + + + <div class="method-description"> + + <p>A place holder method. This method <strong>must</strong> be implemented in +the subclasses.</p> + + + + <div class="method-source-code" id="can_handle-3F-source"> + <pre><span class="ruby-comment"># File lib/site_plugin.rb, line 21</span> +<span class="ruby-keyword">def</span> <span class="ruby-identifier">can_handle?</span>(<span class="ruby-identifier">site</span>) + <span class="ruby-identifier">raise</span> <span class="ruby-string">"Method not implemented !"</span> +<span class="ruby-keyword">end</span></pre> + </div><!-- can_handle-3F-source --> + + </div> + + + + + </div><!-- can_handle-3F-method --> + + + </section><!-- public-instance-method-details --> + + </section><!-- 5Buntitled-5D --> + +</div><!-- documentation --> + + +<footer id="validator-badges"> + <p><a href="http://validator.w3.org/check/referer">[Validate]</a> + <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12. + <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3. +</footer> + diff --git a/TestPlugin.html b/TestPlugin.html new file mode 100644 index 0000000..8273ae9 --- /dev/null +++ b/TestPlugin.html @@ -0,0 +1,202 @@ +<!DOCTYPE html> + +<html> +<head> +<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> + +<title>class TestPlugin - RDoc Documentation</title> + +<link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet"> + +<script type="text/javascript"> + var rdoc_rel_prefix = "./"; +</script> + +<script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/search.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script> + + +<body id="top" class="class"> +<nav id="metadata"> + <nav id="home-section" class="section"> + <h3 class="section-header"> + <a href="./index.html">Home</a> + <a href="./table_of_contents.html#classes">Classes</a> + <a href="./table_of_contents.html#methods">Methods</a> + </h3> +</nav> + + + <nav id="search-section" class="section project-section" class="initially-hidden"> + <form action="#" method="get" accept-charset="utf-8"> + <h3 class="section-header"> + <input type="text" name="search" placeholder="Search" id="search-field" + title="Type to search, Up and Down to navigate, Enter to load"> + </h3> + </form> + + <ul id="search-results" class="initially-hidden"></ul> +</nav> + + + <div id="file-metadata"> + <nav id="file-list-section" class="section"> + <h3 class="section-header">Defined In</h3> + <ul> + <li>plugins/test_plugin.rb + </ul> +</nav> + + + </div> + + <div id="class-metadata"> + + <nav id="parent-class-section" class="section"> + <h3 class="section-header">Parent</h3> + + <p class="link"><a href="SitePlugin.html">SitePlugin</a> + +</nav> + + + <!-- Method Quickref --> +<nav id="method-list-section" class="section"> + <h3 class="section-header">Methods</h3> + + <ul class="link-list"> + + <li><a href="#method-c-can_handle-3F">::can_handle?</a> + + <li><a href="#method-c-new">::new</a> + + </ul> +</nav> + + </div> + + <div id="project-metadata"> + + <nav id="classindex-section" class="section project-section"> + <h3 class="section-header">Class and Module Index</h3> + + <ul class="link-list"> + + <li><a href="./PlayBot.html">PlayBot</a> + + <li><a href="./SitePlugin.html">SitePlugin</a> + + <li><a href="./TestPlugin.html">TestPlugin</a> + + <li><a href="./TestPlugin1.html">TestPlugin1</a> + + <li><a href="./TestPlugin2.html">TestPlugin2</a> + + </ul> +</nav> + + </div> +</nav> + +<div id="documentation"> + <h1 class="class">class TestPlugin</h1> + + <div id="description" class="description"> + + </div><!-- description --> + + + + + <section id="5Buntitled-5D" class="documentation-section"> + + + + + + + + + <!-- Methods --> + + <section id="public-class-5Buntitled-5D-method-details" class="method-section section"> + <h3 class="section-header">Public Class Methods</h3> + + + <div id="method-c-can_handle-3F" class="method-detail "> + + <div class="method-heading"> + <span class="method-name">can_handle?</span><span + class="method-args">(site)</span> + <span class="method-click-advice">click to toggle source</span> + </div> + + + <div class="method-description"> + + + + + + <div class="method-source-code" id="can_handle-3F-source"> + <pre><span class="ruby-comment"># File plugins/test_plugin.rb, line 5</span> +<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">can_handle?</span>(<span class="ruby-identifier">site</span>) + <span class="ruby-identifier">site</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp">%r(www.)?youtube.(fr|com)|youtu.be/</span> +<span class="ruby-keyword">end</span></pre> + </div><!-- can_handle-3F-source --> + + </div> + + + + + </div><!-- can_handle-3F-method --> + + + <div id="method-c-new" class="method-detail "> + + <div class="method-heading"> + <span class="method-name">new</span><span + class="method-args">()</span> + <span class="method-click-advice">click to toggle source</span> + </div> + + + <div class="method-description"> + + + + + + <div class="method-source-code" id="new-source"> + <pre><span class="ruby-comment"># File plugins/test_plugin.rb, line 9</span> +<span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize</span> + <span class="ruby-ivar">@testVar</span> = <span class="ruby-keyword">true</span> +<span class="ruby-keyword">end</span></pre> + </div><!-- new-source --> + + </div> + + + + + </div><!-- new-method --> + + + </section><!-- public-class-method-details --> + + </section><!-- 5Buntitled-5D --> + +</div><!-- documentation --> + + +<footer id="validator-badges"> + <p><a href="http://validator.w3.org/check/referer">[Validate]</a> + <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12. + <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3. +</footer> + diff --git a/TestPlugin1.html b/TestPlugin1.html new file mode 100644 index 0000000..d77a82c --- /dev/null +++ b/TestPlugin1.html @@ -0,0 +1,170 @@ +<!DOCTYPE html> + +<html> +<head> +<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> + +<title>class TestPlugin1 - RDoc Documentation</title> + +<link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet"> + +<script type="text/javascript"> + var rdoc_rel_prefix = "./"; +</script> + +<script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/search.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script> + + +<body id="top" class="class"> +<nav id="metadata"> + <nav id="home-section" class="section"> + <h3 class="section-header"> + <a href="./index.html">Home</a> + <a href="./table_of_contents.html#classes">Classes</a> + <a href="./table_of_contents.html#methods">Methods</a> + </h3> +</nav> + + + <nav id="search-section" class="section project-section" class="initially-hidden"> + <form action="#" method="get" accept-charset="utf-8"> + <h3 class="section-header"> + <input type="text" name="search" placeholder="Search" id="search-field" + title="Type to search, Up and Down to navigate, Enter to load"> + </h3> + </form> + + <ul id="search-results" class="initially-hidden"></ul> +</nav> + + + <div id="file-metadata"> + <nav id="file-list-section" class="section"> + <h3 class="section-header">Defined In</h3> + <ul> + <li>spec/site_plugin_spec.rb + </ul> +</nav> + + + </div> + + <div id="class-metadata"> + + <nav id="parent-class-section" class="section"> + <h3 class="section-header">Parent</h3> + + <p class="link"><a href="SitePlugin.html">SitePlugin</a> + +</nav> + + + <!-- Method Quickref --> +<nav id="method-list-section" class="section"> + <h3 class="section-header">Methods</h3> + + <ul class="link-list"> + + <li><a href="#method-c-can_handle-3F">::can_handle?</a> + + </ul> +</nav> + + </div> + + <div id="project-metadata"> + + <nav id="classindex-section" class="section project-section"> + <h3 class="section-header">Class and Module Index</h3> + + <ul class="link-list"> + + <li><a href="./PlayBot.html">PlayBot</a> + + <li><a href="./SitePlugin.html">SitePlugin</a> + + <li><a href="./TestPlugin.html">TestPlugin</a> + + <li><a href="./TestPlugin1.html">TestPlugin1</a> + + <li><a href="./TestPlugin2.html">TestPlugin2</a> + + </ul> +</nav> + + </div> +</nav> + +<div id="documentation"> + <h1 class="class">class TestPlugin1</h1> + + <div id="description" class="description"> + + </div><!-- description --> + + + + + <section id="5Buntitled-5D" class="documentation-section"> + + + + + + + + + <!-- Methods --> + + <section id="public-class-5Buntitled-5D-method-details" class="method-section section"> + <h3 class="section-header">Public Class Methods</h3> + + + <div id="method-c-can_handle-3F" class="method-detail "> + + <div class="method-heading"> + <span class="method-name">can_handle?</span><span + class="method-args">(site)</span> + <span class="method-click-advice">click to toggle source</span> + </div> + + + <div class="method-description"> + + + + + + <div class="method-source-code" id="can_handle-3F-source"> + <pre><span class="ruby-comment"># File spec/site_plugin_spec.rb, line 8</span> +<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">can_handle?</span>(<span class="ruby-identifier">site</span>) + <span class="ruby-keyword">false</span> +<span class="ruby-keyword">end</span></pre> + </div><!-- can_handle-3F-source --> + + </div> + + + + + </div><!-- can_handle-3F-method --> + + + </section><!-- public-class-method-details --> + + </section><!-- 5Buntitled-5D --> + +</div><!-- documentation --> + + +<footer id="validator-badges"> + <p><a href="http://validator.w3.org/check/referer">[Validate]</a> + <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12. + <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3. +</footer> + diff --git a/TestPlugin2.html b/TestPlugin2.html new file mode 100644 index 0000000..a3a1588 --- /dev/null +++ b/TestPlugin2.html @@ -0,0 +1,170 @@ +<!DOCTYPE html> + +<html> +<head> +<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> + +<title>class TestPlugin2 - RDoc Documentation</title> + +<link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet"> + +<script type="text/javascript"> + var rdoc_rel_prefix = "./"; +</script> + +<script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/search.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script> + + +<body id="top" class="class"> +<nav id="metadata"> + <nav id="home-section" class="section"> + <h3 class="section-header"> + <a href="./index.html">Home</a> + <a href="./table_of_contents.html#classes">Classes</a> + <a href="./table_of_contents.html#methods">Methods</a> + </h3> +</nav> + + + <nav id="search-section" class="section project-section" class="initially-hidden"> + <form action="#" method="get" accept-charset="utf-8"> + <h3 class="section-header"> + <input type="text" name="search" placeholder="Search" id="search-field" + title="Type to search, Up and Down to navigate, Enter to load"> + </h3> + </form> + + <ul id="search-results" class="initially-hidden"></ul> +</nav> + + + <div id="file-metadata"> + <nav id="file-list-section" class="section"> + <h3 class="section-header">Defined In</h3> + <ul> + <li>spec/site_plugin_spec.rb + </ul> +</nav> + + + </div> + + <div id="class-metadata"> + + <nav id="parent-class-section" class="section"> + <h3 class="section-header">Parent</h3> + + <p class="link"><a href="SitePlugin.html">SitePlugin</a> + +</nav> + + + <!-- Method Quickref --> +<nav id="method-list-section" class="section"> + <h3 class="section-header">Methods</h3> + + <ul class="link-list"> + + <li><a href="#method-c-can_handle-3F">::can_handle?</a> + + </ul> +</nav> + + </div> + + <div id="project-metadata"> + + <nav id="classindex-section" class="section project-section"> + <h3 class="section-header">Class and Module Index</h3> + + <ul class="link-list"> + + <li><a href="./PlayBot.html">PlayBot</a> + + <li><a href="./SitePlugin.html">SitePlugin</a> + + <li><a href="./TestPlugin.html">TestPlugin</a> + + <li><a href="./TestPlugin1.html">TestPlugin1</a> + + <li><a href="./TestPlugin2.html">TestPlugin2</a> + + </ul> +</nav> + + </div> +</nav> + +<div id="documentation"> + <h1 class="class">class TestPlugin2</h1> + + <div id="description" class="description"> + + </div><!-- description --> + + + + + <section id="5Buntitled-5D" class="documentation-section"> + + + + + + + + + <!-- Methods --> + + <section id="public-class-5Buntitled-5D-method-details" class="method-section section"> + <h3 class="section-header">Public Class Methods</h3> + + + <div id="method-c-can_handle-3F" class="method-detail "> + + <div class="method-heading"> + <span class="method-name">can_handle?</span><span + class="method-args">(site)</span> + <span class="method-click-advice">click to toggle source</span> + </div> + + + <div class="method-description"> + + + + + + <div class="method-source-code" id="can_handle-3F-source"> + <pre><span class="ruby-comment"># File spec/site_plugin_spec.rb, line 20</span> +<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">can_handle?</span>(<span class="ruby-identifier">site</span>) + <span class="ruby-identifier">site</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp">%rtest/</span> +<span class="ruby-keyword">end</span></pre> + </div><!-- can_handle-3F-source --> + + </div> + + + + + </div><!-- can_handle-3F-method --> + + + </section><!-- public-class-method-details --> + + </section><!-- 5Buntitled-5D --> + +</div><!-- documentation --> + + +<footer id="validator-badges"> + <p><a href="http://validator.w3.org/check/referer">[Validate]</a> + <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12. + <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3. +</footer> + diff --git a/bdd.sql b/bdd.sql deleted file mode 100644 index 06bd7d7..0000000 --- a/bdd.sql +++ /dev/null @@ -1,34 +0,0 @@ -SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; - - --- --- Structure de la table `playbot_codes` --- - -CREATE TABLE IF NOT EXISTS `playbot_codes` ( - `user` varchar(255) NOT NULL, - `code` varchar(25) NOT NULL, - `nick` varchar(255) DEFAULT NULL, - PRIMARY KEY (`user`), - UNIQUE KEY `code` (`code`), - UNIQUE KEY `nick` (`nick`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - - --- --- Structure de la table `playbot` --- - -CREATE TABLE IF NOT EXISTS `playbot` ( - `date` date NOT NULL, - `type` varchar(15) COLLATE utf8_unicode_ci NOT NULL, - `url` varchar(255) COLLATE utf8_unicode_ci NOT NULL, - `sender_irc` varchar(99) COLLATE utf8_unicode_ci NOT NULL, - `sender` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, - `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL, - `file` varchar(150) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `id` int(11) NOT NULL AUTO_INCREMENT, - `chan` varchar(255) COLLATE utf8_unicode_ci NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `url` (`url`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='table du bot irc' AUTO_INCREMENT=652 ; diff --git a/images/add.png b/images/add.png new file mode 100644 index 0000000000000000000000000000000000000000..6332fefea4be19eeadf211b0b202b272e8564898 GIT binary patch literal 733 zcmV<30wVp1P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!Z%IT!R5;6} zlj}>9VHk(~TedF+gQSL8D5xnVSSWAVY>J9b+m>@{iq7_KE}go~11+5s4;8hc+i0Xa zI1j@EX5!S+Me6HNqKzU5YQwL;-W5$p%ZMKMeR<%zp69-~?<4?8|C8S?bklXr4v&Ov zb&06v2|-x?qB`90yn>Qi%Sh2^G4n)$ZdyvTPf9}1)_buUT7>`e2G&2VU@~Bb(o+Mz zi4)>IxlSY${Dj4k={-9RzU^W5g9|2V5RZ2Zu<x6&^l=W_1sO_5@*~{AJR(k@osu$W zIOyKBVDIZThPU;2xYmJgUn>lL9s2xQbZ@r6eP9Ra5u(s|C0Nj#&4>wTSkb?%#=9?@ z^oxDy-O@tyN{L@by(WWvQ3%CyEu8x{+#Jb4-h&K9Owi)2p<DqQ{Z%tMS5;_RkwZ2s ziU|ZZE*fUaAe}14z#AR(OU=04okqn3igEs-_q_}KZ*?@>gg+heWDyked|3R$$kL@A z#sp1v-r+=G4B8D6DqsDH0@7OztA7aT9qc1Py{()w`m``?Y0&gi2=ROcc-9+nU^I6< zT=e_Y=<?pf1$FXK3F5I5#ceAAN5BHvd?h5_(jPS+7l@o3)VYh{*frx)Pb%2=Sw~G2 znu{1!PYZ*jM}To^G}f>vSnG@?3Ue{BW5ONFttcE!R-R_W4O01|0-|K-YNXLo2`4Qv z`r1LxR6#yf3FB%T95gJnaKKivA~Z}S9A(ZxE<qS_Liq!k=vg3Per<qx!vKx95m{X+ zQ8;uQPPk0h^qI`uo^&$1^CFd@NeQR5pADaHJwu&SvB+fQDdu0d@n7>DK}O3T04USJ P00000NkvXXu0mjf^IS-S literal 0 HcmV?d00001 diff --git a/images/brick.png b/images/brick.png new file mode 100644 index 0000000000000000000000000000000000000000..7851cf34c946e5667221e3478668503eb1cd733f GIT binary patch literal 452 zcmV;#0XzPQP)<h;3K|Lk000e1NJLTq000mG000mO1ONa4wfZ;e00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzR!KxbR2Ufr z!9Pe;0RRW!@7<lIl3o%R*`Lh}3L0v44WhBhrLn=H)^JZ~X)lPPp*Ym3y&;EiD#3^_ z;}R2s(2l&aJKy{DeMJDQEOc(}O)|dId@(Z*AR=OUqSZ^1Bx&_tPDVr&v9i#a-8-w+ zG-X<R@>Pdwe5?6tW?r-ok|b$oDQj8FV%kZPq;(MWOV8?8;<)(iP}>h<N+(r5>NMU> z7fbz%jjlr7h8uuoQ~J6}n}@Y@PdTk=)PxO{%7zmL?dchpZX*~n;I{!C>*(8cU;q(~ zAS%Po_@naEU!xidrBXD?;hN|x^%W|Ij)0y*r5vi|?W&Fub(NqJ@z0o=O<Ao~*SBxI z`SL+wOarB!5l6MHf7`vAYen#UBKI<P{@6LCZG|0M`+1T_cfL~u@bp6FGkdxCW!wI8 u9^8Hp6am2FtGS=SJe+$CKoI}{0Kk9KAGswB^FYP`0000<MNUMnLSTXd=EXk% literal 0 HcmV?d00001 diff --git a/images/brick_link.png b/images/brick_link.png new file mode 100644 index 0000000000000000000000000000000000000000..9ebf013a23a56653655a736a7e149deb7365ea03 GIT binary patch literal 764 zcmV<Y0t5YtP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!j!8s8R5;6R zQq4=^Q55~b!2Ag<W<3P62<AVC7)g*?REu`A(sFPWZK_2?9|KY?Dk3XVN)jw9B3evR z^aU<T#iERcK19Qmte-!p$x=J>&SR3v>A``^efOSo-hEdApp;^Jd;9y!%1UfzX6Bh- z%-mbG|0Na{7Ruai_Y+DEb1s+b!<z(u6)%KZK>*9k%Q!whMxjtZKA*?o;i1g&jy0@( zaU=-@d-h+o%gal6JRXEXA&L3<d6_G5l$8XFi;E5c9334=MZ)LvVRdyCPN!3XF>`d2 z%jIxzZ~*p9O-;EJp_Ds0If38rM<5W8ic~K>FOK&2_p!CLg^i63OioVb6k$)zWHLx3 z5;!|M!}<9+#QSi1dRlbEcxPt^;cysUuU8@%3}RwpLRIGG<|IKnoyP6$Eh3SKw7a*r zSDXP=IYc&YZf;7@?fCe($^l9ORaJ3wbAx0uiC8QqRr$2t-Cfy8%XCI3B%pxJW>XdM zw~zPt_s}#A@pxQ5Ly)4szaMtH9lgE1SXx@b+S(fW`ub$fYPE8J7#bSNDzme*Ub07{ zQKV8SjEs!%0@v5ql8ggm!@$6Rbi^E8vBqpRM-}l+@5OSMrl+TWj*gC^qoV@>u{fQb zov5v?g~?>X@bEC&+uLPaQ&Ypn-y~^mZA}+f(&2EFH8eE%dU|@ENpN*_1-)L6_4Rc* zFuq@`IjX9vp1QiaK9ZojyZhnQURP99d=u;%37VRkpwsD4U0sd3x;hEQB&e^i|3QN0 z=H|Os1fRqaw!?#igLmS4HE!G3*ce(`TF}<kCS&HrU5YiVeML}SUjDAKvhuURV7M?E ujlV1w%Y(pUV`Jl2fiEJ~nByI5So;SIr}_C=u4<M50000<MNUMnLSTaX=VJK) literal 0 HcmV?d00001 diff --git a/images/bug.png b/images/bug.png new file mode 100644 index 0000000000000000000000000000000000000000..2d5fb90ec6ee08f53947e0266a87b03f75893446 GIT binary patch literal 774 zcmV+h1Nr=kP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!m`OxIR5;6> zlgUq0Q544c8(ae&UR$8ps&snq6^bPY3v3xAmMW74Di$h~GCH6E3TaYs2#6A<7K*gC z777H71_Wa;(dfp+g-drPCSWu)#PInZi72LJ;o?i~$-U=y&UbQ89Dul3%3P+Axkzc* zbH-y;QF=hR{qLItf%ci2_&e5wNo0gnVatG?ul6Zw=o$I9Ljfn*ic3`U?>IfEim3g{ zujU&$-hy6wn;w(xme|zJm;lWJxtTFfM)q0`kX!Vu0+d${$}LCddK1<^htTe-fUYL3 zB`SdNsZD>RgvLj1<^@h6_+cDRK2Brcr2~>%$*5S)hyV33PV^teac3%|4lz@8p4?)5 z?t5o^?q+%^%)Yygo~I^U4VR!bTnWuE35hcWrfCDR3q+sxJ79e7Fg`&)RCqLA^2^y^ z0laVfadW90_Fz8Brm|r47sB^u1VgI>kanj)Z4`zMSfHlm8>CwXa$JVM`$2RrmZB-3 zN10m-!;BvH*Br3V8t`DH7m`jf#2upVDXl{5ff<mavWU@F1lMyb8vQzyPGq6ja~k(n zyJ4LwMAcX>18_pzCPK1Zu$$CKKvd8FGeFf)+K<|x33pc7P&S#3GZT4mEw;nr(Ze*F z3&*?-4U-lm*#t<gCyuZ=gqeG7A3)z#^rg8Z=vrz+@wg7Ig$`KUI#iD2pl8ko>ber5 z%S_ceqB`b3ko6r~BbvDwdohTvP(3a(pq{x#T$yQsu#OKwEe}KuH^Mh@nxg_(Nw136 zq#a^3xNBke)In+!?<ES&ylN&<%d1G-<d!CYb1t5U3SgCL7rB$H{GWnLOhq#n{3_0? zSPK_-*fz4_U*K%;$`ipopFsQ<fEC9WzmsT)-->qk3%4wB69{pF`Tzg`07*qoM6N<$ Eg55P&8UO$Q literal 0 HcmV?d00001 diff --git a/images/bullet_black.png b/images/bullet_black.png new file mode 100644 index 0000000000000000000000000000000000000000..57619706d10d9736b1849a83f2c5694fbe09c53b GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$h^>lFz(Kw&{<9vg>5sw~gS5O!4 zr|{HuUFIBKiQyL}eBJ-L{`UVT|6_O~L{G%N{Wbre{kQtZ_0LvEh<e1m{W1TG{hRu` z^=xmrTBL;jnKLdu{NFfXdsB4R+Qx@k0%istytgJC;bWA(_^)`{*9T!h3mH6J{an^L HB{Ts5vOrN_ literal 0 HcmV?d00001 diff --git a/images/bullet_toggle_minus.png b/images/bullet_toggle_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..b47ce55f685dac56ee9d63f2c3d426bfc4c9e31a GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$h^mK6y(Kw&{<9vg>(S^W+6Zii9 z|Nhthr~iNb*Z!}6uiN$Dz5neG3a-`baBX8yz1H+_;eX)`ni0%X8XBDc-`=Ph(Uan2 zYsR{H!kvIN--9isvHznRs<i)4|8qXx+(6ND8xzBc$?{dfrt4dQmN9s``njxgN@xNA D;VV%` literal 0 HcmV?d00001 diff --git a/images/bullet_toggle_plus.png b/images/bullet_toggle_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab4a89664eee1aa81a51ca127f64cb3ac6fa918 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$h_H=O!(Kw&{<9vg>(S^W+6Zii9 z|Nhthr~iNb*Z!}6uiN$Dz5neG3a-`baBX8yz4q@v|B?28{s)#N@CGn3@%_y|zAV9T z66e<&B4?b6oF&azg|C(V&1ZbI_D}pL`}(^FT2yXwG1Ph~$Q@h8mJYOz!PC{xWt~$( F699+YQR)By literal 0 HcmV?d00001 diff --git a/images/date.png b/images/date.png new file mode 100644 index 0000000000000000000000000000000000000000..783c83357fdf90a1c7c024358e1d768b5c09c135 GIT binary patch literal 626 zcmV-&0*(ENP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!1W80eR5;6( zQf+G*K@fiKywr>5OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8<YqcMz2dUgJsF7QDU1o6Af5yuZih`dZo2Qfj(J!cJB&2rCxD zcDqG59>;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BV<Txgy3R<M<VsBsMqV#b=|+haU8i^E)`h#jbk|0zyVpW z*J!ufNT<{2_xq~%`FxIYx$J$pFZv+@4jzq0h|uJ7xg1id6hfg8D6<cb=ox|cn5SLv z7KPDjwNy0@50t8-R{WShT6kIFY&L_S$#d{zGErxS=XY=h`()e>t+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$f<j&%R{#J2 literal 0 HcmV?d00001 diff --git a/images/delete.png b/images/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..08f249365afd29594b51210c6e21ba253897505d GIT binary patch literal 715 zcmV;+0yO=JP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!T}ebiR5;6} zllx0kVHn5#Tecsf1c`2hgi%nK^D=kV+T5njvrLa$EMjSnone|mjm2E}L#U;8)yiKo zO>C4}Mrzlg<+1Y8PEBfUp0jJpx4B>@E+cy3`^(Gw`Mf+2&yxZm<$to~Vpgvg&QKNR z_f#1(r6svZt%iF?s+n<8X?B&!h3g9Dbb8_=MX}!;HiQSAh`bp^WMl~Z-44teO7W_Y zV4thSL{h;rJY7!l3%5J4H1!tIzB`Dv+YxO(haWeausGZYkI8^hWj6mzo=L0{%;<E2 z80_Y*w_}NMA$su)e0B@`wrYegSP*HT5w@N{_}&f79VIb*XrKGBY>yxzh{5!Htr?51 zvG|W62MzC8BZ76hRpCyO2zOn<%e)K>NHge!-~)Ap33OdWw6hsLYbCxGNt0%wk_2z7 zfyYvXheSG)5HRK1VB~%mq7Dmurw#bi@hEcOr3&G1ZiF*$M=&9nB#VNf&Q^r$4G5kp zTURh&s)E0%5&hyVD}sp<72~zmAY`Y(9aqO6CXF%=zFHGzO-A&I(pE}v70YQxCPJ{Y z4L+?5-crdLn3ZRPEs!A4ehEY3ZRpL~w9>@aMN+{F4dI@v&>(QDHQum!mG~E^$OS8l z!7?%Uwib*ROP67Hw`ika)gX-(<Pal@1N`)16#~~<@x7jghg9OTS^;mJ8T{oIOsMnG zla<QHU?S-#Kb7w%o*dlEj!JgnOSKW+hV$`!syc>8Ia`-u_IEhxG7U<13kSsMW+$<e xd62)I>lbb2dUMm5p6pa}cjgA+U$^mJ^AjD?&bdi)8~y+Q002ovPDHLkV1g8IMc@Dc literal 0 HcmV?d00001 diff --git a/images/find.png b/images/find.png new file mode 100644 index 0000000000000000000000000000000000000000..1547479646722bda4647df52cf3e8bc9b77428c6 GIT binary patch literal 659 zcmV;E0&M+>P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!B}qg<R5;6H z`2YVu10|S&>IO9T&v~?D!=C@G6X*U1@h2}>2WE%HrrsjTfQsh6N9%SR25A5rkWp0g zzi;-6|3HJE;58sAyX1e@^d<jmJE#6{n>7EwiKQLb00%dp|5+t<{|l;G!D3eSuFDma zRCxr2MVY_`ELgLXqo}ssqp5E;*r|opZT~&|!~VN?1^mw`Yxp0VmiIp*r|Ey~#AW|W zTBd;IxVd?%*x1<_!3Ip2yP9Rn!u1aqt=siKx4a3At0%7dKV|u@|9wlg|7x7R;eT!K z{QuFp&Huxb3&AdAW?^~2z`(!^HUQ{cR*=op7H|BYU0VMi<mZ&!^8eAvIsetP^uRWP zTmlo1OD_QGV)zHdtY8Du3MyIsLSuef*gF093XJ$~Y+?IfTi^J<tb+1W5ixNCNg27V zViHpSf&Tt4DlYk-myiEHBO~KGpaD$qK=cWUIt&W9U5C&7U$y1H|Lz&fKmoP_B&VvW zv!b$P!vD294uR!BF~Y|$co-!X+<b!n<X1F<4FJ06e|$#ae?4RKs~|a`%~wG&05Tvo zzv6#-VfB9wPOd*F1~|I={)ZU=Q>3A-|5H&#ol!zs_8lnTU<QD~f|Zr+KZ*g?j&9(1 z1|=Yn0#IP;8kzkE`k!A(RpScC08lK!<bYv-Y5*vK7?@as0}tru|3I7nOUo+!2L_@P t(7(4ixw!uW;~f-zpcnvS+GQqEF#w)2XpIh9Jaqs7002ovPDHLkV1l;eHv<3w literal 0 HcmV?d00001 diff --git a/images/loadingAnimation.gif b/images/loadingAnimation.gif new file mode 100644 index 0000000000000000000000000000000000000000..82290f48334c81272ff5991962951758137a08ba GIT binary patch literal 5886 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 Dl)1NK literal 0 HcmV?d00001 diff --git a/images/macFFBgHack.png b/images/macFFBgHack.png new file mode 100644 index 0000000000000000000000000000000000000000..c6473b324ee1dae1faaacc0826639833f551116c GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIEX7WqAsj$Z!;#Vf<Z~8yL>4nJ za0`Jj<E6WGe}IBAC9V-A!TD(=<%vb942~)JNvR5MnMJAP`9;~q3eLgCGp@NY1J#Lw z)HxTWCYEI8=P86_=B6^3>l>Qs8<<Be|IZCnpyBD_7~;|S_N*f#g8>JF;+Fd5q0wCR k?u=~bH}2*0f`J3<krx?0%Kw?)3e>~k>FVdQ&MBb@0BAfpf&c&j literal 0 HcmV?d00001 diff --git a/images/package.png b/images/package.png new file mode 100644 index 0000000000000000000000000000000000000000..da3c2a2d74bab159ba0f65d7db601768258afcb2 GIT binary patch literal 853 zcmV-b1FHOqP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!=Sf6CR5;6h zlS^n^bsUAiduQ&<oixKtrjnE?i9(+-KGJSn)Z#|65V0w>5TQ^(M5v$(QKVE?W+9X! z*o}&~6c?_FreF)9NJB7b5Nbn{G0n4+%uJhR9(V5R|NFTpb|HgjefT!tIhLx@DR+N) zV+fHiR5Yt19}k|KnCsND{tH-`IMJ)3AE?OtyZ4>Un|6(d%h#JK`i&a7^xW9>`yBy` zS4SOHeOpC7$?hH5-#7Rswiue_8Ju*2N@<cu>$58=a#2OTA3png`w3v->gWif7t%e$ z$NLVS!tFT#8WL|Wa&K~+{%4P2cRfwes<Ks@rBR)qR%6DGzB_%zx;t^=2Sm<3wSUZV z3(w;>YV1_!F=3OaRVHl(>=`%&{x*s30c<x*y}ZCyX%=sL<;SENIdkyU%U0B=(JW6Q zVV$&B#jBU8uWfL2>}#CNE@&;ItrAv!f!)Oy$Q9t$uS=(sD$-J{T*^(8Eez1E-l3}} zPrfHZ1`qsIFe&gipuL8-IZbo<Chjw*P$R9RihuxC3MY2}C!NKw%plDQP690NZ?Khc z^BRr%BjQXRQfV}bQ4x}AgvTBXXaLDwxV=Y+QyE<U0kZiUJ5ht!?Z%|Dh!;YvNEoBW zV5>2Yg{lFGKs?ZZWcOaOdk*3`5T;$?AjbG1#`B510Er^h2)2r3Y{!8_2Gj=$KzuN5 zaErtW8W_Y2iJJjY)5pmTVJoPJYpanPOE<ovy}b(QA|$%NgrE^1Xe1avB=$lQsR43_ zP9r8mX=Vx)nNGYn+W%9qv$9rOyfzrN8-;A&VeCvVNCRSzM&&jVx^(xyj^z|szdgs+ zy~&l>uYHclM^C1F>${hFRpdi8a<2H|Xudf78bm(zwJ9`K%6I<a!RpPXihQdgmyUn7 zw9)ZQe_TE?q(;uG$XokfdB<v3mbpLwCvkiIXB8cP`9f*#f8Y3TrY;VRsK}>?q*Ua~ fW9JvIbn5*B+_J)rUMBs>00000NkvXXu0mjfH&TkY literal 0 HcmV?d00001 diff --git a/images/page_green.png b/images/page_green.png new file mode 100644 index 0000000000000000000000000000000000000000..de8e003f9fb8752c09e7f3655d5d8664b5c62fc3 GIT binary patch literal 621 zcmV-z0+RiSP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz|4BqaR2Ufr z!9R@Oa~ucY=l%J9e!uJW>QqUjAtB;_Vvt6}AS_5YgM`Uqu`yva+H8^=4U$e4gHb}u zAQ2N{V3A%pO|?Pv?tb6z=jC}SiRa$G^v3q?*6XcYz$p|cq{uLj@#~Fi`J(>5{@&&N zy%T^+;>8cXx%|o77anP?&W1?<NFc8MyK(Wm8~*t1_`jci`1#z|`+LXGp-uJBx=&|+ z{L|E`C^A?w%yZn_ES`Pf7EeCdeLJq6&UpCxGjDx<+gBgGbljk-&Lo-EQ?qLHVroo9 z6-{9{zq_{g#CiALzqQ?WcRq#&p`f7^txBuXs<bL?D!>1A(>-T49z9pyeCl@7YI+Si zKti7=B~``}TImz(G{0PnlQA3P#MAd}sorMjkP!50B7$nAkU^%#nl{Q9lW0@}9fE-> zN(q7tRuiC_T1r|BBtVBTlQ2+70$Rf;eF`Z;lx46Cpu-rEgb)EBKq(b^W8l<^We(`D z43?0=01z<3G6+UUv6`CsWCk6^93!#+<;ws7007{zS3k2k9-zZKFO~(k`>s0y006+1 zgF_jyIhsL-`FM<ZjG(R@90C9U0O-Aqc^NZw*c>f~JL~C=cV75(CrJ|q;MVO961G=O zm9d)YpJg5g(4i_HKL75eSE}mq$Y}r}hyVdcV~p>6a}oXr80q`oj%+s700000NkvXX Hu0mjfPs|!l literal 0 HcmV?d00001 diff --git a/images/page_white_text.png b/images/page_white_text.png new file mode 100644 index 0000000000000000000000000000000000000000..813f712f726c935f9adf8d2f2dd0d7683791ef11 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%6;pyTSA|c6o&@eC9QG)Hj&ExYL zO&oVL^)+cM^qd@ApywS>pwx0H@RDN}hq;7mU-SKczYQ-hnrr=;iDAQMZQ+*g=YOM= z!QlMQEn7FbaD->uKAYgo_j9)W&$$zS*W9}m(ey0q$&7l-XEWO0Y(9M=SnhLbwy<xp z<-V!w{rtjKUv+o*|6m()ceab>;d>@~SY$Ku*0xPvIOQeV1x7u_z-2-X>_74(yfh7C znXL|3GZ+d2`3re2hs?MK<V&+KGL$sTUzRzG=^m3+$2Td42G30@X|lcy44dbP=-$#! h7h_<U68r8SGxL_I=i_|Jgn@o$@O1TaS?83{1OPX3f*b$< literal 0 HcmV?d00001 diff --git a/images/page_white_width.png b/images/page_white_width.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb880947ddf3e745c29e8d9dc90f09c7e6e323c GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$R?&;zfqH(@;q9b3Efq-lM(nr^( z=EYR73-9e)UYMWsXy%?aZsD68Yyv^2$~6QgEcljw%kx>O(f-gQ?@fOOx3A-0+Qw?O zRx~W)kn~Qe2d6f9nMG#g9Q04Mk==M~N!Dglvxk!fgVh#w@ZV$IY1+Xc`d{d2UcaP~ zfWp)_Ivqj}l2SPy^9ZWy6rG9Yx4v67_uA&&9|XA~5-#3)W3%em1peD8RWH^#O%XoM zxMPud%}GTj#~*+7JMxTd!`{^Q+>(D3*|@KV`*G2;{QnANOxu1$r2xIe;OXk;vd$@? F2>@zac~<}c literal 0 HcmV?d00001 diff --git a/images/plugin.png b/images/plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..6187b15aec001b7080b51a5f944f07591f26cc15 GIT binary patch literal 591 zcmV-V0<iswP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz;Ymb6R5;6} zl08V3aTLaXuVw{)TtAV-EQp(VZ&;&yOGCA^HyY7UV+BnWv^BakMQc+OB&0Z27AkkL zxPppG-9jbH?t7kd8eTEus*7hi@aLT8f1cktNknjvIJDd2gQ>eEcNHZMNv|IbJ-M`( zKwWL~opzjJe^WpCmV9E;(0&ut2;4va_(#>M8)>9$R5viQnf(Nkh~VM$y>J(jqb$cj z+nL1Nm|mV)Gm|9MnHf*7Ja4OEAQz__^LRKOLEwqpiGV^^A*T=#&inGm-62Xs;dnSp zKj&H9T*boh2<no0+=ElOJZ83sfQeG2L`y@C?#3Rz{i>i)W+(n27l!C)>fq|L%VB1i ziC4p;NwV_}ZjW7$LRW#(_bKF#hp=!IqNO26Z*w2+LEwx{PVnZ&Sn}T;m<fe2Wm#Lz za$)sCo<WYS+HDKB-VTSEXg%7B+({$Nn7A;{*z`8{F+2a6g_Xssq{Gq<0W(qT9zX<h z>tzb<gWDVNaLQ|6kUI-2i;UhJKT-oRHNy~7Uq5lS^Bm=sIhHERNTM^>$;qA*nT@@+ zV5uQ@iXDTPoTbV#FRr~z04|PPh`wXTNoCm9*tG&?e3+fYl>K6+&3|Cc$KOpL`ER+_ dcRl5U#9zn6ZO}GF<yZg!002ovPDHLkV1oCe4!{5a literal 0 HcmV?d00001 diff --git a/images/ruby.png b/images/ruby.png new file mode 100644 index 0000000000000000000000000000000000000000..f763a16880751445e3c4a8802a28d3cf8b5787c9 GIT binary patch literal 592 zcmV-W0<ZmvP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz;z>k7R5;7c zlif>`Q5?tj7Yw@ZCMtTF^Q|ZedeJhM%QPCR*bs8V79p$QTo7e94yQNXRs<plf_Ncf zR5#^~QWPqv1!JZS9OCvor@4Ig;`4kuTUS9u;f)7Am*4L>-{0?hOn_-8n0AMO@u1Ts zNl8QzJs1#rz%RBt?ux>l+amAvh+J!{$lkaqv}+Erb-6j2xp>K4GLQnNB*W`hFg*?P z^AL@~(h~Z+w<L#$QHF*{4-TR}eMWp>fcWEXHqV^Tq-#z$7Y#o0;yFxA!00F}F2dX# zjE$iOgT#G4*1TR6kB1Gnn@>$meCh2a>c5YuIvFn-R2W@>4@M*m@-|jiDV?b)bccgA zyPfsMM!rjy>+1O2)5Eg29Z_*2p&qGnmS!OH?vZ(4>QB01d>j%9n4QINxkyT(Dos?I zjaWF$*IQmh`SF-?xU%xMEfjq1=6qY*<aQ_oGc&NTfFYkQ>g&lgG_cXv$BGoIWyfO5 zp>pdV*O+y=&6@N2WWFo(%RtT`Q(H^6zn^a%epE~Kx^mEJ{c8`luC$nc*z9j|4<BKS zj8KR~Q0@hgc{SxgS<62aY4hBLz3EeDqq#sQniR{tT57+=`Cm;G)ioBG_r1)!lG=Cl e>Ms8aJK-la<J!Mps^iK40000<MNUMnLSTYHVh<bu literal 0 HcmV?d00001 diff --git a/images/tag_blue.png b/images/tag_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..3f02b5f8f8bf7c89b60ff70437fb7df6bd95e327 GIT binary patch literal 1880 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 I_CnHs0qX}mlmGw# literal 0 HcmV?d00001 diff --git a/images/tag_green.png b/images/tag_green.png new file mode 100644 index 0000000000000000000000000000000000000000..83ec984bd73364134da0f98d27a800c5d3264180 GIT binary patch literal 613 zcmV-r0-F7aP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz_en%SR5;6p zlSz*fVGxG<Ps~-rzaZ)Od*)(BWAv&{G)7Hy+-~mi#?mc4>^5T)AZ%#@G{_P{NCN^P z(J0zvSn~SSm(Ur);-M~8^*;61*VRI`T1BN&LAhK;sZ>I-SVW;vfUfJv=ko^ugnc0x zhJodBxe>iyk3%w<%wC8<lSyEjCZF8tbZiLam<uG6$(;~^EK@U0qeL#3(<hS&=JPqv z6EK}lL({aa5P_zy8kzW<SvIHBDMmlLh#NAmwcBkZ5(&g&u?>holUJ4(iv>tL{`DQt zPOsyUbO_Cmc&*iHkqbm3ku`|GcC^OhF>jj9W*GkH;^g!iUVpib_h<L;oPk!5X0u5y z5C{Zph>*=@udp4h(P+e*zL_~ZmJjh(y^BxULwq>9zXoYE8sq{#pN~U0C6!8vY)5N2 z9P*}mw}7X<BfL|OZODmogjmVN>$O^qTtJef1ACWvJT9^wt-)Zh0r~j#0bT`f;-zv6 z^Tmw22!%rMcs!TaUX<-8s;X-B`+Xbo<nvX$@ZZ3j=rR8M{e4mFuvfSk(P&f*hr<?K zBDZVmOne8^bITUH-EN2dh}(`M7z~Pjzu%%uTzz5^v;3NPCxAjx6eoLWiw>+_uWuFa z1yIPc?DTrQ7KvRhmt*TG|L=EYQ=LqFX;=Lp`4}jx6BE-@00000NkvXXu0mjf=s_29 literal 0 HcmV?d00001 diff --git a/images/transparent.png b/images/transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..d665e179efd797451084235f105425247fea0a14 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;bAV5X>;M1%mmiTn0pv241o;Is pI6S+N2ITN~x;Tb#$R;N!@B(=T42&&nK2`x)44$rjF6*2UngG277DE64 literal 0 HcmV?d00001 diff --git a/images/wrench.png b/images/wrench.png new file mode 100644 index 0000000000000000000000000000000000000000..5c8213fef5ab969f03189d4367e32e597e38bd7f GIT binary patch literal 610 zcmV-o0-gPdP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz^hrcPR5;6( zlgn=sQ5ePfU;JB)8e@zrS1w(P(S@XGn&CAJ9Uu+`XB?mlZLpTs7)o14)NzKF$>^jb z4`0v}DG1te)wmeb(>p90leRz?_mO+^JKy=v&2<29Od6?F%9%(c8los#f*@G`-%W&* z$)uBj2i<NLrfDJ`kK<ed1a5RX9rXKs<nwt%qtWvT@H}tX)pcD5$8m~%77mBOvMhqZ zpfyo|SpL^)wNNUR5Q#+Ig+d`UlgXgjY=Wlg@dB|}>@u-@SgX}gtyWPe6d*|w6h%R? zScK2#Yn%$sum0cy>90DmY*i{1XqpClEtktsRTZ)<!|U}PxZQ5&37A>l<r4Wm_>CUe z<<Bq-1G!ud48t7SmPu91<MA{oigKO^k+$K@9t!#&NFPnGYaPsp1_FV=U%%gf;WW3$ z8((^t6A1i@fN6PvC$E1ZTm22{=?-o&#{08!8cm+19gbh`LHb}~>FogV^*tm>8*AlX za4oiR!&85LrobG57qUHUX#{>Vz(RHpB5|@>9O6N$jqB8>%($0wxE5R3)b>Y~xtCo$ zCgEk&A?_#IxHdN)9tqre^o{ho4{?hmPuf@^@I3-wncaRd%|~<Ge)vVRgIZCBcqR{V wSNM)gGt<GxA>O3xbrKY=&TiwPYkJroM{;WUQTuMY8vp<R07*qoM6N<$g5pFD$^ZZW literal 0 HcmV?d00001 diff --git a/images/wrench_orange.png b/images/wrench_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..565a9330e0a156dff5bed2c9fad8c95a44344ba4 GIT binary patch literal 584 zcmV-O0=NB%P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz+DSw~R5;6( zle=qEQ5?tfe>g}f4o)2%U3C;eEDoiEh?94d(rV57VIF#8VqzW$HrDC|#U`x@QDbgi zVl)t9GGz&YY#D?gc%>hISA+_EBpnXt#pnC`p6@xw0$8TCbULjhlgVx(kuc)%xbgqq zR5+DNDFRN0!y)7Gm}oT0i39}h4h928qY?Rho^UvPGJ#kuW|-Amtrn`Pmd&+bFo@sp z$LI4IQw7BG?|#2ewOS<<3VjL$0=lMY^m;wqZujv5kx1l%Sl;V&Iy4#$ip3&@LV<F* zOr=u6>2!7vhhN=PCz%^9v24`qb(+m4W?!q-&~=?ssf5GfnAmJK<siIuU1iq_*)@J_ z-lE-Zlgs7sdcAw5WvOb|?e?zKYE=$~xM{+7;oBB`eF2)n_{kC;kLRb$<(fat?fxXQ ztg^Evuz(*Q!2A2qcnTZK{BocBd{j>V;3bvpDm0(NhahZ=&^sqo6Odj6>)Dq_3p~4~ zvb`d3Mydwjt&Df<pvNJ371qya$K8~L)Mfax0Y$O=<~HQ+2^<sn3f!63ro9sjk&955 zv+hdO>^hVmLtI2x=U&h9(JVYX-!y~z3zi;1>=LY;o(bL$(Yf$lf)dMf0-u^0HrpTG Wk@)HE*94aU0000<MNUMnLSTXwQVY`n literal 0 HcmV?d00001 diff --git a/images/zoom.png b/images/zoom.png new file mode 100644 index 0000000000000000000000000000000000000000..908612e394525fc2e52a7e9b94689c25ce167381 GIT binary patch literal 692 zcmV;l0!#ggP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!MoC0LR5;6x z(o0CxK^(yG@64(#mWoThLp|674WUDA(q?t;P?ivh8yG1>m+BBgry{~j2fHLegbHP( zrgXNbr0}2;^nywdjLjZe?uxtrd3D(pZH@fFFc0{BW_~jxoO1w7-VX;6vK@ROA$$R6 zEmo;Ht-Mj|>5jUy{bQ^V5@53LRI8AgLpUm|m+15sqcz@QtVSo|oz7ArM8?pIn+>gN z0b=4_b5O|4A*;Q+vc9Vqr~%3V155*NV~@gTz}KSUiKB-uJzjMZ>5%Q#n24<J>H!V{ zTY(LLAE*NAHZ}C#wnj%Bw5OFIkRhkkAW#kDC3j9Wm0YXRaXlyyp>#mVfYG)eC;@ab zDb=T-BCAY4LI(Z@GOTr2V_A{pRwSmz+8Be>CjAw(=gnbVWAeguvZa93JmL(EDxv1m z0OP4q=fpAK1Mq!C2`OkEn37o;m#wF#(t(8Pu#S?2f#x<~4EO{@fmm`p9veD6RZ_jp z@Au4};q&`XuKEYgIiB4((kgxOs#YdqJw0fY>9^K_agEu5+$#k;w#%I2N>n_?)YIqu z`tq&#_^p?-%K*U0^}|7+9U(&k0?s;=r=uCZ%)H9_edH8wK}gB(nUB1FFk+2Ol%BXV zHoFY`D~2x|2<MlV_LK*M_;d3~#G=f;nc&I5tIrih8*Bdy01TcBh4V@ad&+k0#3A|l z={;ZHP0x8ts$yLLz{9q^VYQ@tHdhs}Ff$+VJXPD&J^o|e06<^M?m#TAFJ@<nYfaq~ aaezN5sVn;(iAePT0000<MNUMnLSTaSf<5^F literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..8d9d870 --- /dev/null +++ b/index.html @@ -0,0 +1,77 @@ +<!DOCTYPE html> + +<html> +<head> +<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> + +<title>RDoc Documentation</title> + +<link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet"> + +<script type="text/javascript"> + var rdoc_rel_prefix = "./"; +</script> + +<script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/search.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script> + + +<body> +<nav id="metadata"> + <nav id="home-section" class="section"> + <h3 class="section-header"> + <a href="./index.html">Home</a> + <a href="./table_of_contents.html#classes">Classes</a> + <a href="./table_of_contents.html#methods">Methods</a> + </h3> +</nav> + + + <nav id="search-section" class="section project-section" class="initially-hidden"> + <form action="#" method="get" accept-charset="utf-8"> + <h3 class="section-header"> + <input type="text" name="search" placeholder="Search" id="search-field" + title="Type to search, Up and Down to navigate, Enter to load"> + </h3> + </form> + + <ul id="search-results" class="initially-hidden"></ul> +</nav> + + + <div id="project-metadata"> + + <nav id="classindex-section" class="section project-section"> + <h3 class="section-header">Class and Module Index</h3> + + <ul class="link-list"> + + <li><a href="./PlayBot.html">PlayBot</a> + + <li><a href="./SitePlugin.html">SitePlugin</a> + + <li><a href="./TestPlugin.html">TestPlugin</a> + + <li><a href="./TestPlugin1.html">TestPlugin1</a> + + <li><a href="./TestPlugin2.html">TestPlugin2</a> + + </ul> +</nav> + + </div> +</nav> + +<p>This is the API documentation for RDoc Documentation. + + +<footer id="validator-badges"> + <p><a href="http://validator.w3.org/check/referer">[Validate]</a> + <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12. + <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3. +</footer> + diff --git a/js/darkfish.js b/js/darkfish.js new file mode 100644 index 0000000..4be722f --- /dev/null +++ b/js/darkfish.js @@ -0,0 +1,153 @@ +/** + * + * Darkfish Page Functions + * $Id: darkfish.js 53 2009-01-07 02:52:03Z deveiant $ + * + * Author: Michael Granger <mgranger@laika.com> + * + */ + +/* Provide console simulation for firebug-less environments */ +if (!("console" in window) || !("firebug" in console)) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", + "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; + + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +}; + + +/** + * Unwrap the first element that matches the given @expr@ from the targets and return them. + */ +$.fn.unwrap = function( expr ) { + return this.each( function() { + $(this).parents( expr ).eq( 0 ).after( this ).remove(); + }); +}; + + +function showSource( e ) { + var target = e.target; + var codeSections = $(target). + parents('.method-detail'). + find('.method-source-code'); + + $(target). + parents('.method-detail'). + find('.method-source-code'). + slideToggle(); +}; + +function hookSourceViews() { + $('.method-heading').click( showSource ); +}; + +function toggleDebuggingSection() { + $('.debugging-section').slideToggle(); +}; + +function hookDebuggingToggle() { + $('#debugging-toggle img').click( toggleDebuggingSection ); +}; + +function hookTableOfContentsToggle() { + $('.indexpage li .toc-toggle').each( function() { + $(this).click( function() { + $(this).toggleClass('open'); + }); + + var section = $(this).next(); + + $(this).click( function() { + section.slideToggle(); + }); + }); +} + +function hookSearch() { + var input = $('#search-field').eq(0); + var result = $('#search-results').eq(0); + $(result).show(); + + var search_section = $('#search-section').get(0); + $(search_section).show(); + + var search = new Search(search_data, input, result); + + search.renderItem = function(result) { + var li = document.createElement('li'); + var html = ''; + + // TODO add relative path to <script> per-page + html += '<p class="search-match"><a href="' + rdoc_rel_prefix + result.path + '">' + this.hlt(result.title); + if (result.params) + html += '<span class="params">' + result.params + '</span>'; + html += '</a>'; + + + if (result.namespace) + html += '<p class="search-namespace">' + this.hlt(result.namespace); + + if (result.snippet) + html += '<div class="search-snippet">' + result.snippet + '</div>'; + + li.innerHTML = html; + + return li; + } + + search.select = function(result) { + var result_element = result.get(0); + window.location.href = result_element.firstChild.firstChild.href; + } + + search.scrollIntoView = search.scrollInWindow; +}; + +function highlightTarget( anchor ) { + console.debug( "Highlighting target '%s'.", anchor ); + + $("a[name=" + anchor + "]").each( function() { + if ( !$(this).parent().parent().hasClass('target-section') ) { + console.debug( "Wrapping the target-section" ); + $('div.method-detail').unwrap( 'div.target-section' ); + $(this).parent().wrap( '<div class="target-section"></div>' ); + } else { + console.debug( "Already wrapped." ); + } + }); +}; + +function highlightLocationTarget() { + console.debug( "Location hash: %s", window.location.hash ); + if ( ! window.location.hash || window.location.hash.length == 0 ) return; + + var anchor = window.location.hash.substring(1); + console.debug( "Found anchor: %s; matching %s", anchor, "a[name=" + anchor + "]" ); + + highlightTarget( anchor ); +}; + +function highlightClickTarget( event ) { + console.debug( "Highlighting click target for event %o", event.target ); + try { + var anchor = $(event.target).attr( 'href' ).substring(1); + console.debug( "Found target anchor: %s", anchor ); + highlightTarget( anchor ); + } catch ( err ) { + console.error( "Exception while highlighting: %o", err ); + }; +}; + + +$(document).ready( function() { + hookSourceViews(); + hookDebuggingToggle(); + hookSearch(); + highlightLocationTarget(); + hookTableOfContentsToggle(); + + $('ul.link-list a').bind( "click", highlightClickTarget ); +}); diff --git a/js/jquery.js b/js/jquery.js new file mode 100644 index 0000000..48590ec --- /dev/null +++ b/js/jquery.js @@ -0,0 +1,18 @@ +/*! + * jQuery JavaScript Library v1.6.2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Jun 30 14:16:56 2011 -0400 + */ +(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bZ(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bY(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bC.test(a)?d(a,e):bY(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)bY(a+"["+e+"]",b[e],c,d);else d(a,b)}function bX(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bR,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bX(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bX(a,c,d,e,"*",g));return l}function bW(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bN),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bA(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bv:bw;if(d>0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)f.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function bg(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function W(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(R.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;i<s.length;i++)g=s[i],g.origType.replace(x,"")===a.type?q.push(g.selector):s.splice(i--,1);e=f(a.target).closest(q,a.currentTarget);for(j=0,k=e.length;j<k;j++){m=e[j];for(i=0;i<s.length;i++){g=s[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,d=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,d=f(a.relatedTarget).closest(g.selector)[0],d&&f.contains(h,d)&&(d=h);(!d||d!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){e=p[j];if(c&&e.level>c)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b){if(H)return H.call(b,a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=s.exec(a)||t.exec(a)||u.exec(a)||a.indexOf("compatible")<0&&v.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g="done fail isResolved isRejected promise then always pipe".split(" "),h=[].slice;f.extend({_Deferred:function(){var a=[],b,c,d,e={done:function(){if(!d){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=f.type(i),j==="array"?e.done.apply(e,i):j==="function"&&a.push(i);k&&e.resolveWith(k[0],k[1])}return this},resolveWith:function(e,f){if(!d&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(e,f)}finally{b=[e,f],c=0}}return this},resolve:function(){e.resolveWith(this,arguments);return this},isResolved:function(){return!!c||!!b},cancel:function(){d=1,a=[];return this}};return e},Deferred:function(a){var b=f._Deferred(),c=f._Deferred(),d;f.extend(b,{then:function(a,c){b.done(a).fail(c);return this},always:function(){return b.done.apply(b,arguments).fail.apply(this,arguments)},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,pipe:function(a,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[c,"reject"]},function(a,c){var e=c[0],g=c[1],h;f.isFunction(e)?b[a](function(){h=e.apply(this,arguments),h&&f.isFunction(h.promise)?h.promise().then(d.resolve,d.reject):d[g](h)}):b[a](d[g])})}).promise()},promise:function(a){if(a==null){if(d)return d;d=a={}}var c=g.length;while(c--)a[g[c]]=b[g[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c<d;c++)b[c]&&f.isFunction(b[c].promise)?b[c].promise().then(i(c),g.reject):--e;e||g.resolveWith(g,b)}else g!==a&&g.resolveWith(g,d?[a]:[]);return g.promise()}}),f.support=function(){var a=c.createElement("div"),b=c.documentElement,d,e,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;a.setAttribute("className","t"),a.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h<i;h++)g=e[h].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),k(this[0],g,d[g]))}}return d}if(typeof a=="object")return this.each(function(){f.data(this,a)});var j=a.split(".");j[1]=j[1]?"."+j[1]:"";if(c===b){d=this.triggerHandler("getData"+j[1]+"!",[j[0]]),d===b&&this.length&&(d=f.data(this[0],a),d=k(this[0],a,d));return d===b&&j[1]?this.data(j[0]):d}return this.each(function(){var b=f(this),d=[j[0],c];b.triggerHandler("setData"+j[1]+"!",d),f.data(this,a,c),b.triggerHandler("changeData"+j[1]+"!",d)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,c){a&&(c=(c||"fx")+"mark",f.data(a,c,(f.data(a,c,b,!0)||0)+1,!0))},_unmark:function(a,c,d){a!==!0&&(d=c,c=a,a=!1);if(c){d=d||"fx";var e=d+"mark",g=a?0:(f.data(c,e,b,!0)||1)-1;g?f.data(c,e,g,!0):(f.removeData(c,e,!0),m(c,d,"mark"))}},queue:function(a,c,d){if(a){c=(c||"fx")+"queue";var e=f.data(a,c,b,!0);d&&(!e||f.isArray(d)?e=f.data(a,c,f.makeArray(d),!0):e.push(d));return e||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e;d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),d.call(a,function(){f.dequeue(a,b)})),c.length||(f.removeData(a,b+"queue",!0),m(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){f.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f._Deferred(),!0))h++,l.done(m);m();return d.promise()}});var n=/[\n\t\r]/g,o=/\s+/,p=/\r/g,q=/^(?:button|input)$/i,r=/^(?:button|input|object|select|textarea)$/i,s=/^a(?:rea)?$/i,t=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,u=/\:|^on/,v,w;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(o);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(o);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(n," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(o);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(n," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h<i;h++){var j=e[h];if(j.selected&&(f.support.optDisabled?!j.disabled:j.getAttribute("disabled")===null)&&(!j.parentNode.disabled||!f.nodeName(j.parentNode,"optgroup"))){b=f(j).val();if(g)return b;d.push(b)}}if(g&&!d.length&&e.length)return f(e[c]).val();return d},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))f.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=f.event.special[h]||{};for(j=e||0;j<p.length;j++){q=p[j];if(d.guid===q.guid){if(l||n.test(q.namespace))e==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(e!=null)break}}if(p.length===0||e!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&f.removeEvent(a,h,s.handle),g=null,delete t[h]}if(f.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,f.isEmptyObject(s)&&f.removeData(a,b,!0)}}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){var h=c.type||c,i=[],j;h.indexOf("!")>=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. +shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h<i;h++){var j=d[h];if(e||c.namespace_re.test(j.namespace)){c.handler=j.handler,c.data=j.data,c.handleObj=j;var k=j.handler.apply(this,g);k!==b&&(c.result=k,k===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[f.expando])return a;var d=a;a=f.Event(d);for(var e=this.props.length,g;e;)g=this.props[--e],a[g]=d[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=a.target.ownerDocument||c,i=h.documentElement,j=h.body;a.pageX=a.clientX+(i&&i.scrollLeft||j&&j.scrollLeft||0)-(i&&i.clientLeft||j&&j.clientLeft||0),a.pageY=a.clientY+(i&&i.scrollTop||j&&j.scrollTop||0)-(i&&i.clientTop||j&&j.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:f.proxy,special:{ready:{setup:f.bindReady,teardown:f.noop},live:{add:function(a){f.event.add(this,N(a.origType,a.selector),f.extend({},a,{handler:M,guid:a.handler.guid}))},remove:function(a){f.event.remove(this,N(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!this.preventDefault)return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?E:D):this.type=a,b&&f.extend(this,b),this.timeStamp=f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=E;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=E;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=E,this.stopPropagation()},isDefaultPrevented:D,isPropagationStopped:D,isImmediatePropagationStopped:D};var F=function(a){var b=a.relatedTarget,c=!1,d=a.type;a.type=a.data,b!==this&&(b&&(c=f.contains(this,b)),c||(f.event.handle.apply(this,arguments),a.type=d))},G=function(a){a.type=a.data,f.event.handle.apply(this,arguments)};f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={setup:function(c){f.event.add(this,b,c&&c.selector?G:F,a)},teardown:function(a){f.event.remove(this,b,a&&a.selector?G:F)}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(a,b){if(!f.nodeName(this,"form"))f.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&f(b).closest("form").length&&K("submit",this,arguments)}),f.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&f(b).closest("form").length&&a.keyCode===13&&K("submit",this,arguments)});else return!1},teardown:function(a){f.event.remove(this,".specialSubmit")}});if(!f.support.changeBubbles){var H,I=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i<j;i++)f.event.add(this[i],a,g,d);return this}}),f.fn.extend({unbind:function(a,b){if(typeof a=="object"&&!a.preventDefault)for(var c in a)this.unbind(c,a[c]);else for(var d=0,e=this.length;d<e;d++)f.event.remove(this[d],a,b);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f.data(this,"lastToggle"+a.guid)||0)%d;f.data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var L={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};f.each(["live","die"],function(a,c){f.fn[c]=function(a,d,e,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:f(this.context);if(typeof a=="object"&&!a.preventDefault){for(var o in a)n[c](o,d,a[o],m);return this}if(c==="die"&&!a&&g&&g.charAt(0)==="."){n.unbind(g);return this}if(d===!1||f.isFunction(d))e=d||D,d=b;a=(a||"").split(" ");while((h=a[i++])!=null){j=x.exec(h),k="",j&&(k=j[0],h=h.replace(x,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,L[h]?(a.push(L[h]+k),h=h+k):h=(L[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)f.event.add(n[p],"live."+N(h,m),{data:d,selector:m,handler:e,origType:h,origHandler:e,preType:l});else n.unbind("live."+N(h,m),e)}return this}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(!f)g=o=!0;else if(f===!0)continue}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("parentNode",b,f,a,e,c)},"~":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("previousSibling",b,f,a,e,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c<f;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){if(a===b){g=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};f.find=k,f.expr=k.selectors,f.expr[":"]=f.expr.filters,f.unique=k.uniqueSort,f.text=k.getText,f.isXMLDoc=k.isXML,f.contains=k.contains}();var O=/Until$/,P=/^(?:parents|prevUntil|prevAll)/,Q=/,/,R=/^.[^:#\[\.,]*$/,S=Array.prototype.slice,T=f.expr.match.POS,U={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(W(this,a,!1),"not",a)},filter:function(a){return this.pushStack(W(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d<e;d++)i=a[d],j[i]||(j[i]=T.test(i)?f(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(l?l.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/<tbody/i,ba=/<|&#?\w+;/,bb=/<(?:script|object|embed|option|style)/i,bc=/checked\s*(?:[^=]|=\s*.checked.)/i,bd=/\/(java|ecma)script/i,be=/^\s*<!(?:\[CDATA\[|\-\-)/,bf={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bc.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bg(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bm)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i;b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof a[0]=="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!bb.test(a[0])&&(f.support.checkClone||!bc.test(a[0]))&&(g=!0,h=f.fragments[a[0]],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[a[0]]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j +)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1></$2>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bl(k[i]);else bl(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||bd.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.expando,g=f.event.special,h=f.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&f.noData[j.nodeName.toLowerCase()])continue;c=j[f.expando];if(c){b=d[c]&&d[c][e];if(b&&b.events){for(var k in b.events)g[k]?f.event.remove(j,k):f.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[f.expando]:j.removeAttribute&&j.removeAttribute(f.expando),delete d[c]}}}});var bn=/alpha\([^)]*\)/i,bo=/opacity=([^)]*)/,bp=/([A-Z]|^ms)/g,bq=/^-?\d+(?:px)?$/i,br=/^-?\d/,bs=/^[+\-]=/,bt=/[^+\-\.\de]+/g,bu={position:"absolute",visibility:"hidden",display:"block"},bv=["Left","Right"],bw=["Top","Bottom"],bx,by,bz;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bx(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d;if(h==="number"&&isNaN(d)||d==null)return;h==="string"&&bs.test(d)&&(d=+d.replace(bt,"")+parseFloat(f.css(a,c)),h="number"),h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bx)return bx(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bA(a,b,d);f.swap(a,bu,function(){e=bA(a,b,d)});return e}},set:function(a,b){if(!bq.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cs(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cr("hide",3),a,b,c);for(var d=0,e=this.length;d<e;d++)if(this[d].style){var g=f.css(this[d],"display");g!=="none"&&!f._data(this[d],"olddisplay")&&f._data(this[d],"olddisplay",g)}for(d=0;d<e;d++)this[d].style&&(this[d].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cr("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return this[e.queue===!1?"each":"queue"](function(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(f.support.inlineBlockNeedsLayout?(j=cs(this.nodeName),j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)):this.style.display="inline-block"))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)k=new f.fx(this,b,i),h=a[i],cj.test(h)?k[h==="toggle"?d?"show":"hide":h]():(l=ck.exec(h),m=k.cur(),l?(n=parseFloat(l[2]),o=l[3]||(f.cssNumber[i]?"":"px"),o!=="px"&&(f.style(this,i,(n||1)+o),m=(n||1)/k.cur()*m,f.style(this,i,m+o)),l[1]&&(n=(l[1]==="-="?-1:1)*n+m),k.custom(m,n,o)):k.custom(m,h,""));return!0})},stop:function(a,b){a&&this.queue([]),this.each(function(){var a=f.timers,c=a.length;b||f._unmark(!0,this);while(c--)a[c].elem===this&&(b&&a[c](!0),a.splice(c,1))}),b||this.dequeue();return this}}),f.each({slideDown:cr("show",1),slideUp:cr("hide",1),slideToggle:cr("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default,d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue!==!1?f.dequeue(this):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function h(a){return d.step(a)}var d=this,e=f.fx,g;this.startTime=cn||cp(),this.start=a,this.end=b,this.unit=c||this.unit||(f.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,h.elem=this.elem,h()&&f.timers.push(h)&&!cl&&(co?(cl=!0,g=function(){cl&&(co(g),e.tick())},co(g)):cl=setInterval(e.tick,e.interval))},show:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=cn||cp(),c=!0,d=this.elem,e=this.options,g,h;if(a||b>=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b<a.length;++b)a[b]()||a.splice(b--,1);a.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cl),cl=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var ct=/^t(?:able|d|h)$/i,cu=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cv(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);f.offset.initialize();var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.offset.doesNotAddBorder&&(!f.offset.doesAddBorderForTableAndCells||!ct.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={initialize:function(){var a=c.body,b=c.createElement("div"),d,e,g,h,i=parseFloat(f.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/js/navigation.js b/js/navigation.js new file mode 100644 index 0000000..e412681 --- /dev/null +++ b/js/navigation.js @@ -0,0 +1,142 @@ +/* + * Navigation allows movement using the arrow keys through the search results. + * + * When using this library you will need to set scrollIntoView to the + * appropriate function for your layout. Use scrollInWindow if the container + * is not scrollable and scrollInElement if the container is a separate + * scrolling region. + */ +Navigation = new function() { + this.initNavigation = function() { + var _this = this; + + $(document).keydown(function(e) { + _this.onkeydown(e); + }).keyup(function(e) { + _this.onkeyup(e); + }); + + this.navigationActive = true; + } + + this.setNavigationActive = function(state) { + this.navigationActive = state; + this.clearMoveTimeout(); + } + + this.onkeyup = function(e) { + if (!this.navigationActive) return; + + switch(e.keyCode) { + case 37: //Event.KEY_LEFT: + case 38: //Event.KEY_UP: + case 39: //Event.KEY_RIGHT: + case 40: //Event.KEY_DOWN: + this.clearMoveTimeout(); + break; + } + } + + this.onkeydown = function(e) { + if (!this.navigationActive) return; + switch(e.keyCode) { + case 37: //Event.KEY_LEFT: + if (this.moveLeft()) e.preventDefault(); + break; + case 38: //Event.KEY_UP: + if (e.keyCode == 38 || e.ctrlKey) { + if (this.moveUp()) e.preventDefault(); + this.startMoveTimeout(false); + } + break; + case 39: //Event.KEY_RIGHT: + if (this.moveRight()) e.preventDefault(); + break; + case 40: //Event.KEY_DOWN: + if (e.keyCode == 40 || e.ctrlKey) { + if (this.moveDown()) e.preventDefault(); + this.startMoveTimeout(true); + } + break; + case 13: //Event.KEY_RETURN: + if (this.$current) + e.preventDefault(); + this.select(this.$current); + break; + } + if (e.ctrlKey && e.shiftKey) this.select(this.$current); + } + + this.clearMoveTimeout = function() { + clearTimeout(this.moveTimeout); + this.moveTimeout = null; + } + + this.startMoveTimeout = function(isDown) { + if (!$.browser.mozilla && !$.browser.opera) return; + if (this.moveTimeout) this.clearMoveTimeout(); + var _this = this; + + var go = function() { + if (!_this.moveTimeout) return; + _this[isDown ? 'moveDown' : 'moveUp'](); + _this.moveTimout = setTimeout(go, 100); + } + this.moveTimeout = setTimeout(go, 200); + } + + this.moveRight = function() { + } + + this.moveLeft = function() { + } + + this.move = function(isDown) { + } + + this.moveUp = function() { + return this.move(false); + } + + this.moveDown = function() { + return this.move(true); + } + + /* + * Scrolls to the given element in the scrollable element view. + */ + this.scrollInElement = function(element, view) { + var offset, viewHeight, viewScroll, height; + offset = element.offsetTop; + height = element.offsetHeight; + viewHeight = view.offsetHeight; + viewScroll = view.scrollTop; + + if (offset - viewScroll + height > viewHeight) { + view.scrollTop = offset - viewHeight + height; + } + if (offset < viewScroll) { + view.scrollTop = offset; + } + } + + /* + * Scrolls to the given element in the window. The second argument is + * ignored + */ + this.scrollInWindow = function(element, ignored) { + var offset, viewHeight, viewScroll, height; + offset = element.offsetTop; + height = element.offsetHeight; + viewHeight = window.innerHeight; + viewScroll = window.scrollY; + + if (offset - viewScroll + height > viewHeight) { + window.scrollTo(window.scrollX, offset - viewHeight + height); + } + if (offset < viewScroll) { + window.scrollTo(window.scrollX, offset); + } + } +} + diff --git a/js/search.js b/js/search.js new file mode 100644 index 0000000..dbdfdcb --- /dev/null +++ b/js/search.js @@ -0,0 +1,94 @@ +Search = function(data, input, result) { + this.data = data; + this.$input = $(input); + this.$result = $(result); + + this.$current = null; + this.$view = this.$result.parent(); + this.searcher = new Searcher(data.index); + this.init(); +} + +Search.prototype = $.extend({}, Navigation, new function() { + var suid = 1; + + this.init = function() { + var _this = this; + var observer = function() { + _this.search(_this.$input[0].value); + }; + this.$input.keyup(observer); + this.$input.click(observer); // mac's clear field + + this.searcher.ready(function(results, isLast) { + _this.addResults(results, isLast); + }) + + this.initNavigation(); + this.setNavigationActive(false); + } + + this.search = function(value, selectFirstMatch) { + value = jQuery.trim(value).toLowerCase(); + if (value) { + this.setNavigationActive(true); + } else { + this.setNavigationActive(false); + } + + if (value == '') { + this.lastQuery = value; + this.$result.empty(); + this.setNavigationActive(false); + } else if (value != this.lastQuery) { + this.lastQuery = value; + this.firstRun = true; + this.searcher.find(value); + } + } + + this.addResults = function(results, isLast) { + var target = this.$result.get(0); + if (this.firstRun && (results.length > 0 || isLast)) { + this.$current = null; + this.$result.empty(); + } + + for (var i=0, l = results.length; i < l; i++) { + target.appendChild(this.renderItem.call(this, results[i])); + }; + + if (this.firstRun && results.length > 0) { + this.firstRun = false; + this.$current = $(target.firstChild); + this.$current.addClass('current'); + } + if (jQuery.browser.msie) this.$element[0].className += ''; + } + + this.move = function(isDown) { + if (!this.$current) return; + var $next = this.$current[isDown ? 'next' : 'prev'](); + if ($next.length) { + this.$current.removeClass('current'); + $next.addClass('current'); + this.scrollIntoView($next[0], this.$view[0]); + this.$current = $next; + } + return true; + } + + this.hlt = function(html) { + return this.escapeHTML(html). + replace(/\u0001/g, '<em>'). + replace(/\u0002/g, '</em>'); + } + + this.escapeHTML = function(html) { + return html.replace(/[&<>]/g, function(c) { + return '&#' + c.charCodeAt(0) + ';'; + }); + } + +}); + diff --git a/js/search_index.js b/js/search_index.js new file mode 100644 index 0000000..d759daa --- /dev/null +++ b/js/search_index.js @@ -0,0 +1 @@ +var search_data = {"index":{"searchIndex":["playbot","siteplugin","testplugin","testplugin1","testplugin2","add_custom_handlers()","can_handle?()","can_handle?()","can_handle?()","can_handle?()","for_site()","inherited()","new()","new()","repository()"],"longSearchIndex":["playbot","siteplugin","testplugin","testplugin1","testplugin2","playbot#add_custom_handlers()","siteplugin#can_handle?()","testplugin::can_handle?()","testplugin1::can_handle?()","testplugin2::can_handle?()","siteplugin::for_site()","siteplugin::inherited()","playbot::new()","testplugin::new()","siteplugin::repository()"],"info":[["PlayBot","","PlayBot.html","",""],["SitePlugin","","SitePlugin.html","","<p>Implement a plugin system.\n<p>Each plugin have to inherite from this class and implement a\ncan_handle?(site) …\n"],["TestPlugin","","TestPlugin.html","",""],["TestPlugin1","","TestPlugin1.html","",""],["TestPlugin2","","TestPlugin2.html","",""],["add_custom_handlers","PlayBot","PlayBot.html#method-i-add_custom_handlers","()","<p>This metod is called by IRCBot#connect_socket\n"],["can_handle?","SitePlugin","SitePlugin.html#method-i-can_handle-3F","(site)","<p>A place holder method. This method <strong>must</strong> be implemented in\nthe subclasses.\n"],["can_handle?","TestPlugin","TestPlugin.html#method-c-can_handle-3F","(site)",""],["can_handle?","TestPlugin1","TestPlugin1.html#method-c-can_handle-3F","(site)",""],["can_handle?","TestPlugin2","TestPlugin2.html#method-c-can_handle-3F","(site)",""],["for_site","SitePlugin","SitePlugin.html#method-c-for_site","(site)","<p>Return the plugin that can handle a given site.\n"],["inherited","SitePlugin","SitePlugin.html#method-c-inherited","(target)",""],["new","PlayBot","PlayBot.html#method-c-new","(options = {})","<p>Start a new instance\n<p>Options:\n<p><code>:address</code>: irc server\n"],["new","TestPlugin","TestPlugin.html#method-c-new","()",""],["repository","SitePlugin","SitePlugin.html#method-c-repository","()",""]]}} \ No newline at end of file diff --git a/js/searcher.js b/js/searcher.js new file mode 100644 index 0000000..f854b54 --- /dev/null +++ b/js/searcher.js @@ -0,0 +1,228 @@ +Searcher = function(data) { + this.data = data; + this.handlers = []; +} + +Searcher.prototype = new function() { + // search is performed in chunks of 1000 for non-blocking user input + var CHUNK_SIZE = 1000; + // do not try to find more than 100 results + var MAX_RESULTS = 100; + var huid = 1; + var suid = 1; + var runs = 0; + + this.find = function(query) { + var queries = splitQuery(query); + var regexps = buildRegexps(queries); + var highlighters = buildHilighters(queries); + var state = { from: 0, pass: 0, limit: MAX_RESULTS, n: suid++}; + var _this = this; + + this.currentSuid = state.n; + + if (!query) return; + + var run = function() { + // stop current search thread if new search started + if (state.n != _this.currentSuid) return; + + var results = + performSearch(_this.data, regexps, queries, highlighters, state); + var hasMore = (state.limit > 0 && state.pass < 4); + + triggerResults.call(_this, results, !hasMore); + if (hasMore) { + setTimeout(run, 2); + } + runs++; + }; + runs = 0; + + // start search thread + run(); + } + + /* ----- Events ------ */ + this.ready = function(fn) { + fn.huid = huid; + this.handlers.push(fn); + } + + /* ----- Utilities ------ */ + function splitQuery(query) { + return jQuery.grep(query.split(/(\s+|::?|\(\)?)/), function(string) { + return string.match(/\S/) + }); + } + + function buildRegexps(queries) { + return jQuery.map(queries, function(query) { + return new RegExp(query.replace(/(.)/g, '([$1])([^$1]*?)'), 'i') + }); + } + + function buildHilighters(queries) { + return jQuery.map(queries, function(query) { + return jQuery.map(query.split(''), function(l, i) { + return '\u0001$' + (i*2+1) + '\u0002$' + (i*2+2); + }).join(''); + }); + } + + // function longMatchRegexp(index, longIndex, regexps) { + // for (var i = regexps.length - 1; i >= 0; i--){ + // if (!index.match(regexps[i]) && !longIndex.match(regexps[i])) return false; + // }; + // return true; + // } + + + /* ----- Mathchers ------ */ + + /* + * This record matches if the index starts with queries[0] and the record + * matches all of the regexps + */ + function matchPassBeginning(index, longIndex, queries, regexps) { + if (index.indexOf(queries[0]) != 0) return false; + for (var i=1, l = regexps.length; i < l; i++) { + if (!index.match(regexps[i]) && !longIndex.match(regexps[i])) + return false; + }; + return true; + } + + /* + * This record matches if the longIndex starts with queries[0] and the + * longIndex matches all of the regexps + */ + function matchPassLongIndex(index, longIndex, queries, regexps) { + if (longIndex.indexOf(queries[0]) != 0) return false; + for (var i=1, l = regexps.length; i < l; i++) { + if (!longIndex.match(regexps[i])) + return false; + }; + return true; + } + + /* + * This record matches if the index contains queries[0] and the record + * matches all of the regexps + */ + function matchPassContains(index, longIndex, queries, regexps) { + if (index.indexOf(queries[0]) == -1) return false; + for (var i=1, l = regexps.length; i < l; i++) { + if (!index.match(regexps[i]) && !longIndex.match(regexps[i])) + return false; + }; + return true; + } + + /* + * This record matches if regexps[0] matches the index and the record + * matches all of the regexps + */ + function matchPassRegexp(index, longIndex, queries, regexps) { + if (!index.match(regexps[0])) return false; + for (var i=1, l = regexps.length; i < l; i++) { + if (!index.match(regexps[i]) && !longIndex.match(regexps[i])) + return false; + }; + return true; + } + + + /* ----- Highlighters ------ */ + function highlightRegexp(info, queries, regexps, highlighters) { + var result = createResult(info); + for (var i=0, l = regexps.length; i < l; i++) { + result.title = result.title.replace(regexps[i], highlighters[i]); + result.namespace = result.namespace.replace(regexps[i], highlighters[i]); + }; + return result; + } + + function hltSubstring(string, pos, length) { + return string.substring(0, pos) + '\u0001' + string.substring(pos, pos + length) + '\u0002' + string.substring(pos + length); + } + + function highlightQuery(info, queries, regexps, highlighters) { + var result = createResult(info); + var pos = 0; + var lcTitle = result.title.toLowerCase(); + + pos = lcTitle.indexOf(queries[0]); + if (pos != -1) { + result.title = hltSubstring(result.title, pos, queries[0].length); + } + + result.namespace = result.namespace.replace(regexps[0], highlighters[0]); + for (var i=1, l = regexps.length; i < l; i++) { + result.title = result.title.replace(regexps[i], highlighters[i]); + result.namespace = result.namespace.replace(regexps[i], highlighters[i]); + }; + return result; + } + + function createResult(info) { + var result = {}; + result.title = info[0]; + result.namespace = info[1]; + result.path = info[2]; + result.params = info[3]; + result.snippet = info[4]; + return result; + } + + /* ----- Searching ------ */ + function performSearch(data, regexps, queries, highlighters, state) { + var searchIndex = data.searchIndex; + var longSearchIndex = data.longSearchIndex; + var info = data.info; + var result = []; + var i = state.from; + var l = searchIndex.length; + var togo = CHUNK_SIZE; + var matchFunc, hltFunc; + + while (state.pass < 4 && state.limit > 0 && togo > 0) { + if (state.pass == 0) { + matchFunc = matchPassBeginning; + hltFunc = highlightQuery; + } else if (state.pass == 1) { + matchFunc = matchPassLongIndex; + hltFunc = highlightQuery; + } else if (state.pass == 2) { + matchFunc = matchPassContains; + hltFunc = highlightQuery; + } else if (state.pass == 3) { + matchFunc = matchPassRegexp; + hltFunc = highlightRegexp; + } + + for (; togo > 0 && i < l && state.limit > 0; i++, togo--) { + if (info[i].n == state.n) continue; + if (matchFunc(searchIndex[i], longSearchIndex[i], queries, regexps)) { + info[i].n = state.n; + result.push(hltFunc(info[i], queries, regexps, highlighters)); + state.limit--; + } + }; + if (searchIndex.length <= i) { + state.pass++; + i = state.from = 0; + } else { + state.from = i; + } + } + return result; + } + + function triggerResults(results, isLast) { + jQuery.each(this.handlers, function(i, fn) { + fn.call(this, results, isLast) + }) + } +} + diff --git a/lib/playbot.rb b/lib/playbot.rb deleted file mode 100644 index 3f9203b..0000000 --- a/lib/playbot.rb +++ /dev/null @@ -1,70 +0,0 @@ -require 'rubygems' -require 'net/yail/irc_bot' - -require 'site_plugin' - -# -# Add plugins folder to LOAD_PATH and subsequently require all plugins. -# -dir = '../plugins' -$LOAD_PATH << dir -Dir[File.join(dir, '*.rb')].each {|file| require File.basename(file) } - -class PlayBot < IRCBot - BOTNAME = 'PlayBot' - - public - # Start a new instance - # - # Options: - # * <tt>:address</tt>: irc server - # * <tt>:port</tt>: port number, default to 6667 - # * <tt>:nicknames</tt>: array of nicknames to cycle through - # * <tt>:nick_passwd</tt>: password for the first nick of :nicknames - # if we are not connected with this nick, we will use ghost and take this nick - # * <tt>:channels</tt>: the channels we are going to connect to - # * <tt>:admin</tt>: the nick of the user who can command the bot - def initialize(options = {}) - @admin = options.delete(:admin) - raise "You must provide an admin !" if !@admin - - if options[:nick_passwd] - @nick = options[:nicknames].first - @nick_paswd = options.delete[:nick_passwd] - end - - options[:username] = BOTNAME - options[:realname] = BOTNAME - - super(options) - self.connect_socket - self.start_listening - end - - # This metod is called by IRCBot#connect_socket - def add_custom_handlers() - @irc.hearing_welcome self.method(:_in_welcome) - @irc.on_msg self.method(:_in_msg) - end - - private - # Welcome event handler - # - # We use it to identify us against NickServ - def _in_welcome(event) - return if !@nick - - if self.bot_name != @nick - msg('NickServ', "ghost #{nick} #{nick_passwd}") - sleep 30 - nick @nick - end - - msg('NickServ', "identify #{nick_passwd}") - end - - def _in_msg(event) - # we don't care of private messages - return if event.pm? - end -end diff --git a/lib/site_plugin.rb b/lib/site_plugin.rb deleted file mode 100644 index c59d975..0000000 --- a/lib/site_plugin.rb +++ /dev/null @@ -1,15 +0,0 @@ -class SitePlugin - @@repository = [] - - def self.repository - @@repository - end - - def self.inherited(target) - @@repository << target - end - - def self.for_site(site) - @@repository.find {|handler| handler.can_handle? site } - end -end diff --git a/mixcloud.pm b/mixcloud.pm deleted file mode 100644 index 8cd29a5..0000000 --- a/mixcloud.pm +++ /dev/null @@ -1,71 +0,0 @@ -package mixcloud; - -use LWP::UserAgent; -use HTML::Parser; -use HTML::Entities; - -require Exporter; -our @ISA = qw(Exporter); -our @EXPORT = qw(mixcloud); - - -my $inTitle = 0; -my $inAuthor = 0; -my %infos; - - -sub mixcloud { - my ($url) = @_; - - my $ua = LWP::UserAgent->new( - agent => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 GTB7.1", - timeout => 30 - ); - - my $response = $ua->get($url); - die($response->status_line) unless ($response->is_success); - - my $content = $response->decoded_content; - - my $parser = HTML::Parser->new(); - $parser->handler(text => \&parser_text, 'text'); - $parser->handler(start => \&parser_start, 'tagname'); - $parser->handler(end => \&parser_end, 'tagname'); - $parser->unbroken_text(1); - $parser->report_tags('title', 'a'); - $parser->parse($content); - $parser->eof(); - - $infos{'url'} = $url; - - return %infos; -} - -sub parser_text -{ - my ($text) = @_; - chomp $text; - $text = decode_entities($text); - - if ($inTitle) { - $text =~ s/\n//; - $text =~ s/ \| Mixcloud .*//; - $text =~ s/^ *//; - $text =~ s/[^a-zA-Z0-9\(\)\[\]]*$//; - ($infos{'author'}, $infos{'title'}) = split (' - ', $text, 2); - } -} - -sub parser_start -{ - my ($tag) = @_; - $inTitle = 1 if ($tag eq 'title'); -} - -sub parser_end -{ - my ($tag) = @_; - $inTitle = 0 if ($tag eq 'title'); -} - -1; diff --git a/run.rb b/run.rb deleted file mode 100755 index 165659f..0000000 --- a/run.rb +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/ruby - -require 'logger' -require 'optparse' - -$LOAD_PATH << './lib' -require 'playbot' - -# This code start the PlayBot with somes options. - -options = {} - -OptionParser.new do |opts| - opts.banner = "Usage: ./run.rb [OPTIONS]" - - opts.on('-h', '--help', 'show this help') do - puts opts - exit - end - - opts.on('-s', '--silent', 'set log to FATAL') do - options[:silent] = true - end - - opts.on('-a', '--admin', 'admin nick') do - options[:admin] = arg - end - - opts.on('-n', '--network', 'server address') do - options[:address] = arg - end - - opts.on('-p', '--port', 'server port') do - options[:port] = arg - end -end.parse! - -options[:silent] ||= false -options[:admin] ||= 'moise' -options[:address] ||= 'irc.iiens.net' - -bot = PlayBot.new( - :address => options[:address], - :port => options[:port], - :nicknames => ['PlayBot', 'Play_Bot', 'Play__Bot', 'Play___Bot'], - :channels => ['#hormone'], - :admin => options[:admin], - :silent => options[:silent] -) -bot.irc_loop diff --git a/soundcloud.pm b/soundcloud.pm deleted file mode 100644 index 1e00ebf..0000000 --- a/soundcloud.pm +++ /dev/null @@ -1,35 +0,0 @@ -package soundcloud; - -use LWP::UserAgent; -use JSON; - -require Exporter; -our @ISA = qw(Exporter); -our @EXPORT = qw(soundcloud); - - -my $root = 'http://api.soundcloud.com'; -my $clientId = 'f4956716fe1a9dc9c3725af822963365'; - - -sub soundcloud { - my ($url) = @_; - - my $ua = LWP::UserAgent->new(timeout => 30); - - my $response = $ua->get($root.'/resolve.json?url='.$url.'&client_id='.$clientId); - die($response->status_line) unless ($response->is_success); - - $content = decode_json($response->decoded_content); - $infos{'title'} = $content->{'title'}; - $infos{'author'} = $content->{'user'}->{'username'}; - $infos{'url'} = $url; - - if ($content->{'downloadable'}) { - $infos{'ddl'} = $content->{'download_url'}; - } - - return %infos; -} - -1; diff --git a/spec/site_plugin_spec.rb b/spec/site_plugin_spec.rb deleted file mode 100644 index 612cf31..0000000 --- a/spec/site_plugin_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -$LOAD_PATH << '../lib' -require 'site_plugin' - -describe SitePlugin do - describe 'inherance' do - it 'add the class to the repository' do - class TestPlugin1 < SitePlugin - def self.can_handle?(site) - false - end - end - - SitePlugin.repository.empty?.should be_false - end - end - - describe '.for_site' do - it 'return plugin that can handle a given site"' do - class TestPlugin2 < SitePlugin - def self.can_handle?(site) - site =~ /test/ - end - end - - SitePlugin.for_site('OfCourseICanHandle_test_').nil?.should be_false - end - end -end diff --git a/table_of_contents.html b/table_of_contents.html new file mode 100644 index 0000000..2b27aaa --- /dev/null +++ b/table_of_contents.html @@ -0,0 +1,78 @@ +<!DOCTYPE html> + +<html> +<head> +<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> + +<title>Table of Contents - RDoc Documentation</title> + +<link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet"> + +<script type="text/javascript"> + var rdoc_rel_prefix = "./"; +</script> + +<script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/search.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script> +<script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script> + + +<body class="indexpage"> +<h1>Table of Contents - RDoc Documentation</h1> + + +<h2 id="classes">Classes/Modules</h2> +<ul> + <li class="class"> + <a href="PlayBot.html">PlayBot</a> + </li> + <li class="class"> + <a href="SitePlugin.html">SitePlugin</a> + </li> + <li class="class"> + <a href="TestPlugin.html">TestPlugin</a> + </li> + <li class="class"> + <a href="TestPlugin1.html">TestPlugin1</a> + </li> + <li class="class"> + <a href="TestPlugin2.html">TestPlugin2</a> + </li> + +</ul> + +<h2 id="methods">Methods</h2> +<ul> + + <li class="method"><a href="TestPlugin.html#method-c-can_handle-3F">::can_handle? — TestPlugin</a> + + <li class="method"><a href="TestPlugin1.html#method-c-can_handle-3F">::can_handle? — TestPlugin1</a> + + <li class="method"><a href="TestPlugin2.html#method-c-can_handle-3F">::can_handle? — TestPlugin2</a> + + <li class="method"><a href="SitePlugin.html#method-c-for_site">::for_site — SitePlugin</a> + + <li class="method"><a href="SitePlugin.html#method-c-inherited">::inherited — SitePlugin</a> + + <li class="method"><a href="PlayBot.html#method-c-new">::new — PlayBot</a> + + <li class="method"><a href="TestPlugin.html#method-c-new">::new — TestPlugin</a> + + <li class="method"><a href="SitePlugin.html#method-c-repository">::repository — SitePlugin</a> + + <li class="method"><a href="PlayBot.html#method-i-add_custom_handlers">#add_custom_handlers — PlayBot</a> + + <li class="method"><a href="SitePlugin.html#method-i-can_handle-3F">#can_handle? — SitePlugin</a> + +</ul> + + +<footer id="validator-badges"> + <p><a href="http://validator.w3.org/check/referer">[Validate]</a> + <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12. + <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3. +</footer> + diff --git a/youtube.pm b/youtube.pm deleted file mode 100644 index d9039b5..0000000 --- a/youtube.pm +++ /dev/null @@ -1,76 +0,0 @@ -package youtube; - -use LWP::UserAgent; -use HTML::Parser; -use HTML::Entities; - -require Exporter; -our @ISA = qw(Exporter); -our @EXPORT = qw(youtube); - - -my $inTitle = 0; -my $inAuthor = 0; -my %infos; - - -sub youtube { - my ($url) = @_; - - my $ua = LWP::UserAgent->new( - agent => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 GTB7.1", - timeout => 30 - ); - - my $response = $ua->get($url); - die($response->status_line) unless ($response->is_success); - - my $content = $response->decoded_content; - - my $parser = HTML::Parser->new(); - $parser->handler(text => \&parser_text, 'text'); - $parser->handler(start => \&parser_start, 'tagname,attr'); - $parser->handler(end => \&parser_end, 'tagname'); - $parser->unbroken_text(1); - $parser->report_tags('title', 'a'); - $parser->parse($content); - $parser->eof(); - - $infos{'url'} = $url; - - return %infos; -} - -sub parser_text -{ - my ($text) = @_; - chomp $text; - - if ($inTitle) { - $text =~ s/\n//; - $text =~ s/- YouTube//; - $text =~ s/^ *//; - $text =~ s/[^a-zA-Z0-9\(\)\[\]]*$//; - $infos{'title'} = decode_entities($text); - } - elsif ($inAuthor) { - $infos{'author'} = $text; - } -} - -sub parser_start -{ - my ($tag, $attr) = @_; - $inTitle = 1 if ($tag eq 'title'); - return unless (defined $attr); - $inAuthor = 1 if ($tag eq 'a' && exists($attr->{'class'}) && $attr->{'class'} =~ /yt-user-name author/); -} - -sub parser_end -{ - my ($tag) = @_; - $inTitle = 0 if ($tag eq 'title'); - $inAuthor = 0 if ($tag eq 'a'); -} - -1; diff --git a/zippy.pm b/zippy.pm deleted file mode 100644 index 872b13a..0000000 --- a/zippy.pm +++ /dev/null @@ -1,70 +0,0 @@ -package zippy; - -use LWP::UserAgent; -use HTML::Parser; -use HTML::Entities; - -require Exporter; -our @ISA = qw(Exporter); -our @EXPORT = qw(zippy); - - -my $inTitle = 0; -my $inAuthor = 0; -my %infos; - - -sub zippy { - my ($url) = @_; - - my $ua = LWP::UserAgent->new( - agent => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 GTB7.1", - timeout => 30 - ); - - my $response = $ua->get($url); - die($response->status_line) unless ($response->is_success); - - my $content = $response->decoded_content; - - my $parser = HTML::Parser->new(); - $parser->handler(text => \&parser_text, 'text'); - $parser->handler(start => \&parser_start, 'tagname'); - $parser->handler(end => \&parser_end, 'tagname'); - $parser->unbroken_text(1); - $parser->report_tags('title', 'a'); - $parser->parse($content); - $parser->eof(); - - $infos{'url'} = $url; - $infos{'author'} = undef; - - return %infos; -} - -sub parser_text -{ - my ($text) = @_; - chomp $text; - $text = decode_entities($text); - - if ($inTitle) { - $text =~ s/^Zippyshare.com - //; - $text =~ s/\.mp3$//; - $infos{'title'} = $text; - } -} - -sub parser_start -{ - my ($tag) = @_; - $inTitle = 1 if ($tag eq 'title'); -} - -sub parser_end -{ - my ($tag) = @_; - $inTitle = 0 if ($tag eq 'title'); -} - -1; -- GitLab