passenger 3.0.12 → 3.0.13
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- data/DEVELOPERS.TXT +1 -0
- data/NEWS +11 -0
- data/bin/passenger-install-nginx-module +1 -1
- data/build/basics.rb +0 -1
- data/build/documentation.rb +17 -8
- data/build/packaging.rb +2 -2
- data/doc/Architectural overview.html +987 -133
- data/doc/Architectural overview.idmap.txt +36 -0
- data/doc/Architectural overview.txt +150 -74
- data/doc/Security of user switching support.html +820 -54
- data/doc/Security of user switching support.idmap.txt +34 -0
- data/doc/Users guide Apache.html +1675 -633
- data/doc/Users guide Apache.idmap.txt +298 -0
- data/doc/Users guide Apache.txt +3 -11
- data/doc/Users guide Nginx.html +1462 -452
- data/doc/Users guide Nginx.idmap.txt +218 -0
- data/doc/Users guide Standalone.html +979 -44
- data/doc/Users guide Standalone.idmap.txt +18 -0
- data/doc/images/many_web_framework_protocols.png +0 -0
- data/doc/images/passenger_architecture.png +0 -0
- data/doc/images/passenger_architecture.svg +198 -215
- data/doc/images/rack.png +0 -0
- data/ext/boost/config/stdlib/libstdcpp3.hpp +2 -1
- data/ext/boost/exception/detail/error_info_impl.hpp +1 -1
- data/ext/common/AgentBase.cpp +15 -5
- data/ext/common/Constants.h +1 -1
- data/ext/common/EventedMessageServer.h +1 -1
- data/ext/common/StaticString.h +2 -1
- data/ext/common/Watchdog.cpp +2 -2
- data/ext/libev/config.h +122 -0
- data/ext/nginx/Configuration.c +24 -8
- data/ext/nginx/ContentHandler.c +5 -6
- data/lib/phusion_passenger.rb +2 -2
- data/lib/phusion_passenger/abstract_request_handler.rb +11 -8
- data/lib/phusion_passenger/dependencies.rb +12 -18
- data/lib/phusion_passenger/platform_info/compiler.rb +8 -2
- data/lib/phusion_passenger/platform_info/ruby.rb +3 -2
- data/lib/phusion_passenger/rails3_extensions/init.rb +6 -4
- data/lib/phusion_passenger/standalone/command.rb +10 -13
- data/lib/phusion_passenger/standalone/runtime_installer.rb +2 -2
- data/lib/phusion_passenger/standalone/start_command.rb +32 -16
- data/lib/phusion_passenger/templates/apache2/apache_must_be_compiled_with_compatible_mpm.txt.erb +1 -1
- data/lib/phusion_passenger/templates/standalone/config.erb +2 -1
- data/test/stub/wsgi/passenger_wsgi.pyc +0 -0
- metadata +21 -16
- data/doc/Users guide Apache with comments.html +0 -4830
- data/lib/phusion_passenger/platform_info/documentation_tools.rb +0 -35
- data/test/stub/rails_apps/3.0/empty/log/development.log +0 -3
data/DEVELOPERS.TXT
CHANGED
data/NEWS
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
Release 3.0.13
|
2
|
+
--------------
|
3
|
+
|
4
|
+
* [Nginx] Preferred Nginx version upgraded to 1.2.1.
|
5
|
+
* Fixed compilation problems on FreeBSD 6.4. Fixes issue #766.
|
6
|
+
* Fixed compilation problems on GCC >= 4.6.
|
7
|
+
* Fixed compilation problems on OpenIndiana and Solaris 11. Fixes issue #742.
|
8
|
+
* Union Station-related bug fixes.
|
9
|
+
* Sending the soft termination signal twice to application processes no longer makes them crash. Patch contributed by Ian Ehlert.
|
10
|
+
|
11
|
+
|
1
12
|
Release 3.0.12
|
2
13
|
--------------
|
3
14
|
|
@@ -162,7 +162,7 @@ private
|
|
162
162
|
new_screen
|
163
163
|
color_puts "<banner>PCRE (required by Nginx) not installed, downloading it...</banner>"
|
164
164
|
|
165
|
-
url = "
|
165
|
+
url = "http://downloads.sourceforge.net/project/pcre/pcre/#{PREFERRED_PCRE_VERSION}/pcre-#{PREFERRED_PCRE_VERSION}.tar.gz"
|
166
166
|
dirname = "pcre-#{PREFERRED_PCRE_VERSION}"
|
167
167
|
tarball = "#{@working_dir}/pcre.tar.gz"
|
168
168
|
|
data/build/basics.rb
CHANGED
@@ -33,7 +33,6 @@ require 'phusion_passenger/platform_info/apache'
|
|
33
33
|
require 'phusion_passenger/platform_info/curl'
|
34
34
|
require 'phusion_passenger/platform_info/zlib'
|
35
35
|
require 'phusion_passenger/platform_info/compiler'
|
36
|
-
require 'phusion_passenger/platform_info/documentation_tools'
|
37
36
|
|
38
37
|
include PhusionPassenger
|
39
38
|
include PhusionPassenger::PlatformInfo
|
data/build/documentation.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# Phusion Passenger - http://www.modrails.com/
|
2
|
-
# Copyright (c) 2010 Phusion
|
2
|
+
# Copyright (c) 2010, 2011, 2012 Phusion
|
3
3
|
#
|
4
4
|
# "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
5
5
|
#
|
@@ -21,25 +21,34 @@
|
|
21
21
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
22
|
# THE SOFTWARE.
|
23
23
|
|
24
|
-
ASCIIDOC_FLAGS = "-b html5 -a toc -a theme=flask -a numbered -a toclevels=3 -a icons"
|
25
|
-
|
26
24
|
desc "Generate all documentation"
|
27
25
|
task :doc => Packaging::ASCII_DOCS
|
28
26
|
|
29
27
|
Packaging::ASCII_DOCS.each do |target|
|
30
28
|
source = target.sub(/\.html$/, '.txt')
|
31
29
|
file target => [source] + Dir["doc/users_guide_snippets/**/*"] do
|
32
|
-
if PlatformInfo.
|
30
|
+
if PlatformInfo.find_command('mizuho')
|
33
31
|
if target =~ /apache/i
|
34
|
-
type = "
|
32
|
+
type = "apache"
|
33
|
+
juvia_site_key = "5jpmkyjqlml8rktsfldfpbwth8ig7w9"
|
35
34
|
elsif target =~ /nginx/i
|
36
|
-
type = "
|
35
|
+
type = "nginx"
|
36
|
+
juvia_site_key = "q0ptarhn8o9xanwomq8zkgewbtwffyz"
|
37
|
+
elsif target =~ /standalone/i
|
38
|
+
type = nil
|
39
|
+
juvia_site_key = "amggdy0k65hb4hbjg3dh7pnb9zd8dwy"
|
37
40
|
else
|
38
41
|
type = nil
|
42
|
+
juvia_site_key = nil
|
43
|
+
end
|
44
|
+
command = "mizuho '#{source}'"
|
45
|
+
command << " -a #{type}" if type
|
46
|
+
if juvia_site_key
|
47
|
+
command << " -c juvia --juvia-url http://juvia.phusion.nl --juvia-site-key #{juvia_site_key}"
|
39
48
|
end
|
40
|
-
|
49
|
+
sh(command)
|
41
50
|
else
|
42
|
-
sh "echo '
|
51
|
+
sh "echo 'Mizuho required to build docs' > '#{target}'"
|
43
52
|
end
|
44
53
|
end
|
45
54
|
|
data/build/packaging.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# Phusion Passenger - http://www.modrails.com/
|
2
|
-
# Copyright (c) 2010 Phusion
|
2
|
+
# Copyright (c) 2010, 2011, 2012 Phusion
|
3
3
|
#
|
4
4
|
# "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
5
5
|
#
|
@@ -42,7 +42,7 @@ spec = Gem::Specification.new do |s|
|
|
42
42
|
s.require_paths = ["lib"]
|
43
43
|
s.add_dependency 'rake', '>= 0.8.1'
|
44
44
|
s.add_dependency 'fastthread', '>= 1.0.1'
|
45
|
-
s.add_dependency 'daemon_controller', '>= 0.
|
45
|
+
s.add_dependency 'daemon_controller', '>= 1.0.0'
|
46
46
|
s.add_dependency 'rack'
|
47
47
|
s.files = FileList[*Packaging::GLOB] - FileList[*Packaging::EXCLUDE_GLOB]
|
48
48
|
s.executables = Packaging::USER_EXECUTABLES + Packaging::SUPER_USER_EXECUTABLES
|
@@ -1,20 +1,10 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html lang="en">
|
3
|
-
<head>
|
4
|
-
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
5
|
-
<meta name="generator" content="AsciiDoc 8.6.
|
6
|
-
<title>Passenger
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
5
|
+
<meta name="generator" content="AsciiDoc 8.6.7">
|
6
|
+
<title>Phusion Passenger design & architecture</title>
|
7
7
|
<style type="text/css">
|
8
|
-
/*
|
9
|
-
* AsciiDoc 'flask' theme for xhtml11 and html5 backends. A shameless knock-off
|
10
|
-
* of the Flask website styling (http://flask.pocoo.org/docs/).
|
11
|
-
*
|
12
|
-
* The implementation is straight-forward, consisting of the asciidoc.css file
|
13
|
-
* followed by theme specific overrides.
|
14
|
-
*
|
15
|
-
* */
|
16
|
-
|
17
|
-
|
18
8
|
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
|
19
9
|
|
20
10
|
/* Default font. */
|
@@ -99,6 +89,7 @@ ul > li > * { color: black; }
|
|
99
89
|
pre {
|
100
90
|
padding: 0;
|
101
91
|
margin: 0;
|
92
|
+
overflow: auto;
|
102
93
|
}
|
103
94
|
|
104
95
|
#author {
|
@@ -525,6 +516,29 @@ th.tableblock.valign-bottom, td.tableblock.valign-bottom {
|
|
525
516
|
}
|
526
517
|
|
527
518
|
|
519
|
+
/*
|
520
|
+
* manpage specific
|
521
|
+
*
|
522
|
+
* */
|
523
|
+
|
524
|
+
body.manpage h1 {
|
525
|
+
padding-top: 0.5em;
|
526
|
+
padding-bottom: 0.5em;
|
527
|
+
border-top: 2px solid silver;
|
528
|
+
border-bottom: 2px solid silver;
|
529
|
+
}
|
530
|
+
body.manpage h2 {
|
531
|
+
border-style: none;
|
532
|
+
}
|
533
|
+
body.manpage div.sectionbody {
|
534
|
+
margin-left: 3em;
|
535
|
+
}
|
536
|
+
|
537
|
+
@media print {
|
538
|
+
body.manpage div#toc { display: none; }
|
539
|
+
}
|
540
|
+
|
541
|
+
|
528
542
|
/*
|
529
543
|
* Theme specific overrides of the preceding (asciidoc.css) CSS.
|
530
544
|
*
|
@@ -551,7 +565,7 @@ h1 { font-size: 240%; }
|
|
551
565
|
h2 { font-size: 180%; }
|
552
566
|
h3 { font-size: 150%; }
|
553
567
|
h4 { font-size: 130%; }
|
554
|
-
h5 { font-size:
|
568
|
+
h5 { font-size: 115%; }
|
555
569
|
h6 { font-size: 100%; }
|
556
570
|
#header h1 { margin-top: 0; }
|
557
571
|
#toc {
|
@@ -589,7 +603,7 @@ div.exampleblock > div.content, div.sidebarblock > div.content, div.listingblock
|
|
589
603
|
div.verseblock { border-left-width: 0; margin-left: 3em; }
|
590
604
|
div.quoteblock { border-left-width: 3px; margin-left: 0; margin-right: 0;}
|
591
605
|
div.admonitionblock td.content { border-left: 3px solid #E8E8E8; }
|
592
|
-
</style>
|
606
|
+
</style>
|
593
607
|
<script type="text/javascript">
|
594
608
|
/*<![CDATA[*/
|
595
609
|
var asciidoc = { // Namespace.
|
@@ -633,7 +647,7 @@ toc: function (toclevels) {
|
|
633
647
|
|
634
648
|
function tocEntries(el, toclevels) {
|
635
649
|
var result = new Array;
|
636
|
-
var re = new RegExp('[hH]([
|
650
|
+
var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
|
637
651
|
// Function that scans the DOM tree for header elements (the DOM2
|
638
652
|
// nodeIterator API would be a better technique but not supported by all
|
639
653
|
// browsers).
|
@@ -662,7 +676,7 @@ toc: function (toclevels) {
|
|
662
676
|
var i;
|
663
677
|
for (i = 0; i < toc.childNodes.length; i++) {
|
664
678
|
var entry = toc.childNodes[i];
|
665
|
-
if (entry.nodeName == '
|
679
|
+
if (entry.nodeName.toLowerCase() == 'div'
|
666
680
|
&& entry.getAttribute("class")
|
667
681
|
&& entry.getAttribute("class").match(/^toclevel/))
|
668
682
|
tocEntriesToRemove.push(entry);
|
@@ -708,7 +722,7 @@ footnotes: function () {
|
|
708
722
|
var entriesToRemove = [];
|
709
723
|
for (i = 0; i < noteholder.childNodes.length; i++) {
|
710
724
|
var entry = noteholder.childNodes[i];
|
711
|
-
if (entry.nodeName == '
|
725
|
+
if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
|
712
726
|
entriesToRemove.push(entry);
|
713
727
|
}
|
714
728
|
for (i = 0; i < entriesToRemove.length; i++) {
|
@@ -783,32 +797,285 @@ install: function(toclevels) {
|
|
783
797
|
}
|
784
798
|
asciidoc.install(3);
|
785
799
|
/*]]>*/
|
786
|
-
</script>
|
787
|
-
|
788
|
-
|
800
|
+
</script><style type="text/css">
|
801
|
+
body {
|
802
|
+
margin: 1em 10% 1em 10%;
|
803
|
+
}
|
804
|
+
|
805
|
+
a.image {
|
806
|
+
border: none;
|
807
|
+
}
|
808
|
+
|
809
|
+
.comments {
|
810
|
+
display: block;
|
811
|
+
background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAgCAYAAAB6kdqOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAB0wAAAdMBc2+PegAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAASjSURBVFiFvZdPaBxVHMc/b/7sbNLdxG13s0sbE1jBxELVbVGEgqmQiiBiDxZqKRWhR0Fqe/BSmoNQSNmrt4ISTyV3byWLHorVU5dYtgVpk4DGhXZ1a7rZmXkeMm99eZn9k1b9wY/3Z2f2fX7f3++9mRFSSnQTQgjAAkTkaO2zmtRaCYTSABBqrIEkS6VS9vTp069lMpmClFL4vt8BCsNwWwsQBAHm7+Y4CAKEEEGtVvtlYWHhbqvVagJ/AE90MCGlVDD2xYsXiydPnvza87wXksnk8NDQUFIPQPW7zfXyMAwJw5BGo/FXs9ncvHfv3tKFCxe+aLfbDyKwQEopFZBdLpdfnp2d/Tafz4+5rhsxghAC1d+h/y5gzH69XvdrtdqDs2fPfuT7/jLQkFIGlhBC5HK5oZmZmW8KhUI+kUgIy7KwLAvbtrFte1vfdHVtnKtg9L7yffv2OcViceLSpUufA88DSSGEcABrfn7+zdHR0UnXdWNv1tXqpY6phGVZnRoy/0MIQT6fdw4ePHgUKAK/AU8sQOzfv/+tdDq9x4xKd1MVU51uSvTzVCrlTU9PTwN7AGEBYmRk5FXXdTvk+gI6kJnGQQG6KQQwMjLiTk1NTQIJBQTgmAWst2rhfiBxC3ab00wAbtRugZjb2LzR3O7d2rh7+s2Ztg1IwajChK2DTSlggpuFrHs34H7BOHELqN0Rl5K4P+4GNQioPt8BUqeoqpd+MGYQvQ7DfrCxKVNAcTCws0B7RdrvhO4HtS1lCkYtbKrT7WB8GihdQf2B3FFIPbEH2cY6iAljjk1l4qB2KKSrMwjMblXqpVpfIF2lXjBxULsB06HigDb1lA2ijgm0WyithmS73faJ3iYdgHq9/tOBAwfe9jyvJ4wam1H1O196QT18+HBzeXl5FQgVkLxz5873k5OTzWw2m+oHE6dMHEw3EGBbuh4/fuyvrKysAS1AOkA4Nzf3w5EjR+6m0+mS/tTvBhMH1U2lXgqtra21l5aWvgNWgCYQ2tH/hY1G48epqal3Pc/b4ziOGLQegiCIPVv0ubhDcXV1dfP27dv3y+Xyl0AVqAO+/pKfmpiYeHFubm4+m82+kkgkPNd1nbjI9TaZTNqu61rRQpbrujiOs+O6MAx59OhRuL6+3mq1Wq1KpXJjYWFhMYK5DzSljF7yo7RYwBCQBfKlUml6bGxsMggCLwgC/Ruts4CRPpFMJodnZmbeKBaLLxUKheFMJmPr6a5Wq0+uXLmyWK1WK8DPwBrwO7AhpQxB+y6LoARbhe4Bw0AyGlv0N/Vd56VSqb3nzp378PDhw+/ncrnnCoWCZ1kWvu9z69at9fPnz3+6sbFxE/gVaEkNYhuQBqUvsBtTSnrAKDB25syZ944dO/ZxNpvNjY+PDzebTb9Sqdy8fPnyZ0AN+FOpEwv0rKYFZEdgaSB7/PjxoydOnPgkl8tNAN7169fLi4uLX7G1w/5RadDnz9N4pJbNVupzwHSpVPrg6tWrN65du/broUOHZoEMYHXu+S+BYsA8YC9QHB8ff/3UqVPvREC2uvZfT1kvi9KpNo7LVo1uApsqZf8rkAHWMX2X/Q1tcUY1hl3QyQAAAABJRU5ErkJggg==') top left no-repeat;
|
812
|
+
float: left;
|
813
|
+
margin-left: -55px;
|
814
|
+
width: 36px;
|
815
|
+
height: 48px;
|
816
|
+
line-height: 0;
|
817
|
+
color: black;
|
818
|
+
text-decoration: none !important;
|
819
|
+
border: none !important;
|
820
|
+
}
|
821
|
+
|
822
|
+
#toc .comments {
|
823
|
+
margin-top: 0.25em;
|
824
|
+
}
|
825
|
+
|
826
|
+
.sect1 .comments {
|
827
|
+
margin-top: 0.5em;
|
828
|
+
}
|
829
|
+
|
830
|
+
.sect2 .comments {
|
831
|
+
margin-top: 1.15em;
|
832
|
+
}
|
833
|
+
|
834
|
+
.sect3 .comments {
|
835
|
+
margin-top: -1em;
|
836
|
+
}
|
837
|
+
|
838
|
+
.comments.empty {
|
839
|
+
opacity: 0.2;
|
840
|
+
}
|
841
|
+
|
842
|
+
.comments.empty:hover,
|
843
|
+
.comments.nonempty {
|
844
|
+
opacity: 1;
|
845
|
+
}
|
846
|
+
|
847
|
+
.comments .count {
|
848
|
+
display: block;
|
849
|
+
font-size: 80%;
|
850
|
+
padding-top: 12px;
|
851
|
+
text-align: center;
|
852
|
+
text-shadow: 1px 1px 2px white;
|
853
|
+
}
|
854
|
+
|
855
|
+
#comments_lightbox_shadow {
|
856
|
+
position: fixed;
|
857
|
+
top: 0;
|
858
|
+
left: 0;
|
859
|
+
right: 0;
|
860
|
+
bottom: 0;
|
861
|
+
background: black;
|
862
|
+
opacity: 0.7;
|
863
|
+
z-index: 10;
|
864
|
+
}
|
865
|
+
|
866
|
+
#comments_lightbox_contents {
|
867
|
+
position: fixed;
|
868
|
+
top: 10%;
|
869
|
+
left: 20%;
|
870
|
+
right: 20%;
|
871
|
+
bottom: 10%;
|
872
|
+
background: white;
|
873
|
+
overflow: auto;
|
874
|
+
z-index: 11;
|
875
|
+
}
|
876
|
+
|
877
|
+
#comments_lightbox_contents > .shell {
|
878
|
+
margin: 2em;
|
879
|
+
}
|
880
|
+
|
881
|
+
@media print {
|
882
|
+
body {
|
883
|
+
font-size: 18pt;
|
884
|
+
}
|
885
|
+
|
886
|
+
#header h1 {
|
887
|
+
page-break-after: always;
|
888
|
+
font-size: 500%;
|
889
|
+
vertical-align: middle;
|
890
|
+
}
|
891
|
+
|
892
|
+
#header {
|
893
|
+
page-break-after: always;
|
894
|
+
}
|
895
|
+
|
896
|
+
#toctitle {
|
897
|
+
font-size: 200%;
|
898
|
+
margin-bottom: 1em;
|
899
|
+
}
|
900
|
+
|
901
|
+
div.toclevel1 {
|
902
|
+
font-size: 100%;
|
903
|
+
}
|
904
|
+
|
905
|
+
div.toclevel2 {
|
906
|
+
font-size: 90%;
|
907
|
+
}
|
908
|
+
|
909
|
+
div.toclevel3 {
|
910
|
+
font-size: 80%;
|
911
|
+
}
|
912
|
+
|
913
|
+
#content .comments {
|
914
|
+
display: none;
|
915
|
+
}
|
916
|
+
|
917
|
+
@page :left {
|
918
|
+
@bottom-left {
|
919
|
+
content: counter(page);
|
920
|
+
}
|
921
|
+
}
|
922
|
+
}
|
923
|
+
|
924
|
+
#topbar {
|
925
|
+
position: fixed;
|
926
|
+
left: 0;
|
927
|
+
top: 0;
|
928
|
+
right: 0;
|
929
|
+
height: 2.5em;
|
930
|
+
padding-left: 10%;
|
931
|
+
padding-right: 10%;
|
932
|
+
z-index: 1;
|
933
|
+
background: #880000;
|
934
|
+
overflow: hidden;
|
935
|
+
white-space: nowrap;
|
936
|
+
box-shadow: 0px 3px 6px #555555;
|
937
|
+
-moz-box-shadow: 0px 3px 6px #555555;
|
938
|
+
-webkit-box-shadow: 0px 3px 6px #555555;
|
939
|
+
-o-box-shadow: 0px 3px 6px #555555;
|
940
|
+
}
|
941
|
+
|
942
|
+
#topbar .title {
|
943
|
+
display: inline-block;
|
944
|
+
margin: 0.6em 1em 0 0;
|
945
|
+
vertical-align: top;
|
946
|
+
}
|
947
|
+
|
948
|
+
#topbar .title img {
|
949
|
+
display: none;
|
950
|
+
margin-right: 6px;
|
951
|
+
vertical-align: middle;
|
952
|
+
}
|
953
|
+
|
954
|
+
#topbar .title a {
|
955
|
+
color: #fffafa;
|
956
|
+
border: 0;
|
957
|
+
}
|
958
|
+
|
959
|
+
#topbar .title:hover img,
|
960
|
+
.mobile #topbar .title img {
|
961
|
+
display: inline-block;
|
962
|
+
margin-left: -17px;
|
963
|
+
}
|
964
|
+
|
965
|
+
#topbar .title:hover a,
|
966
|
+
.mobile #topbar .title a {
|
967
|
+
color: #ffffdd;
|
968
|
+
}
|
969
|
+
|
970
|
+
#floattoc {
|
971
|
+
position: fixed;
|
972
|
+
z-index: 1;
|
973
|
+
top: 2em;
|
974
|
+
bottom: 20%;
|
975
|
+
width: 50%;
|
976
|
+
background: #f0f0f0;
|
977
|
+
color: black;
|
978
|
+
box-shadow: 0px 6px 6px #555555;
|
979
|
+
-moz-box-shadow: 0px 6px 6px #555555;
|
980
|
+
-webkit-box-shadow: 0px 6px 6px #555555;
|
981
|
+
-o-box-shadow: 0px 6px 6px #555555;
|
982
|
+
overflow: auto;
|
983
|
+
padding: 1em;
|
984
|
+
border-radius: 6px;
|
985
|
+
-webkit-border-radius: 8px;
|
986
|
+
-webkit-border-top-left-radius: 0;
|
987
|
+
-webkit-border-top-right-radius: 0;
|
988
|
+
-moz-border-radius: 8px;
|
989
|
+
-moz-border-radius-topleft: 0;
|
990
|
+
-moz-border-top-right-radius: 0;
|
991
|
+
-o-border-radius: 8px;
|
992
|
+
-o-border-radius-topleft: 0;
|
993
|
+
-o-border-top-right-radius: 0;
|
994
|
+
border-radius: 8px;
|
995
|
+
border-top-left-radius: 0;
|
996
|
+
border-top-right-radius: 0;
|
997
|
+
}
|
998
|
+
|
999
|
+
#floattoc a.current {
|
1000
|
+
font-weight: bold;
|
1001
|
+
color: black;
|
1002
|
+
}
|
1003
|
+
|
1004
|
+
#current_section {
|
1005
|
+
display: inline-block;
|
1006
|
+
margin: 0.5em 0 0 0;
|
1007
|
+
padding: 0.2em 0.5em 0.2em 0.5em;
|
1008
|
+
background: #550000;
|
1009
|
+
font-size: 90%;
|
1010
|
+
vertical-align: top;
|
1011
|
+
color: white;
|
1012
|
+
border: none;
|
1013
|
+
-webkit-border-radius: 8px;
|
1014
|
+
-moz-border-radius: 8px;
|
1015
|
+
-o-border-radius: 8px;
|
1016
|
+
border-radius: 8px;
|
1017
|
+
}
|
1018
|
+
|
1019
|
+
#current_section:hover {
|
1020
|
+
text-decoration: none;
|
1021
|
+
border: none;
|
1022
|
+
}
|
1023
|
+
|
1024
|
+
#current_section.pressed {
|
1025
|
+
background: #f0f0f0;
|
1026
|
+
color: black;
|
1027
|
+
-webkit-border-top-left-radius: 8px;
|
1028
|
+
-webkit-border-top-right-radius: 8px;
|
1029
|
+
-webkit-border-bottom-left-radius: 0;
|
1030
|
+
-webkit-border-bottom-right-radius: 0;
|
1031
|
+
-moz-border-radius-topleft: 8px;
|
1032
|
+
-moz-border-radius-topright: 8px;
|
1033
|
+
-moz-border-bottom-left-radius: 0;
|
1034
|
+
-moz-border-bottom-right-radius: 0;
|
1035
|
+
border-top-left-radius: 8px;
|
1036
|
+
border-top-right-radius: 8px;
|
1037
|
+
border-bottom-left-radius: 0;
|
1038
|
+
border-bottom-right-radius: 0;
|
1039
|
+
}
|
1040
|
+
|
1041
|
+
</style>
|
1042
|
+
</head>
|
1043
|
+
<body class="article">
|
1044
|
+
<div id="topbar" style="display: none">
|
1045
|
+
<div class="title">
|
1046
|
+
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAKCAYAAAEV95QVAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sGCRMSACDxkZwAAAAidEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVAgb24gYSBNYWOHqHdDAAAAZUlEQVQY032PSxbAIAjEIlfygL6ePF3UUvpzNjgSYWwqAMEhUQnANnsC7TQPeJpsVWzMuh2sog4vDTUbqP081zECrW4dtdaQGSIKlWluPyjK+VXxAz5XfcKufCzA130AfQHWB30HZxlPaP080xsAAAAASUVORK5CYII=" width="11" height="10" alt=""><a href="javascript:void(Mizuho.smoothlyScrollToToc())">Phusion Passenger design & architecture</a>
|
1047
|
+
</div>
|
1048
|
+
<a href="javascript:void(0)" id="current_section"></a>
|
1049
|
+
</div>
|
789
1050
|
<div id="header">
|
790
|
-
<h1>Passenger
|
1051
|
+
<h1>Phusion Passenger design & architecture</h1>
|
1052
|
+
<div id="preamble">
|
1053
|
+
<div class="sectionbody">
|
1054
|
+
<div class="paragraph"><p><span class="image">
|
1055
|
+
<a class="image" href="http://www.phusion.nl/">
|
1056
|
+
<img src="images/phusion_banner.png" alt="images/phusion_banner.png"></a>
|
1057
|
+
</span></p></div>
|
1058
|
+
<div class="paragraph"><p>Last updated: June 5, 2012.</p></div>
|
1059
|
+
<div class="paragraph"><p>This document describes Phusion Passenger’s design and architure in a global way.
|
1060
|
+
Its purpose is to lower the barrier to entry for new contributors,
|
1061
|
+
to explain some of the design choices we have made and to educate people
|
1062
|
+
about how Phusion Passenger works.</p></div>
|
1063
|
+
</div>
|
1064
|
+
</div>
|
791
1065
|
<div id="toc">
|
792
1066
|
<div id="toctitle">Table of Contents</div>
|
793
1067
|
<noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
|
794
1068
|
</div>
|
795
1069
|
</div>
|
796
1070
|
<div id="content">
|
797
|
-
|
798
|
-
<div class="sectionbody">
|
799
|
-
<div class="paragraph"><p>This document describes Passenger’s architure in a global way. The purpose of
|
800
|
-
this document is to lower the barrier to entry for new contributors, as well
|
801
|
-
as to explain (some of the) design choices that we have made.</p></div>
|
802
|
-
<div class="paragraph"><p>Or it can be a fun read for people who just want to know how Passenger works.</p></div>
|
803
|
-
</div>
|
804
|
-
</div>
|
1071
|
+
|
805
1072
|
<div class="sect1">
|
806
|
-
<h2 id="
|
1073
|
+
<h2 id="_introduction_to_related_technologies">1. Introduction to related technologies</h2>
|
807
1074
|
<div class="sectionbody">
|
808
1075
|
<div class="sect2">
|
809
|
-
<h3 id="
|
810
|
-
<div class="paragraph"><p>Before we describe Passenger, it is important to understand how typical web
|
811
|
-
applications work
|
1076
|
+
<h3 id="web_app_models">1.1. Web application models</h3>
|
1077
|
+
<div class="paragraph"><p>Before we describe Phusion Passenger, it is important to understand how typical web
|
1078
|
+
applications work from the viewpoint of someone who wants to connect the
|
812
1079
|
application to a web server.</p></div>
|
813
1080
|
<div class="paragraph"><p>A typical, isolated, web application accepts an HTTP request from some I/O
|
814
1081
|
channel, processes it internally, and outputs an HTTP response, which is sent
|
@@ -817,42 +1084,62 @@ to exit. This does not necessarily mean that the web application speaks HTTP
|
|
817
1084
|
directly: it just means that the web application accepts some kind of
|
818
1085
|
representation of an HTTP request.</p></div>
|
819
1086
|
<div class="paragraph"><p><span class="image">
|
820
|
-
<img src="images/typical_isolated_web_application.png" alt="Architecture of a typical web application in isolation">
|
821
|
-
|
822
|
-
<div class="paragraph"><p>Few web applications are accessible directly by HTTP clients. Common setups
|
1087
|
+
<img src="images/typical_isolated_web_application.png" alt="Architecture of a typical web application in isolation"></span></p></div>
|
1088
|
+
<div class="paragraph"><p>Few web applications are accessible directly by HTTP clients. Common models
|
823
1089
|
are:</p></div>
|
824
|
-
<div class="olist arabic"><ol class="arabic">
|
1090
|
+
<div class="olist arabic"><ol class="arabic">
|
825
1091
|
<li>
|
826
1092
|
<p>
|
827
1093
|
The web application is contained in an application server. This application
|
828
1094
|
server may or may not be able to contain multiple web applications. The
|
829
|
-
application server is then connected to the web server
|
1095
|
+
application server is then connected to the web server through some kind of
|
1096
|
+
protocol. This protocol may be HTTP, FastCGI, SCGI, AJP or whatever. The web server
|
830
1097
|
dispatches requests to the application server, which in turn dispatches
|
831
1098
|
requests to the correct web application, in a format that the web application
|
832
1099
|
understands. Conversely, HTTP responses outputted by the web application are
|
833
1100
|
sent to the application server, which in turn sends them to the web server,
|
834
1101
|
and eventually to the HTTP client.
|
835
1102
|
</p>
|
836
|
-
<div class="paragraph"><p>
|
837
|
-
|
1103
|
+
<div class="paragraph"><p>Typical examples of such a model:</p></div>
|
1104
|
+
<div class="ulist"><ul>
|
1105
|
+
<li>
|
1106
|
+
<p>
|
1107
|
+
A J2EE application, contained in the Tomcat application server, proxied
|
1108
|
+
behind the Apache web server. Tomcat can contain multiple web applications
|
1109
|
+
in a single Tomcat instance.
|
1110
|
+
</p>
|
1111
|
+
</li>
|
1112
|
+
<li>
|
1113
|
+
<p>
|
1114
|
+
Most Ruby application servers besides Phusion Passenger (Thin, Unicorn,
|
1115
|
+
Goliath, etc). These application servers can only contain a single Ruby
|
1116
|
+
web application per instance. They load the web application into their
|
1117
|
+
own process and are put behind a web server (Apache, Nginx) in a reverse
|
1118
|
+
proxy setup.
|
1119
|
+
</p>
|
1120
|
+
</li>
|
1121
|
+
</ul></div>
|
838
1122
|
</li>
|
839
1123
|
<li>
|
840
1124
|
<p>
|
841
1125
|
The web application is contained in a web server. In this case, the web
|
842
|
-
server acts like an application server. This is the case for PHP applications
|
1126
|
+
server acts like an application server. This is the case for PHP applications
|
843
1127
|
on Apache servers with <em>mod_php</em>. Note that this does not necessarily mean
|
844
1128
|
that the web application is run inside the same process as the web server:
|
845
|
-
it just means that the web server manages applications.
|
1129
|
+
it just means that the web server manages applications. In case of mod_php
|
1130
|
+
however PHP does run directly inside the Apache worker processes.
|
846
1131
|
</p>
|
1132
|
+
<div class="paragraph"><p>Phusion Passenger for Apache and Phusion Passenger for Nginx implement this model.</p></div>
|
847
1133
|
</li>
|
848
1134
|
<li>
|
849
1135
|
<p>
|
850
1136
|
The web application <strong>is</strong> a web server, and can accept HTTP requests
|
851
1137
|
directly. This is the case for the Trac bug tracking system, running in its
|
852
|
-
standalone server. In
|
853
|
-
web server, instead of accepting HTTP requests directly.
|
854
|
-
server acts like a reverse HTTP proxy.
|
1138
|
+
standalone server. In most setups they are reverse proxied behind a real
|
1139
|
+
web server such as Apache or Nginx, instead of accepting HTTP requests directly.
|
855
1140
|
</p>
|
1141
|
+
<div class="paragraph"><p>Phusion Passenger Standalone implements this model. You can expose Phusion Passenger
|
1142
|
+
Standalone directly to the Internet because it uses Nginx internally.</p></div>
|
856
1143
|
</li>
|
857
1144
|
<li>
|
858
1145
|
<p>
|
@@ -862,14 +1149,14 @@ are good examples of this.
|
|
862
1149
|
</p>
|
863
1150
|
</li>
|
864
1151
|
</ol></div>
|
865
|
-
<div class="paragraph"><p>These descriptions are true for virtually all web applications, whether they
|
1152
|
+
<div class="paragraph"><p>These descriptions are true for virtually all web applications, whether they’re
|
866
1153
|
based on PHP, Django, J2EE, ASP.NET, Ruby on Rails, or whatever. Note that all
|
867
|
-
of these
|
868
|
-
that a different
|
869
|
-
|
1154
|
+
of these models provide the same functionality, i.e. no model can do something
|
1155
|
+
that a different model can’t. The critical reader will notice that all of these
|
1156
|
+
models are identical to the one described in the first diagram, if the
|
870
1157
|
combination of web servers, application servers, web applications etc. are
|
871
1158
|
considered to be a single entity; a black box if you will.</p></div>
|
872
|
-
<div class="paragraph"><p>It should also be noted that these
|
1159
|
+
<div class="paragraph"><p>It should also be noted that these models do not enforce any particular
|
873
1160
|
I/O processing implementation. The web servers, application servers, web
|
874
1161
|
applications, etc. could process I/O serially (i.e. one request at a time),
|
875
1162
|
could multiplex I/O with a single thread (e.g. by using <span class="monospaced">select(2)</span> or
|
@@ -877,21 +1164,64 @@ could multiplex I/O with a single thread (e.g. by using <span class="monospaced"
|
|
877
1164
|
processes.</p></div>
|
878
1165
|
<div class="paragraph"><p>Of course, there are many variations possible. For example, load balancers
|
879
1166
|
could be used. But that is outside the scope of this document.</p></div>
|
1167
|
+
<div class="sect3">
|
1168
|
+
<h4 id="_why_reverse_proxy">1.1.1. Why reverse proxy?</h4>
|
1169
|
+
<div class="paragraph"><p>As you’ve seen, it is often necessary to put the web application or its
|
1170
|
+
application server behind a real web server in a reverse proxy setup even
|
1171
|
+
when the web app/app server already speaks HTTP. This is because implementing
|
1172
|
+
HTTP in a proper, secure way involves more than just speaking the protocol.
|
1173
|
+
The public Internet is a hostile environment where clients can send any
|
1174
|
+
arbitrary data and can exhibit any arbitrary I/O patterns. Web servers like
|
1175
|
+
Apache and Nginx have already implemented world-class I/O and connection
|
1176
|
+
handling code and it would be a waste to reinvent their wheel. In the end,
|
1177
|
+
putting the application in a reverse proxying setup makes the whole system
|
1178
|
+
more robust and and more secure.</p></div>
|
1179
|
+
<div class="paragraph"><p>A typical problem involves dealing with <strong>slow clients</strong>. These clients may send
|
1180
|
+
HTTP requests slowly and read HTTP responses slowly, perhaps taking many seconds
|
1181
|
+
to complete their work. A naive single-threaded HTTP server implementation
|
1182
|
+
that reads an HTTP requests, processes, and sends the HTTP response in a loop
|
1183
|
+
may end up spending so much time waiting for I/O that spends very little time
|
1184
|
+
doing actual work. Worse: suppose that the client is malicious, just leaves the
|
1185
|
+
socket open and never reads the HTTP response, then the server will spend
|
1186
|
+
forever waiting for the client, not being able to handle any more requests.</p></div>
|
1187
|
+
<div class="listingblock">
|
1188
|
+
<div class="title">An example of a naive HTTP server implementation</div>
|
1189
|
+
<div class="content monospaced">
|
1190
|
+
<pre>while true
|
1191
|
+
client = accept_next_client()
|
1192
|
+
request = read_http_request(client)
|
1193
|
+
response = process_request(request)
|
1194
|
+
send_http_response(client, response)
|
1195
|
+
end</pre>
|
1196
|
+
</div>
|
1197
|
+
</div>
|
1198
|
+
<div class="paragraph"><p>There are many ways to solve this problem. One could use one thread per client,
|
1199
|
+
one could implement I/O timeouts, one could use an evented I/O architecture, one
|
1200
|
+
could have a dedicated I/O thread or process buffer requests and responses.
|
1201
|
+
The point is, implementing all this properly is non-trivial. Instead of
|
1202
|
+
reimplementing these over and over in each application server, it’s better to
|
1203
|
+
let a real web server deal with all the details and let the application server
|
1204
|
+
and the web application do what they’re best at: their own core business logic.</p></div>
|
1205
|
+
</div>
|
880
1206
|
</div>
|
881
1207
|
<div class="sect2">
|
882
|
-
<h3 id="
|
883
|
-
<div class="paragraph"><p>
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
<
|
890
|
-
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
<
|
1208
|
+
<h3 id="_ruby_rack_and_ruby_on_rails">1.2. Ruby Rack and Ruby on Rails</h3>
|
1209
|
+
<div class="paragraph"><p>The de-facto standard interface for Ruby web applications is <a href="http://rack.rubyforge.org/">Rack</a>.
|
1210
|
+
Rack specifies an programming interface for web application developers to implement.
|
1211
|
+
This interface covers HTTP request and response handling, and is not dependent on
|
1212
|
+
any particular application server. The idea is that any Rack-compliant application
|
1213
|
+
server can implement the Rack specification and work with all Rack-compliant web applications.</p></div>
|
1214
|
+
<div class="paragraph"><p><span class="image">
|
1215
|
+
<img src="images/rack.png" alt="images/rack.png"></span></p></div>
|
1216
|
+
<div class="paragraph"><p>In the distant past, each Ruby web framework had its own interface, so application
|
1217
|
+
servers needed to explicitly add support for each web framework. Nowadays application
|
1218
|
+
servers just support Rack.</p></div>
|
1219
|
+
<div class="paragraph"><p><span class="image">
|
1220
|
+
<img src="images/many_web_framework_protocols.png" alt="images/many_web_framework_protocols.png"></span></p></div>
|
1221
|
+
<div class="paragraph"><p>Ruby on Rails has been fully Rack compliant since version 3.0. Rails 2.3 was partially
|
1222
|
+
Rack-compliant while earlier versions were not Rack-compliant at all. Phusion Passenger
|
1223
|
+
supports Rack as well as all Rails 1.x and 2.x versions.</p></div>
|
1224
|
+
<div class="paragraph"><p>A particularly interesting thing to note is that a lot of the memory
|
895
1225
|
occupied by Ruby on Rails applications is spent on storing the program code
|
896
1226
|
(i.e. the <a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree">abstract
|
897
1227
|
syntax tree (AST)</a>) in memory. This is observed through the use of the
|
@@ -901,56 +1231,80 @@ application is spent on bootstrapping the Rails framework.</p></div>
|
|
901
1231
|
</div>
|
902
1232
|
<div class="sect2">
|
903
1233
|
<h3 id="_apache">1.3. Apache</h3>
|
904
|
-
<div class="paragraph"><p>The Apache web server has a pluggable I/O
|
1234
|
+
<div class="paragraph"><p>The Apache web server has a dynamic module system and a pluggable I/O
|
1235
|
+
multiprocessing (the ability to
|
905
1236
|
handle more than 1 concurrent HTTP client at the same time) architecture. An
|
906
1237
|
Apache module which implements a particular multiprocessing strategy, is called
|
907
|
-
a Multi-Processing Module (MPM). The
|
908
|
-
<a href="http://httpd.apache.org/docs/2.
|
909
|
-
|
910
|
-
|
1238
|
+
a Multi-Processing Module (MPM). The single-threaded multi-process
|
1239
|
+
<a href="http://httpd.apache.org/docs/2.4/mod/prefork.html">prefork MPM</a> had been
|
1240
|
+
the default and the most popular one for a long time, but in recent times the
|
1241
|
+
hybrid multi-threaded/multi-process <a href="http://httpd.apache.org/docs/2.4/mod/worker.html">worker MPM</a>
|
1242
|
+
is becoming increasingly popular because of its better performance and scalability.
|
1243
|
+
Furthermore, Apache 2.4 introduced the <a href="http://httpd.apache.org/docs/2.4/mod/event.html">event MPM</a>
|
1244
|
+
which is a hybrid evented/multi-threaded/multi-process MPM and offers even more
|
1245
|
+
scalability benefits.</p></div>
|
1246
|
+
<div class="paragraph"><p>The prefork MPM remains in wide use today because it’s the only MPM that works well with mod_php.</p></div>
|
1247
|
+
<div class="paragraph"><p>The prefork MPM spawns multiple worker child processes. HTTP requests are first accepted by a
|
911
1248
|
so-called control process, and then forwarded to one of the worker processes.
|
912
|
-
The next section contains a diagram which shows the prefork MPM
|
1249
|
+
The next section contains a diagram which shows the prefork MPM’s architecture.</p></div>
|
1250
|
+
</div>
|
1251
|
+
<div class="sect2">
|
1252
|
+
<h3 id="_nginx">1.4. Nginx</h3>
|
1253
|
+
<div class="paragraph"><p>Nginx is a lightweight web server that is becoming increasingly popular. It is known
|
1254
|
+
to be smaller, lighter weight and more scalable than Apache thanks to its evented I/O
|
1255
|
+
architecture. That said, Nginx is less flexible than Apache. For example it has no
|
1256
|
+
dynamic module system: all modules must be statically compiled into Nginx.</p></div>
|
913
1257
|
</div>
|
914
1258
|
</div>
|
915
1259
|
</div>
|
916
1260
|
<div class="sect1">
|
917
|
-
<h2 id="
|
1261
|
+
<h2 id="_phusion_passenger_architecture">2. Phusion Passenger architecture</h2>
|
918
1262
|
<div class="sectionbody">
|
919
1263
|
<div class="sect2">
|
920
1264
|
<h3 id="_overview">2.1. Overview</h3>
|
921
|
-
<div class="paragraph"><p>Passenger
|
922
|
-
<a href="#
|
923
|
-
Passenger extends Apache and allows it to act like an
|
924
|
-
|
1265
|
+
<div class="paragraph"><p>Phusion Passenger’s architecture is a lot like model #2 described in
|
1266
|
+
<a href="#web_app_models">Web application models</a>. In other words,
|
1267
|
+
Phusion Passenger extends Apache/Nginx and allows it to act like an
|
1268
|
+
application server. This is shown in the following diagram:</p></div>
|
925
1269
|
<div class="paragraph"><p><span class="image">
|
926
|
-
<img src="images/passenger_architecture.png" alt="Passenger
|
927
|
-
|
928
|
-
<div class="
|
929
|
-
|
930
|
-
|
931
|
-
|
932
|
-
|
933
|
-
|
934
|
-
|
935
|
-
<
|
936
|
-
|
1270
|
+
<img src="images/passenger_architecture.png" alt="Passenger’s architecture"></span></p></div>
|
1271
|
+
<div class="paragraph"><p>Phusion Passenger consists of:</p></div>
|
1272
|
+
<div class="ulist"><ul>
|
1273
|
+
<li>
|
1274
|
+
<p>
|
1275
|
+
an Apache module, <em>mod_passenger</em>. This is written in C++, and can be found in the directory <em>ext/apache2</em>.
|
1276
|
+
</p>
|
1277
|
+
</li>
|
1278
|
+
<li>
|
1279
|
+
<p>
|
1280
|
+
an Nginx module <em>ngx_http_passenger_module</em>. This is written in C, and can be found in the directory <em>ext/nginx</em>.
|
1281
|
+
</p>
|
1282
|
+
</li>
|
1283
|
+
<li>
|
1284
|
+
<p>
|
1285
|
+
Common code used by both the Apache and the Nginx module. For example the helper agent is among this code. This code is mostly C++ and can be found in the directory <em>ext/common</em>.
|
1286
|
+
</p>
|
1287
|
+
</li>
|
1288
|
+
</ul></div>
|
1289
|
+
<div class="paragraph"><p>The module is active all Apache/Nginx processes. When an HTTP request comes in, the Phusion Passenger module checks whether the request should be handled by a Phusion Passenger-served application. If so, then the module spawns one or more processes for the corresponding application (if necessary), forwards the request to that application process and forwards its generated response back to the client. This is all done with the assistance of the Phusion Passenger helper agent, which stores state that must be shared among all web server worker processes and handles much of the internal I/O between the web server and the application processes.</p></div>
|
1290
|
+
<div class="paragraph"><p>It should be noted that applications do <strong>not</strong> run in the same address space as the web server.
|
1291
|
+
This differentiates Passenger from other
|
937
1292
|
application-server-inside-web-server software such as mod_php, mod_perl and
|
938
|
-
mod_ruby. If the
|
939
|
-
effect on
|
940
|
-
is carefully designed and implemented so that
|
941
|
-
of Passenger.</p></div>
|
1293
|
+
mod_ruby. If the application crashes or leak memory, it will have no
|
1294
|
+
effect on the web server. In fact, stability is one of our highest goals. Phusion Passenger
|
1295
|
+
is carefully designed and implemented so that the web server shouldn’t crash because
|
1296
|
+
of Phusion Passenger.</p></div>
|
942
1297
|
</div>
|
943
1298
|
<div class="sect2">
|
944
1299
|
<h3 id="_spawning_and_caching_of_code_and_applications">2.2. Spawning and caching of code and applications</h3>
|
945
|
-
<div class="paragraph"><p>A very naive implementation of
|
946
|
-
|
947
|
-
However, spawning Ruby
|
948
|
-
seconds on a modern
|
949
|
-
|
950
|
-
|
951
|
-
similar to how Lighttpd’s FastCGI implementation works.
|
1300
|
+
<div class="paragraph"><p>A very naive implementation of an application server would spawn an application
|
1301
|
+
process every time an HTTP request is received, just like CGI would.
|
1302
|
+
However, spawning Ruby applications is typically expensive. It can take a few
|
1303
|
+
seconds on a modern computer, and possibly much longer on a heavily loaded server.
|
1304
|
+
A less naive implementation would keep spawned application processes alive,
|
1305
|
+
similar to how Lighttpd’s FastCGI implementation works.
|
952
1306
|
However, this still has several problems:</p></div>
|
953
|
-
<div class="olist arabic"><ol class="arabic">
|
1307
|
+
<div class="olist arabic"><ol class="arabic">
|
954
1308
|
<li>
|
955
1309
|
<p>
|
956
1310
|
The first request to a Rails website will be slow, and subsequent requests
|
@@ -960,21 +1314,21 @@ The first request to a Rails website will be slow, and subsequent requests
|
|
960
1314
|
</li>
|
961
1315
|
<li>
|
962
1316
|
<p>
|
963
|
-
As we
|
1317
|
+
As we’ve explained earlier in this article, a lot of memory in a Rails
|
964
1318
|
application is spent on storing the AST of the Ruby on Rails framework and
|
965
1319
|
the application. Especially on shared hosts and on memory-constrained
|
966
1320
|
Virtual Private Servers (VPS), this can be a problem.
|
967
1321
|
</p>
|
968
1322
|
</li>
|
969
1323
|
</ol></div>
|
970
|
-
<div class="paragraph"><p>Both of these problems are very much solvable, and we
|
1324
|
+
<div class="paragraph"><p>Both of these problems are very much solvable, and we’ve chosen to do just
|
971
1325
|
that.</p></div>
|
972
1326
|
<div class="paragraph"><p>The first problem can be solved by preloading Rails applications, i.e. by
|
973
1327
|
running the Rails application before a request is ever made to that website.
|
974
1328
|
This is the approach taken by most Rails hosts, for example in the form of a
|
975
1329
|
Mongrel cluster which is running all the time. However, this is unacceptable
|
976
1330
|
for a shared host: such an application would just sit there and waste memory
|
977
|
-
even if it
|
1331
|
+
even if it’s not doing anything. Instead, we’ve chosen to take a different
|
978
1332
|
approach, which solves both of the aforementioned problems.</p></div>
|
979
1333
|
<div class="paragraph"><p>We spawn Rails applications via a <em>spawn server</em>. The spawn server caches Ruby
|
980
1334
|
on Rails framework code and application code in memory. Spawning a Rails
|
@@ -988,14 +1342,14 @@ share memory with each other, thus solving problem #2. This is described in
|
|
988
1342
|
detail in <a href="#spawn_server">the next section</a>.</p></div>
|
989
1343
|
<div class="paragraph"><p>But despite the caching of framework code and application code, spawning is
|
990
1344
|
still expensive compared to an HTTP request. We want to avoid spawning whenever
|
991
|
-
possible. This is why we
|
1345
|
+
possible. This is why we’ve introduced the <strong>application pool</strong>. Spawned
|
992
1346
|
application instances are kept alive, and their handles are stored into this
|
993
1347
|
pool, allowing each application instance to be reused later. Thus, Passenger
|
994
1348
|
has very good average case performance.</p></div>
|
995
1349
|
<div class="paragraph"><p>The application pool is shared between different worker processes. Because the
|
996
1350
|
worker processes cannot share memory with each other, either shared memory must
|
997
1351
|
be used to implement the application pool, or a client/server architecture must
|
998
|
-
be implemented. We
|
1352
|
+
be implemented. We’ve chosen the latter because it is easier
|
999
1353
|
to implement. The Apache control process acts like a server for the application
|
1000
1354
|
pool. However, this does not mean that all HTTP request/response data go
|
1001
1355
|
through the control process. A worker process queries the pool for a connection
|
@@ -1014,10 +1368,10 @@ idle for an extended period of time.</p></div>
|
|
1014
1368
|
<h3 id="spawn_server">2.3. The spawn server</h3>
|
1015
1369
|
<div class="paragraph"><p>The spawn server is written in Ruby, and its code can be found in the directory
|
1016
1370
|
<em>lib/passenger</em>. Its main executable is <em>bin/passenger-spawn-server</em>.
|
1017
|
-
<a href="rdoc/index.html">The spawn server
|
1371
|
+
<a href="rdoc/index.html">The spawn server’s RDoc documentation</a> documents the
|
1018
1372
|
implementation in detail.</p></div>
|
1019
1373
|
<div class="paragraph"><p>The spawn server consists of 3 logical layers:</p></div>
|
1020
|
-
<div class="olist arabic"><ol class="arabic">
|
1374
|
+
<div class="olist arabic"><ol class="arabic">
|
1021
1375
|
<li>
|
1022
1376
|
<p>
|
1023
1377
|
<strong>The spawn manager.</strong> This is the topmost layer, and acts like a fascade for
|
@@ -1040,28 +1394,27 @@ implementation in detail.</p></div>
|
|
1040
1394
|
<strong>The application spawner server.</strong> This is to the framework spawner server
|
1041
1395
|
what the framework spawner server is to the spawn manager. The framework
|
1042
1396
|
spawner server spawns an application spawner server for each unique Ruby on
|
1043
|
-
Rails application (here
|
1397
|
+
Rails application (here “application” does not mean a running process, but
|
1044
1398
|
a set of (source code) files). An application spawner server caches the
|
1045
1399
|
code for exactly one application.
|
1046
1400
|
</p>
|
1047
1401
|
</li>
|
1048
1402
|
</ol></div>
|
1049
1403
|
<div class="paragraph"><p><span class="image">
|
1050
|
-
<img src="images/spawn_server_architecture.png" alt="The spawn server
|
1051
|
-
</span></p></div>
|
1404
|
+
<img src="images/spawn_server_architecture.png" alt="The spawn server’s architecture"></span></p></div>
|
1052
1405
|
<div class="paragraph"><p>As you can see, we have two layers of code caching: when the spawn server
|
1053
1406
|
receives a request to spawn a new application instance, it will forward the
|
1054
1407
|
request to the correct framework spawner server (and will spawn that framework
|
1055
|
-
spawner server if it doesn
|
1408
|
+
spawner server if it doesn’t already exist), which — in turn — will forward
|
1056
1409
|
it to the correct application spawner server (which will, again, be created if
|
1057
|
-
it doesn
|
1410
|
+
it doesn’t already exist).</p></div>
|
1058
1411
|
<div class="paragraph"><p>Each layer is only responsible for the layer directly below. The spawn manager
|
1059
1412
|
only knows about framework spawner servers, and a framework spawner server only
|
1060
1413
|
knows about its application spawner servers. The application spawner server is,
|
1061
1414
|
however, not responsible for managing spawned application instances. If an
|
1062
1415
|
application instance is spawned by mod_passenger, its information will be sent
|
1063
1416
|
back to mod_passenger, which will be fully responsible for managing the
|
1064
|
-
application instance
|
1417
|
+
application instance’s life time (through the application pool).</p></div>
|
1065
1418
|
<div class="paragraph"><p>Also note that each layer is a seperate process. This is required because a
|
1066
1419
|
single Ruby process can only load a single Ruby on Rails framework and a
|
1067
1420
|
single application.</p></div>
|
@@ -1073,26 +1426,26 @@ be able to access each others' memory, so the operating system makes a copy of
|
|
1073
1426
|
a piece of memory when it is written to by the parent process or the child
|
1074
1427
|
process. This is called copy-on-write (COW). Detailed background information
|
1075
1428
|
can be found on <a href="http://www.rubyenterpriseedition.com/">Ruby Enterprise
|
1076
|
-
Edition
|
1429
|
+
Edition’s website</a>.</p></div>
|
1077
1430
|
<div class="paragraph"><p>The spawn server makes use of this useful fact. Each layer shares its Ruby AST
|
1078
1431
|
memory with all of its lower layers, as long as the AST nodes in question
|
1079
|
-
haven
|
1432
|
+
haven’t been written to. This means that all spawned Rails applications will — if possible — share the Ruby on Rails framework’s code, as well as its own
|
1080
1433
|
application code, with each other. This results in a dramatic reduction in
|
1081
1434
|
memory usage.</p></div>
|
1082
1435
|
<div class="admonitionblock">
|
1083
|
-
<table><tr>
|
1436
|
+
<table><tr>
|
1084
1437
|
<td class="icon">
|
1085
|
-
<img src="./images/icons/note.png" alt="Note">
|
1438
|
+
<img src="./images/icons/note.png" alt="Note">
|
1086
1439
|
</td>
|
1087
1440
|
<td class="content">
|
1088
1441
|
<div class="paragraph"><p>Sharing memory only works if <a href="http://www.rubyenterpriseedition.com/">Ruby
|
1089
|
-
Enterprise Edition</a> is used. This is because the standard Ruby interpreter
|
1090
|
-
garbage collector isn
|
1442
|
+
Enterprise Edition</a> is used. This is because the standard Ruby interpreter’s
|
1443
|
+
garbage collector isn’t copy-on-write friendly. Please visit the Ruby
|
1091
1444
|
Enterprise Edition website for technical details.</p></div>
|
1092
1445
|
<div class="paragraph"><p>Passenger works fine with standard Ruby. You still get to enjoy reduced Rails
|
1093
|
-
startup times. You just won
|
1446
|
+
startup times. You just won’t be able to benefit from memory sharing.</p></div>
|
1094
1447
|
</td>
|
1095
|
-
</tr></table>
|
1448
|
+
</tr></table>
|
1096
1449
|
</div>
|
1097
1450
|
<div class="paragraph"><p>Note that <a href="http://rubini.us/">Rubinius</a>'s garbage collector is already
|
1098
1451
|
copy-on-write friendly.</p></div>
|
@@ -1102,14 +1455,14 @@ copy-on-write friendly.</p></div>
|
|
1102
1455
|
<h3 id="concurrent_requests">2.4. Handling of concurrent requests</h3>
|
1103
1456
|
<div class="paragraph"><p>As explained earlier, a single Rails application instance can only handle a
|
1104
1457
|
single request at the same time. This is obviously undesirable. But before we
|
1105
|
-
dive into the solution, let us take a look how the
|
1458
|
+
dive into the solution, let us take a look how the “competition” solves this
|
1106
1459
|
problem. PHP has similar problems: a single PHP script can also process only
|
1107
1460
|
one HTTP request at a time.</p></div>
|
1108
|
-
<div class="ulist"><ul>
|
1461
|
+
<div class="ulist"><ul>
|
1109
1462
|
<li>
|
1110
1463
|
<p>
|
1111
|
-
mod_php
|
1112
|
-
mod_php doesn
|
1464
|
+
mod_php “solves” this problem by using Apache’s MPM. In other words,
|
1465
|
+
mod_php doesn’t do anything by itself at all. A single Apache worker
|
1113
1466
|
process/thread can only handle 1 PHP request at a time, but Apache spawns
|
1114
1467
|
multiple worker processes/threads.
|
1115
1468
|
</p>
|
@@ -1124,12 +1477,12 @@ PHP-FastCGI solves the problem by spawning multiple persistent PHP servers.
|
|
1124
1477
|
</li>
|
1125
1478
|
</ul></div>
|
1126
1479
|
<div class="paragraph"><p>Passenger cannot use the mod_php way because it would force us to spawn a new
|
1127
|
-
Rails application for each request, which is
|
1480
|
+
Rails application for each request, which is — as explained earlier — unacceptably slow. Instead, Passenger uses the PHP-FastCGI approach. We
|
1128
1481
|
maintain a pool of application instances, and whenever a request is received,
|
1129
1482
|
we forward the request to one of the application instances in the pool. The
|
1130
1483
|
size of the pool is configurable, which is useful for administrators of servers
|
1131
1484
|
that are either heavily loaded or have little memory.</p></div>
|
1132
|
-
<div class="paragraph"><p>The reader might also be interested in studying the application pool
|
1485
|
+
<div class="paragraph"><p>The reader might also be interested in studying the application pool’s
|
1133
1486
|
algorithm, which is non-trivial. The algorithm is documented in detail in
|
1134
1487
|
<a href="ApplicationPool%20algorithm.txt">ApplicationPool algorithm.txt</a>.</p></div>
|
1135
1488
|
</div>
|
@@ -1143,8 +1496,7 @@ algorithm, which is non-trivial. The algorithm is documented in detail in
|
|
1143
1496
|
Attribution-Share Alike 3.0 Unported License</a>.</p></div>
|
1144
1497
|
<div class="paragraph"><p><span class="image">
|
1145
1498
|
<a class="image" href="link:http://creativecommons.org/licenses/by-sa/3.0/">
|
1146
|
-
<img src="images/by_sa.png" alt="images/by_sa.png">
|
1147
|
-
</a>
|
1499
|
+
<img src="images/by_sa.png" alt="images/by_sa.png"></a>
|
1148
1500
|
</span></p></div>
|
1149
1501
|
</div>
|
1150
1502
|
</div>
|
@@ -1152,8 +1504,510 @@ Attribution-Share Alike 3.0 Unported License</a>.</p></div>
|
|
1152
1504
|
<div id="footnotes"><hr></div>
|
1153
1505
|
<div id="footer">
|
1154
1506
|
<div id="footer-text">
|
1155
|
-
Last updated
|
1507
|
+
Last updated 2012-06-14 09:44:52 CEST
|
1156
1508
|
</div>
|
1157
1509
|
</div>
|
1158
|
-
|
1159
|
-
</html>
|
1510
|
+
<script>/*! jQuery v1.7.1 jquery.com | jquery.org/license */
|
1511
|
+
(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(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 cb(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 ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(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===bT,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=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),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 bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(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 bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(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(O.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 S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}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=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,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=m.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.7.1",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.add(a);return this},eq:function(a){a=+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.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");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},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(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;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(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(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},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,"ms-").replace(v,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,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&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=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.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={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.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:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([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&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=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,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},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"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(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(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},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.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;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(p);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(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");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(p);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+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.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}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),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,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},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},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.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}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.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,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?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}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,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.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,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);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),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 z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
|
1512
|
+
f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,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 instanceof f.Event))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()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},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)}}),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 contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.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&&!l.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&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.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&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,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(j,"")+" ";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(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.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]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),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]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.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!!m(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=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([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}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&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=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null: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=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=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(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)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 v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=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}),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)&&(o.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:[]}},o.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&&(o.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")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[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}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.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 m(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;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={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(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0: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=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.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(i?i.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)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));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(S(c[0])||S(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);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).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 V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={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,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._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){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):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.clean(arguments);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.clean(arguments));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()
|
1513
|
+
{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(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$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"&&bd.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?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=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,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},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(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),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&&X.test(k)&&o.insertBefore(b.createTextNode(X.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++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.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.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;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=bz(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,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;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(bz)return bz(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 bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.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,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,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=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,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&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.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(bN,"")).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||bO.test(this.nodeName)||bI.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(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(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?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[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","*":bX},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},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),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>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),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.Callbacks("once memory"),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=bH.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.add,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(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.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]!=="*"?", "+bX+"; 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=b$(bU,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){if(s<2)w(-1,z);else throw 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)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),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&&(ce.test(b.url)||e&&ce.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(ce,l),b.url===j&&(e&&(k=k.replace(ce,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 cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,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,cf&&delete ch[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=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("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",cv(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(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].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(cu("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){function g(){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||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("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;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):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,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=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.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?: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=cy(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);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.support.fixedPosition&&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.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.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.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.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=cx.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&&!cx.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=cy(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=cy(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")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():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],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["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 i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
|
1514
|
+
/**
|
1515
|
+
* jQuery hashchange 1.0.0
|
1516
|
+
*
|
1517
|
+
* (based on jquery.history)
|
1518
|
+
*
|
1519
|
+
* Copyright (c) 2008 Chris Leishman (chrisleishman.com)
|
1520
|
+
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
1521
|
+
* and GPL (GPL-LICENSE.txt) licenses.
|
1522
|
+
*/
|
1523
|
+
(function($) {
|
1524
|
+
|
1525
|
+
$.fn.extend({
|
1526
|
+
hashchange: function(callback) { this.bind('hashchange', callback) },
|
1527
|
+
openOnClick: function(href) {
|
1528
|
+
if (href === undefined || href.length == 0)
|
1529
|
+
href = '#';
|
1530
|
+
return this.click(function(ev) {
|
1531
|
+
if (href && href.charAt(0) == '#') {
|
1532
|
+
// execute load in separate call stack
|
1533
|
+
window.setTimeout(function() { $.locationHash(href) }, 0);
|
1534
|
+
} else {
|
1535
|
+
window.location(href);
|
1536
|
+
}
|
1537
|
+
ev.stopPropagation();
|
1538
|
+
return false;
|
1539
|
+
});
|
1540
|
+
}
|
1541
|
+
});
|
1542
|
+
|
1543
|
+
// IE 8 introduces the hashchange event natively - so nothing more to do
|
1544
|
+
if ($.browser.msie && document.documentMode && document.documentMode >= 8) {
|
1545
|
+
$.extend({
|
1546
|
+
locationHash: function(hash) {
|
1547
|
+
if (!hash) hash = '#';
|
1548
|
+
else if (hash.charAt(0) != '#') hash = '#' + hash;
|
1549
|
+
location.hash = hash;
|
1550
|
+
}
|
1551
|
+
});
|
1552
|
+
return;
|
1553
|
+
}
|
1554
|
+
|
1555
|
+
var curHash;
|
1556
|
+
// hidden iframe for IE (earlier than 8)
|
1557
|
+
var iframe;
|
1558
|
+
|
1559
|
+
$.extend({
|
1560
|
+
locationHash: function(hash) {
|
1561
|
+
if (curHash === undefined) return;
|
1562
|
+
|
1563
|
+
if (!hash) hash = '#';
|
1564
|
+
else if (hash.charAt(0) != '#') hash = '#' + hash;
|
1565
|
+
|
1566
|
+
location.hash = hash;
|
1567
|
+
|
1568
|
+
if (curHash == hash) return;
|
1569
|
+
curHash = hash;
|
1570
|
+
|
1571
|
+
if ($.browser.msie) updateIEFrame(hash);
|
1572
|
+
$.event.trigger('hashchange');
|
1573
|
+
}
|
1574
|
+
});
|
1575
|
+
|
1576
|
+
$(document).ready(function() {
|
1577
|
+
curHash = location.hash;
|
1578
|
+
if ($.browser.msie) {
|
1579
|
+
// stop the callback firing twice during init if no hash present
|
1580
|
+
if (curHash == '') curHash = '#';
|
1581
|
+
// add hidden iframe for IE
|
1582
|
+
iframe = $('<iframe />').hide().get(0);
|
1583
|
+
$('body').prepend(iframe);
|
1584
|
+
updateIEFrame(location.hash);
|
1585
|
+
setInterval(checkHashIE, 100);
|
1586
|
+
} else {
|
1587
|
+
setInterval(checkHash, 100);
|
1588
|
+
}
|
1589
|
+
});
|
1590
|
+
$(window).unload(function() { iframe = null });
|
1591
|
+
|
1592
|
+
function checkHash() {
|
1593
|
+
var hash = location.hash;
|
1594
|
+
if (hash != curHash) {
|
1595
|
+
curHash = hash;
|
1596
|
+
$.event.trigger('hashchange');
|
1597
|
+
}
|
1598
|
+
}
|
1599
|
+
|
1600
|
+
if ($.browser.msie) {
|
1601
|
+
// Attach a live handler for any anchor links
|
1602
|
+
$('a[href^=#]').live('click', function() {
|
1603
|
+
var hash = $(this).attr('href');
|
1604
|
+
// Don't intercept the click if there is an existing anchor on the page
|
1605
|
+
// that matches this hash
|
1606
|
+
if ($(hash).length == 0 && $('a[name='+hash.slice(1)+']').length == 0) {
|
1607
|
+
$.locationHash(hash);
|
1608
|
+
return false;
|
1609
|
+
}
|
1610
|
+
});
|
1611
|
+
}
|
1612
|
+
|
1613
|
+
function checkHashIE() {
|
1614
|
+
// On IE, check for location.hash of iframe
|
1615
|
+
var idoc = iframe.contentDocument || iframe.contentWindow.document;
|
1616
|
+
var hash = idoc.location.hash;
|
1617
|
+
if (hash == '') hash = '#';
|
1618
|
+
|
1619
|
+
if (hash != curHash) {
|
1620
|
+
if (location.hash != hash) location.hash = hash;
|
1621
|
+
curHash = hash;
|
1622
|
+
$.event.trigger('hashchange');
|
1623
|
+
}
|
1624
|
+
}
|
1625
|
+
|
1626
|
+
function updateIEFrame(hash) {
|
1627
|
+
if (hash == '#') hash = '';
|
1628
|
+
var idoc = iframe.contentWindow.document;
|
1629
|
+
idoc.open();
|
1630
|
+
idoc.close();
|
1631
|
+
if (idoc.location.hash != hash) idoc.location.hash = hash;
|
1632
|
+
}
|
1633
|
+
|
1634
|
+
})(jQuery);
|
1635
|
+
// IE...
|
1636
|
+
if (!Date.now) {
|
1637
|
+
Date.now = function() {
|
1638
|
+
return new Date().getTime();
|
1639
|
+
}
|
1640
|
+
}
|
1641
|
+
|
1642
|
+
var Mizuho = {
|
1643
|
+
/** Cached DOM elements so that we don't have to re-find them over and over. */
|
1644
|
+
$document: undefined,
|
1645
|
+
$window: undefined,
|
1646
|
+
$mainSections: undefined,
|
1647
|
+
$sectionHeaders: undefined,
|
1648
|
+
|
1649
|
+
/** Constants */
|
1650
|
+
MAX_TOC_LEVEL: 3,
|
1651
|
+
|
1652
|
+
sectionHeadersSelector: undefined,
|
1653
|
+
scrollMemory: {},
|
1654
|
+
changingHash: false,
|
1655
|
+
activeHash: undefined,
|
1656
|
+
/** Whether in single-page or multi-page mode. Either 'single' or 'multi'. */
|
1657
|
+
mode: 'single',
|
1658
|
+
/** Whether smooth scrolling is enabled. It is always enabled except right
|
1659
|
+
* after page load: when the page is scrolled to the section as pointed to
|
1660
|
+
* by location.hash.
|
1661
|
+
*/
|
1662
|
+
smoothScrolling: true,
|
1663
|
+
|
1664
|
+
initialize: function() {
|
1665
|
+
this.sectionHeadersSelector = '';
|
1666
|
+
for (var i = 0; i < this.MAX_TOC_LEVEL; i++) {
|
1667
|
+
if (i != 0) {
|
1668
|
+
this.sectionHeadersSelector += ', ';
|
1669
|
+
}
|
1670
|
+
this.sectionHeadersSelector += 'h' + (i + 2);
|
1671
|
+
}
|
1672
|
+
|
1673
|
+
this.$document = $(document);
|
1674
|
+
this.$window = $(window);
|
1675
|
+
this.$mainSections = $('.sect1');
|
1676
|
+
this.$sectionHeaders = $(this.sectionHeadersSelector, '#content');
|
1677
|
+
this.$sectionHeaders.sort(function(a, b) {
|
1678
|
+
var off_a = $(a).offset();
|
1679
|
+
var off_b = $(b).offset();
|
1680
|
+
return off_a.top - off_b.top;
|
1681
|
+
});
|
1682
|
+
|
1683
|
+
if (this.isMobileDevice()) {
|
1684
|
+
$(document.body).addClass('mobile');
|
1685
|
+
}
|
1686
|
+
},
|
1687
|
+
|
1688
|
+
|
1689
|
+
/********* Generic utility functions *********/
|
1690
|
+
|
1691
|
+
isMobileDevice: function() {
|
1692
|
+
return navigator.userAgent.match(
|
1693
|
+
/(IEMobile|Windows CE|NetFront|PlayStation|PLAYSTATION|like Mac OS X|MIDP|UP\.Browser|Symbian|Nintendo|Android)/
|
1694
|
+
);
|
1695
|
+
},
|
1696
|
+
|
1697
|
+
virtualAnimate: function(options) {
|
1698
|
+
var options = $.extend({
|
1699
|
+
duration: 1000
|
1700
|
+
}, options || {});
|
1701
|
+
var animation_start = Date.now();
|
1702
|
+
var animation_end = Date.now() + options.duration;
|
1703
|
+
var interval = animation_end - animation_start;
|
1704
|
+
this._virtualAnimate_step(animation_start, animation_end, interval, options);
|
1705
|
+
},
|
1706
|
+
|
1707
|
+
_virtualAnimate_step: function(animation_start, animation_end, interval, options) {
|
1708
|
+
var self = this;
|
1709
|
+
var now = new Date();
|
1710
|
+
var progress = (now - animation_start) / interval;
|
1711
|
+
if (progress > 1) {
|
1712
|
+
progress = 1;
|
1713
|
+
}
|
1714
|
+
progress = (1 + Math.sin(-Math.PI / 2 + progress * Math.PI)) / 2;
|
1715
|
+
options.step(progress);
|
1716
|
+
if (now < animation_end) {
|
1717
|
+
setTimeout(function() {
|
1718
|
+
self._virtualAnimate_step(animation_start,
|
1719
|
+
animation_end, interval, options);
|
1720
|
+
}, 15);
|
1721
|
+
} else {
|
1722
|
+
options.step(1);
|
1723
|
+
if (options.finish) {
|
1724
|
+
options.finish();
|
1725
|
+
}
|
1726
|
+
}
|
1727
|
+
},
|
1728
|
+
|
1729
|
+
smoothlyScrollTo: function(top) {
|
1730
|
+
if (!this.smoothScrolling) {
|
1731
|
+
return this.setScrollTop(top);
|
1732
|
+
}
|
1733
|
+
|
1734
|
+
var self = this;
|
1735
|
+
var $document = this.$document;
|
1736
|
+
var current = $document.scrollTop();
|
1737
|
+
this.virtualAnimate({
|
1738
|
+
duration: 300,
|
1739
|
+
step: function(x) {
|
1740
|
+
$document.scrollTop(Math.floor(
|
1741
|
+
top + (1 - x) * (current - top)
|
1742
|
+
));
|
1743
|
+
},
|
1744
|
+
finish: function() {
|
1745
|
+
self.setScrollTop(top);
|
1746
|
+
}
|
1747
|
+
});
|
1748
|
+
},
|
1749
|
+
|
1750
|
+
smoothlyScrollToToc: function() {
|
1751
|
+
this.smoothlyScrollTo($('#toc').position().top);
|
1752
|
+
},
|
1753
|
+
|
1754
|
+
scrollToHeader: function(header) {
|
1755
|
+
this.smoothlyScrollTo($(header).offset().top - 50);
|
1756
|
+
},
|
1757
|
+
|
1758
|
+
setScrollTop: function(top, element) {
|
1759
|
+
// Browsers don't always scroll properly so work around
|
1760
|
+
// this with a few timers.
|
1761
|
+
var self = this;
|
1762
|
+
element = element || this.$document;
|
1763
|
+
element = $(element);
|
1764
|
+
element.scrollTop(top);
|
1765
|
+
setTimeout(function() {
|
1766
|
+
element.scrollTop(top);
|
1767
|
+
}, 1);
|
1768
|
+
setTimeout(function() {
|
1769
|
+
element.scrollTop(top);
|
1770
|
+
self.$document.trigger('mizuho:updateTopBar');
|
1771
|
+
}, 20);
|
1772
|
+
},
|
1773
|
+
|
1774
|
+
|
1775
|
+
/********* Mizuho-specific functions *********/
|
1776
|
+
|
1777
|
+
/** Returns the currently displayed section's header DOM element. */
|
1778
|
+
currentSubsection: function() {
|
1779
|
+
var $sectionHeaders = this.$sectionHeaders;
|
1780
|
+
var scrollTop = this.$document.scrollTop();
|
1781
|
+
var windowHeight = this.$window.height();
|
1782
|
+
var offset;
|
1783
|
+
|
1784
|
+
var low = 0;
|
1785
|
+
var high = this.$sectionHeaders.length - 1;
|
1786
|
+
var mid = 0;
|
1787
|
+
|
1788
|
+
while (low <= high) {
|
1789
|
+
mid = Math.floor((low + high) / 2);
|
1790
|
+
offset = $($sectionHeaders[mid]).offset();
|
1791
|
+
|
1792
|
+
if (offset.top >= scrollTop) {
|
1793
|
+
high = mid - 1;
|
1794
|
+
} else {
|
1795
|
+
low = mid + 1;
|
1796
|
+
}
|
1797
|
+
}
|
1798
|
+
|
1799
|
+
var $found = $($sectionHeaders[low]);
|
1800
|
+
if ($found.offset().top > scrollTop + windowHeight) {
|
1801
|
+
if (low > 0) {
|
1802
|
+
return $sectionHeaders[low - 1];
|
1803
|
+
} else {
|
1804
|
+
return undefined;
|
1805
|
+
}
|
1806
|
+
} else {
|
1807
|
+
return $sectionHeaders[low];
|
1808
|
+
}
|
1809
|
+
},
|
1810
|
+
|
1811
|
+
/** Looks up a section's header DOM element corresponding to a hash name. */
|
1812
|
+
lookupHeader: function(hash) {
|
1813
|
+
var id = hash.replace(/^#!\//, '#');
|
1814
|
+
if (id == '') {
|
1815
|
+
return undefined;
|
1816
|
+
} else {
|
1817
|
+
var header = $(id);
|
1818
|
+
if (header.length == 0) {
|
1819
|
+
return undefined;
|
1820
|
+
} else {
|
1821
|
+
return header;
|
1822
|
+
}
|
1823
|
+
}
|
1824
|
+
}
|
1825
|
+
};
|
1826
|
+
|
1827
|
+
for (var key in Mizuho) {
|
1828
|
+
if (typeof(Mizuho[key]) == 'function') {
|
1829
|
+
Mizuho[key] = $.proxy(Mizuho[key], Mizuho);
|
1830
|
+
}
|
1831
|
+
}
|
1832
|
+
$(document).ready(Mizuho.initialize);
|
1833
|
+
//$(document).ready(Mizuho.installHashbangLinks);
|
1834
|
+
|
1835
|
+
Mizuho.initializeTopBar = $.proxy(function() {
|
1836
|
+
var $window = this.$window;
|
1837
|
+
var $document = this.$document;
|
1838
|
+
var self = this;
|
1839
|
+
var $topbar = $('#topbar');
|
1840
|
+
var $title = $('#header h1');
|
1841
|
+
var $currentSection = $('#current_section');
|
1842
|
+
var isMobileDevice = this.isMobileDevice();
|
1843
|
+
var timerId;
|
1844
|
+
|
1845
|
+
var $floattoc = $('<div id="floattoc"></div>').html($('#toc').html());
|
1846
|
+
$floattoc.find('#toctitle').remove();
|
1847
|
+
$floattoc.find('.comments').remove();
|
1848
|
+
$floattoc.css('visibility', 'hidden');
|
1849
|
+
$floattoc.insertAfter($topbar);
|
1850
|
+
var $floattoclinks = $floattoc.find('a');
|
1851
|
+
$floattoclinks.each(function() {
|
1852
|
+
// Firefox changes '#!' to '#%21' so change that back.
|
1853
|
+
var $this = $(this);
|
1854
|
+
var href = $this.attr('href');
|
1855
|
+
if (href.match(/^#%21/)) {
|
1856
|
+
$this.attr('href', href.replace(/^#%21/, '#!'));
|
1857
|
+
}
|
1858
|
+
});
|
1859
|
+
$floattoclinks.click(function(event) {
|
1860
|
+
self.internalLinkClicked(this, event);
|
1861
|
+
});
|
1862
|
+
|
1863
|
+
function showFloatingToc() {
|
1864
|
+
var scrollUpdateTimerId;
|
1865
|
+
|
1866
|
+
function reposition() {
|
1867
|
+
if (isMobileDevice) {
|
1868
|
+
$floattoc.css({
|
1869
|
+
top: $currentSection.offset().top +
|
1870
|
+
$currentSection.innerHeight() +
|
1871
|
+
'px',
|
1872
|
+
height: $window.height() * 0.7 + 'px'
|
1873
|
+
});
|
1874
|
+
}
|
1875
|
+
}
|
1876
|
+
|
1877
|
+
function highlightCurrentTocEntry() {
|
1878
|
+
var currentSubsection = self.currentSubsection();
|
1879
|
+
$floattoclinks.removeClass('current');
|
1880
|
+
if (currentSubsection) {
|
1881
|
+
var currentSubsectionTitle = $(currentSubsection).text();
|
1882
|
+
var $link;
|
1883
|
+
|
1884
|
+
$floattoclinks.each(function() {
|
1885
|
+
if ($(this).text() == currentSubsectionTitle) {
|
1886
|
+
$link = $(this);
|
1887
|
+
return false;
|
1888
|
+
}
|
1889
|
+
});
|
1890
|
+
if ($link) {
|
1891
|
+
$link.addClass('current');
|
1892
|
+
self.setScrollTop(
|
1893
|
+
$floattoc.scrollTop() +
|
1894
|
+
$link.position().top -
|
1895
|
+
$floattoc.height() * 0.45,
|
1896
|
+
$floattoc);
|
1897
|
+
return false;
|
1898
|
+
}
|
1899
|
+
}
|
1900
|
+
}
|
1901
|
+
|
1902
|
+
function hideFloatingToc() {
|
1903
|
+
$currentSection.removeClass('pressed');
|
1904
|
+
$floattoc.css('visibility', 'hidden');
|
1905
|
+
$floattoclinks.unbind('click', hideFloatingToc);
|
1906
|
+
$document.unbind('mousedown', onMouseDown);
|
1907
|
+
$document.unbind('touchdown', onMouseDown);
|
1908
|
+
$document.unbind('mizuho:hideTopBar', hideFloatingToc);
|
1909
|
+
$window.unbind('scroll', onScroll);
|
1910
|
+
if (scrollUpdateTimerId !== undefined) {
|
1911
|
+
clearTimeout(scrollUpdateTimerId);
|
1912
|
+
scrollUpdateTimerId = undefined;
|
1913
|
+
}
|
1914
|
+
}
|
1915
|
+
|
1916
|
+
function onMouseDown(event) {
|
1917
|
+
if (event.target != $floattoc[0]
|
1918
|
+
&& $(event.target).closest('#floattoc').length == 0) {
|
1919
|
+
hideFloatingToc();
|
1920
|
+
}
|
1921
|
+
}
|
1922
|
+
|
1923
|
+
function onScroll(event) {
|
1924
|
+
if (scrollUpdateTimerId === undefined) {
|
1925
|
+
scrollUpdateTimerId = setTimeout(function() {
|
1926
|
+
scrollUpdateTimerId = undefined;
|
1927
|
+
reposition();
|
1928
|
+
highlightCurrentTocEntry();
|
1929
|
+
}, 100);
|
1930
|
+
}
|
1931
|
+
}
|
1932
|
+
|
1933
|
+
// Layout and display floating TOC.
|
1934
|
+
highlightCurrentTocEntry();
|
1935
|
+
var origScrollTop = $document.scrollTop();
|
1936
|
+
var windowWidth = $window.width();
|
1937
|
+
var maxRight = windowWidth - Math.floor(windowWidth * 0.1);
|
1938
|
+
|
1939
|
+
if ($currentSection.offset().left + $floattoc.outerWidth() > maxRight) {
|
1940
|
+
$floattoc.css('left', maxRight - $floattoc.outerWidth());
|
1941
|
+
} else {
|
1942
|
+
$floattoc.css('left', $currentSection.offset().left + 'px');
|
1943
|
+
}
|
1944
|
+
reposition();
|
1945
|
+
$floattoc.css('visibility', 'visible');
|
1946
|
+
$currentSection.addClass('pressed');
|
1947
|
+
|
1948
|
+
$floattoclinks.bind('click', hideFloatingToc);
|
1949
|
+
$document.bind('mousedown', onMouseDown)
|
1950
|
+
$document.bind('touchdown', onMouseDown);
|
1951
|
+
$document.bind('mizuho:hideTopBar', hideFloatingToc);
|
1952
|
+
$window.bind('scroll', onScroll);
|
1953
|
+
}
|
1954
|
+
|
1955
|
+
function update() {
|
1956
|
+
if ($title.offset().top + $title.height() < $document.scrollTop()) {
|
1957
|
+
if (!$topbar.is(':visible')) {
|
1958
|
+
$topbar.slideDown(250);
|
1959
|
+
$document.trigger('mizuho:showTopBar');
|
1960
|
+
}
|
1961
|
+
} else {
|
1962
|
+
if ($topbar.is(':visible')) {
|
1963
|
+
$topbar.slideUp();
|
1964
|
+
$document.trigger('mizuho:hideTopBar');
|
1965
|
+
}
|
1966
|
+
}
|
1967
|
+
|
1968
|
+
if (isMobileDevice) {
|
1969
|
+
$topbar.css({
|
1970
|
+
top: $document.scrollTop() + 'px',
|
1971
|
+
width: $window.width() -
|
1972
|
+
parseInt($topbar.css('padding-left')) -
|
1973
|
+
parseInt($topbar.css('padding-right')) +
|
1974
|
+
'px'
|
1975
|
+
});
|
1976
|
+
}
|
1977
|
+
|
1978
|
+
var header = self.currentSubsection();
|
1979
|
+
var name;
|
1980
|
+
if (header) {
|
1981
|
+
name = $(header).text();
|
1982
|
+
} else {
|
1983
|
+
name = 'Preamble';
|
1984
|
+
}
|
1985
|
+
$currentSection.text(name);
|
1986
|
+
}
|
1987
|
+
|
1988
|
+
function scheduleUpdate() {
|
1989
|
+
if (timerId !== undefined) {
|
1990
|
+
return;
|
1991
|
+
}
|
1992
|
+
timerId = setTimeout(function() {
|
1993
|
+
timerId = undefined;
|
1994
|
+
update();
|
1995
|
+
}, 100);
|
1996
|
+
}
|
1997
|
+
|
1998
|
+
if (isMobileDevice) {
|
1999
|
+
// Mobile devices don't support position fixed.
|
2000
|
+
$topbar.css('position', 'absolute');
|
2001
|
+
$floattoc.css('position', 'absolute');
|
2002
|
+
}
|
2003
|
+
|
2004
|
+
$currentSection.click(showFloatingToc);
|
2005
|
+
$window.scroll(scheduleUpdate);
|
2006
|
+
$document.bind('mizuho:updateTopBar', update);
|
2007
|
+
}, Mizuho);
|
2008
|
+
|
2009
|
+
$(document).ready(Mizuho.initializeTopBar);
|
2010
|
+
|
2011
|
+
</script>
|
2012
|
+
</body>
|
2013
|
+
</html>
|