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
@@ -0,0 +1,36 @@
1
+ ###### Autogenerated by Mizuho, DO NOT EDIT ######
2
+ # This file maps section names to IDs so that the commenting system knows which
3
+ # comments belong to which section. Section names may be changed at will but
4
+ # IDs always stay the same, allowing one to retain old comments even if you
5
+ # rename a section.
6
+ #
7
+ # This file is autogenerated but is not a cache; you MUST NOT DELETE this
8
+ # file and you must check it into your version control system. If you lose
9
+ # this file you may lose the ability to identity old comments.
10
+ #
11
+ # Entries marked with "fuzzy" indicate that the section title has changed
12
+ # and that Mizuho has found an ID which appears to be associated with that
13
+ # section. You should check whether it is correct, and if not, fix it.
14
+
15
+ 1. About the involved technologies => about-the-involved-technologies-14ot82u
16
+
17
+ 1.1. Typical web applications => typical-web-applications-1yd1iav
18
+
19
+ 1.2. Ruby on Rails => ruby-on-rails-5v776m
20
+
21
+ 1.3. Apache => apache-123bbrn
22
+
23
+ 2. Passenger architecture => passenger-architecture-ehq6p7
24
+
25
+ 2.1. Overview => overview-1ickxaj
26
+
27
+ 2.2. Spawning and caching of code and applications => spawning-and-caching-of-code-and-applications-rtkxsp
28
+
29
+ 2.3. The spawn server => the-spawn-server-ktu9q0
30
+
31
+ 2.3.1. Memory sharing => memory-sharing-30wsnk
32
+
33
+ 2.4. Handling of concurrent requests => handling-of-concurrent-requests-1ud4gns
34
+
35
+ 3. Appendix A: About this document => appendix-a-about-this-document-fo5ufe
36
+
@@ -1,21 +1,24 @@
1
- Passenger architectural overview
2
- ================================
1
+ Phusion Passenger design & architecture
2
+ =======================================
3
3
 
4
- This document describes Passenger's architure in a global way. The purpose of
5
- this document is to lower the barrier to entry for new contributors, as well
6
- as to explain (some of the) design choices that we have made.
4
+ image:images/phusion_banner.png[link="http://www.phusion.nl/"]
7
5
 
8
- Or it can be a fun read for people who just want to know how Passenger works.
6
+ Last updated: June 5, 2012.
9
7
 
8
+ This document describes Phusion Passenger's design and architure in a global way.
9
+ Its purpose is to lower the barrier to entry for new contributors,
10
+ to explain some of the design choices we have made and to educate people
11
+ about how Phusion Passenger works.
10
12
 
11
- About the involved technologies
12
- -------------------------------
13
13
 
14
- [[typical_web_applications]]
15
- === Typical web applications ===
14
+ Introduction to related technologies
15
+ ------------------------------------
16
16
 
17
- Before we describe Passenger, it is important to understand how typical web
18
- applications work, from the point of view of someone who wants to connect the
17
+ [[web_app_models]]
18
+ === Web application models ===
19
+
20
+ Before we describe Phusion Passenger, it is important to understand how typical web
21
+ applications work from the viewpoint of someone who wants to connect the
19
22
  application to a web server.
20
23
 
21
24
  A typical, isolated, web application accepts an HTTP request from some I/O
@@ -28,32 +31,46 @@ representation of an HTTP request.
28
31
  image:images/typical_isolated_web_application.png[Architecture of a typical
29
32
  web application in isolation]
30
33
 
31
- Few web applications are accessible directly by HTTP clients. Common setups
34
+ Few web applications are accessible directly by HTTP clients. Common models
32
35
  are:
33
36
 
34
37
  1. The web application is contained in an application server. This application
35
38
  server may or may not be able to contain multiple web applications. The
36
- application server is then connected to the web server. The web server
39
+ application server is then connected to the web server through some kind of
40
+ protocol. This protocol may be HTTP, FastCGI, SCGI, AJP or whatever. The web server
37
41
  dispatches requests to the application server, which in turn dispatches
38
42
  requests to the correct web application, in a format that the web application
39
43
  understands. Conversely, HTTP responses outputted by the web application are
40
44
  sent to the application server, which in turn sends them to the web server,
41
45
  and eventually to the HTTP client.
42
46
  +
43
- A typical example of such a setup is a J2EE application, contained in the
44
- Tomcat web server, behind the Apache web server.
47
+ Typical examples of such a model:
48
+ +
49
+ * A J2EE application, contained in the Tomcat application server, proxied
50
+ behind the Apache web server. Tomcat can contain multiple web applications
51
+ in a single Tomcat instance.
52
+ * Most Ruby application servers besides Phusion Passenger (Thin, Unicorn,
53
+ Goliath, etc). These application servers can only contain a single Ruby
54
+ web application per instance. They load the web application into their
55
+ own process and are put behind a web server (Apache, Nginx) in a reverse
56
+ proxy setup.
45
57
 
46
58
  2. The web application is contained in a web server. In this case, the web
47
- server acts like an application server. This is the case for PHP applications,
59
+ server acts like an application server. This is the case for PHP applications
48
60
  on Apache servers with 'mod_php'. Note that this does not necessarily mean
49
61
  that the web application is run inside the same process as the web server:
50
- it just means that the web server manages applications.
62
+ it just means that the web server manages applications. In case of mod_php
63
+ however PHP does run directly inside the Apache worker processes.
64
+ +
65
+ Phusion Passenger for Apache and Phusion Passenger for Nginx implement this model.
51
66
 
52
67
  3. The web application *is* a web server, and can accept HTTP requests
53
68
  directly. This is the case for the Trac bug tracking system, running in its
54
- standalone server. In many setups, such web applications sit behind a different
55
- web server, instead of accepting HTTP requests directly. The frontend web
56
- server acts like a reverse HTTP proxy.
69
+ standalone server. In most setups they are reverse proxied behind a real
70
+ web server such as Apache or Nginx, instead of accepting HTTP requests directly.
71
+ +
72
+ Phusion Passenger Standalone implements this model. You can expose Phusion Passenger
73
+ Standalone directly to the Internet because it uses Nginx internally.
57
74
 
