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.

Files changed (48) hide show
  1. data/DEVELOPERS.TXT +1 -0
  2. data/NEWS +11 -0
  3. data/bin/passenger-install-nginx-module +1 -1
  4. data/build/basics.rb +0 -1
  5. data/build/documentation.rb +17 -8
  6. data/build/packaging.rb +2 -2
  7. data/doc/Architectural overview.html +987 -133
  8. data/doc/Architectural overview.idmap.txt +36 -0
  9. data/doc/Architectural overview.txt +150 -74
  10. data/doc/Security of user switching support.html +820 -54
  11. data/doc/Security of user switching support.idmap.txt +34 -0
  12. data/doc/Users guide Apache.html +1675 -633
  13. data/doc/Users guide Apache.idmap.txt +298 -0
  14. data/doc/Users guide Apache.txt +3 -11
  15. data/doc/Users guide Nginx.html +1462 -452
  16. data/doc/Users guide Nginx.idmap.txt +218 -0
  17. data/doc/Users guide Standalone.html +979 -44
  18. data/doc/Users guide Standalone.idmap.txt +18 -0
  19. data/doc/images/many_web_framework_protocols.png +0 -0
  20. data/doc/images/passenger_architecture.png +0 -0
  21. data/doc/images/passenger_architecture.svg +198 -215
  22. data/doc/images/rack.png +0 -0
  23. data/ext/boost/config/stdlib/libstdcpp3.hpp +2 -1
  24. data/ext/boost/exception/detail/error_info_impl.hpp +1 -1
  25. data/ext/common/AgentBase.cpp +15 -5
  26. data/ext/common/Constants.h +1 -1
  27. data/ext/common/EventedMessageServer.h +1 -1
  28. data/ext/common/StaticString.h +2 -1
  29. data/ext/common/Watchdog.cpp +2 -2
  30. data/ext/libev/config.h +122 -0
  31. data/ext/nginx/Configuration.c +24 -8
  32. data/ext/nginx/ContentHandler.c +5 -6
  33. data/lib/phusion_passenger.rb +2 -2
  34. data/lib/phusion_passenger/abstract_request_handler.rb +11 -8
  35. data/lib/phusion_passenger/dependencies.rb +12 -18
  36. data/lib/phusion_passenger/platform_info/compiler.rb +8 -2
  37. data/lib/phusion_passenger/platform_info/ruby.rb +3 -2
  38. data/lib/phusion_passenger/rails3_extensions/init.rb +6 -4
  39. data/lib/phusion_passenger/standalone/command.rb +10 -13
  40. data/lib/phusion_passenger/standalone/runtime_installer.rb +2 -2
  41. data/lib/phusion_passenger/standalone/start_command.rb +32 -16
  42. data/lib/phusion_passenger/templates/apache2/apache_must_be_compiled_with_compatible_mpm.txt.erb +1 -1
  43. data/lib/phusion_passenger/templates/standalone/config.erb +2 -1
  44. data/test/stub/wsgi/passenger_wsgi.pyc +0 -0
  45. metadata +21 -16
  46. data/doc/Users guide Apache with comments.html +0 -4830
  47. data/lib/phusion_passenger/platform_info/documentation_tools.rb +0 -35
  48. data/test/stub/rails_apps/3.0/empty/log/development.log +0 -3
data/DEVELOPERS.TXT CHANGED
@@ -13,6 +13,7 @@ The tests need the following software installed:
13
13
  * rspec >= 1.1.2
14
14
  * mime-types >= 1.15
15
15
  * sqlite3-ruby
16
+ * daemon_controller >= 1.0.0
16
17
 
17
18
  The following software is optional:
18
19
 
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 = "ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-#{PREFERRED_PCRE_VERSION}.tar.gz"
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
@@ -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.asciidoc
30
+ if PlatformInfo.find_command('mizuho')
33
31
  if target =~ /apache/i
34
- type = "-a apache"
32
+ type = "apache"
33
+ juvia_site_key = "5jpmkyjqlml8rktsfldfpbwth8ig7w9"
35
34
  elsif target =~ /nginx/i
