passenger 3.0.12 → 3.0.13
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- data/DEVELOPERS.TXT +1 -0
- data/NEWS +11 -0
- data/bin/passenger-install-nginx-module +1 -1
- data/build/basics.rb +0 -1
- data/build/documentation.rb +17 -8
- data/build/packaging.rb +2 -2
- data/doc/Architectural overview.html +987 -133
- data/doc/Architectural overview.idmap.txt +36 -0
- data/doc/Architectural overview.txt +150 -74
- data/doc/Security of user switching support.html +820 -54
- data/doc/Security of user switching support.idmap.txt +34 -0
- data/doc/Users guide Apache.html +1675 -633
- data/doc/Users guide Apache.idmap.txt +298 -0
- data/doc/Users guide Apache.txt +3 -11
- data/doc/Users guide Nginx.html +1462 -452
- data/doc/Users guide Nginx.idmap.txt +218 -0
- data/doc/Users guide Standalone.html +979 -44
- data/doc/Users guide Standalone.idmap.txt +18 -0
- data/doc/images/many_web_framework_protocols.png +0 -0
- data/doc/images/passenger_architecture.png +0 -0
- data/doc/images/passenger_architecture.svg +198 -215
- data/doc/images/rack.png +0 -0
- data/ext/boost/config/stdlib/libstdcpp3.hpp +2 -1
- data/ext/boost/exception/detail/error_info_impl.hpp +1 -1
- data/ext/common/AgentBase.cpp +15 -5
- data/ext/common/Constants.h +1 -1
- data/ext/common/EventedMessageServer.h +1 -1
- data/ext/common/StaticString.h +2 -1
- data/ext/common/Watchdog.cpp +2 -2
- data/ext/libev/config.h +122 -0
- data/ext/nginx/Configuration.c +24 -8
- data/ext/nginx/ContentHandler.c +5 -6
- data/lib/phusion_passenger.rb +2 -2
- data/lib/phusion_passenger/abstract_request_handler.rb +11 -8
- data/lib/phusion_passenger/dependencies.rb +12 -18
- data/lib/phusion_passenger/platform_info/compiler.rb +8 -2
- data/lib/phusion_passenger/platform_info/ruby.rb +3 -2
- data/lib/phusion_passenger/rails3_extensions/init.rb +6 -4
- data/lib/phusion_passenger/standalone/command.rb +10 -13
- data/lib/phusion_passenger/standalone/runtime_installer.rb +2 -2
- data/lib/phusion_passenger/standalone/start_command.rb +32 -16
- data/lib/phusion_passenger/templates/apache2/apache_must_be_compiled_with_compatible_mpm.txt.erb +1 -1
- data/lib/phusion_passenger/templates/standalone/config.erb +2 -1
- data/test/stub/wsgi/passenger_wsgi.pyc +0 -0
- metadata +21 -16
- data/doc/Users guide Apache with comments.html +0 -4830
- data/lib/phusion_passenger/platform_info/documentation_tools.rb +0 -35
- data/test/stub/rails_apps/3.0/empty/log/development.log +0 -3
@@ -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
|
2
|
-
|
1
|
+
Phusion Passenger design & architecture
|
2
|
+
=======================================
|
3
3
|
|
4
|
-
|
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
|
-
|
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
|
-
|
15
|
-
|
14
|
+
Introduction to related technologies
|
15
|
+
------------------------------------
|
16
16
|
|
17
|
-
|
18
|
-
|
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
|
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
|
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
|
-
|
44
|
-
|
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
|
55
|
-
web server, instead of accepting HTTP requests directly.
|
56
|
-
|
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
|
65
|
-
that a different
|
66
|
-
|
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
|
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
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
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
|
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.
|
113
|
-
|
114
|
-
|
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
|
-
|
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
|
125
|
-
<<
|
126
|
-
Passenger extends Apache and allows it to act like an
|
127
|
-
|
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
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
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
|
141
|
-
|
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
|
144
|
-
effect on
|
145
|
-
is carefully designed and implemented so that
|
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
|
151
|
-
|
152
|
-
However, spawning Ruby
|
153
|
-
seconds on a modern
|
154
|
-
|
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.
|
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:
|
568
|
+
h5 { font-size: 115%; }
|
555
569
|
h6 { font-size: 100%; }
|
556
570
|
#header h1 { margin-top: 0; }
|
557
571
|
#toc {
|
@@ -589,7 +603,7 @@ div.exampleblock > div.content, div.sidebarblock > div.content, div.listingblock
|
|
589
603
|
div.verseblock { border-left-width: 0; margin-left: 3em; }
|
590
604
|
div.quoteblock { border-left-width: 3px; margin-left: 0; margin-right: 0;}
|
591
605
|
div.admonitionblock td.content { border-left: 3px solid #E8E8E8; }
|
592
|
-
</style>
|
606
|
+
</style>
|
593
607
|
<script type="text/javascript">
|
594
608
|
/*<![CDATA[*/
|
595
609
|
var asciidoc = { // Namespace.
|
@@ -633,7 +647,7 @@ toc: function (toclevels) {
|
|
633
647
|
|
634
648
|
function tocEntries(el, toclevels) {
|
635
649
|
var result = new Array;
|
636
|
-
var re = new RegExp('[hH]([
|
650
|
+
var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
|
637
651
|
// Function that scans the DOM tree for header elements (the DOM2
|
638
652
|
// nodeIterator API would be a better technique but not supported by all
|
639
653
|
// browsers).
|
@@ -662,7 +676,7 @@ toc: function (toclevels) {
|
|
662
676
|
var i;
|
663
677
|
for (i = 0; i < toc.childNodes.length; i++) {
|
664
678
|
var entry = toc.childNodes[i];
|
665
|
-
if (entry.nodeName == '
|
679
|
+
if (entry.nodeName.toLowerCase() == 'div'
|
666
680
|
&& entry.getAttribute("class")
|
667
681
|
&& entry.getAttribute("class").match(/^toclevel/))
|
668
682
|
tocEntriesToRemove.push(entry);
|
@@ -708,7 +722,7 @@ footnotes: function () {
|
|
708
722
|
var entriesToRemove = [];
|
709
723
|
for (i = 0; i < noteholder.childNodes.length; i++) {
|
710
724
|
var entry = noteholder.childNodes[i];
|
711
|
-
if (entry.nodeName == '
|
725
|
+
if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
|
712
726
|
entriesToRemove.push(entry);
|
713
727
|
}
|
714
728
|
for (i = 0; i < entriesToRemove.length; i++) {
|
@@ -783,9 +797,256 @@ install: function(toclevels) {
|
|
783
797
|
}
|
784
798
|
asciidoc.install(3);
|
785
799
|
/*]]>*/
|
786
|
-
</script>
|
787
|
-
|
788
|
-
|
800
|
+
</script><style type="text/css">
|
801
|
+
body {
|
802
|
+
margin: 1em 10% 1em 10%;
|
803
|
+
}
|
804
|
+
|
805
|
+
a.image {
|
806
|
+
border: none;
|
807
|
+
}
|
808
|
+
|
809
|
+
.comments {
|
810
|
+
display: block;
|
811
|
+
background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAgCAYAAAB6kdqOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAB0wAAAdMBc2+PegAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAASjSURBVFiFvZdPaBxVHMc/b/7sbNLdxG13s0sbE1jBxELVbVGEgqmQiiBiDxZqKRWhR0Fqe/BSmoNQSNmrt4ISTyV3byWLHorVU5dYtgVpk4DGhXZ1a7rZmXkeMm99eZn9k1b9wY/3Z2f2fX7f3++9mRFSSnQTQgjAAkTkaO2zmtRaCYTSABBqrIEkS6VS9vTp069lMpmClFL4vt8BCsNwWwsQBAHm7+Y4CAKEEEGtVvtlYWHhbqvVagJ/AE90MCGlVDD2xYsXiydPnvza87wXksnk8NDQUFIPQPW7zfXyMAwJw5BGo/FXs9ncvHfv3tKFCxe+aLfbDyKwQEopFZBdLpdfnp2d/Tafz4+5rhsxghAC1d+h/y5gzH69XvdrtdqDs2fPfuT7/jLQkFIGlhBC5HK5oZmZmW8KhUI+kUgIy7KwLAvbtrFte1vfdHVtnKtg9L7yffv2OcViceLSpUufA88DSSGEcABrfn7+zdHR0UnXdWNv1tXqpY6phGVZnRoy/0MIQT6fdw4ePHgUKAK/AU8sQOzfv/+tdDq9x4xKd1MVU51uSvTzVCrlTU9PTwN7AGEBYmRk5FXXdTvk+gI6kJnGQQG6KQQwMjLiTk1NTQIJBQTgmAWst2rhfiBxC3ab00wAbtRugZjb2LzR3O7d2rh7+s2Ztg1IwajChK2DTSlggpuFrHs34H7BOHELqN0Rl5K4P+4GNQioPt8BUqeoqpd+MGYQvQ7DfrCxKVNAcTCws0B7RdrvhO4HtS1lCkYtbKrT7WB8GihdQf2B3FFIPbEH2cY6iAljjk1l4qB2KKSrMwjMblXqpVpfIF2lXjBxULsB06HigDb1lA2ijgm0WyithmS73faJ3iYdgHq9/tOBAwfe9jyvJ4wam1H1O196QT18+HBzeXl5FQgVkLxz5873k5OTzWw2m+oHE6dMHEw3EGBbuh4/fuyvrKysAS1AOkA4Nzf3w5EjR+6m0+mS/tTvBhMH1U2lXgqtra21l5aWvgNWgCYQ2tH/hY1G48epqal3Pc/b4ziOGLQegiCIPVv0ubhDcXV1dfP27dv3y+Xyl0AVqAO+/pKfmpiYeHFubm4+m82+kkgkPNd1nbjI9TaZTNqu61rRQpbrujiOs+O6MAx59OhRuL6+3mq1Wq1KpXJjYWFhMYK5DzSljF7yo7RYwBCQBfKlUml6bGxsMggCLwgC/Ruts4CRPpFMJodnZmbeKBaLLxUKheFMJmPr6a5Wq0+uXLmyWK1WK8DPwBrwO7AhpQxB+y6LoARbhe4Bw0AyGlv0N/Vd56VSqb3nzp378PDhw+/ncrnnCoWCZ1kWvu9z69at9fPnz3+6sbFxE/gVaEkNYhuQBqUvsBtTSnrAKDB25syZ944dO/ZxNpvNjY+PDzebTb9Sqdy8fPnyZ0AN+FOpEwv0rKYFZEdgaSB7/PjxoydOnPgkl8tNAN7169fLi4uLX7G1w/5RadDnz9N4pJbNVupzwHSpVPrg6tWrN65du/broUOHZoEMYHXu+S+BYsA8YC9QHB8ff/3UqVPvREC2uvZfT1kvi9KpNo7LVo1uApsqZf8rkAHWMX2X/Q1tcUY1hl3QyQAAAABJRU5ErkJggg==') top left no-repeat;
|
812
|
+
float: left;
|
813
|
+
margin-left: -55px;
|
814
|
+
width: 36px;
|
815
|
+
height: 48px;
|
816
|
+
line-height: 0;
|
817
|
+
color: black;
|
818
|
+
text-decoration: none !important;
|
819
|
+
border: none !important;
|
820
|
+
}
|
821
|
+
|
822
|
+
#toc .comments {
|
823
|
+
margin-top: 0.25em;
|
824
|
+
}
|
825
|
+
|
826
|
+
.sect1 .comments {
|
827
|
+
margin-top: 0.5em;
|
828
|
+
}
|
829
|
+
|
830
|
+
.sect2 .comments {
|
831
|
+
margin-top: 1.15em;
|
832
|
+
}
|
833
|
+
|
834
|
+
.sect3 .comments {
|
835
|
+
margin-top: -1em;
|
836
|
+
}
|
837
|
+
|
838
|
+
.comments.empty {
|
839
|
+
opacity: 0.2;
|
840
|
+
}
|
841
|
+
|
842
|
+
.comments.empty:hover,
|
843
|
+
.comments.nonempty {
|
844
|
+
opacity: 1;
|
845
|
+
}
|
846
|
+
|
847
|
+
.comments .count {
|
848
|
+
display: block;
|
849
|
+
font-size: 80%;
|
850
|
+
padding-top: 12px;
|
851
|
+
text-align: center;
|
852
|
+
text-shadow: 1px 1px 2px white;
|
853
|
+
}
|
854
|
+
|
855
|
+
#comments_lightbox_shadow {
|
856
|
+
position: fixed;
|
857
|
+
top: 0;
|
858
|
+
left: 0;
|
859
|
+
right: 0;
|
860
|
+
bottom: 0;
|
861
|
+
background: black;
|
862
|
+
opacity: 0.7;
|
863
|
+
z-index: 10;
|
864
|
+
}
|
865
|
+
|
866
|
+
#comments_lightbox_contents {
|
867
|
+
position: fixed;
|
868
|
+
top: 10%;
|
869
|
+
left: 20%;
|
870
|
+
right: 20%;
|
871
|
+
bottom: 10%;
|
872
|
+
background: white;
|
873
|
+
overflow: auto;
|
874
|
+
z-index: 11;
|
875
|
+
}
|
876
|
+
|
877
|
+
#comments_lightbox_contents > .shell {
|
878
|
+
margin: 2em;
|
879
|
+
}
|
880
|
+
|
881
|
+
@media print {
|
882
|
+
body {
|
883
|
+
font-size: 18pt;
|
884
|
+
}
|
885
|
+
|
886
|
+
#header h1 {
|
887
|
+
page-break-after: always;
|
888
|
+
font-size: 500%;
|
889
|
+
vertical-align: middle;
|
890
|
+
}
|
891
|
+
|
892
|
+
#header {
|
893
|
+
page-break-after: always;
|
894
|
+
}
|
895
|
+
|
896
|
+
#toctitle {
|
897
|
+
font-size: 200%;
|
898
|
+
margin-bottom: 1em;
|
899
|
+
}
|
900
|
+
|
901
|
+
div.toclevel1 {
|
902
|
+
font-size: 100%;
|
903
|
+
}
|
904
|
+
|
905
|
+
div.toclevel2 {
|
906
|
+
font-size: 90%;
|
907
|
+
}
|
908
|
+
|
909
|
+
div.toclevel3 {
|
910
|
+
font-size: 80%;
|
911
|
+
}
|
912
|
+
|
913
|
+
#content .comments {
|
914
|
+
display: none;
|
915
|
+
}
|
916
|
+
|
917
|
+
@page :left {
|
918
|
+
@bottom-left {
|
919
|
+
content: counter(page);
|
920
|
+
}
|
921
|
+
}
|
922
|
+
}
|
923
|
+
|
924
|
+
#topbar {
|
925
|
+
position: fixed;
|
926
|
+
left: 0;
|
927
|
+
top: 0;
|
928
|
+
right: 0;
|
929
|
+
height: 2.5em;
|
930
|
+
padding-left: 10%;
|
931
|
+
padding-right: 10%;
|
932
|
+
z-index: 1;
|
933
|
+
background: #880000;
|
934
|
+
overflow: hidden;
|
935
|
+
white-space: nowrap;
|
936
|
+
box-shadow: 0px 3px 6px #555555;
|
937
|
+
-moz-box-shadow: 0px 3px 6px #555555;
|
938
|
+
-webkit-box-shadow: 0px 3px 6px #555555;
|
939
|
+
-o-box-shadow: 0px 3px 6px #555555;
|
940
|
+
}
|
941
|
+
|
942
|
+
#topbar .title {
|
943
|
+
display: inline-block;
|
944
|
+
margin: 0.6em 1em 0 0;
|
945
|
+
vertical-align: top;
|
946
|
+
}
|
947
|
+
|
948
|
+
#topbar .title img {
|
949
|
+
display: none;
|
950
|
+
margin-right: 6px;
|
951
|
+
vertical-align: middle;
|
952
|
+
}
|
953
|
+
|
954
|
+
#topbar .title a {
|
955
|
+
color: #fffafa;
|
956
|
+
border: 0;
|
957
|
+
}
|
958
|
+
|
959
|
+
#topbar .title:hover img,
|
960
|
+
.mobile #topbar .title img {
|
961
|
+
display: inline-block;
|
962
|
+
margin-left: -17px;
|
963
|
+
}
|
964
|
+
|
965
|
+
#topbar .title:hover a,
|
966
|
+
.mobile #topbar .title a {
|
967
|
+
color: #ffffdd;
|
968
|
+
}
|
969
|
+
|
970
|
+
#floattoc {
|
971
|
+
position: fixed;
|
972
|
+
z-index: 1;
|
973
|
+
top: 2em;
|
974
|
+
bottom: 20%;
|
975
|
+
width: 50%;
|
976
|
+
background: #f0f0f0;
|
977
|
+
color: black;
|
978
|
+
box-shadow: 0px 6px 6px #555555;
|
979
|
+
-moz-box-shadow: 0px 6px 6px #555555;
|
980
|
+
-webkit-box-shadow: 0px 6px 6px #555555;
|
981
|
+
-o-box-shadow: 0px 6px 6px #555555;
|
982
|
+
overflow: auto;
|
983
|
+
padding: 1em;
|
984
|
+
border-radius: 6px;
|
985
|
+
-webkit-border-radius: 8px;
|
986
|
+
-webkit-border-top-left-radius: 0;
|
987
|
+
-webkit-border-top-right-radius: 0;
|
988
|
+
-moz-border-radius: 8px;
|
989
|
+
-moz-border-radius-topleft: 0;
|
990
|
+
-moz-border-top-right-radius: 0;
|
991
|
+
-o-border-radius: 8px;
|
992
|
+
-o-border-radius-topleft: 0;
|
993
|
+
-o-border-top-right-radius: 0;
|
994
|
+
border-radius: 8px;
|
995
|
+
border-top-left-radius: 0;
|
996
|
+
border-top-right-radius: 0;
|
997
|
+
}
|
998
|
+
|
999
|
+
#floattoc a.current {
|
1000
|
+
font-weight: bold;
|
1001
|
+
color: black;
|
1002
|
+
}
|
1003
|
+
|
1004
|
+
#current_section {
|
1005
|
+
display: inline-block;
|
1006
|
+
margin: 0.5em 0 0 0;
|
1007
|
+
padding: 0.2em 0.5em 0.2em 0.5em;
|
1008
|
+
background: #550000;
|
1009
|
+
font-size: 90%;
|
1010
|
+
vertical-align: top;
|
1011
|
+
color: white;
|
1012
|
+
border: none;
|
1013
|
+
-webkit-border-radius: 8px;
|
1014
|
+
-moz-border-radius: 8px;
|
1015
|
+
-o-border-radius: 8px;
|
1016
|
+
border-radius: 8px;
|
1017
|
+
}
|
1018
|
+
|
1019
|
+
#current_section:hover {
|
1020
|
+
text-decoration: none;
|
1021
|
+
border: none;
|
1022
|
+
}
|
1023
|
+
|
1024
|
+
#current_section.pressed {
|
1025
|
+
background: #f0f0f0;
|
1026
|
+
color: black;
|
1027
|
+
-webkit-border-top-left-radius: 8px;
|
1028
|
+
-webkit-border-top-right-radius: 8px;
|
1029
|
+
-webkit-border-bottom-left-radius: 0;
|
1030
|
+
-webkit-border-bottom-right-radius: 0;
|
1031
|
+
-moz-border-radius-topleft: 8px;
|
1032
|
+
-moz-border-radius-topright: 8px;
|
1033
|
+
-moz-border-bottom-left-radius: 0;
|
1034
|
+
-moz-border-bottom-right-radius: 0;
|
1035
|
+
border-top-left-radius: 8px;
|
1036
|
+
border-top-right-radius: 8px;
|
1037
|
+
border-bottom-left-radius: 0;
|
1038
|
+
border-bottom-right-radius: 0;
|
1039
|
+
}
|
1040
|
+
|
1041
|
+
</style>
|
1042
|
+
</head>
|
1043
|
+
<body class="article">
|
1044
|
+
<div id="topbar" style="display: none">
|
1045
|
+
<div class="title">
|
1046
|
+
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAKCAYAAAEV95QVAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sGCRMSACDxkZwAAAAidEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVAgb24gYSBNYWOHqHdDAAAAZUlEQVQY032PSxbAIAjEIlfygL6ePF3UUvpzNjgSYWwqAMEhUQnANnsC7TQPeJpsVWzMuh2sog4vDTUbqP081zECrW4dtdaQGSIKlWluPyjK+VXxAz5XfcKufCzA130AfQHWB30HZxlPaP080xsAAAAASUVORK5CYII=" width="11" height="10" alt=""><a href="javascript:void(Mizuho.smoothlyScrollToToc())">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
|
814
|
-
Rails application
|
1074
|
+
web server can. So for example, Joe’s Rails applications could read Jane’s
|
1075
|
+
Rails application’s <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
|
1079
|
+
Passenger’s 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
|
1086
|
+
application server as its owner’s 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
|
1096
|
+
Using Apache’s 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
|
1128
|
+
unacceptable security risk, so Apache’s 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
|
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
|
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
|
891
|
-
<div class="paragraph"><p>Apache
|
1152
|
+
<h3 id="_using_apache_8217_s_suexec">2.2. Using Apache’s suEXEC</h3>
|
1153
|
+
<div class="paragraph"><p>Apache’s <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
|
1158
|
+
to use suEXEC, then it is likely that we’ll 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
|
1200
|
+
process’s 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
|
962
|
-
|
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
|
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
|
1255
|
+
<div class="paragraph"><p>It might also be worthy to look into suEXEC’s 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
|
1272
|
+
contestants. The former is preferred, because it’s 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
|
1015
|
-
that of the <em>ApplicationSpawner</em> class
|
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
|
1284
|
+
<div class="paragraph"><p>We have also not implemented suEXEC’s security model. suEXEC’s 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
|
1287
|
+
convinced that implementing suEXEC’s 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
|
-
|
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>
|