58
75
  4. The web application does not speak HTTP directly, but is connected directly
59
76
  to the web server through some communication adapter. CGI, FastCGI and SCGI
@@ -61,13 +78,13 @@ are good examples of this.
61
78
 
62
79
  These descriptions are true for virtually all web applications, whether they're
63
80
  based on PHP, Django, J2EE, ASP.NET, Ruby on Rails, or whatever. Note that all
64
- of these setups provide the same functionality, i.e. no setup can do something
65
- that a different setup can't. The critical reader will notice that all of these
66
- setups are identical to the one described in the first diagram, if the
81
+ of these models provide the same functionality, i.e. no model can do something
82
+ that a different model can't. The critical reader will notice that all of these
83
+ models are identical to the one described in the first diagram, if the
67
84
  combination of web servers, application servers, web applications etc. are
68
85
  considered to be a single entity; a black box if you will.
69
86
 
70
- It should also be noted that these setups do not enforce any particular
87
+ It should also be noted that these models do not enforce any particular
71
88
  I/O processing implementation. The web servers, application servers, web
72
89
  applications, etc. could process I/O serially (i.e. one request at a time),
73
90
  could multiplex I/O with a single thread (e.g. by using `select(2)` or
@@ -77,24 +94,68 @@ processes.
77
94
  Of course, there are many variations possible. For example, load balancers
78
95
  could be used. But that is outside the scope of this document.
79
96
 
80
-
81
- === Ruby on Rails ===
82
-
83
- Every Ruby on Rails application has a 'dispatcher'. This dispatcher is
84
- responsible for processing HTTP requests. It does not speak HTTP directly.
85
- Instead, it accepts data structures that contain the information of an
86
- HTTP request. Thus, the dispatcher is particularly interesting to
87
- developers who wish to develop software which connects Ruby on Rails to an
88
- HTTP processing layer (e.g. a web server).
89
-
90
- The Ruby on Rails dispatcher can only process requests serially, i.e. one
91
- at a time. It is not possible to process two requests at the same time
92
- with threads, because parts of Ruby on Rails are not thread-safe. (In
93
- practice, this isn't as big of a problem as some people imagine. This will
94
- be elaborated further in <<concurrent_requests,Handling of concurrent
95
- requests>>.)
96
-
97
- A particularly interesting thing to note, is that a lot of the memory
97
+ ==== Why reverse proxy? ====
98
+
99
+ As you've seen, it is often necessary to put the web application or its
100
+ application server behind a real web server in a reverse proxy setup even
101
+ when the web app/app server already speaks HTTP. This is because implementing
102
+ HTTP in a proper, secure way involves more than just speaking the protocol.
103
+ The public Internet is a hostile environment where clients can send any
104
+ arbitrary data and can exhibit any arbitrary I/O patterns. Web servers like
105
+ Apache and Nginx have already implemented world-class I/O and connection
106
+ handling code and it would be a waste to reinvent their wheel. In the end,
107
+ putting the application in a reverse proxying setup makes the whole system
108
+ more robust and and more secure.
109
+
110
+ A typical problem involves dealing with *slow clients*. These clients may send
111
+ HTTP requests slowly and read HTTP responses slowly, perhaps taking many seconds
112
+ to complete their work. A naive single-threaded HTTP server implementation
113
+ that reads an HTTP requests, processes, and sends the HTTP response in a loop
114
+ may end up spending so much time waiting for I/O that spends very little time
115
+ doing actual work. Worse: suppose that the client is malicious, just leaves the
116
+ socket open and never reads the HTTP response, then the server will spend
117
+ forever waiting for the client, not being able to handle any more requests.
118
+
119
+ .An example of a naive HTTP server implementation
120
+ -------------------
121
+ while true
122
+ client = accept_next_client()
123
+ request = read_http_request(client)
124
+ response = process_request(request)
125
+ send_http_response(client, response)
126
+ end
127
+ -------------------
128
+
129
+ There are many ways to solve this problem. One could use one thread per client,
130
+ one could implement I/O timeouts, one could use an evented I/O architecture, one
131
+ could have a dedicated I/O thread or process buffer requests and responses.
132
+ The point is, implementing all this properly is non-trivial. Instead of
133
+ reimplementing these over and over in each application server, it's better to
134
+ let a real web server deal with all the details and let the application server
135
+ and the web application do what they're best at: their own core business logic.
136
+
137
+
138
+ === Ruby Rack and Ruby on Rails ===
139
+
140
+ The de-facto standard interface for Ruby web applications is link:http://rack.rubyforge.org/[Rack].
141
+ Rack specifies an programming interface for web application developers to implement.
142
+ This interface covers HTTP request and response handling, and is not dependent on
143
+ any particular application server. The idea is that any Rack-compliant application
144
+ server can implement the Rack specification and work with all Rack-compliant web applications.
145
+
146
+ image:images/rack.png[]
147
+
148
+ In the distant past, each Ruby web framework had its own interface, so application
149
+ servers needed to explicitly add support for each web framework. Nowadays application
150
+ servers just support Rack.
151
+
152
+ image:images/many_web_framework_protocols.png[]
153
+
154
+ Ruby on Rails has been fully Rack compliant since version 3.0. Rails 2.3 was partially
155
+ Rack-compliant while earlier versions were not Rack-compliant at all. Phusion Passenger
156
+ supports Rack as well as all Rails 1.x and 2.x versions.
157
+
158
+ A particularly interesting thing to note is that a lot of the memory
98
159
  occupied by Ruby on Rails applications is spent on storing the program code
99
160
  (i.e. the link:http://en.wikipedia.org/wiki/Abstract_syntax_tree[abstract
100
161
  syntax tree (AST)]) in memory. This is observed through the use of the
@@ -105,54 +166,69 @@ application is spent on bootstrapping the Rails framework.
105
166
 
106
167
  === Apache ===
107
168
 