36
- type = "-a nginx"
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
- sh "#{PlatformInfo.asciidoc} #{ASCIIDOC_FLAGS} #{type} '#{source}'"
49
+ sh(command)
41
50
  else
42
- sh "echo 'asciidoc required to build docs' > '#{target}'"
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.2.5'
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.5">
6
- <title>Passenger architectural overview</title>
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 &amp; 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: 100%; }
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]([2-'+(toclevels+1)+'])');
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 == 'DIV'
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 == 'DIV' && entry.getAttribute("class") == "footnote")
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
- </head>
788
- <body class="article">
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 &amp; architecture</a>
1047
+ </div>
1048
+ <a href="javascript:void(0)" id="current_section"></a>
1049
+ </div>
789
1050
  <div id="header">
790
- <h1>Passenger architectural overview</h1>
1051
+ <h1>Phusion Passenger design &amp; 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
- <div id="preamble">
798
- <div class="sectionbody">
799
- <div class="paragraph"><p>This document describes Passenger&#8217;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="_about_the_involved_technologies">1. About the involved technologies</h2>
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="typical_web_applications">1.1. Typical web applications</h3>
810
- <div class="paragraph"><p>Before we describe Passenger, it is important to understand how typical web
811
- applications work, from the point of view of someone who wants to connect the
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
- </span></p></div>
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. 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>A typical example of such a setup is a J2EE application, contained in the
837
- Tomcat web server, behind the Apache web server.</p></div>
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 many setups, such web applications sit behind a different
853
- web server, instead of accepting HTTP requests directly. The frontend web
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&#8217;re
1152
+ <div class="paragraph"><p>These descriptions are true for virtually all web applications, whether theyre
866
1153
  based on PHP, Django, J2EE, ASP.NET, Ruby on Rails, or whatever. Note that all
867
- of these setups provide the same functionality, i.e. no setup can do something
868
- that a different setup can&#8217;t. The critical reader will notice that all of these
869
- setups are identical to the one described in the first diagram, if the
1154
+ of these models provide the same functionality, i.e. no model can do something
1155
+ that a different model cant. 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 setups do not enforce any particular
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="_ruby_on_rails">1.2. Ruby on Rails</h3>
883
- <div class="paragraph"><p>Every Ruby on Rails application has a <em>dispatcher</em>. This dispatcher is
884
- responsible for processing HTTP requests. It does not speak HTTP directly.
885
- Instead, it accepts data structures that contain the information of an
886
- HTTP request. Thus, the dispatcher is particularly interesting to
887
- developers who wish to develop software which connects Ruby on Rails to an
888
- HTTP processing layer (e.g. a web server).</p></div>
889
- <div class="paragraph"><p>The Ruby on Rails dispatcher can only process requests serially, i.e. one
890
- at a time. It is not possible to process two requests at the same time
891
- with threads, because parts of Ruby on Rails are not thread-safe. (In
892
- practice, this isn&#8217;t as big of a problem as some people imagine. This will
893
- be elaborated further in <a href="#concurrent_requests">Handling of concurrent requests</a>.)</p></div>
894
- <div class="paragraph"><p>A particularly interesting thing to note, is that a lot of the memory
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 multiprocessing (the ability to
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.0/mod/prefork.html">prefork MPM</a>&#8201;&#8212;&#8201;which
909
- also happens to be the default&#8201;&#8212;&#8201;appears to be the most popular one. This MPM
910
- spawns multiple worker child processes. HTTP requests are first accepted by a
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&#8217;s architecture.</p></div>
1249
+ The next section contains a diagram which shows the prefork MPMs 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="_passenger_architecture">2. Passenger architecture</h2>
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&#8217;s architecture is a lot like setup #2 described in
922
- <a href="#typical_web_applications">Typical web applications</a>. In other words,
923
- Passenger extends Apache and allows it to act like an application server.
924
- Passenger&#8217;s architecture&#8201;&#8212;&#8201;assuming Apache 2 with the prefork MPM is used&#8201;&#8212;&#8201;is shown in the following diagram:</p></div>
1265
+ <div class="paragraph"><p>Phusion Passengers 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&#8217;s architecture">
927
- </span></p></div>
928
- <div class="paragraph"><p>Passenger consists of an Apache module, <em>mod_passenger</em>. This is written in
929
- C++, and can be found in the directory <em>ext/apache2</em>. The module is active in
930
- the Apache control process and in all the Apache worker processes. When an
931
- HTTP request comes in, <em>mod_passenger</em> will check whether the request should
932
- be handled by a Ruby on Rails application. If so, then <em>mod_passenger</em> will
933
- spawn the corresponding Rails application (if necessary) and forward the
934
- request to that application.</p></div>
935
- <div class="paragraph"><p>It should be noted that the Ruby on Rails application does <strong>not</strong> run in the
936
- same address space as Apache. This differentiates Passenger from other
1270
+ <img src="images/passenger_architecture.png" alt="Passengers 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 Rails application crashes or leak memory, it will have no
939
- effect on Apache. In fact, stability is one of our highest goals. Passenger
940
- is carefully designed and implemented so that Apache shouldn&#8217;t crash because
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 shouldnt 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 Passenger would spawn a Ruby on Rails
946
- application every time an HTTP request is received, just like CGI would.
947
- However, spawning Ruby on Rails applications is expensive. It can take 1 or 2
948
- seconds on a modern PC, and possibly much longer on a heavily loaded server.
949
- This overhead is particularily unacceptable on shared hosts. A less naive
950
- implementation would keep spawned Ruby on Rails application instances alive,
951
- similar to how Lighttpd&#8217;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&#8217;ve explained earlier in this article, a lot of memory in a Rails
1317
+ As weve 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&#8217;ve chosen to do just
1324
+ <div class="paragraph"><p>Both of these problems are very much solvable, and weve 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&#8217;s not doing anything. Instead, we&#8217;ve chosen to take a different
1331
+ even if its not doing anything. Instead, weve 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&#8217;ve introduced the <strong>application pool</strong>. Spawned
1345
+ possible. This is why weve 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&#8217;ve chosen the latter because it is easier
1352
+ be implemented. Weve 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&#8217;s RDoc documentation</a> documents the
1371
+ <a href="rdoc/index.html">The spawn servers 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 &#8220;application&#8221; does not mean a running process, but
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&#8217;s architecture">
1051
- </span></p></div>
1404
+ <img src="images/spawn_server_architecture.png" alt="The spawn servers 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&#8217;t already exist), which&#8201;&#8212;&#8201;in turn&#8201;&#8212;&#8201;will forward
1408
+ spawner server if it doesnt 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&#8217;t already exist).</p></div>
1410
+ it doesnt 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&#8217;s life time (through the application pool).</p></div>
1417
+ application instances 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&#8217;s website</a>.</p></div>
1429
+ Editions 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&#8217;t been written to. This means that all spawned Rails applications will&#8201;&#8212;&#8201;if possible&#8201;&#8212;&#8201;share the Ruby on Rails framework&#8217;s code, as well as its own
1432
+ havent been written to. This means that all spawned Rails applications will — if possible — share the Ruby on Rails frameworks 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&#8217;s
1090
- garbage collector isn&#8217;t copy-on-write friendly. Please visit the Ruby
1442
+ Enterprise Edition</a> is used. This is because the standard Ruby interpreters
1443
+ garbage collector isnt 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&#8217;t be able to benefit from memory sharing.</p></div>
1446
+ startup times. You just wont 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 &#8220;competition&#8221; solves this
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 &#8220;solves&#8221; this problem by using Apache&#8217;s MPM. In other words,
1112
- mod_php doesn&#8217;t do anything by itself at all. A single Apache worker
1464
+ mod_php solves this problem by using Apaches MPM. In other words,
1465
+ mod_php doesnt 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&#8201;&#8212;&#8201;as explained earlier&#8201;&#8212;&#8201;unacceptably slow. Instead, Passenger uses the PHP-FastCGI approach. We
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&#8217;s
1485
+ <div class="paragraph"><p>The reader might also be interested in studying the application pools
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 2010-09-25 20:09:08 CEST
1507
+ Last updated 2012-06-14 09:44:52 CEST
1156
1508
  </div>
1157
1509
  </div>
1158
- </body>
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>