108
- The Apache web server has a pluggable I/O multiprocessing (the ability to
169
+ The Apache web server has a dynamic module system and a pluggable I/O
170
+ multiprocessing (the ability to
109
171
  handle more than 1 concurrent HTTP client at the same time) architecture. An
110
172
  Apache module which implements a particular multiprocessing strategy, is called
111
- a Multi-Processing Module (MPM). The
112
- link:http://httpd.apache.org/docs/2.0/mod/prefork.html[prefork MPM] -- which
113
- also happens to be the default -- appears to be the most popular one. This MPM
114
- spawns multiple worker child processes. HTTP requests are first accepted by a
173
+ a Multi-Processing Module (MPM). The single-threaded multi-process
174
+ link:http://httpd.apache.org/docs/2.4/mod/prefork.html[prefork MPM] had been
175
+ the default and the most popular one for a long time, but in recent times the
176
+ hybrid multi-threaded/multi-process link:http://httpd.apache.org/docs/2.4/mod/worker.html[worker MPM]
177
+ is becoming increasingly popular because of its better performance and scalability.
178
+ Furthermore, Apache 2.4 introduced the link:http://httpd.apache.org/docs/2.4/mod/event.html[event MPM]
179
+ which is a hybrid evented/multi-threaded/multi-process MPM and offers even more
180
+ scalability benefits.
181
+
182
+ The prefork MPM remains in wide use today because it's the only MPM that works well with mod_php.
183
+
184
+ The prefork MPM spawns multiple worker child processes. HTTP requests are first accepted by a
115
185
  so-called control process, and then forwarded to one of the worker processes.
116
186
  The next section contains a diagram which shows the prefork MPM's architecture.
117
187
 
118
188
 
119
- Passenger architecture
120
- ----------------------
189
+ === Nginx ===
190
+
191
+ Nginx is a lightweight web server that is becoming increasingly popular. It is known
192
+ to be smaller, lighter weight and more scalable than Apache thanks to its evented I/O
193
+ architecture. That said, Nginx is less flexible than Apache. For example it has no
194
+ dynamic module system: all modules must be statically compiled into Nginx.
195
+
196
+
197
+ Phusion Passenger architecture
198
+ ------------------------------
121
199
 
122
200
  === Overview ===
123
201
 
124
- Passenger's architecture is a lot like setup #2 described in
125
- <<typical_web_applications,Typical web applications>>. In other words,
126
- Passenger extends Apache and allows it to act like an application server.
127
- Passenger's architecture -- assuming Apache 2 with the prefork MPM is used --
128
- is shown in the following diagram:
202
+ Phusion Passenger's architecture is a lot like model #2 described in
203
+ <<web_app_models,Web application models>>. In other words,
204
+ Phusion Passenger extends Apache/Nginx and allows it to act like an
205
+ application server. This is shown in the following diagram:
129
206
 
130
207
  image:images/passenger_architecture.png[Passenger's architecture]
131
208
 
132
- Passenger consists of an Apache module, 'mod_passenger'. This is written in
133
- C++, and can be found in the directory 'ext/apache2'. The module is active in
134
- the Apache control process and in all the Apache worker processes. When an
135
- HTTP request comes in, 'mod_passenger' will check whether the request should
136
- be handled by a Ruby on Rails application. If so, then 'mod_passenger' will
137
- spawn the corresponding Rails application (if necessary) and forward the
138
- request to that application.
209
+ Phusion Passenger consists of:
210
+
211
+ * an Apache module, 'mod_passenger'. This is written in C++, and can be found in the directory 'ext/apache2'.
212
+ * an Nginx module 'ngx_http_passenger_module'. This is written in C, and can be found in the directory 'ext/nginx'.
213
+ * 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 'ext/common'.
214
+
215
+ 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.
139
216
 
140
- It should be noted that the Ruby on Rails application does *not* run in the
141
- same address space as Apache. This differentiates Passenger from other
217
+ It should be noted that applications do *not* run in the same address space as the web server.
218
+ This differentiates Passenger from other
142
219
  application-server-inside-web-server software such as mod_php, mod_perl and
143
- mod_ruby. If the Rails application crashes or leak memory, it will have no
144
- effect on Apache. In fact, stability is one of our highest goals. Passenger
145
- is carefully designed and implemented so that Apache shouldn't crash because
146
- of Passenger.
220
+ mod_ruby. If the application crashes or leak memory, it will have no
221
+ effect on the web server. In fact, stability is one of our highest goals. Phusion Passenger
222
+ is carefully designed and implemented so that the web server shouldn't crash because
223
+ of Phusion Passenger.
147
224
 
148
225
  === Spawning and caching of code and applications ===
149
226
 
150
- A very naive implementation of Passenger would spawn a Ruby on Rails
151
- application every time an HTTP request is received, just like CGI would.
152
- However, spawning Ruby on Rails applications is expensive. It can take 1 or 2
153
- seconds on a modern PC, and possibly much longer on a heavily loaded server.
154
- This overhead is particularily unacceptable on shared hosts. A less naive
155
- implementation would keep spawned Ruby on Rails application instances alive,
227
+ A very naive implementation of an application server would spawn an application
228
+ process every time an HTTP request is received, just like CGI would.
229
+ However, spawning Ruby applications is typically expensive. It can take a few
230
+ seconds on a modern computer, and possibly much longer on a heavily loaded server.
231
+ A less naive implementation would keep spawned application processes alive,
156
232
  similar to how Lighttpd's FastCGI implementation works.
157
233
  However, this still has several problems:
158
234
 
@@ -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>Security of user switching support in Passenger</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>Security of user switching support in Passenger</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,9 +797,256 @@ 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())">Security of user switching support in Passenger</a>
1047
+ </div>
1048
+ <a href="javascript:void(0)" id="current_section"></a>
1049
+ </div>
789
1050
  <div id="header">
790
1051
  <h1>Security of user switching support in Passenger</h1>
791
1052
  <div id="toc">
@@ -798,33 +1059,33 @@ asciidoc.install(3);
798
1059
  <h2 id="_problem_description">1. Problem description</h2>
799
1060
  <div class="sectionbody">
800
1061
  <div class="admonitionblock">
801
- <table><tr>
1062
+ <table><tr>
802
1063
  <td class="icon">
803
- <img src="./images/icons/tip.png" alt="Tip">
1064
+ <img src="./images/icons/tip.png" alt="Tip">
804
1065
  </td>
805
1066
  <td class="content">It is strongly recommended that you first read our
806
1067
  <a href="Architectural%20overview.html">Architectural Overview</a>.</td>
807
- </tr></table>
1068
+ </tr></table>
808
1069
  </div>
809
1070
  <div class="paragraph"><p>A straightforward implementation of Passenger will spawn Rails applications in
810
1071
  the same user context as Apache itself. On server machines which host multiple
811
1072
  websites for multiple users, this may not be desired. All Rails applications
812
1073
  spawned by Passenger will be able to read and write to all directories that the
813
- web server can. So for example, Joe&#8217;s Rails applications could read Jane&#8217;s
814
- Rails application&#8217;s <em>database.yml</em> or delete her application files. This is
1074
+ web server can. So for example, Joes Rails applications could read Janes
1075
+ Rails applications <em>database.yml</em> or delete her application files. This is
815
1076
  also a problem that typically plagues PHP web hosts.</p></div>
816
1077
  <div class="paragraph"><p>There are multiple ways to solve this problem. The goal of this document is to
817
1078
  inform the reader about the solutions have we have analyzed, so that
818
- Passenger&#8217;s security may be peer reviewed.</p></div>
1079
+ Passengers security may be peer reviewed.</p></div>
819
1080
  </div>
820
1081
  </div>
821
1082
  <div class="sect1">
822
1083
  <h2 id="_analysis_of_possible_solutions">2. Analysis of possible solutions</h2>
823
1084
  <div class="sectionbody">
824
1085
  <div class="paragraph"><p>It seems that the only way to solve this problem on Unix, is to run each Rails
825
- application server as its owner&#8217;s user and group. Passenger can make use of
1086
+ application server as its owners user and group. Passenger can make use of
826
1087
  one of the following methods to implement this:</p></div>
827
- <div class="olist arabic"><ol class="arabic">
1088
+ <div class="olist arabic"><ol class="arabic">
828
1089
  <li>
829
1090
  <p>
830
1091
  Apache (and thus Passenger) must already be running as root.
@@ -832,7 +1093,7 @@ Apache (and thus Passenger) must already be running as root.
832
1093
  </li>
833
1094
  <li>
834
1095
  <p>
835
- Using Apache&#8217;s suEXEC.
1096
+ Using Apaches suEXEC.
836
1097
  </p>
837
1098
  </li>
838
1099
  <li>
@@ -864,11 +1125,11 @@ Using <em>sudo</em>.
864
1125
  <div class="paragraph"><p>First, let us take a look at the typical Apache setup, in which Apache is bound
865
1126
  to port 80, and uses the prefork MPM. Binding to any port lower than 1024
866
1127
  requires root privileges, so Apache is typically run as root. This poses an
867
- unacceptable security risk, so Apache&#8217;s prefork MPM will, upon receiving an
1128
+ unacceptable security risk, so Apaches prefork MPM will, upon receiving an
868
1129
  HTTP request, spawn a child process with the privileges of a normal user,
869
1130
  typically <em>www-data</em> or <em>nobody</em>.
870
1131
  See <a href="http://httpd.apache.org/docs/2.2/mod/prefork.html">the documentation for the
871
- prefork MPM</a> - in particular the &#8220;User&#8221; and &#8220;Group&#8221; directives - for details.
1132
+ prefork MPM</a> - in particular the User and Group directives - for details.
872
1133
  The process which is responsible for spawning child processes (also called the
873
1134
  control process) is run as root. This is also true for
874
1135
  <a href="http://httpd.apache.org/docs/2.2/mod/worker.html">the worker MPM</a>.</p></div>
@@ -879,7 +1140,8 @@ have to ask this question:</p></div>
879
1140
  <div class="content">
880
1141
  <div class="paragraph"><p>If Apache is not running as root, are there still any Passenger users who
881
1142
  want to run Rails applications as different users?</p></div>
882
- </div></div>
1143
+ </div>
1144
+ </div>
883
1145
  <div class="paragraph"><p>If the answer is yes, then we cannot use this method.</p></div>
884
1146
  <div class="paragraph"><p>The advantage of this method is that setting up Apache to run as root is
885
1147
  incredibly easy, and requires no new framework to be written. However, testing
@@ -887,13 +1149,13 @@ this method in automated unit tests will require running the unit test suit as
887
1149
  root.</p></div>
888
1150
  </div>
889
1151
  <div class="sect2">
890
- <h3 id="_using_apache_8217_s_suexec">2.2. Using Apache&#8217;s suEXEC</h3>
891
- <div class="paragraph"><p>Apache&#8217;s <a href="http://httpd.apache.org/docs/2.0/suexec.html">suEXEC</a> allows one to
1152
+ <h3 id="_using_apache_8217_s_suexec">2.2. Using Apaches suEXEC</h3>
1153
+ <div class="paragraph"><p>Apaches <a href="http://httpd.apache.org/docs/2.0/suexec.html">suEXEC</a> allows one to
892
1154
  run CGI processes as different users. But it seems that suEXEC can only be
893
1155
  used for CGI, and is not a general-purpose mechanism. The
894
1156
  <a href="http://alain.knaff.lu/howto/PhpSuexec/">PHP-suEXEC</a> software allows one to run
895
1157
  PHP applications via suEXEC, but it requires patching suEXEC. If Passenger is
896
- to use suEXEC, then it is likely that we&#8217;ll have to patch suEXEC. The suEXEC
1158
+ to use suEXEC, then it is likely that well have to patch suEXEC. The suEXEC
897
1159
  website strongly discourages patching.</p></div>
898
1160
  </div>
899
1161
  <div class="sect2">
@@ -906,7 +1168,7 @@ a password file, which only Apache and the wrapper can read, through
906
1168
  the use of proper file permissions. The password file must never be world
907
1169
  readable or writable.</p></div>
908
1170
  <div class="paragraph"><p>It works as follows:</p></div>
909
- <div class="olist arabic"><ol class="arabic">
1171
+ <div class="olist arabic"><ol class="arabic">
910
1172
  <li>
911
1173
  <p>
912
1174
  Passenger runs the wrapper.
@@ -935,7 +1197,7 @@ The solution is that the filename is to be hardcoded into the binary during
935
1197
  compile time.</p></div>
936
1198
  <div class="paragraph"><p>Another way to implement security is to use a whitelist of users that are
937
1199
  allowed to use the wrapper. The wrapper can then check whether the calling
938
- process&#8217;s user is in the whitelist.</p></div>
1200
+ processs user is in the whitelist.</p></div>
939
1201
  <div class="paragraph"><p>Writing a wrapper is not too hard. Furthermore, unit tests do not have to be
940
1202
  run as root, in contrast to the run-Apache-as-root method.</p></div>
941
1203
  </div>
@@ -958,12 +1220,14 @@ methods.</p></div>
958
1220
  wrapper for each user, and to install it.</p></div>
959
1221
  </div>
960
1222
  <div class="sect2">
961
- <h3 id="_using_em_su_em">2.5. Using <em>su</em></h3>
962
- <div class="paragraph"><p>The standard Unix <em>su</em> tool asks for the root password. It&#8217;s a bad idea for
1223
+ <h3 id="_using_em_su_em">2.5. Using <em>su</em>
1224
+ </h3>
1225
+ <div class="paragraph"><p>The standard Unix <em>su</em> tool asks for the root password. It’s a bad idea for
963
1226
  Apache to know the root password, so using <em>su</em> is not a viable alternative.</p></div>
964
1227
  </div>
965
1228
  <div class="sect2">
966
- <h3 id="_using_em_sudo_em">2.6. Using <em>sudo</em></h3>
1229
+ <h3 id="_using_em_sudo_em">2.6. Using <em>sudo</em>
1230
+ </h3>
967
1231
  <div class="paragraph"><p>It might be possible to use the <em>sudo</em> utility. sudo can be configured in
968
1232
  such a way that the user Apache runs as can use sudo without having to enter a
969
1233
  password.</p></div>
@@ -981,16 +1245,16 @@ or (on Linux) by reading the file <span class="monospaced">/proc/$PID/cmdline</s
981
1245
  <h3 id="_common_security_issues">2.7. Common security issues</h3>
982
1246
  <div class="paragraph"><p>Whatever method Passenger will use, the following security principles must be
983
1247
  honored:</p></div>
984
- <div class="ulist"><ul>
1248
+ <div class="ulist"><ul>
985
1249
  <li>
986
1250
  <p>
987
1251
  Rails applications must never be run as root.
988
1252
  </p>
989
1253
  </li>
990
1254
  </ul></div>
991
- <div class="paragraph"><p>It might also be worthy to look into suEXEC&#8217;s security model for inspiration.</p></div>
1255
+ <div class="paragraph"><p>It might also be worthy to look into suEXECs security model for inspiration.</p></div>
992
1256
  <div class="paragraph"><p>Also, the following questions remain:</p></div>
993
- <div class="ulist"><ul>
1257
+ <div class="ulist"><ul>
994
1258
  <li>
995
1259
  <p>
996
1260
  Is there a need for a user whitelist/blacklist? That is, is there a need for
@@ -1005,22 +1269,22 @@ Is there a need for a user whitelist/blacklist? That is, is there a need for
1005
1269
  <h2 id="_chosen_solution">3. Chosen solution</h2>
1006
1270
  <div class="sectionbody">
1007
1271
  <div class="paragraph"><p>Running Apache as root and writing a setuid root wrapper are the main
1008
- contestants. The former is preferred, because it&#8217;s easier to implement.</p></div>
1272
+ contestants. The former is preferred, because its easier to implement.</p></div>
1009
1273
  <div class="paragraph"><p>We have had some conversations with people on the IRC channel #rubyonrails.
1010
1274
  Among those people, nobody has ever run Apache as non-root. Because of this
1011
1275
  we have chosen to implement the <a href="#apache_root">Running Apache as root</a>
1012
1276
  solution, until a significant number of users request us to implement the
1013
1277
  <a href="#setuid_root">setuid root wrapper</a> solution.</p></div>
1014
- <div class="paragraph"><p>Please read <a href="rdoc/index.html">the Ruby API documentation</a>&#8201;&#8212;&#8201;in particular
1015
- that of the <em>ApplicationSpawner</em> class&#8201;&#8212;&#8201;for implementation details. But to
1278
+ <div class="paragraph"><p>Please read <a href="rdoc/index.html">the Ruby API documentation</a> — in particular
1279
+ that of the <em>ApplicationSpawner</em> class — for implementation details. But to
1016
1280
  make a long story short: it will switch to the owner of the file
1017
1281
  <em>config/environment.rb</em>. User whitelisting/blacklisting is currently not
1018
1282
  implemented. We rely on the system administrator to set the correct owner
1019
1283
  on that file.</p></div>
1020
- <div class="paragraph"><p>We have also not implemented suEXEC&#8217;s security model. suEXEC&#8217;s model is quite
1284
+ <div class="paragraph"><p>We have also not implemented suEXECs security model. suEXECs model is quite
1021
1285
  paranoid, and although paranoia is good to a certain extend, it can be in the
1022
1286
  way of usability while proving little extra security. We are not entirely
1023
- convinced that implementing suEXEC&#8217;s full security model will provide
1287
+ convinced that implementing suEXECs full security model will provide
1024
1288
  significant benefits, but if you have good reasons to think otherwise, please
1025
1289
  feel free to discuss it with us.</p></div>
1026
1290
  </div>
@@ -1032,5 +1296,507 @@ feel free to discuss it with us.</p></div>
1032
1296
  Last updated 2010-09-25 20:09:08 CEST
1033
1297
  </div>
1034
1298
  </div>
1035
- </body>
1036
- </html>
1299
+ <script>/*! jQuery v1.7.1 jquery.com | jquery.org/license */
1300
+ (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")};
1301
+ 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()
1302
+ {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);
1303
+ /**
1304
+ * jQuery hashchange 1.0.0
1305
+ *
1306
+ * (based on jquery.history)
1307
+ *
1308
+ * Copyright (c) 2008 Chris Leishman (chrisleishman.com)
1309
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
1310
+ * and GPL (GPL-LICENSE.txt) licenses.
1311
+ */
1312
+ (function($) {
1313
+
1314
+ $.fn.extend({
1315
+ hashchange: function(callback) { this.bind('hashchange', callback) },
1316
+ openOnClick: function(href) {
1317
+ if (href === undefined || href.length == 0)
1318
+ href = '#';
1319
+ return this.click(function(ev) {
1320
+ if (href && href.charAt(0) == '#') {
1321
+ // execute load in separate call stack
1322
+ window.setTimeout(function() { $.locationHash(href) }, 0);
1323
+ } else {
1324
+ window.location(href);
1325
+ }
1326
+ ev.stopPropagation();
1327
+ return false;
1328
+ });
1329
+ }
1330
+ });
1331
+
1332
+ // IE 8 introduces the hashchange event natively - so nothing more to do
1333
+ if ($.browser.msie && document.documentMode && document.documentMode >= 8) {
1334
+ $.extend({
1335
+ locationHash: function(hash) {
1336
+ if (!hash) hash = '#';
1337
+ else if (hash.charAt(0) != '#') hash = '#' + hash;
1338
+ location.hash = hash;
1339
+ }
1340
+ });
1341
+ return;
1342
+ }
1343
+
1344
+ var curHash;
1345
+ // hidden iframe for IE (earlier than 8)
1346
+ var iframe;
1347
+
1348
+ $.extend({
1349
+ locationHash: function(hash) {
1350
+ if (curHash === undefined) return;
1351
+
1352
+ if (!hash) hash = '#';
1353
+ else if (hash.charAt(0) != '#') hash = '#' + hash;
1354
+
1355
+ location.hash = hash;
1356
+
1357
+ if (curHash == hash) return;
1358
+ curHash = hash;
1359
+
1360
+ if ($.browser.msie) updateIEFrame(hash);
1361
+ $.event.trigger('hashchange');
1362
+ }
1363
+ });
1364
+
1365
+ $(document).ready(function() {
1366
+ curHash = location.hash;
1367
+ if ($.browser.msie) {
1368
+ // stop the callback firing twice during init if no hash present
1369
+ if (curHash == '') curHash = '#';
1370
+ // add hidden iframe for IE
1371
+ iframe = $('<iframe />').hide().get(0);
1372
+ $('body').prepend(iframe);
1373
+ updateIEFrame(location.hash);
1374
+ setInterval(checkHashIE, 100);
1375
+ } else {
1376
+ setInterval(checkHash, 100);
1377
+ }
1378
+ });
1379
+ $(window).unload(function() { iframe = null });
1380
+
1381
+ function checkHash() {
1382
+ var hash = location.hash;
1383
+ if (hash != curHash) {
1384
+ curHash = hash;
1385
+ $.event.trigger('hashchange');
1386
+ }
1387
+ }
1388
+
1389
+ if ($.browser.msie) {
1390
+ // Attach a live handler for any anchor links
1391
+ $('a[href^=#]').live('click', function() {
1392
+ var hash = $(this).attr('href');
1393
+ // Don't intercept the click if there is an existing anchor on the page
1394
+ // that matches this hash
1395
+ if ($(hash).length == 0 && $('a[name='+hash.slice(1)+']').length == 0) {
1396
+ $.locationHash(hash);
1397
+ return false;
1398
+ }
1399
+ });
1400
+ }
1401
+
1402
+ function checkHashIE() {
1403
+ // On IE, check for location.hash of iframe
1404
+ var idoc = iframe.contentDocument || iframe.contentWindow.document;
1405
+ var hash = idoc.location.hash;
1406
+ if (hash == '') hash = '#';
1407
+
1408
+ if (hash != curHash) {
1409
+ if (location.hash != hash) location.hash = hash;
1410
+ curHash = hash;
1411
+ $.event.trigger('hashchange');
1412
+ }
1413
+ }
1414
+
1415
+ function updateIEFrame(hash) {
1416
+ if (hash == '#') hash = '';
1417
+ var idoc = iframe.contentWindow.document;
1418
+ idoc.open();
1419
+ idoc.close();
1420
+ if (idoc.location.hash != hash) idoc.location.hash = hash;
1421
+ }
1422
+
1423
+ })(jQuery);
1424
+ // IE...
1425
+ if (!Date.now) {
1426
+ Date.now = function() {
1427
+ return new Date().getTime();
1428
+ }
1429
+ }
1430
+
1431
+ var Mizuho = {
1432
+ /** Cached DOM elements so that we don't have to re-find them over and over. */
1433
+ $document: undefined,
1434
+ $window: undefined,
1435
+ $mainSections: undefined,
1436
+ $sectionHeaders: undefined,
1437
+
1438
+ /** Constants */
1439
+ MAX_TOC_LEVEL: 3,
1440
+
1441
+ sectionHeadersSelector: undefined,
1442
+ scrollMemory: {},
1443
+ changingHash: false,
1444
+ activeHash: undefined,
1445
+ /** Whether in single-page or multi-page mode. Either 'single' or 'multi'. */
1446
+ mode: 'single',
1447
+ /** Whether smooth scrolling is enabled. It is always enabled except right
1448
+ * after page load: when the page is scrolled to the section as pointed to
1449
+ * by location.hash.
1450
+ */
1451
+ smoothScrolling: true,
1452
+
1453
+ initialize: function() {
1454
+ this.sectionHeadersSelector = '';
1455
+ for (var i = 0; i < this.MAX_TOC_LEVEL; i++) {
1456
+ if (i != 0) {
1457
+ this.sectionHeadersSelector += ', ';
1458
+ }
1459
+ this.sectionHeadersSelector += 'h' + (i + 2);
1460
+ }
1461
+
1462
+ this.$document = $(document);
1463
+ this.$window = $(window);
1464
+ this.$mainSections = $('.sect1');
1465
+ this.$sectionHeaders = $(this.sectionHeadersSelector, '#content');
1466
+ this.$sectionHeaders.sort(function(a, b) {
1467
+ var off_a = $(a).offset();
1468
+ var off_b = $(b).offset();
1469
+ return off_a.top - off_b.top;
1470
+ });
1471
+
1472
+ if (this.isMobileDevice()) {
1473
+ $(document.body).addClass('mobile');
1474
+ }
1475
+ },
1476
+
1477
+
1478
+ /********* Generic utility functions *********/
1479
+
1480
+ isMobileDevice: function() {
1481
+ return navigator.userAgent.match(
1482
+ /(IEMobile|Windows CE|NetFront|PlayStation|PLAYSTATION|like Mac OS X|MIDP|UP\.Browser|Symbian|Nintendo|Android)/
1483
+ );
1484
+ },
1485
+
1486
+ virtualAnimate: function(options) {
1487
+ var options = $.extend({
1488
+ duration: 1000
1489
+ }, options || {});
1490
+ var animation_start = Date.now();
1491
+ var animation_end = Date.now() + options.duration;
1492
+ var interval = animation_end - animation_start;
1493
+ this._virtualAnimate_step(animation_start, animation_end, interval, options);
1494
+ },
1495
+
1496
+ _virtualAnimate_step: function(animation_start, animation_end, interval, options) {
1497
+ var self = this;
1498
+ var now = new Date();
1499
+ var progress = (now - animation_start) / interval;
1500
+ if (progress > 1) {
1501
+ progress = 1;
1502
+ }
1503
+ progress = (1 + Math.sin(-Math.PI / 2 + progress * Math.PI)) / 2;
1504
+ options.step(progress);
1505
+ if (now < animation_end) {
1506
+ setTimeout(function() {
1507
+ self._virtualAnimate_step(animation_start,
1508
+ animation_end, interval, options);
1509
+ }, 15);
1510
+ } else {
1511
+ options.step(1);
1512
+ if (options.finish) {
1513
+ options.finish();
1514
+ }
1515
+ }
1516
+ },
1517
+
1518
+ smoothlyScrollTo: function(top) {
1519
+ if (!this.smoothScrolling) {
1520
+ return this.setScrollTop(top);
1521
+ }
1522
+
1523
+ var self = this;
1524
+ var $document = this.$document;
1525
+ var current = $document.scrollTop();
1526
+ this.virtualAnimate({
1527
+ duration: 300,
1528
+ step: function(x) {
1529
+ $document.scrollTop(Math.floor(
1530
+ top + (1 - x) * (current - top)
1531
+ ));
1532
+ },
1533
+ finish: function() {
1534
+ self.setScrollTop(top);
1535
+ }
1536
+ });
1537
+ },
1538
+
1539
+ smoothlyScrollToToc: function() {
1540
+ this.smoothlyScrollTo($('#toc').position().top);
1541
+ },
1542
+
1543
+ scrollToHeader: function(header) {
1544
+ this.smoothlyScrollTo($(header).offset().top - 50);
1545
+ },
1546
+
1547
+ setScrollTop: function(top, element) {
1548
+ // Browsers don't always scroll properly so work around
1549
+ // this with a few timers.
1550
+ var self = this;
1551
+ element = element || this.$document;
1552
+ element = $(element);
1553
+ element.scrollTop(top);
1554
+ setTimeout(function() {
1555
+ element.scrollTop(top);
1556
+ }, 1);
1557
+ setTimeout(function() {
1558
+ element.scrollTop(top);
1559
+ self.$document.trigger('mizuho:updateTopBar');
1560
+ }, 20);
1561
+ },
1562
+
1563
+
1564
+ /********* Mizuho-specific functions *********/
1565
+
1566
+ /** Returns the currently displayed section's header DOM element. */
1567
+ currentSubsection: function() {
1568
+ var $sectionHeaders = this.$sectionHeaders;
1569
+ var scrollTop = this.$document.scrollTop();
1570
+ var windowHeight = this.$window.height();
1571
+ var offset;
1572
+
1573
+ var low = 0;
1574
+ var high = this.$sectionHeaders.length - 1;
1575
+ var mid = 0;
1576
+
1577
+ while (low <= high) {
1578
+ mid = Math.floor((low + high) / 2);
1579
+ offset = $($sectionHeaders[mid]).offset();
1580
+
1581
+ if (offset.top >= scrollTop) {
1582
+ high = mid - 1;
1583
+ } else {
1584
+ low = mid + 1;
1585
+ }
1586
+ }
1587
+
1588
+ var $found = $($sectionHeaders[low]);
1589
+ if ($found.offset().top > scrollTop + windowHeight) {
1590
+ if (low > 0) {
1591
+ return $sectionHeaders[low - 1];
1592
+ } else {
1593
+ return undefined;
1594
+ }
1595
+ } else {
1596
+ return $sectionHeaders[low];
1597
+ }
1598
+ },
1599
+
1600
+ /** Looks up a section's header DOM element corresponding to a hash name. */
1601
+ lookupHeader: function(hash) {
1602
+ var id = hash.replace(/^#!\//, '#');
1603
+ if (id == '') {
1604
+ return undefined;
1605
+ } else {
1606
+ var header = $(id);
1607
+ if (header.length == 0) {
1608
+ return undefined;
1609
+ } else {
1610
+ return header;
1611
+ }
1612
+ }
1613
+ }
1614
+ };
1615
+
1616
+ for (var key in Mizuho) {
1617
+ if (typeof(Mizuho[key]) == 'function') {
1618
+ Mizuho[key] = $.proxy(Mizuho[key], Mizuho);
1619
+ }
1620
+ }
1621
+ $(document).ready(Mizuho.initialize);
1622
+ //$(document).ready(Mizuho.installHashbangLinks);
1623
+
1624
+ Mizuho.initializeTopBar = $.proxy(function() {
1625
+ var $window = this.$window;
1626
+ var $document = this.$document;
1627
+ var self = this;
1628
+ var $topbar = $('#topbar');
1629
+ var $title = $('#header h1');
1630
+ var $currentSection = $('#current_section');
1631
+ var isMobileDevice = this.isMobileDevice();
1632
+ var timerId;
1633
+
1634
+ var $floattoc = $('<div id="floattoc"></div>').html($('#toc').html());
1635
+ $floattoc.find('#toctitle').remove();
1636
+ $floattoc.find('.comments').remove();
1637
+ $floattoc.css('visibility', 'hidden');
1638
+ $floattoc.insertAfter($topbar);
1639
+ var $floattoclinks = $floattoc.find('a');
1640
+ $floattoclinks.each(function() {
1641
+ // Firefox changes '#!' to '#%21' so change that back.
1642
+ var $this = $(this);
1643
+ var href = $this.attr('href');
1644
+ if (href.match(/^#%21/)) {
1645
+ $this.attr('href', href.replace(/^#%21/, '#!'));
1646
+ }
1647
+ });
1648
+ $floattoclinks.click(function(event) {
1649
+ self.internalLinkClicked(this, event);
1650
+ });
1651
+
1652
+ function showFloatingToc() {
1653
+ var scrollUpdateTimerId;
1654
+
1655
+ function reposition() {
1656
+ if (isMobileDevice) {
1657
+ $floattoc.css({
1658
+ top: $currentSection.offset().top +
1659
+ $currentSection.innerHeight() +
1660
+ 'px',
1661
+ height: $window.height() * 0.7 + 'px'
1662
+ });
1663
+ }
1664
+ }
1665
+
1666
+ function highlightCurrentTocEntry() {
1667
+ var currentSubsection = self.currentSubsection();
1668
+ $floattoclinks.removeClass('current');
1669
+ if (currentSubsection) {
1670
+ var currentSubsectionTitle = $(currentSubsection).text();
1671
+ var $link;
1672
+
1673
+ $floattoclinks.each(function() {
1674
+ if ($(this).text() == currentSubsectionTitle) {
1675
+ $link = $(this);
1676
+ return false;
1677
+ }
1678
+ });
1679
+ if ($link) {
1680
+ $link.addClass('current');
1681
+ self.setScrollTop(
1682
+ $floattoc.scrollTop() +
1683
+ $link.position().top -
1684
+ $floattoc.height() * 0.45,
1685
+ $floattoc);
1686
+ return false;
1687
+ }
1688
+ }
1689
+ }
1690
+
1691
+ function hideFloatingToc() {
1692
+ $currentSection.removeClass('pressed');
1693
+ $floattoc.css('visibility', 'hidden');
1694
+ $floattoclinks.unbind('click', hideFloatingToc);
1695
+ $document.unbind('mousedown', onMouseDown);
1696
+ $document.unbind('touchdown', onMouseDown);
1697
+ $document.unbind('mizuho:hideTopBar', hideFloatingToc);
1698
+ $window.unbind('scroll', onScroll);
1699
+ if (scrollUpdateTimerId !== undefined) {
1700
+ clearTimeout(scrollUpdateTimerId);
1701
+ scrollUpdateTimerId = undefined;
1702
+ }
1703
+ }
1704
+
1705
+ function onMouseDown(event) {
1706
+ if (event.target != $floattoc[0]
1707
+ && $(event.target).closest('#floattoc').length == 0) {
1708
+ hideFloatingToc();
1709
+ }
1710
+ }
1711
+
1712
+ function onScroll(event) {
1713
+ if (scrollUpdateTimerId === undefined) {
1714
+ scrollUpdateTimerId = setTimeout(function() {
1715
+ scrollUpdateTimerId = undefined;
1716
+ reposition();
1717
+ highlightCurrentTocEntry();
1718
+ }, 100);
1719
+ }
1720
+ }
1721
+
1722
+ // Layout and display floating TOC.
1723
+ highlightCurrentTocEntry();
1724
+ var origScrollTop = $document.scrollTop();
1725
+ var windowWidth = $window.width();
1726
+ var maxRight = windowWidth - Math.floor(windowWidth * 0.1);
1727
+
1728
+ if ($currentSection.offset().left + $floattoc.outerWidth() > maxRight) {
1729
+ $floattoc.css('left', maxRight - $floattoc.outerWidth());
1730
+ } else {
1731
+ $floattoc.css('left', $currentSection.offset().left + 'px');
1732
+ }
1733
+ reposition();
1734
+ $floattoc.css('visibility', 'visible');
1735
+ $currentSection.addClass('pressed');
1736
+
1737
+ $floattoclinks.bind('click', hideFloatingToc);
1738
+ $document.bind('mousedown', onMouseDown)
1739
+ $document.bind('touchdown', onMouseDown);
1740
+ $document.bind('mizuho:hideTopBar', hideFloatingToc);
1741
+ $window.bind('scroll', onScroll);
1742
+ }
1743
+
1744
+ function update() {
1745
+ if ($title.offset().top + $title.height() < $document.scrollTop()) {
1746
+ if (!$topbar.is(':visible')) {
1747
+ $topbar.slideDown(250);
1748
+ $document.trigger('mizuho:showTopBar');
1749
+ }
1750
+ } else {
1751
+ if ($topbar.is(':visible')) {
1752
+ $topbar.slideUp();
1753
+ $document.trigger('mizuho:hideTopBar');
1754
+ }
1755
+ }
1756
+
1757
+ if (isMobileDevice) {
1758
+ $topbar.css({
1759
+ top: $document.scrollTop() + 'px',
1760
+ width: $window.width() -
1761
+ parseInt($topbar.css('padding-left')) -
1762
+ parseInt($topbar.css('padding-right')) +
1763
+ 'px'
1764
+ });
1765
+ }
1766
+
1767
+ var header = self.currentSubsection();
1768
+ var name;
1769
+ if (header) {
1770
+ name = $(header).text();
1771
+ } else {
1772
+ name = 'Preamble';
1773
+ }
1774
+ $currentSection.text(name);
1775
+ }
1776
+
1777
+ function scheduleUpdate() {
1778
+ if (timerId !== undefined) {
1779
+ return;
1780
+ }
1781
+ timerId = setTimeout(function() {
1782
+ timerId = undefined;
1783
+ update();
1784
+ }, 100);
1785
+ }
1786
+
1787
+ if (isMobileDevice) {
1788
+ // Mobile devices don't support position fixed.
1789
+ $topbar.css('position', 'absolute');
1790
+ $floattoc.css('position', 'absolute');
1791
+ }
1792
+
1793
+ $currentSection.click(showFloatingToc);
1794
+ $window.scroll(scheduleUpdate);
1795
+ $document.bind('mizuho:updateTopBar', update);
1796
+ }, Mizuho);
1797
+
1798
+ $(document).ready(Mizuho.initializeTopBar);
1799
+
1800
+ </script>
1801
+ </body>
1802
+ </html>