Merge branch 'onelab' of ssh://git.onelab.eu/git/myslice into onelab
authorJavier Garcia <javier.garcial@atos.net>
Thu, 17 Sep 2015 08:33:58 +0000 (10:33 +0200)
committerJavier Garcia <javier.garcial@atos.net>
Thu, 17 Sep 2015 08:33:58 +0000 (10:33 +0200)
175 files changed:
README
activity/__init__.py
manifoldapi/manifoldproxy.py
manifoldapi/static/js/manifold.js
myslice/configengine.py
myslice/myslice.ini.dist
myslice/myslice.ini.onelab
myslice/settings.py
plugins/asap/__init__.py [new file with mode: 0644]
plugins/asap/static/css/asap.css [new file with mode: 0644]
plugins/asap/static/js/asap.js [new file with mode: 0644]
plugins/asap/templates/asap.html [new file with mode: 0644]
plugins/filter_status/static/js/filter_status.js
plugins/filter_status/templates/filter_status.html
plugins/querytable/static/js/querytable.js
plugins/scheduler/static/js/raphael.js [changed from symlink to file mode: 0644]
plugins/scheduler2/static/js/angular/angular.min.js.map [new file with mode: 0644]
plugins/scheduler2/static/js/scheduler2.js
portal/actions.py
portal/manageuserview.py
portal/migrations/0001_initial.py
portal/migrations/0002_extend_slice.py [deleted file]
portal/migrations/0003_extend_slice.py [deleted file]
portal/migrations/0004_extend_user.py [deleted file]
portal/migrations/0005_extend_user.py [deleted file]
portal/migrations/0006_extend_slice.py [deleted file]
portal/migrations/0007_extend_slice_user.py [deleted file]
portal/migrations/0008_extend_user.py [deleted file]
portal/migrations/0009_initial.py [deleted file]
portal/migrations/0010_project.py [deleted file]
portal/migrations/0011_join.py [deleted file]
portal/projectrequestview.py
portal/registrationview.py
portal/releasenotesview.py [new file with mode: 0644]
portal/slicerequestview.py
portal/sliceresourceview.py
portal/slicetabexperiment.py
portal/static/css/fed4fire.css
portal/static/css/myslice.css
portal/static/css/onelab.css
portal/static/css/smartfire.css
portal/static/icons/emulab.png [new file with mode: 0644]
portal/static/img/smartfire_favicon.ico [new file with mode: 0644]
portal/static/img/testbeds/FIT NITOS Paris.png [new file with mode: 0644]
portal/static/img/testbeds/FIT NITOS R2Lab.png [new file with mode: 0644]
portal/static/js/experiment.js [new file with mode: 0644]
portal/static/js/join.js
portal/templates/_footer.html
portal/templates/_slogan.html
portal/templates/_widget-email_footer.html [new file with mode: 0644]
portal/templates/_widget-slice-sections.html
portal/templates/activate_user.html
portal/templates/activate_user.txt
portal/templates/authority_request_email.html
portal/templates/base.html
portal/templates/contact_support_email.html
portal/templates/contact_support_email_subject.txt
portal/templates/fed4fire/contact_support_email.txt [moved from portal/templates/fed4fire/fed4fire_contact_support_email.txt with 100% similarity]
portal/templates/fed4fire/fed4fire_activate_user.html [deleted file]
portal/templates/fed4fire/fed4fire_activate_user.txt [deleted file]
portal/templates/fed4fire/fed4fire_contact_support_email.html
portal/templates/fed4fire/fed4fire_email_activation.html [deleted file]
portal/templates/fed4fire/fed4fire_footer.html [deleted file]
portal/templates/fed4fire/fed4fire_join_request_validated.html [deleted file]
portal/templates/fed4fire/fed4fire_join_request_validated.txt [deleted file]
portal/templates/fed4fire/fed4fire_slice-request-done-view.html [deleted file]
portal/templates/fed4fire/fed4fire_slice-resource-view.html
portal/templates/fed4fire/fed4fire_slice-view.html
portal/templates/fed4fire/fed4fire_slice_request_denied.html [deleted file]
portal/templates/fed4fire/fed4fire_slice_request_denied.txt [deleted file]
portal/templates/fed4fire/fed4fire_slice_request_email.html [deleted file]
portal/templates/fed4fire/fed4fire_slice_request_email.txt [deleted file]
portal/templates/fed4fire/fed4fire_slice_request_validated.html [deleted file]
portal/templates/fed4fire/fed4fire_slice_request_validated.txt [deleted file]
portal/templates/fed4fire/fed4fire_user_register_complete.html [deleted file]
portal/templates/fed4fire/fed4fire_user_request_denied.html [deleted file]
portal/templates/fed4fire/fed4fire_user_request_denied.txt [deleted file]
portal/templates/fed4fire/fed4fire_user_request_email.html [deleted file]
portal/templates/fed4fire/fed4fire_user_request_email.txt [deleted file]
portal/templates/fed4fire/fed4fire_widget-email_footer.html [new file with mode: 0644]
portal/templates/home-view.html
portal/templates/join_request_denied.html [moved from portal/templates/fed4fire/fed4fire_join_request_denied.html with 60% similarity]
portal/templates/join_request_denied.txt [moved from portal/templates/fed4fire/fed4fire_join_request_denied.txt with 64% similarity]
portal/templates/join_request_email.html [moved from portal/templates/fed4fire/fed4fire_join_request_email.html with 63% similarity]
portal/templates/join_request_email.txt [moved from portal/templates/fed4fire/fed4fire_join_request_email.txt with 65% similarity]
portal/templates/join_request_validated.html [new file with mode: 0644]
portal/templates/join_request_validated.txt [new file with mode: 0644]
portal/templates/join_view.html
portal/templates/onelab/onelab_contact_support_email.html [new file with mode: 0644]
portal/templates/onelab/onelab_contact_support_email_subject.txt [new file with mode: 0644]
portal/templates/onelab/onelab_slice-resource-view.html [deleted file]
portal/templates/onelab/onelab_slice-view.html [deleted file]
portal/templates/onelab/onelab_user_request_email.html [deleted file]
portal/templates/onelab/onelab_user_request_email.txt [deleted file]
portal/templates/onelab/onelab_widget-email_footer.html [new file with mode: 0644]
portal/templates/onelab/onelab_widget-slice-sections.html [deleted file]
portal/templates/onelab/onelab_widget-user_request_email.html [new file with mode: 0644]
portal/templates/project_request_denied.html
portal/templates/project_request_email.html
portal/templates/projectrequest_view.html
portal/templates/registration_view.html
portal/templates/release-notes-view.html [new file with mode: 0644]
portal/templates/slice-request-done-view.html
portal/templates/slice-resource-view.html
portal/templates/slice-tab-experiment.html
portal/templates/slice-view.html
portal/templates/slice_request_denied.html
portal/templates/slice_request_email.html
portal/templates/slice_request_email.txt
portal/templates/slice_request_validated.html
portal/templates/slice_request_validated.txt
portal/templates/smartfire/smartfire_account-view.html [deleted file]
portal/templates/smartfire/smartfire_activate_user.html [deleted file]
portal/templates/smartfire/smartfire_activate_user.txt [deleted file]
portal/templates/smartfire/smartfire_authority_request_denied.html [deleted file]
portal/templates/smartfire/smartfire_authority_request_denied.txt [deleted file]
portal/templates/smartfire/smartfire_authority_request_email.html [deleted file]
portal/templates/smartfire/smartfire_authority_request_email.txt [deleted file]
portal/templates/smartfire/smartfire_authority_request_email_subject.txt [deleted file]
portal/templates/smartfire/smartfire_email_activation.html [deleted file]
portal/templates/smartfire/smartfire_email_default_recipients.txt
portal/templates/smartfire/smartfire_email_default_sender.txt
portal/templates/smartfire/smartfire_footer.html [deleted file]
portal/templates/smartfire/smartfire_home-view.html [deleted file]
portal/templates/smartfire/smartfire_management-tab-requests.html [deleted file]
portal/templates/smartfire/smartfire_slice_request_denied.html [deleted file]
portal/templates/smartfire/smartfire_slice_request_denied.txt [deleted file]
portal/templates/smartfire/smartfire_slice_request_email_subject.txt [deleted file]
portal/templates/smartfire/smartfire_slice_request_validated.html [deleted file]
portal/templates/smartfire/smartfire_slice_request_validated.txt [deleted file]
portal/templates/smartfire/smartfire_slicerequest_view.html [deleted file]
portal/templates/smartfire/smartfire_user_request_denied.html [deleted file]
portal/templates/smartfire/smartfire_user_request_denied.txt [deleted file]
portal/templates/smartfire/smartfire_user_request_email.html [deleted file]
portal/templates/smartfire/smartfire_user_request_email.txt [deleted file]
portal/templates/smartfire/smartfire_user_request_email_subject.txt [deleted file]
portal/templates/smartfire/smartfire_user_request_validated.html [deleted file]
portal/templates/smartfire/smartfire_user_request_validated.txt [deleted file]
portal/templates/smartfire/smartfire_widget-topmenu.html
portal/templates/termsview.html
portal/templates/user_register_complete.html
portal/templates/user_request_denied.html
portal/templates/user_request_denied.txt
portal/templates/user_request_email.html
portal/templates/user_request_email.txt
portal/templates/user_request_validated.html
portal/templates/user_request_validated_subject.txt [deleted file]
portal/urls.py
rest/__init__.py
rest/monitor.py
rest/sfa_api.py
third-party/angular [new symlink]
third-party/angular-1.3.0/angular.min.js [new file with mode: 0644]
third-party/angular-1.3.0/angular.min.js.map [new file with mode: 0644]
third-party/angular-1.3.0/angular.url [new file with mode: 0644]
third-party/bootstrap-slider
third-party/datatables-1.9.4/js/dataTables.js [changed from symlink to file mode: 0644]
third-party/jquery-1.10.2/js/jquery.js [changed from symlink to file mode: 0644]
third-party/jquery-1.10.2/js/jquery.min.js [changed from symlink to file mode: 0644]
third-party/jquery-2.0.3/js/jquery-2.0.3.min.map [new file with mode: 0644]
third-party/jquery-2.0.3/js/jquery.js [changed from symlink to file mode: 0644]
third-party/jquery-2.0.3/js/jquery.min.js [changed from symlink to file mode: 0644]
third-party/jquery-html5storage
third-party/jquery-ui-slider
third-party/jquery-validate
third-party/markerclusterer
third-party/mustache
third-party/slickgrid
third-party/smartwizard
third-party/spin
third-party/syntaxhighlighter [deleted symlink]
third-party/timepicker-addon
to-be-integrated/third-party/codemirror [deleted symlink]
unfold/collectstatic.py
unfold/wsgi.py [changed from symlink to file mode: 0644]

diff --git a/README b/README
index 9dc93fe..7fa6f6e 100644 (file)
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-Last update 18 MAR. 2015
+Last update 21 MAY. 2015
 
 Installation
 =================================================================
@@ -24,6 +24,7 @@ $ pip install paramiko
 $ pip install pyparsing
 $ pip install python-dateutil
 $ pip instal pyOpenSSL
+$ pip install xmltodict
 
 MYSLICE
 =======
index b749672..be5779d 100644 (file)
@@ -15,7 +15,11 @@ import time
 import datetime
 from myslice.configengine import ConfigEngine
 from myslice.settings import logger
-
+import random
+import os
+import sqlite3 as lite
+import json
+import syslog
 
 config = ConfigEngine()
 if config.activity and config.activity.apikey :
@@ -52,7 +56,7 @@ def logWrite(request, action, message, objects = None):
         "client_ip" : ip,
         "host"      : request.get_host(),
         "referrer"  : request.META.get('HTTP_REFERER'),
-        "user"      : request.user,
+        "user"      : request.user.username,
         "action"    : action,
         "message"   : message,
         "apikey"    : apikey,
@@ -73,10 +77,31 @@ def logWrite(request, action, message, objects = None):
         result = urllib2.urlopen(server, urllib.urlencode(log))
         logger.info("===============>> activity: {} <{}> {}".format(action, request.user,message))
         content = result.read()
+
+        #checking for not sent data and sending it (50% probability)
+        if random.randint(0,100) < 50:
+            logCheck()
+
     except urllib2.URLError as e:
         logger.error("===============>> activity: connection to {} impossible, could not log action".format(server))
         logger.error(e.strerror)
 
+        dbfile = ''.join([os.path.dirname(os.path.abspath(__file__)), "/errors.db"])
+        conn = None
+        try:
+            conn = lite.connect(dbfile)
+            cur = conn.cursor()
+            cur.execute("""INSERT INTO logs(log) values('%s')""" % json.dumps(log))
+            conn.commit()
+        except lite.Error, e:
+            # this means that writing log into db also failed :(
+            # Last chance to preserve log is to send it to system syslog
+            # however there is no mechanism to pull it from this log - just manually.
+            logger.error('[activity] Error while inserting into sql db: %s' % str(e.args))
+            logger.error("[activity] data to send: '%s'" % json.dumps(log))
+        if conn:
+            conn.close()
+
 def log(request, action, message, objects = None):
     # Create a new thread in Daemon mode to send the log entry
     t = threading.Thread(target=logWrite, args=(request, action, message, objects))
@@ -95,3 +120,38 @@ def getClientIp(request):
 # sign the request with the secret key
 def sign(secret, message):
     return hmac.new(secret, msg=message, digestmod=hashlib.sha256).hexdigest()
+
+#
+# sending the logs cached in sqlite database
+
+def logCheck():
+    """Checking local database for logs adn sending it to monitoring server"""
+    dbfile = ''.join([os.path.dirname(os.path.abspath(__file__)), "/errors.db"])
+    conn = None
+
+    #trying to connect local db adn pull unsent logs
+    try:
+        conn = lite.connect(dbfile)
+        cur = conn.cursor()
+        cur.execute("SELECT rowid, log from logs")
+        notsent = cur.fetchall()
+        for row in notsent:
+            #trying to send unsent data from sqlite db
+            try :
+                urllib2.urlopen(config.activity.server, urllib.urlencode(json.loads(row[1])))
+                #delete those who were sent
+                cur.execute("""DELETE FROM logs where rowid = %s""" % row[0] )
+                conn.commit()
+            except urllib2.URLError as e:
+                # this is just to inform that DB is not working properly
+                logger.error('[activity] Error while sending stats')
+                logger.error(e.strerror)
+
+    except lite.Error, e:
+        #this need to be updated to store information via syslog
+        logger.error('[activity] Error while pulling from local sqlite3 db: %s' % str(e.args))
+        logger.error(e.strerror)
+    if conn:
+        conn.close()
+
+    return
index eba37bb..0f700bf 100644 (file)
@@ -10,7 +10,6 @@ from manifold.core.query        import Query
 from manifold.core.result_value import ResultValue
 from manifoldapi                import ManifoldAPI
 from manifoldresult             import ManifoldException
-from manifold.util.log          import Log
 
 # from unfold.sessioncache import SessionCache
 
index 7b2d54c..5b5e6af 100644 (file)
@@ -516,7 +516,7 @@ function QueryStore() {
     this.recount = function(query_uuid)
     {
         var query_ext;
-        var is_reserved, is_pending, in_set,  is_unconfigured;
+        var is_reserved, is_pending, in_set, is_unconfigured, is_unavailable, is_available;
 
         query_ext = manifold.query_store.find_analyzed_query_ext(query_uuid);
         query_ext.num_pending = 0;
@@ -525,6 +525,8 @@ function QueryStore() {
         this.iter_records(query_uuid, function(record_key, record) {
             var record_state = manifold.query_store.get_record_state(query_uuid, record_key, STATE_SET);
             var record_warnings = manifold.query_store.get_record_state(query_uuid, record_key, STATE_WARNINGS);
+            is_unavailable = (record.available == 'false'); 
+            is_available = (record.available == 'true'); 
 
             is_reserved = (record_state == STATE_SET_IN) 
                        || (record_state == STATE_SET_OUT_PENDING)
@@ -564,7 +566,7 @@ function QueryStore() {
         // Adapted from querytable._querytable_filter()
 
         this.iter_records(query_uuid, function(record_key, record) {
-            var is_reserved, is_pending, in_set,  is_unconfigured;
+            var is_reserved, is_pending, in_set, is_unconfigured, is_unavailable, is_available;
 
             /* By default, a record is visible unless a filter says the opposite */
             var visible = true;
@@ -572,6 +574,9 @@ function QueryStore() {
             var record_state = manifold.query_store.get_record_state(query_uuid, record_key, STATE_SET);
             var record_warnings = manifold.query_store.get_record_state(query_uuid, record_key, STATE_WARNINGS);
 
+            is_unavailable = (record.available == 'false'); 
+            is_available = (record.available == 'true'); 
+
             is_reserved = (record_state == STATE_SET_IN) 
                        || (record_state == STATE_SET_OUT_PENDING)
                        || (record_state == STATE_SET_IN_SUCCESS)
@@ -610,6 +615,12 @@ function QueryStore() {
                             // false => ~ break
                             visible = is_reserved;
                             return visible;
+                        case 'available':
+                            visible = is_available;
+                            return visible;
+                        case 'unavailable':
+                            visible = is_unavailable;
+                            return visible;
                         case 'unconfigured':
                             visible = is_unconfigured;
                             return visible;
@@ -1085,7 +1096,7 @@ var manifold = {
      * \param array results results corresponding to query
      */
     publish_result: function(query, result) {
-        if (typeof result === 'undefined')
+        if (result == null || typeof result === 'undefined')
             result = [];
 
         // NEW PLUGIN API
@@ -1116,29 +1127,31 @@ var manifold = {
     },
 
     store_records: function(query, records) {
-        // Store records
-        var query_ext = manifold.query_store.find_analyzed_query_ext(query.query_uuid);
-        if (query_ext.set_query_ext) {
-            // We have a domain query
-            // The results are stored in the corresponding set_query
-            manifold.query_store.set_records(query_ext.set_query_ext.query.query_uuid, records);
-            
-        } else if (query_ext.domain_query_ext) {
-            // We have a set query, it is only used to determine which objects are in the set, we should only retrieve the key
-            // Has it a domain query, and has it completed ?
-            $.each(records, function(i, record) {
-                var key = manifold.metadata.get_key(query.object);
-                if ( typeof record === "string" ){
-                    var record_key = record;
-                }else{
-                    var record_key = manifold.record_get_value(record, key);
-                }
-                manifold.query_store.set_record_state(query.query_uuid, record_key, STATE_SET, STATE_SET_IN);
-            });
+        if(records != null && records.length != 0){
+            // Store records
+            var query_ext = manifold.query_store.find_analyzed_query_ext(query.query_uuid);
+            if (query_ext.set_query_ext) {
+                // We have a domain query
+                // The results are stored in the corresponding set_query
+                manifold.query_store.set_records(query_ext.set_query_ext.query.query_uuid, records);
+                
+            } else if (query_ext.domain_query_ext) {
+                // We have a set query, it is only used to determine which objects are in the set, we should only retrieve the key
+                // Has it a domain query, and has it completed ?
+                $.each(records, function(i, record) {
+                    var key = manifold.metadata.get_key(query.object);
+                    if ( typeof record === "string" ){
+                        var record_key = record;
+                    }else{
+                        var record_key = manifold.record_get_value(record, key);
+                    }
+                    manifold.query_store.set_record_state(query.query_uuid, record_key, STATE_SET, STATE_SET_IN);
+                });
 
-        } else {
-            // We have a normal query
-            manifold.query_store.set_records(query.query_uuid, records, STATE_SET_IN);
+            } else {
+                // We have a normal query
+                manifold.query_store.set_records(query.query_uuid, records, STATE_SET_IN);
+            }
         }
     },
 
index 4b40cb2..c8ff197 100644 (file)
@@ -19,7 +19,25 @@ from myslice.settings import ROOT
 #api_key=theapikeyasprovidedbygoogle
 
 # use a singleton instead of staticmethods
-from manifold.util.singleton    import Singleton
+#-------------------------------------------------------------------------
+# Class Singleton
+#
+# Classes that inherit from Singleton can be instanciated only once 
+#-------------------------------------------------------------------------
+
+class Singleton(type):
+    def __init__(cls, name, bases, dic):
+        super(Singleton,cls).__init__(name,bases,dic)
+        cls.instance=None
+
+    def __call__(cls, *args, **kw):
+        if cls.instance is None:
+            cls.instance=super(Singleton,cls).__call__(*args,**kw)
+        return cls.instance
+
+
+# See also
+# http://stackoverflow.com/questions/6760685/creating-a-singleton-in-python
 
 class ConfigEngine(object):
     __metaclass__ = Singleton
index 729b049..a3732f3 100644 (file)
@@ -15,6 +15,7 @@ httproot =
 dataroot =
 components = sla,influxdb,forge
 secret_key = random_key
+default_sender = OneLab Support <support@onelab.eu>
 
 [database]
 # postgresql_psycopg2, mysql, sqlite3 or oracle
index a612a36..4adf9fd 100644 (file)
@@ -15,6 +15,7 @@ httproot =
 dataroot =
 components = sla,influxdb,forge
 secret_key = random_value 
+default_sender = OneLab Support <support@onelab.eu>
 
 [database]
 # postgresql_psycopg2, mysql, sqlite3 or oracle
index 262ad06..b01b565 100644 (file)
@@ -31,7 +31,8 @@ except:
 
 if not config.myslice.portal_version:
     try:
-        PORTAL_VERSION = subprocess.check_output(["git", "describe"])
+        v = subprocess.check_output(["git", "--git-dir", ROOT + "/.git", "describe"])
+        PORTAL_VERSION = '-'.join(v.split('-')[:-1])
     except:
         PORTAL_VERSION = 'not using git' 
 
@@ -90,6 +91,9 @@ MANAGERS = ADMINS
 #DEFAULT_FROM_EMAIL = "root@theseus.ipv6.lip6.fr"
 #EMAIL_HOST_PASSWORD = "mypassword"
 
+if config.myslice.default_sender:
+    DEFAULT_FROM_EMAIL = config.myslice.default_sender
+
 EMAIL_HOST = "localhost"
 EMAIL_PORT = 25
 EMAIL_USE_TLS = False
diff --git a/plugins/asap/__init__.py b/plugins/asap/__init__.py
new file mode 100644 (file)
index 0000000..7429bc6
--- /dev/null
@@ -0,0 +1,32 @@
+from unfold.plugin import Plugin
+
+class AsapPlugin(Plugin):
+    
+    def __init__ (self, query=None, query_lease=None, **settings):
+        Plugin.__init__ (self, **settings)
+        self.query=query
+        self.query_lease = query_lease
+        self.query_lease_uuid = query_lease.query_uuid
+
+    def template_file (self):
+        return "asap.html"
+
+    def requirements (self):
+        reqs = {
+            'js_files' : [
+                'js/asap.js'
+            ],
+            'css_files': [
+                'css/asap.css',
+            ]
+        }
+        return reqs
+
+    def json_settings_list (self):
+        # query_uuid will pass self.query results to the javascript
+        # and will be available as "record" in :
+        # on_new_record: function(record)
+        return ['plugin_uuid', 'domid', 'query_uuid', 'query_lease_uuid']
+
+    def export_json_settings (self):
+        return True
diff --git a/plugins/asap/static/css/asap.css b/plugins/asap/static/css/asap.css
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/plugins/asap/static/js/asap.js b/plugins/asap/static/js/asap.js
new file mode 100644 (file)
index 0000000..107049b
--- /dev/null
@@ -0,0 +1,234 @@
+/**
+ * MyPlugin:    demonstration plugin
+ * Version:     0.1
+ * Description: Template for writing new plugins and illustrating the different
+ *              possibilities of the plugin API.
+ *              This file is part of the Manifold project 
+ * Requires:    js/plugin.js
+ * URL:         http://www.myslice.info
+ * Author:      Jordan Augé <jordan.auge@lip6.fr>
+ * Copyright:   Copyright 2012-2013 UPMC Sorbonne Universités
+ * License:     GPLv3
+ */
+
+var AsapDateSelected = new Date();
+
+(function($){
+
+    var AsapPlugin = Plugin.extend({
+
+        /** XXX to check
+         * @brief Plugin constructor
+         * @param options : an associative array of setting values
+         * @param element : 
+         * @return : a jQuery collection of objects on which the plugin is
+         *     applied, which allows to maintain chainability of calls
+         */
+        init: function(options, element) {
+           // for debugging tools
+           this.classname="myplugin";
+            // Call the parent constructor, see FAQ when forgotten
+            this._super(options, element);
+
+            /* Member variables */
+
+            /* Plugin events */
+
+            /* Setup query and record handlers */
+
+            // Explain this will allow query events to be handled
+            // What happens when we don't define some events ?
+            // Some can be less efficient
+            this.listen_query(options.query_uuid, 'resources');
+            this.listen_query(options.query_lease_uuid, 'leases');
+
+            /* GUI setup and event binding */
+            // call function
+            this._initUI();
+        },
+
+        /* PLUGIN EVENTS */
+        // on_show like in querytable
+
+        remove: function(id) {
+            return (elem=document.getElementById(id)).parentNode.removeChild(elem);
+        },
+        /* GUI EVENTS */
+        /**
+         * Initialize the date picker, the table, the slider and the buttons. Once done, display scheduler.
+         */
+        _initUI: function() 
+        {
+            var self = this;
+
+            /*
+            dateToday = new Date();
+
+            $("#DateAsap").datepicker({
+               //dateFormat: "D, d M yy",
+                minDate: dateToday,
+                defaultDate: dateToday,
+            }).on('changeDate', function(ev) {
+                if(ev.date < dateToday){
+                    $("#asap_msg").show();
+                    $("#asap_msg").css("color","red");
+                    $("#asap_msg").html("Please select an end date today or later");
+                    $("#asap_msg").fadeOut(4000);
+                    $("#DateAsap").datepicker( "setDate", dateToday );
+                }else{
+                    AsapDateSelected = ev.date;
+                }
+            }).datepicker('setValue', AsapDateSelected);
+            */
+            $("#asap_schedule").click(function() {
+                r = document.getElementById("resources");
+                if(r.childNodes.length == 0){
+                    $("#asap_msg").show();
+                    $("#asap_msg").css("color","orange");
+                    $("#asap_msg").html("Please select at least one IoTLab resource");
+                    $("#asap_msg").fadeOut(4000);
+                }else{
+                    start_time = 0;
+                    duration = $("#duration").val();
+                    if(!parseInt(duration)){
+                        $("#asap_msg").show();
+                        $("#asap_msg").css("color","red");
+                        $("#asap_msg").html("Please set the duration with a number");
+                        $("#asap_msg").fadeOut(4000);
+                    }else{
+                        elements = r.childNodes;
+                        // length of elements changes during loop as we remove elements one by one
+                        var size = elements.length;
+                        for (i = 0; i < size; i++) { 
+                            // lets take the first element
+                            el = elements[0];
+                            t_id = el.id.split("_");
+                            self.send_lease(t_id[1], String(start_time), duration);
+                        }
+                    }
+                }
+            });
+        },
+
+        // a function to bind events here: click change
+        // how to raise manifold events
+        send_lease: function(resource_urn, start_time, duration)
+        {
+            var lease_key, new_lease, data;
+
+            lease_key = manifold.metadata.get_key('lease');
+
+            new_lease = {
+                resource:   resource_urn,
+                start_time: start_time,
+                duration: duration,
+                //end_time:   end_time.getTime()/1000,
+            };
+
+            // This is needed to create a hashable object
+            new_lease.hashCode = manifold.record_hashcode(lease_key.sort());
+            new_lease.equals   = manifold.record_equals(lease_key);
+
+            data = {
+                state: STATE_SET,
+                key  : null,
+                op   : STATE_SET_ADD,
+                value: new_lease
+            }
+            prev_state = manifold.query_store.get_record_state(this.options.query_uuid, resource_urn, STATE_SET);
+            manifold.raise_event(this.options.query_lease_uuid, FIELD_STATE_CHANGED, data);
+
+
+        },
+
+        /* GUI MANIPULATION */
+
+        // We advise you to write function to change behaviour of the GUI
+        // Will use naming helpers to access content _inside_ the plugin
+        // always refer to these functions in the remaining of the code
+
+        show_hide_button: function() 
+        {
+            // this.id, this.el, this.cl, this.elts
+            // same output as a jquery selector with some guarantees
+        },
+
+        /* TEMPLATES */
+
+        // see in the html template
+        // How to load a template, use of mustache
+
+        /* QUERY HANDLERS */
+
+        // How to make sure the plugin is not desynchronized
+        // He should manifest its interest in filters, fields or records
+        // functions triggered only if the proper listen is done
+
+        // no prefix
+
+        on_filter_added: function(filter)
+        {
+
+        },
+
+        // ... be sure to list all events here
+        
+        on_resources_field_state_changed: function(record)
+        {
+            if(record["op"] != null){
+                resource = manifold.query_store.get_record(this.options.query_uuid,record['value']);
+                console.log(resource);
+                // TODO: Define which facilities support ASAP
+                if(resource["authority_id"]=="iotlab"){
+                    // TODO: use filters Pending or Unconfigured
+                    if(record['op']==2){
+                        var elm = document.createElement('div');
+                        elm.innerHTML = record['value'];
+                        elm.id = "asap_"+record['value'];
+                        r = document.getElementById("resources");
+                        r.appendChild(elm);
+                    }else if(record['op']==1){
+                        this.remove("asap_"+record['value']);
+                    }
+                }
+            }
+        },
+        on_leases_field_state_changed: function(record)
+        {
+            resource = manifold.query_store.get_record(this.options.query_uuid,record['value']['resource']);
+            console.log(resource);
+            // TODO: Define which facilities support ASAP
+            if(resource["authority_id"]=="iotlab"){
+                // TODO: use filters Pending or Unconfigured
+                if(record['op']==2){
+                    this.remove("asap_"+record['value']['resource']);
+                }else if(record['op']==1){
+                    var elm = document.createElement('div');
+                    elm.innerHTML = record['value']['resource'];
+                    elm.id = "asap_"+record['value']['resource'];
+                    r = document.getElementById("resources");
+                    r.appendChild(elm);
+                }
+            }
+        },
+
+        /* RECORD HANDLERS */
+        on_all_new_record: function(record)
+        {
+            console.log("on_all_new_record ---- ");
+            console.log(record);
+        },
+
+        /* INTERNAL FUNCTIONS */
+        _dummy: function() {
+            // only convention, not strictly enforced at the moment
+        },
+
+    });
+
+    /* Plugin registration */
+    $.plugin('AsapPlugin', AsapPlugin);
+
+    // TODO Here use cases for instanciating plugins in different ways like in the pastie.
+
+})(jQuery);
diff --git a/plugins/asap/templates/asap.html b/plugins/asap/templates/asap.html
new file mode 100644 (file)
index 0000000..f26847a
--- /dev/null
@@ -0,0 +1,17 @@
+<div id={{ domid }}>
+    <div class="col-md-12">
+        <h2>Reserve resources as soon as possible <sup id="note">*</sup></h2>
+        <div class="copy">* This feature is only available for FIT IoT-Lab testbed at the moment</div>
+    </div>
+
+    <div class="col-md-12" style="height:30px">
+        <div id="asap_msg">&nbsp;</div>
+    </div>
+    <div class="col-md-3"> As soon as possible for 
+        <input type="number" id="duration" name="duration"  size="3" style="width: 42px; min-width: 10px !important; margin-left: 2px; text-align: center;" min="1"> minutes
+    </div>
+    <div class="col-md-1">
+        <button id="asap_schedule" type="button" class="btn btn-primary"><span class="glyphicon glyphicon-time"></span> Schedule</button>
+    </div>
+    <div class="col-md-10" id="resources" style="padding-top:20px;"></div>
+</div>
index 324634c..7a30100 100644 (file)
                 manifold.raise_event(self.options.query_uuid, FILTER_REMOVED, filter);
             }
             // XXX The datatables will be refreshed twice !
-            if (filter_status != 'all') {
-                // No filter for 'all'
-                var filter = ['manifold:status', '==', filter_status];
-                manifold.raise_event(self.options.query_uuid, FILTER_ADDED, filter);
-            }
+            //if (filter_status != 'all') {
+            // No filter for 'all'
+            // Changed since we have available/unavailable status
+            var filter = ['manifold:status', '==', filter_status];
+            manifold.raise_event(self.options.query_uuid, FILTER_ADDED, filter);
+            //}
 
             self.prev_filter_status = filter_status;
         },
index 3d1c44b..a497a14 100644 (file)
@@ -6,19 +6,27 @@
      style='display: inline-block !important; font-size: inherit;' 
      id="{{ domid }}__all" 
      data-status="all"
+        title="View all resources."
+        rel='tooltip'>
+       All
+  </a>
+  <a href="#" 
+     class="list-group-item sl-resources" 
+     style='display: inline-block !important; font-size: inherit;' 
+     id="{{ domid }}__available" 
+     data-status="available"
         title="View resources that are available to be reserved."
         rel='tooltip'>
        Available
   </a>
-  
-  <a href="#"
+   <a href="#" 
      class="list-group-item sl-resources" 
      style='display: inline-block !important; font-size: inherit;' 
-     id="{{ domid }}__reserved
-     data-status="reserved"
-     title="View resources that you have previously reserved for the slice."
+     id="{{ domid }}__unavailable
+     data-status="unavailable"
+        title="View resources that are NOT available to be reserved."
         rel='tooltip'>
-       Reserved
+       Unavailable
   </a>
   
   <a href="#" class="list-group-item sl-resources"
        Pending
        <span class="badge" id="badge-pending" style="display:none;"></span>
   </a>
+  <a href="#"
+     class="list-group-item sl-resources" 
+     style='display: inline-block !important; font-size: inherit;' 
+     id="{{ domid }}__reserved" 
+     data-status="reserved"
+     title="View resources that you have previously reserved for the slice."
+        rel='tooltip'>
+       Reserved
+  </a>
+
 </div> 
index c1b1923..76934e7 100644 (file)
@@ -164,7 +164,7 @@ QUERYTABLE_BGCOLOR_REMOVED = 2;
             $('table.dataTable').delegate('a.resource-info','click',function() {
                 var aPos = sTable.fnGetPosition( this.parentNode );
                 var aData = sTable.fnGetData( aPos[0] );
-                //console.log(aData);
+                console.log(aData);
 
                 var index = {}
                 // XXX Loic @ Hardcoded !!! Maybe a loop over all fields would be better 
@@ -174,14 +174,16 @@ QUERYTABLE_BGCOLOR_REMOVED = 2;
                 index['hostname'] = self.getColIndex('hostname',cols);
                 index['urn'] = self.getColIndex('urn',cols);
                 index['type'] = self.getColIndex('type',cols);
-                index['status'] = self.getColIndex('boot_state',cols);
+                //index['status'] = self.getColIndex('boot_state',cols);
+                index['available'] = self.getColIndex('available',cols);
                 index['testbed'] = self.getColIndex('testbed_name',cols);
                 index['facility'] = self.getColIndex('facility_name',cols);
                 var resourceData = {
                     'hostname' : strip(aData[index['hostname']]),
                     'urn' : aData[index['urn']],
                     'type' : aData[index['type']],
-                    'status' : aData[index['status']],
+                    //'status' : aData[index['status']],
+                    'available' : aData[index['available']],
                     'testbed' : aData[index['testbed']],
                     'facility' : aData[index['facility']],
                 };
@@ -206,16 +208,17 @@ QUERYTABLE_BGCOLOR_REMOVED = 2;
                 } else {
                     var logo = resourceData['testbed'];
                     var resourceLocation = {
-                        'longitude' : aData[13],
-                        'latitude' : aData[23],
+                        'longitude' : aData[20],
+                        'latitude' : aData[17],
                     };
                     var coordinates = resourceLocation['latitude']+','+resourceLocation['longitude'];
+                    console.log(coordinates);
                 }
                 
                 var modal = $('#resource-info-modal');
                 modal.find('.modal-title').text(resourceData['testbed'] + ': ' +resourceData['hostname']);
                 table = modal.find('.modal-resource-info');
-                table.html('<tr><td colspan="2"><img class="img-responsive" src="/static/img/testbeds/'+logo+'.png" alt="'+resourceData['facility']+' - '+resourceData['testbed']+'" /></td></tr>');
+                table.html('<tr><td colspan="2"><center><img class="img-responsive" src="/static/img/testbeds/'+logo+'.png" alt="'+resourceData['facility']+' - '+resourceData['testbed']+'" /></center></td></tr>');
                 for (var j in resourceData) {
                     table.append('<tr><td>' + j + '</td><td>' + resourceData[j] + '</td></tr>');
                 }
deleted file mode 120000 (symlink)
index 02b8f470866f5e6021a5be90f259628c98564e41..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1 +0,0 @@
-raphael-1.5.2.js
\ No newline at end of file
new file mode 100644 (file)
index 0000000000000000000000000000000000000000..e5e712619129b17fff4c82214c995f684c2a492e
--- /dev/null
@@ -0,0 +1,7 @@
+/*
+ * Raphael 1.5.2 - JavaScript Vector Library
+ *
+ * Copyright (c) 2010 Dmitry Baranovskiy (http://raphaeljs.com)
+ * Licensed under the MIT (http://raphaeljs.com/license.html) license.
+ */
+(function(){function a(){if(a.is(arguments[0],G)){var b=arguments[0],d=bV[m](a,b.splice(0,3+a.is(b[0],E))),e=d.set();for(var g=0,h=b[w];g<h;g++){var i=b[g]||{};c[f](i.type)&&e[L](d[i.type]().attr(i))}return e}return bV[m](a,arguments)}a.version="1.5.2";var b=/[, ]+/,c={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},d=/\{(\d+)\}/g,e="prototype",f="hasOwnProperty",g=document,h=window,i={was:Object[e][f].call(h,"Raphael"),is:h.Raphael},j=function(){this.customAttributes={}},k,l="appendChild",m="apply",n="concat",o="createTouch"in g,p="",q=" ",r=String,s="split",t="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend orientationchange touchcancel gesturestart gesturechange gestureend"[s](q),u={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},v="join",w="length",x=r[e].toLowerCase,y=Math,z=y.max,A=y.min,B=y.abs,C=y.pow,D=y.PI,E="number",F="string",G="array",H="toString",I="fill",J=Object[e][H],K={},L="push",M=/^url\(['"]?([^\)]+?)['"]?\)$/i,N=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,O={"NaN":1,Infinity:1,"-Infinity":1},P=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,Q=y.round,R="setAttribute",S=parseFloat,T=parseInt,U=" progid:DXImageTransform.Microsoft",V=r[e].toUpperCase,W={blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:"10px \"Arial\"","font-family":"\"Arial\"","font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/",opacity:1,path:"M0,0",r:0,rotation:0,rx:0,ry:0,scale:"1 1",src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",translation:"0 0",width:0,x:0,y:0},X={along:"along",blur:E,"clip-rect":"csv",cx:E,cy:E,fill:"colour","fill-opacity":E,"font-size":E,height:E,opacity:E,path:"path",r:E,rotation:"csv",rx:E,ry:E,scale:"csv",stroke:"colour","stroke-opacity":E,"stroke-width":E,translation:"csv",width:E,x:E,y:E},Y="replace",Z=/^(from|to|\d+%?)$/,$=/\s*,\s*/,_={hs:1,rg:1},ba=/,?([achlmqrstvxz]),?/gi,bb=/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,bc=/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,bd=/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,be=function(a,b){return a.key-b.key};a.type=h.SVGAngle||g.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML";if(a.type=="VML"){var bf=g.createElement("div"),bg;bf.innerHTML="<v:shape adj=\"1\"/>";bg=bf.firstChild;bg.style.behavior="url(#default#VML)";if(!(bg&&typeof bg.adj=="object"))return a.type=null;bf=null}a.svg=!(a.vml=a.type=="VML");j[e]=a[e];k=j[e];a._id=0;a._oid=0;a.fn={};a.is=function(a,b){b=x.call(b);if(b=="finite")return!O[f](+a);return b=="null"&&a===null||b==typeof a||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||J.call(a).slice(8,-1).toLowerCase()==b};a.angle=function(b,c,d,e,f,g){{if(f==null){var h=b-d,i=c-e;if(!h&&!i)return 0;return((h<0)*180+y.atan(-i/-h)*180/D+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)}};a.rad=function(a){return a%360*D/180};a.deg=function(a){return a*180/D%360};a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,G)){var e=b.length;while(e--)if(B(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(f<d)return c-f;if(f>b-d)return c-f+b}return c};function bh(){var a=[],b=0;for(;b<32;b++)a[b]=(~(~(y.random()*16)))[H](16);a[12]=4;a[16]=(a[16]&3|8)[H](16);return"r-"+a[v]("")}a.setWindow=function(a){h=a;g=h.document};var bi=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write("<body>");e.close();d=e.body}catch(a){d=createPopup().document.body}var f=d.createTextRange();bi=bm(function(a){try{d.style.color=r(a)[Y](c,p);var b=f.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b[H](16)).slice(-6)}catch(a){return"none"}})}else{var h=g.createElement("i");h.title="Raphaël Colour Picker";h.style.display="none";g.body[l](h);bi=bm(function(a){h.style.color=a;return g.defaultView.getComputedStyle(h,p).getPropertyValue("color")})}return bi(b)},bj=function(){return"hsb("+[this.h,this.s,this.b]+")"},bk=function(){return"hsl("+[this.h,this.s,this.l]+")"},bl=function(){return this.hex};a.hsb2rgb=function(b,c,d,e){if(a.is(b,"object")&&"h"in b&&"s"in b&&"b"in b){d=b.b;c=b.s;b=b.h;e=b.o}return a.hsl2rgb(b,c,d/2,e)};a.hsl2rgb=function(b,c,d,e){if(a.is(b,"object")&&"h"in b&&"s"in b&&"l"in b){d=b.l;c=b.s;b=b.h}if(b>1||c>1||d>1){b/=360;c/=100;d/=100}var f={},g=["r","g","b"],h,i,j,k,l,m;if(c){d<0.5?h=d*(1+c):h=d+c-d*c;i=2*d-h;for(var n=0;n<3;n++){j=b+1/3*-(n-1);j<0&&j++;j>1&&j--;j*6<1?f[g[n]]=i+(h-i)*6*j:j*2<1?f[g[n]]=h:j*3<2?f[g[n]]=i+(h-i)*(2/3-j)*6:f[g[n]]=i}}else f={r:d,g:d,b:d};f.r*=255;f.g*=255;f.b*=255;f.hex="#"+(16777216|f.b|f.g<<8|f.r<<16).toString(16).slice(1);a.is(e,"finite")&&(f.opacity=e);f.toString=bl;return f};a.rgb2hsb=function(b,c,d){if(c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b){d=b.b;c=b.g;b=b.r}if(c==null&&a.is(b,F)){var e=a.getRGB(b);b=e.r;c=e.g;d=e.b}if(b>1||c>1||d>1){b/=255;c/=255;d/=255}var f=z(b,c,d),g=A(b,c,d),h,i,j=f;{if(g==f)return{h:0,s:0,b:f,toString:bj};var k=f-g;i=k/f;b==f?h=(c-d)/k:c==f?h=2+(d-b)/k:h=4+(b-c)/k;h/=6;h<0&&h++;h>1&&h--}return{h:h,s:i,b:j,toString:bj}};a.rgb2hsl=function(b,c,d){if(c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b){d=b.b;c=b.g;b=b.r}if(c==null&&a.is(b,F)){var e=a.getRGB(b);b=e.r;c=e.g;d=e.b}if(b>1||c>1||d>1){b/=255;c/=255;d/=255}var f=z(b,c,d),g=A(b,c,d),h,i,j=(f+g)/2,k;if(g==f)k={h:0,s:0,l:j};else{var l=f-g;i=j<0.5?l/(f+g):l/(2-f-g);b==f?h=(c-d)/l:c==f?h=2+(d-b)/l:h=4+(b-c)/l;h/=6;h<0&&h++;h>1&&h--;k={h:h,s:i,l:j}}k.toString=bk;return k};a._path2string=function(){return this.join(",")[Y](ba,"$1")};function bm(a,b,c){function d(){var g=Array[e].slice.call(arguments,0),h=g[v]("►"),i=d.cache=d.cache||{},j=d.count=d.count||[];if(i[f](h))return c?c(i[h]):i[h];j[w]>=1000&&delete i[j.shift()];j[L](h);i[h]=a[m](b,g);return c?c(i[h]):i[h]}return d}a.getRGB=bm(function(b){if(!b||!(!((b=r(b)).indexOf("-")+1)))return{r:-1,g:-1,b:-1,hex:"none",error:1};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none"};!(_[f](b.toLowerCase().substring(0,2))||b.charAt()=="#")&&(b=bi(b));var c,d,e,g,h,i,j,k=b.match(N);if(k){if(k[2]){g=T(k[2].substring(5),16);e=T(k[2].substring(3,5),16);d=T(k[2].substring(1,3),16)}if(k[3]){g=T((i=k[3].charAt(3))+i,16);e=T((i=k[3].charAt(2))+i,16);d=T((i=k[3].charAt(1))+i,16)}if(k[4]){j=k[4][s]($);d=S(j[0]);j[0].slice(-1)=="%"&&(d*=2.55);e=S(j[1]);j[1].slice(-1)=="%"&&(e*=2.55);g=S(j[2]);j[2].slice(-1)=="%"&&(g*=2.55);k[1].toLowerCase().slice(0,4)=="rgba"&&(h=S(j[3]));j[3]&&j[3].slice(-1)=="%"&&(h/=100)}if(k[5]){j=k[5][s]($);d=S(j[0]);j[0].slice(-1)=="%"&&(d*=2.55);e=S(j[1]);j[1].slice(-1)=="%"&&(e*=2.55);g=S(j[2]);j[2].slice(-1)=="%"&&(g*=2.55);(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360);k[1].toLowerCase().slice(0,4)=="hsba"&&(h=S(j[3]));j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,g,h)}if(k[6]){j=k[6][s]($);d=S(j[0]);j[0].slice(-1)=="%"&&(d*=2.55);e=S(j[1]);j[1].slice(-1)=="%"&&(e*=2.55);g=S(j[2]);j[2].slice(-1)=="%"&&(g*=2.55);(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360);k[1].toLowerCase().slice(0,4)=="hsla"&&(h=S(j[3]));j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,g,h)}k={r:d,g:e,b:g};k.hex="#"+(16777216|g|e<<8|d<<16).toString(16).slice(1);a.is(h,"finite")&&(k.opacity=h);return k}return{r:-1,g:-1,b:-1,hex:"none",error:1}},a);a.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||0.75},c=this.hsb2rgb(b.h,b.s,b.b);b.h+=0.075;if(b.h>1){b.h=0;b.s-=0.2;b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b})}return c.hex};a.getColor.reset=function(){delete this.start};a.parsePathString=bm(function(b){if(!b)return null;var c={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},d=[];a.is(b,G)&&a.is(b[0],G)&&(d=bo(b));d[w]||r(b)[Y](bb,function(a,b,e){var f=[],g=x.call(b);e[Y](bc,function(a,b){b&&f[L](+b)});if(g=="m"&&f[w]>2){d[L]([b][n](f.splice(0,2)));g="l";b=b=="m"?"l":"L"}while(f[w]>=c[g]){d[L]([b][n](f.splice(0,c[g])));if(!c[g])break}});d[H]=a._path2string;return d});a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=C(j,3)*a+C(j,2)*3*i*c+j*3*i*i*e+C(i,3)*g,l=C(j,3)*b+C(j,2)*3*i*d+j*3*i*i*f+C(i,3)*h,m=a+2*i*(c-a)+i*i*(e-2*c+a),n=b+2*i*(d-b)+i*i*(f-2*d+b),o=c+2*i*(e-c)+i*i*(g-2*e+c),p=d+2*i*(f-d)+i*i*(h-2*f+d),q=(1-i)*a+i*c,r=(1-i)*b+i*d,s=(1-i)*e+i*g,t=(1-i)*f+i*h,u=90-y.atan((m-o)/(n-p))*180/D;(m>o||n<p)&&(u+=180);return{x:k,y:l,m:{x:m,y:n},n:{x:o,y:p},start:{x:q,y:r},end:{x:s,y:t},alpha:u}};var bn=bm(function(a){if(!a)return{x:0,y:0,width:0,height:0};a=bw(a);var b=0,c=0,d=[],e=[],f;for(var g=0,h=a[w];g<h;g++){f=a[g];if(f[0]=="M"){b=f[1];c=f[2];d[L](b);e[L](c)}else{var i=bv(b,c,f[1],f[2],f[3],f[4],f[5],f[6]);d=d[n](i.min.x,i.max.x);e=e[n](i.min.y,i.max.y);b=f[5];c=f[6]}}var j=A[m](0,d),k=A[m](0,e);return{x:j,y:k,width:z[m](0,d)-j,height:z[m](0,e)-k}}),bo=function(b){var c=[];if(!a.is(b,G)||!a.is(b&&b[0],G))b=a.parsePathString(b);for(var d=0,e=b[w];d<e;d++){c[d]=[];for(var f=0,g=b[d][w];f<g;f++)c[d][f]=b[d][f]}c[H]=a._path2string;return c},bp=bm(function(b){if(!a.is(b,G)||!a.is(b&&b[0],G))b=a.parsePathString(b);var c=[],d=0,e=0,f=0,g=0,h=0;if(b[0][0]=="M"){d=b[0][1];e=b[0][2];f=d;g=e;h++;c[L](["M",d,e])}for(var i=h,j=b[w];i<j;i++){var k=c[i]=[],l=b[i];if(l[0]!=x.call(l[0])){k[0]=x.call(l[0]);switch(k[0]){case"a":k[1]=l[1];k[2]=l[2];k[3]=l[3];k[4]=l[4];k[5]=l[5];k[6]=+(l[6]-d).toFixed(3);k[7]=+(l[7]-e).toFixed(3);break;case"v":k[1]=+(l[1]-e).toFixed(3);break;case"m":f=l[1];g=l[2];default:for(var m=1,n=l[w];m<n;m++)k[m]=+(l[m]-(m%2?d:e)).toFixed(3)}}else{k=c[i]=[];if(l[0]=="m"){f=l[1]+d;g=l[2]+e}for(var o=0,p=l[w];o<p;o++)c[i][o]=l[o]}var q=c[i][w];switch(c[i][0]){case"z":d=f;e=g;break;case"h":d+=+c[i][q-1];break;case"v":e+=+c[i][q-1];break;default:d+=+c[i][q-2];e+=+c[i][q-1]}}c[H]=a._path2string;return c},0,bo),bq=bm(function(b){if(!a.is(b,G)||!a.is(b&&b[0],G))b=a.parsePathString(b);var c=[],d=0,e=0,f=0,g=0,h=0;if(b[0][0]=="M"){d=+b[0][1];e=+b[0][2];f=d;g=e;h++;c[0]=["M",d,e]}for(var i=h,j=b[w];i<j;i++){var k=c[i]=[],l=b[i];if(l[0]!=V.call(l[0])){k[0]=V.call(l[0]);switch(k[0]){case"A":k[1]=l[1];k[2]=l[2];k[3]=l[3];k[4]=l[4];k[5]=l[5];k[6]=+(l[6]+d);k[7]=+(l[7]+e);break;case"V":k[1]=+l[1]+e;break;case"H":k[1]=+l[1]+d;break;case"M":f=+l[1]+d;g=+l[2]+e;default:for(var m=1,n=l[w];m<n;m++)k[m]=+l[m]+(m%2?d:e)}}else for(var o=0,p=l[w];o<p;o++)c[i][o]=l[o];switch(k[0]){case"Z":d=f;e=g;break;case"H":d=k[1];break;case"V":e=k[1];break;case"M":f=c[i][c[i][w]-2];g=c[i][c[i][w]-1];default:d=c[i][c[i][w]-2];e=c[i][c[i][w]-1]}}c[H]=a._path2string;return c},null,bo),br=function(a,b,c,d){return[a,b,c,d,c,d]},bs=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},bt=function(a,b,c,d,e,f,g,h,i,j){var k=D*120/180,l=D/180*(+e||0),m=[],o,p=bm(function(a,b,c){var d=a*y.cos(c)-b*y.sin(c),e=a*y.sin(c)+b*y.cos(c);return{x:d,y:e}});if(j){G=j[0];H=j[1];E=j[2];F=j[3]}else{o=p(a,b,-l);a=o.x;b=o.y;o=p(h,i,-l);h=o.x;i=o.y;var q=y.cos(D/180*e),r=y.sin(D/180*e),t=(a-h)/2,u=(b-i)/2,x=t*t/(c*c)+u*u/(d*d);if(x>1){x=y.sqrt(x);c=x*c;d=x*d}var z=c*c,A=d*d,C=(f==g?-1:1)*y.sqrt(B((z*A-z*u*u-A*t*t)/(z*u*u+A*t*t))),E=C*c*u/d+(a+h)/2,F=C*-d*t/c+(b+i)/2,G=y.asin(((b-F)/d).toFixed(9)),H=y.asin(((i-F)/d).toFixed(9));G=a<E?D-G:G;H=h<E?D-H:H;G<0&&(G=D*2+G);H<0&&(H=D*2+H);g&&G>H&&(G=G-D*2);!g&&H>G&&(H=H-D*2)}var I=H-G;if(B(I)>k){var J=H,K=h,L=i;H=G+k*(g&&H>G?1:-1);h=E+c*y.cos(H);i=F+d*y.sin(H);m=bt(h,i,c,d,e,0,g,K,L,[H,J,E,F])}I=H-G;var M=y.cos(G),N=y.sin(G),O=y.cos(H),P=y.sin(H),Q=y.tan(I/4),R=4/3*c*Q,S=4/3*d*Q,T=[a,b],U=[a+R*N,b-S*M],V=[h+R*P,i-S*O],W=[h,i];U[0]=2*T[0]-U[0];U[1]=2*T[1]-U[1];{if(j)return[U,V,W][n](m);m=[U,V,W][n](m)[v]()[s](",");var X=[];for(var Y=0,Z=m[w];Y<Z;Y++)X[Y]=Y%2?p(m[Y-1],m[Y],l).y:p(m[Y],m[Y+1],l).x;return X}},bu=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:C(j,3)*a+C(j,2)*3*i*c+j*3*i*i*e+C(i,3)*g,y:C(j,3)*b+C(j,2)*3*i*d+j*3*i*i*f+C(i,3)*h}},bv=bm(function(a,b,c,d,e,f,g,h){var i=e-2*c+a-(g-2*e+c),j=2*(c-a)-2*(e-c),k=a-c,l=(-j+y.sqrt(j*j-4*i*k))/2/i,n=(-j-y.sqrt(j*j-4*i*k))/2/i,o=[b,h],p=[a,g],q;B(l)>"1e12"&&(l=0.5);B(n)>"1e12"&&(n=0.5);if(l>0&&l<1){q=bu(a,b,c,d,e,f,g,h,l);p[L](q.x);o[L](q.y)}if(n>0&&n<1){q=bu(a,b,c,d,e,f,g,h,n);p[L](q.x);o[L](q.y)}i=f-2*d+b-(h-2*f+d);j=2*(d-b)-2*(f-d);k=b-d;l=(-j+y.sqrt(j*j-4*i*k))/2/i;n=(-j-y.sqrt(j*j-4*i*k))/2/i;B(l)>"1e12"&&(l=0.5);B(n)>"1e12"&&(n=0.5);if(l>0&&l<1){q=bu(a,b,c,d,e,f,g,h,l);p[L](q.x);o[L](q.y)}if(n>0&&n<1){q=bu(a,b,c,d,e,f,g,h,n);p[L](q.x);o[L](q.y)}return{min:{x:A[m](0,p),y:A[m](0,o)},max:{x:z[m](0,p),y:z[m](0,o)}}}),bw=bm(function(a,b){var c=bq(a),d=b&&bq(b),e={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g=function(a,b){var c,d;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null);switch(a[0]){case"M":b.X=a[1];b.Y=a[2];break;case"A":a=["C"][n](bt[m](0,[b.x,b.y][n](a.slice(1))));break;case"S":c=b.x+(b.x-(b.bx||b.x));d=b.y+(b.y-(b.by||b.y));a=["C",c,d][n](a.slice(1));break;case"T":b.qx=b.x+(b.x-(b.qx||b.x));b.qy=b.y+(b.y-(b.qy||b.y));a=["C"][n](bs(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1];b.qy=a[2];a=["C"][n](bs(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][n](br(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][n](br(b.x,b.y,a[1],b.y));break;case"V":a=["C"][n](br(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][n](br(b.x,b.y,b.X,b.Y));break}return a},h=function(a,b){if(a[b][w]>7){a[b].shift();var e=a[b];while(e[w])a.splice(b++,0,["C"][n](e.splice(0,6)));a.splice(b,1);k=z(c[w],d&&d[w]||0)}},i=function(a,b,e,f,g){if(a&&b&&a[g][0]=="M"&&b[g][0]!="M"){b.splice(g,0,["M",f.x,f.y]);e.bx=0;e.by=0;e.x=a[g][1];e.y=a[g][2];k=z(c[w],d&&d[w]||0)}};for(var j=0,k=z(c[w],d&&d[w]||0);j<k;j++){c[j]=g(c[j],e);h(c,j);d&&(d[j]=g(d[j],f));d&&h(d,j);i(c,d,e,f,j);i(d,c,f,e,j);var l=c[j],o=d&&d[j],p=l[w],q=d&&o[w];e.x=l[p-2];e.y=l[p-1];e.bx=S(l[p-4])||e.x;e.by=S(l[p-3])||e.y;f.bx=d&&(S(o[q-4])||f.x);f.by=d&&(S(o[q-3])||f.y);f.x=d&&o[q-2];f.y=d&&o[q-1]}return d?[c,d]:c},null,bo),bx=bm(function(b){var c=[];for(var d=0,e=b[w];d<e;d++){var f={},g=b[d].match(/^([^:]*):?([\d\.]*)/);f.color=a.getRGB(g[1]);if(f.color.error)return null;f.color=f.color.hex;g[2]&&(f.offset=g[2]+"%");c[L](f)}for(d=1,e=c[w]-1;d<e;d++){if(!c[d].offset){var h=S(c[d-1].offset||0),i=0;for(var j=d+1;j<e;j++){if(c[j].offset){i=c[j].offset;break}}if(!i){i=100;j=e}i=S(i);var k=(i-h)/(j-d+1);for(;d<j;d++){h+=k;c[d].offset=h+"%"}}}return c}),by=function(b,c,d,e){var f;if(a.is(b,F)||a.is(b,"object")){f=a.is(b,F)?g.getElementById(b):b;if(f.tagName)return c==null?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:c,height:d}}else return{container:1,x:b,y:c,width:d,height:e}},bz=function(a,b){var c=this;for(var d in b){if(b[f](d)&&!(d in a))switch(typeof b[d]){case"function":(function(b){a[d]=a===c?b:function(){return b[m](c,arguments)}})(b[d]);break;case"object":a[d]=a[d]||{};bz.call(this,a[d],b[d]);break;default:a[d]=b[d];break}}},bA=function(a,b){a==b.top&&(b.top=a.prev);a==b.bottom&&(b.bottom=a.next);a.next&&(a.next.prev=a.prev);a.prev&&(a.prev.next=a.next)},bB=function(a,b){if(b.top===a)return;bA(a,b);a.next=null;a.prev=b.top;b.top.next=a;b.top=a},bC=function(a,b){if(b.bottom===a)return;bA(a,b);a.next=b.bottom;a.prev=null;b.bottom.prev=a;b.bottom=a},bD=function(a,b,c){bA(a,c);b==c.top&&(c.top=a);b.next&&(b.next.prev=a);a.next=b.next;a.prev=b;b.next=a},bE=function(a,b,c){bA(a,c);b==c.bottom&&(c.bottom=a);b.prev&&(b.prev.next=a);a.prev=b.prev;b.prev=a;a.next=b},bF=function(a){return function(){throw new Error("Raphaël: you are calling to method “"+a+"” of removed object")}};a.pathToRelative=bp;if(a.svg){k.svgns="http://www.w3.org/2000/svg";k.xlink="http://www.w3.org/1999/xlink";Q=function(a){return+a+(~(~a)===a)*0.5};var bG=function(a,b){if(b)for(var c in b)b[f](c)&&a[R](c,r(b[c]));else{a=g.createElementNS(k.svgns,a);a.style.webkitTapHighlightColor="rgba(0,0,0,0)";return a}};a[H]=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var bH=function(a,b){var c=bG("path");b.canvas&&b.canvas[l](c);var d=new bN(c,b);d.type="path";bK(d,{fill:"none",stroke:"#000",path:a});return d},bI=function(a,b,c){var d="linear",e=0.5,f=0.5,h=a.style;b=r(b)[Y](bd,function(a,b,c){d="radial";if(b&&c){e=S(b);f=S(c);var g=(f>0.5)*2-1;C(e-0.5,2)+C(f-0.5,2)>0.25&&(f=y.sqrt(0.25-C(e-0.5,2))*g+0.5)&&f!=0.5&&(f=f.toFixed(5)-0.00001*g)}return p});b=b[s](/\s*\-\s*/);if(d=="linear"){var i=b.shift();i=-S(i);if(isNaN(i))return null;var j=[0,0,y.cos(i*D/180),y.sin(i*D/180)],k=1/(z(B(j[2]),B(j[3]))||1);j[2]*=k;j[3]*=k;if(j[2]<0){j[0]=-j[2];j[2]=0}if(j[3]<0){j[1]=-j[3];j[3]=0}}var m=bx(b);if(!m)return null;var n=a.getAttribute(I);n=n.match(/^url\(#(.*)\)$/);n&&c.defs.removeChild(g.getElementById(n[1]));var o=bG(d+"Gradient");o.id=bh();bG(o,d=="radial"?{fx:e,fy:f}:{x1:j[0],y1:j[1],x2:j[2],y2:j[3]});c.defs[l](o);for(var q=0,t=m[w];q<t;q++){var u=bG("stop");bG(u,{offset:m[q].offset?m[q].offset:q?"100%":"0%","stop-color":m[q].color||"#fff"});o[l](u)}bG(a,{fill:"url(#"+o.id+")",opacity:1,"fill-opacity":1});h.fill=p;h.opacity=1;h.fillOpacity=1;return 1},bJ=function(b){var c=b.getBBox();bG(b.pattern,{patternTransform:a.format("translate({0},{1})",c.x,c.y)})},bK=function(c,d){var e={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},h=c.node,i=c.attrs,j=c.rotate(),k=function(a,b){b=e[x.call(b)];if(b){var c=a.attrs["stroke-width"]||"1",f=({round:c,square:c,butt:0})[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],i=b[w];while(i--)g[i]=b[i]*c+(i%2?1:-1)*f;bG(h,{"stroke-dasharray":g[v](",")})}};d[f]("rotation")&&(j=d.rotation);var m=r(j)[s](b);if(m.length-1){m[1]=+m[1];m[2]=+m[2]}else m=null;S(j)&&c.rotate(0,true);for(var n in d){if(d[f](n)){if(!W[f](n))continue;var o=d[n];i[n]=o;switch(n){case"blur":c.blur(o);break;case"rotation":c.rotate(o,true);break;case"href":case"title":case"target":var t=h.parentNode;if(x.call(t.tagName)!="a"){var u=bG("a");t.insertBefore(u,h);u[l](h);t=u}n=="target"&&o=="blank"?t.setAttributeNS(c.paper.xlink,"show","new"):t.setAttributeNS(c.paper.xlink,n,o);break;case"cursor":h.style.cursor=o;break;case"clip-rect":var y=r(o)[s](b);if(y[w]==4){c.clip&&c.clip.parentNode.parentNode.removeChild(c.clip.parentNode);var z=bG("clipPath"),A=bG("rect");z.id=bh();bG(A,{x:y[0],y:y[1],width:y[2],height:y[3]});z[l](A);c.paper.defs[l](z);bG(h,{"clip-path":"url(#"+z.id+")"});c.clip=A}if(!o){var B=g.getElementById(h.getAttribute("clip-path")[Y](/(^url\(#|\)$)/g,p));B&&B.parentNode.removeChild(B);bG(h,{"clip-path":p});delete c.clip}break;case"path":c.type=="path"&&bG(h,{d:o?i.path=bq(o):"M0,0"});break;case"width":h[R](n,o);if(i.fx){n="x";o=i.x}else break;case"x":i.fx&&(o=-i.x-(i.width||0));case"rx":if(n=="rx"&&c.type=="rect")break;case"cx":m&&(n=="x"||n=="cx")&&(m[1]+=o-i[n]);h[R](n,o);c.pattern&&bJ(c);break;case"height":h[R](n,o);if(i.fy){n="y";o=i.y}else break;case"y":i.fy&&(o=-i.y-(i.height||0));case"ry":if(n=="ry"&&c.type=="rect")break;case"cy":m&&(n=="y"||n=="cy")&&(m[2]+=o-i[n]);h[R](n,o);c.pattern&&bJ(c);break;case"r":c.type=="rect"?bG(h,{rx:o,ry:o}):h[R](n,o);break;case"src":c.type=="image"&&h.setAttributeNS(c.paper.xlink,"href",o);break;case"stroke-width":h.style.strokeWidth=o;h[R](n,o);i["stroke-dasharray"]&&k(c,i["stroke-dasharray"]);break;case"stroke-dasharray":k(c,o);break;case"translation":var C=r(o)[s](b);C[0]=+C[0]||0;C[1]=+C[1]||0;if(m){m[1]+=C[0];m[2]+=C[1]}cz.call(c,C[0],C[1]);break;case"scale":C=r(o)[s](b);c.scale(+C[0]||1,+C[1]||+C[0]||1,isNaN(S(C[2]))?null:+C[2],isNaN(S(C[3]))?null:+C[3]);break;case I:var D=r(o).match(M);if(D){z=bG("pattern");var E=bG("image");z.id=bh();bG(z,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1});bG(E,{x:0,y:0});E.setAttributeNS(c.paper.xlink,"href",D[1]);z[l](E);var F=g.createElement("img");F.style.cssText="position:absolute;left:-9999em;top-9999em";F.onload=function(){bG(z,{width:this.offsetWidth,height:this.offsetHeight});bG(E,{width:this.offsetWidth,height:this.offsetHeight});g.body.removeChild(this);c.paper.safari()};g.body[l](F);F.src=D[1];c.paper.defs[l](z);h.style.fill="url(#"+z.id+")";bG(h,{fill:"url(#"+z.id+")"});c.pattern=z;c.pattern&&bJ(c);break}var G=a.getRGB(o);if(G.error)if((({circle:1,ellipse:1})[f](c.type)||r(o).charAt()!="r")&&bI(h,o,c.paper)){i.gradient=o;i.fill="none";break}else{delete d.gradient;delete i.gradient;!a.is(i.opacity,"undefined")&&a.is(d.opacity,"undefined")&&bG(h,{opacity:i.opacity});!a.is(i["fill-opacity"],"undefined")&&a.is(d["fill-opacity"],"undefined")&&bG(h,{"fill-opacity":i["fill-opacity"]})}G[f]("opacity")&&bG(h,{"fill-opacity":G.opacity>1?G.opacity/100:G.opacity});case"stroke":G=a.getRGB(o);h[R](n,G.hex);n=="stroke"&&G[f]("opacity")&&bG(h,{"stroke-opacity":G.opacity>1?G.opacity/100:G.opacity});break;case"gradient":(({circle:1,ellipse:1})[f](c.type)||r(o).charAt()!="r")&&bI(h,o,c.paper);break;case"opacity":i.gradient&&!i[f]("stroke-opacity")&&bG(h,{"stroke-opacity":o>1?o/100:o});case"fill-opacity":if(i.gradient){var H=g.getElementById(h.getAttribute(I)[Y](/^url\(#|\)$/g,p));if(H){var J=H.getElementsByTagName("stop");J[J[w]-1][R]("stop-opacity",o)}break}default:n=="font-size"&&(o=T(o,10)+"px");var K=n[Y](/(\-.)/g,function(a){return V.call(a.substring(1))});h.style[K]=o;h[R](n,o);break}}}bM(c,d);m?c.rotate(m.join(q)):S(j)&&c.rotate(j,true)},bL=1.2,bM=function(b,c){if(b.type!="text"||!(c[f]("text")||c[f]("font")||c[f]("font-size")||c[f]("x")||c[f]("y")))return;var d=b.attrs,e=b.node,h=e.firstChild?T(g.defaultView.getComputedStyle(e.firstChild,p).getPropertyValue("font-size"),10):10;if(c[f]("text")){d.text=c.text;while(e.firstChild)e.removeChild(e.firstChild);var i=r(c.text)[s]("\n");for(var j=0,k=i[w];j<k;j++)if(i[j]){var m=bG("tspan");j&&bG(m,{dy:h*bL,x:d.x});m[l](g.createTextNode(i[j]));e[l](m)}}else{i=e.getElementsByTagName("tspan");for(j=0,k=i[w];j<k;j++)j&&bG(i[j],{dy:h*bL,x:d.x})}bG(e,{y:d.y});var n=b.getBBox(),o=d.y-(n.y+n.height/2);o&&a.is(o,"finite")&&bG(e,{y:d.y+o})},bN=function(b,c){var d=0,e=0;this[0]=b;this.id=a._oid++;this.node=b;b.raphael=this;this.paper=c;this.attrs=this.attrs||{};this.transformations=[];this._={tx:0,ty:0,rt:{deg:0,cx:0,cy:0},sx:1,sy:1};!c.bottom&&(c.bottom=this);this.prev=c.top;c.top&&(c.top.next=this);c.top=this;this.next=null},bO=bN[e];bN[e].rotate=function(c,d,e){if(this.removed)return this;if(c==null){if(this._.rt.cx)return[this._.rt.deg,this._.rt.cx,this._.rt.cy][v](q);return this._.rt.deg}var f=this.getBBox();c=r(c)[s](b);if(c[w]-1){d=S(c[1]);e=S(c[2])}c=S(c[0]);d!=null&&d!==false?this._.rt.deg=c:this._.rt.deg+=c;e==null&&(d=null);this._.rt.cx=d;this._.rt.cy=e;d=d==null?f.x+f.width/2:d;e=e==null?f.y+f.height/2:e;if(this._.rt.deg){this.transformations[0]=a.format("rotate({0} {1} {2})",this._.rt.deg,d,e);this.clip&&bG(this.clip,{transform:a.format("rotate({0} {1} {2})",-this._.rt.deg,d,e)})}else{this.transformations[0]=p;this.clip&&bG(this.clip,{transform:p})}bG(this.node,{transform:this.transformations[v](q)});return this};bN[e].hide=function(){!this.removed&&(this.node.style.display="none");return this};bN[e].show=function(){!this.removed&&(this.node.style.display="");return this};bN[e].remove=function(){if(this.removed)return;bA(this,this.paper);this.node.parentNode.removeChild(this.node);for(var a in this)delete this[a];this.removed=true};bN[e].getBBox=function(){if(this.removed)return this;if(this.type=="path")return bn(this.attrs.path);if(this.node.style.display=="none"){this.show();var a=true}var b={};try{b=this.node.getBBox()}catch(a){}finally{b=b||{}}if(this.type=="text"){b={x:b.x,y:Infinity,width:0,height:0};for(var c=0,d=this.node.getNumberOfChars();c<d;c++){var e=this.node.getExtentOfChar(c);e.y<b.y&&(b.y=e.y);e.y+e.height-b.y>b.height&&(b.height=e.y+e.height-b.y);e.x+e.width-b.x>b.width&&(b.width=e.x+e.width-b.x)}}a&&this.hide();return b};bN[e].attr=function(b,c){if(this.removed)return this;if(b==null){var d={};for(var e in this.attrs)this.attrs[f](e)&&(d[e]=this.attrs[e]);this._.rt.deg&&(d.rotation=this.rotate());(this._.sx!=1||this._.sy!=1)&&(d.scale=this.scale());d.gradient&&d.fill=="none"&&(d.fill=d.gradient)&&delete d.gradient;return d}if(c==null&&a.is(b,F)){if(b=="translation")return cz.call(this);if(b=="rotation")return this.rotate();if(b=="scale")return this.scale();if(b==I&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;return this.attrs[b]}if(c==null&&a.is(b,G)){var g={};for(var h=0,i=b.length;h<i;h++)g[b[h]]=this.attr(b[h]);return g}if(c!=null){var j={};j[b]=c}else b!=null&&a.is(b,"object")&&(j=b);for(var k in this.paper.customAttributes)if(this.paper.customAttributes[f](k)&&j[f](k)&&a.is(this.paper.customAttributes[k],"function")){var l=this.paper.customAttributes[k].apply(this,[][n](j[k]));this.attrs[k]=j[k];for(var m in l)l[f](m)&&(j[m]=l[m])}bK(this,j);return this};bN[e].toFront=function(){if(this.removed)return this;this.node.parentNode[l](this.node);var a=this.paper;a.top!=this&&bB(this,a);return this};bN[e].toBack=function(){if(this.removed)return this;if(this.node.parentNode.firstChild!=this.node){this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild);bC(this,this.paper);var a=this.paper}return this};bN[e].insertAfter=function(a){if(this.removed)return this;var b=a.node||a[a.length-1].node;b.nextSibling?b.parentNode.insertBefore(this.node,b.nextSibling):b.parentNode[l](this.node);bD(this,a,this.paper);return this};bN[e].insertBefore=function(a){if(this.removed)return this;var b=a.node||a[0].node;b.parentNode.insertBefore(this.node,b);bE(this,a,this.paper);return this};bN[e].blur=function(a){var b=this;if(+a!==0){var c=bG("filter"),d=bG("feGaussianBlur");b.attrs.blur=a;c.id=bh();bG(d,{stdDeviation:+a||1.5});c.appendChild(d);b.paper.defs.appendChild(c);b._blur=c;bG(b.node,{filter:"url(#"+c.id+")"})}else{if(b._blur){b._blur.parentNode.removeChild(b._blur);delete b._blur;delete b.attrs.blur}b.node.removeAttribute("filter")}};var bP=function(a,b,c,d){var e=bG("circle");a.canvas&&a.canvas[l](e);var f=new bN(e,a);f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"};f.type="circle";bG(e,f.attrs);return f},bQ=function(a,b,c,d,e,f){var g=bG("rect");a.canvas&&a.canvas[l](g);var h=new bN(g,a);h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:"none",stroke:"#000"};h.type="rect";bG(g,h.attrs);return h},bR=function(a,b,c,d,e){var f=bG("ellipse");a.canvas&&a.canvas[l](f);var g=new bN(f,a);g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"};g.type="ellipse";bG(f,g.attrs);return g},bS=function(a,b,c,d,e,f){var g=bG("image");bG(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"});g.setAttributeNS(a.xlink,"href",b);a.canvas&&a.canvas[l](g);var h=new bN(g,a);h.attrs={x:c,y:d,width:e,height:f,src:b};h.type="image";return h},bT=function(a,b,c,d){var e=bG("text");bG(e,{x:b,y:c,"text-anchor":"middle"});a.canvas&&a.canvas[l](e);var f=new bN(e,a);f.attrs={x:b,y:c,"text-anchor":"middle",text:d,font:W.font,stroke:"none",fill:"#000"};f.type="text";bK(f,f.attrs);return f},bU=function(a,b){this.width=a||this.width;this.height=b||this.height;this.canvas[R]("width",this.width);this.canvas[R]("height",this.height);return this},bV=function(){var b=by[m](0,arguments),c=b&&b.container,d=b.x,e=b.y,f=b.width,h=b.height;if(!c)throw new Error("SVG container not found.");var i=bG("svg");d=d||0;e=e||0;f=f||512;h=h||342;bG(i,{xmlns:"http://www.w3.org/2000/svg",version:1.1,width:f,height:h});if(c==1){i.style.cssText="position:absolute;left:"+d+"px;top:"+e+"px";g.body[l](i)}else c.firstChild?c.insertBefore(i,c.firstChild):c[l](i);c=new j;c.width=f;c.height=h;c.canvas=i;bz.call(c,c,a.fn);c.clear();return c};k.clear=function(){var a=this.canvas;while(a.firstChild)a.removeChild(a.firstChild);this.bottom=this.top=null;(this.desc=bG("desc"))[l](g.createTextNode("Created with Raphaël"));a[l](this.desc);a[l](this.defs=bG("defs"))};k.remove=function(){this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=bF(a)}}if(a.vml){var bW={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},bX=/([clmz]),?([^clmz]*)/gi,bY=/ progid:\S+Blur\([^\)]+\)/g,bZ=/-?[^,\s-]+/g,b$=1000+q+1000,b_=10,ca={path:1,rect:1},cb=function(a){var b=/[ahqstv]/ig,c=bq;r(a).match(b)&&(c=bw);b=/[clmz]/g;if(c==bq&&!r(a).match(b)){var d=r(a)[Y](bX,function(a,b,c){var d=[],e=x.call(b)=="m",f=bW[b];c[Y](bZ,function(a){if(e&&d[w]==2){f+=d+bW[b=="m"?"l":"L"];d=[]}d[L](Q(a*b_))});return f+d});return d}var e=c(a),f,g;d=[];for(var h=0,i=e[w];h<i;h++){f=e[h];g=x.call(e[h][0]);g=="z"&&(g="x");for(var j=1,k=f[w];j<k;j++)g+=Q(f[j]*b_)+(j!=k-1?",":p);d[L](g)}return d[v](q)};a[H]=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};bH=function(a,b){var c=cd("group");c.style.cssText="position:absolute;left:0;top:0;width:"+b.width+"px;height:"+b.height+"px";c.coordsize=b.coordsize;c.coordorigin=b.coordorigin;var d=cd("shape"),e=d.style;e.width=b.width+"px";e.height=b.height+"px";d.coordsize=b$;d.coordorigin=b.coordorigin;c[l](d);var f=new bN(d,c,b),g={fill:"none",stroke:"#000"};a&&(g.path=a);f.type="path";f.path=[];f.Path=p;bK(f,g);b.canvas[l](c);return f};bK=function(c,d){c.attrs=c.attrs||{};var e=c.node,h=c.attrs,i=e.style,j,k=(d.x!=h.x||d.y!=h.y||d.width!=h.width||d.height!=h.height||d.r!=h.r)&&c.type=="rect",m=c;for(var n in d)d[f](n)&&(h[n]=d[n]);if(k){h.path=cc(h.x,h.y,h.width,h.height,h.r);c.X=h.x;c.Y=h.y;c.W=h.width;c.H=h.height}d.href&&(e.href=d.href);d.title&&(e.title=d.title);d.target&&(e.target=d.target);d.cursor&&(i.cursor=d.cursor);"blur"in d&&c.blur(d.blur);if(d.path&&c.type=="path"||k)e.path=cb(h.path);d.rotation!=null&&c.rotate(d.rotation,true);if(d.translation){j=r(d.translation)[s](b);cz.call(c,j[0],j[1]);if(c._.rt.cx!=null){c._.rt.cx+=+j[0];c._.rt.cy+=+j[1];c.setBox(c.attrs,j[0],j[1])}}if(d.scale){j=r(d.scale)[s](b);c.scale(+j[0]||1,+j[1]||+j[0]||1,+j[2]||null,+j[3]||null)}if("clip-rect"in d){var o=r(d["clip-rect"])[s](b);if(o[w]==4){o[2]=+o[2]+ +o[0];o[3]=+o[3]+ +o[1];var q=e.clipRect||g.createElement("div"),t=q.style,u=e.parentNode;t.clip=a.format("rect({1}px {2}px {3}px {0}px)",o);if(!e.clipRect){t.position="absolute";t.top=0;t.left=0;t.width=c.paper.width+"px";t.height=c.paper.height+"px";u.parentNode.insertBefore(q,u);q[l](u);e.clipRect=q}}d["clip-rect"]||e.clipRect&&(e.clipRect.style.clip=p)}c.type=="image"&&d.src&&(e.src=d.src);if(c.type=="image"&&d.opacity){e.filterOpacity=U+".Alpha(opacity="+d.opacity*100+")";i.filter=(e.filterMatrix||p)+(e.filterOpacity||p)}d.font&&(i.font=d.font);d["font-family"]&&(i.fontFamily="\""+d["font-family"][s](",")[0][Y](/^['"]+|['"]+$/g,p)+"\"");d["font-size"]&&(i.fontSize=d["font-size"]);d["font-weight"]&&(i.fontWeight=d["font-weight"]);d["font-style"]&&(i.fontStyle=d["font-style"]);if(d.opacity!=null||d["stroke-width"]!=null||d.fill!=null||d.stroke!=null||d["stroke-width"]!=null||d["stroke-opacity"]!=null||d["fill-opacity"]!=null||d["stroke-dasharray"]!=null||d["stroke-miterlimit"]!=null||d["stroke-linejoin"]!=null||d["stroke-linecap"]!=null){e=c.shape||e;var v=e.getElementsByTagName(I)&&e.getElementsByTagName(I)[0],x=false;!v&&(x=v=cd(I));if("fill-opacity"in d||"opacity"in d){var y=((+h["fill-opacity"]+1||2)-1)*((+h.opacity+1||2)-1)*((+a.getRGB(d.fill).o+1||2)-1);y=A(z(y,0),1);v.opacity=y}d.fill&&(v.on=true);if(v.on==null||d.fill=="none")v.on=false;if(v.on&&d.fill){var B=d.fill.match(M);if(B){v.src=B[1];v.type="tile"}else{v.color=a.getRGB(d.fill).hex;v.src=p;v.type="solid";if(a.getRGB(d.fill).error&&(m.type in{circle:1,ellipse:1}||r(d.fill).charAt()!="r")&&bI(m,d.fill)){h.fill="none";h.gradient=d.fill}}}x&&e[l](v);var C=e.getElementsByTagName("stroke")&&e.getElementsByTagName("stroke")[0],D=false;!C&&(D=C=cd("stroke"));if(d.stroke&&d.stroke!="none"||d["stroke-width"]||d["stroke-opacity"]!=null||d["stroke-dasharray"]||d["stroke-miterlimit"]||d["stroke-linejoin"]||d["stroke-linecap"])C.on=true;(d.stroke=="none"||C.on==null||d.stroke==0||d["stroke-width"]==0)&&(C.on=false);var E=a.getRGB(d.stroke);C.on&&d.stroke&&(C.color=E.hex);y=((+h["stroke-opacity"]+1||2)-1)*((+h.opacity+1||2)-1)*((+E.o+1||2)-1);var F=(S(d["stroke-width"])||1)*0.75;y=A(z(y,0),1);d["stroke-width"]==null&&(F=h["stroke-width"]);d["stroke-width"]&&(C.weight=F);F&&F<1&&(y*=F)&&(C.weight=1);C.opacity=y;d["stroke-linejoin"]&&(C.joinstyle=d["stroke-linejoin"]||"miter");C.miterlimit=d["stroke-miterlimit"]||8;d["stroke-linecap"]&&(C.endcap=d["stroke-linecap"]=="butt"?"flat":d["stroke-linecap"]=="square"?"square":"round");if(d["stroke-dasharray"]){var G={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};C.dashstyle=G[f](d["stroke-dasharray"])?G[d["stroke-dasharray"]]:p}D&&e[l](C)}if(m.type=="text"){i=m.paper.span.style;h.font&&(i.font=h.font);h["font-family"]&&(i.fontFamily=h["font-family"]);h["font-size"]&&(i.fontSize=h["font-size"]);h["font-weight"]&&(i.fontWeight=h["font-weight"]);h["font-style"]&&(i.fontStyle=h["font-style"]);m.node.string&&(m.paper.span.innerHTML=r(m.node.string)[Y](/</g,"&#60;")[Y](/&/g,"&#38;")[Y](/\n/g,"<br>"));m.W=h.w=m.paper.span.offsetWidth;m.H=h.h=m.paper.span.offsetHeight;m.X=h.x;m.Y=h.y+Q(m.H/2);switch(h["text-anchor"]){case"start":m.node.style["v-text-align"]="left";m.bbx=Q(m.W/2);break;case"end":m.node.style["v-text-align"]="right";m.bbx=-Q(m.W/2);break;default:m.node.style["v-text-align"]="center";break}}};bI=function(a,b){a.attrs=a.attrs||{};var c=a.attrs,d,e="linear",f=".5 .5";a.attrs.gradient=b;b=r(b)[Y](bd,function(a,b,c){e="radial";if(b&&c){b=S(b);c=S(c);C(b-0.5,2)+C(c-0.5,2)>0.25&&(c=y.sqrt(0.25-C(b-0.5,2))*((c>0.5)*2-1)+0.5);f=b+q+c}return p});b=b[s](/\s*\-\s*/);if(e=="linear"){var g=b.shift();g=-S(g);if(isNaN(g))return null}var h=bx(b);if(!h)return null;a=a.shape||a.node;d=a.getElementsByTagName(I)[0]||cd(I);!d.parentNode&&a.appendChild(d);if(h[w]){d.on=true;d.method="none";d.color=h[0].color;d.color2=h[h[w]-1].color;var i=[];for(var j=0,k=h[w];j<k;j++)h[j].offset&&i[L](h[j].offset+q+h[j].color);d.colors&&(d.colors.value=i[w]?i[v]():"0% "+d.color);if(e=="radial"){d.type="gradientradial";d.focus="100%";d.focussize=f;d.focusposition=f}else{d.type="gradient";d.angle=(270-g)%360}}return 1};bN=function(b,c,d){var e=0,f=0,g=0,h=1;this[0]=b;this.id=a._oid++;this.node=b;b.raphael=this;this.X=0;this.Y=0;this.attrs={};this.Group=c;this.paper=d;this._={tx:0,ty:0,rt:{deg:0},sx:1,sy:1};!d.bottom&&(d.bottom=this);this.prev=d.top;d.top&&(d.top.next=this);d.top=this;this.next=null};bO=bN[e];bO.rotate=function(a,c,d){if(this.removed)return this;if(a==null){if(this._.rt.cx)return[this._.rt.deg,this._.rt.cx,this._.rt.cy][v](q);return this._.rt.deg}a=r(a)[s](b);if(a[w]-1){c=S(a[1]);d=S(a[2])}a=S(a[0]);c!=null?this._.rt.deg=a:this._.rt.deg+=a;d==null&&(c=null);this._.rt.cx=c;this._.rt.cy=d;this.setBox(this.attrs,c,d);this.Group.style.rotation=this._.rt.deg;return this};bO.setBox=function(a,b,c){if(this.removed)return this;var d=this.Group.style,e=this.shape&&this.shape.style||this.node.style;a=a||{};for(var g in a)a[f](g)&&(this.attrs[g]=a[g]);b=b||this._.rt.cx;c=c||this._.rt.cy;var h=this.attrs,i,j,k,l;switch(this.type){case"circle":i=h.cx-h.r;j=h.cy-h.r;k=l=h.r*2;break;case"ellipse":i=h.cx-h.rx;j=h.cy-h.ry;k=h.rx*2;l=h.ry*2;break;case"image":i=+h.x;j=+h.y;k=h.width||0;l=h.height||0;break;case"text":this.textpath.v=["m",Q(h.x),", ",Q(h.y-2),"l",Q(h.x)+1,", ",Q(h.y-2)][v](p);i=h.x-Q(this.W/2);j=h.y-this.H/2;k=this.W;l=this.H;break;case"rect":case"path":if(this.attrs.path){var m=bn(this.attrs.path);i=m.x;j=m.y;k=m.width;l=m.height}else{i=0;j=0;k=this.paper.width;l=this.paper.height}break;default:i=0;j=0;k=this.paper.width;l=this.paper.height;break}b=b==null?i+k/2:b;c=c==null?j+l/2:c;var n=b-this.paper.width/2,o=c-this.paper.height/2,q;d.left!=(q=n+"px")&&(d.left=q);d.top!=(q=o+"px")&&(d.top=q);this.X=ca[f](this.type)?-n:i;this.Y=ca[f](this.type)?-o:j;this.W=k;this.H=l;if(ca[f](this.type)){e.left!=(q=-n*b_+"px")&&(e.left=q);e.top!=(q=-o*b_+"px")&&(e.top=q)}else if(this.type=="text"){e.left!=(q=-n+"px")&&(e.left=q);e.top!=(q=-o+"px")&&(e.top=q)}else{d.width!=(q=this.paper.width+"px")&&(d.width=q);d.height!=(q=this.paper.height+"px")&&(d.height=q);e.left!=(q=i-n+"px")&&(e.left=q);e.top!=(q=j-o+"px")&&(e.top=q);e.width!=(q=k+"px")&&(e.width=q);e.height!=(q=l+"px")&&(e.height=q)}};bO.hide=function(){!this.removed&&(this.Group.style.display="none");return this};bO.show=function(){!this.removed&&(this.Group.style.display="block");return this};bO.getBBox=function(){if(this.removed)return this;if(ca[f](this.type))return bn(this.attrs.path);return{x:this.X+(this.bbx||0),y:this.Y,width:this.W,height:this.H}};bO.remove=function(){if(this.removed)return;bA(this,this.paper);this.node.parentNode.removeChild(this.node);this.Group.parentNode.removeChild(this.Group);this.shape&&this.shape.parentNode.removeChild(this.shape);for(var a in this)delete this[a];this.removed=true};bO.attr=function(b,c){if(this.removed)return this;if(b==null){var d={};for(var e in this.attrs)this.attrs[f](e)&&(d[e]=this.attrs[e]);this._.rt.deg&&(d.rotation=this.rotate());(this._.sx!=1||this._.sy!=1)&&(d.scale=this.scale());d.gradient&&d.fill=="none"&&(d.fill=d.gradient)&&delete d.gradient;return d}if(c==null&&a.is(b,"string")){if(b=="translation")return cz.call(this);if(b=="rotation")return this.rotate();if(b=="scale")return this.scale();if(b==I&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;return this.attrs[b]}if(this.attrs&&c==null&&a.is(b,G)){var g,h={};for(e=0,g=b[w];e<g;e++)h[b[e]]=this.attr(b[e]);return h}var i;if(c!=null){i={};i[b]=c}c==null&&a.is(b,"object")&&(i=b);if(i){for(var j in this.paper.customAttributes)if(this.paper.customAttributes[f](j)&&i[f](j)&&a.is(this.paper.customAttributes[j],"function")){var k=this.paper.customAttributes[j].apply(this,[][n](i[j]));this.attrs[j]=i[j];for(var l in k)k[f](l)&&(i[l]=k[l])}i.text&&this.type=="text"&&(this.node.string=i.text);bK(this,i);i.gradient&&(({circle:1,ellipse:1})[f](this.type)||r(i.gradient).charAt()!="r")&&bI(this,i.gradient);(!ca[f](this.type)||this._.rt.deg)&&this.setBox(this.attrs)}return this};bO.toFront=function(){!this.removed&&this.Group.parentNode[l](this.Group);this.paper.top!=this&&bB(this,this.paper);return this};bO.toBack=function(){if(this.removed)return this;if(this.Group.parentNode.firstChild!=this.Group){this.Group.parentNode.insertBefore(this.Group,this.Group.parentNode.firstChild);bC(this,this.paper)}return this};bO.insertAfter=function(a){if(this.removed)return this;a.constructor==cC&&(a=a[a.length-1]);a.Group.nextSibling?a.Group.parentNode.insertBefore(this.Group,a.Group.nextSibling):a.Group.parentNode[l](this.Group);bD(this,a,this.paper);return this};bO.insertBefore=function(a){if(this.removed)return this;a.constructor==cC&&(a=a[0]);a.Group.parentNode.insertBefore(this.Group,a.Group);bE(this,a,this.paper);return this};bO.blur=function(b){var c=this.node.runtimeStyle,d=c.filter;d=d.replace(bY,p);if(+b!==0){this.attrs.blur=b;c.filter=d+q+U+".Blur(pixelradius="+(+b||1.5)+")";c.margin=a.format("-{0}px 0 0 -{0}px",Q(+b||1.5))}else{c.filter=d;c.margin=0;delete this.attrs.blur}};bP=function(a,b,c,d){var e=cd("group"),f=cd("oval"),g=f.style;e.style.cssText="position:absolute;left:0;top:0;width:"+a.width+"px;height:"+a.height+"px";e.coordsize=b$;e.coordorigin=a.coordorigin;e[l](f);var h=new bN(f,e,a);h.type="circle";bK(h,{stroke:"#000",fill:"none"});h.attrs.cx=b;h.attrs.cy=c;h.attrs.r=d;h.setBox({x:b-d,y:c-d,width:d*2,height:d*2});a.canvas[l](e);return h};function cc(b,c,d,e,f){return f?a.format("M{0},{1}l{2},0a{3},{3},0,0,1,{3},{3}l0,{5}a{3},{3},0,0,1,{4},{3}l{6},0a{3},{3},0,0,1,{4},{4}l0,{7}a{3},{3},0,0,1,{3},{4}z",b+f,c,d-f*2,f,-f,e-f*2,f*2-d,f*2-e):a.format("M{0},{1}l{2},0,0,{3},{4},0z",b,c,d,e,-d)}bQ=function(a,b,c,d,e,f){var g=cc(b,c,d,e,f),h=a.path(g),i=h.attrs;h.X=i.x=b;h.Y=i.y=c;h.W=i.width=d;h.H=i.height=e;i.r=f;i.path=g;h.type="rect";return h};bR=function(a,b,c,d,e){var f=cd("group"),g=cd("oval"),h=g.style;f.style.cssText="position:absolute;left:0;top:0;width:"+a.width+"px;height:"+a.height+"px";f.coordsize=b$;f.coordorigin=a.coordorigin;f[l](g);var i=new bN(g,f,a);i.type="ellipse";bK(i,{stroke:"#000"});i.attrs.cx=b;i.attrs.cy=c;i.attrs.rx=d;i.attrs.ry=e;i.setBox({x:b-d,y:c-e,width:d*2,height:e*2});a.canvas[l](f);return i};bS=function(a,b,c,d,e,f){var g=cd("group"),h=cd("image");g.style.cssText="position:absolute;left:0;top:0;width:"+a.width+"px;height:"+a.height+"px";g.coordsize=b$;g.coordorigin=a.coordorigin;h.src=b;g[l](h);var i=new bN(h,g,a);i.type="image";i.attrs.src=b;i.attrs.x=c;i.attrs.y=d;i.attrs.w=e;i.attrs.h=f;i.setBox({x:c,y:d,width:e,height:f});a.canvas[l](g);return i};bT=function(b,c,d,e){var f=cd("group"),g=cd("shape"),h=g.style,i=cd("path"),j=i.style,k=cd("textpath");f.style.cssText="position:absolute;left:0;top:0;width:"+b.width+"px;height:"+b.height+"px";f.coordsize=b$;f.coordorigin=b.coordorigin;i.v=a.format("m{0},{1}l{2},{1}",Q(c*10),Q(d*10),Q(c*10)+1);i.textpathok=true;h.width=b.width;h.height=b.height;k.string=r(e);k.on=true;g[l](k);g[l](i);f[l](g);var m=new bN(k,f,b);m.shape=g;m.textpath=i;m.type="text";m.attrs.text=e;m.attrs.x=c;m.attrs.y=d;m.attrs.w=1;m.attrs.h=1;bK(m,{font:W.font,stroke:"none",fill:"#000"});m.setBox();b.canvas[l](f);return m};bU=function(a,b){var c=this.canvas.style;a==+a&&(a+="px");b==+b&&(b+="px");c.width=a;c.height=b;c.clip="rect(0 "+a+" "+b+" 0)";return this};var cd;g.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!g.namespaces.rvml&&g.namespaces.add("rvml","urn:schemas-microsoft-com:vml");cd=function(a){return g.createElement("<rvml:"+a+" class=\"rvml\">")}}catch(a){cd=function(a){return g.createElement("<"+a+" xmlns=\"urn:schemas-microsoft.com:vml\" class=\"rvml\">")}}bV=function(){var b=by[m](0,arguments),c=b.container,d=b.height,e,f=b.width,h=b.x,i=b.y;if(!c)throw new Error("VML container not found.");var k=new j,n=k.canvas=g.createElement("div"),o=n.style;h=h||0;i=i||0;f=f||512;d=d||342;f==+f&&(f+="px");d==+d&&(d+="px");k.width=1000;k.height=1000;k.coordsize=b_*1000+q+b_*1000;k.coordorigin="0 0";k.span=g.createElement("span");k.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";n[l](k.span);o.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",f,d);if(c==1){g.body[l](n);o.left=h+"px";o.top=i+"px";o.position="absolute"}else c.firstChild?c.insertBefore(n,c.firstChild):c[l](n);bz.call(k,k,a.fn);return k};k.clear=function(){this.canvas.innerHTML=p;this.span=g.createElement("span");this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";this.canvas[l](this.span);this.bottom=this.top=null};k.remove=function(){this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=bF(a);return true}}var ce=navigator.userAgent.match(/Version\\x2f(.*?)\s/);navigator.vendor=="Apple Computer, Inc."&&(ce&&ce[1]<4||navigator.platform.slice(0,2)=="iP")?k.safari=function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});h.setTimeout(function(){a.remove()})}:k.safari=function(){};var cf=function(){this.returnValue=false},cg=function(){return this.originalEvent.preventDefault()},ch=function(){this.cancelBubble=true},ci=function(){return this.originalEvent.stopPropagation()},cj=(function(){{if(g.addEventListener)return function(a,b,c,d){var e=o&&u[b]?u[b]:b,g=function(e){if(o&&u[f](b))for(var g=0,h=e.targetTouches&&e.targetTouches.length;g<h;g++){if(e.targetTouches[g].target==a){var i=e;e=e.targetTouches[g];e.originalEvent=i;e.preventDefault=cg;e.stopPropagation=ci;break}}return c.call(d,e)};a.addEventListener(e,g,false);return function(){a.removeEventListener(e,g,false);return true}};if(g.attachEvent)return function(a,b,c,d){var e=function(a){a=a||h.event;a.preventDefault=a.preventDefault||cf;a.stopPropagation=a.stopPropagation||ch;return c.call(d,a)};a.attachEvent("on"+b,e);var f=function(){a.detachEvent("on"+b,e);return true};return f}}})(),ck=[],cl=function(a){var b=a.clientX,c=a.clientY,d=g.documentElement.scrollTop||g.body.scrollTop,e=g.documentElement.scrollLeft||g.body.scrollLeft,f,h=ck.length;while(h--){f=ck[h];if(o){var i=a.touches.length,j;while(i--){j=a.touches[i];if(j.identifier==f.el._drag.id){b=j.clientX;c=j.clientY;(a.originalEvent?a.originalEvent:a).preventDefault();break}}}else a.preventDefault();b+=e;c+=d;f.move&&f.move.call(f.move_scope||f.el,b-f.el._drag.x,c-f.el._drag.y,b,c,a)}},cm=function(b){a.unmousemove(cl).unmouseup(cm);var c=ck.length,d;while(c--){d=ck[c];d.el._drag={};d.end&&d.end.call(d.end_scope||d.start_scope||d.move_scope||d.el,b)}ck=[]};for(var cn=t[w];cn--;)(function(b){a[b]=bN[e][b]=function(c,d){if(a.is(c,"function")){this.events=this.events||[];this.events.push({name:b,f:c,unbind:cj(this.shape||this.node||g,b,c,d||this)})}return this};a["un"+b]=bN[e]["un"+b]=function(a){var c=this.events,d=c[w];while(d--)if(c[d].name==b&&c[d].f==a){c[d].unbind();c.splice(d,1);!c.length&&delete this.events;return this}return this}})(t[cn]);bO.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)};bO.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};bO.drag=function(b,c,d,e,f,h){this._drag={};this.mousedown(function(i){(i.originalEvent||i).preventDefault();var j=g.documentElement.scrollTop||g.body.scrollTop,k=g.documentElement.scrollLeft||g.body.scrollLeft;this._drag.x=i.clientX+k;this._drag.y=i.clientY+j;this._drag.id=i.identifier;c&&c.call(f||e||this,i.clientX+k,i.clientY+j,i);!ck.length&&a.mousemove(cl).mouseup(cm);ck.push({el:this,move:b,end:d,move_scope:e,start_scope:f,end_scope:h})});return this};bO.undrag=function(b,c,d){var e=ck.length;while(e--)ck[e].el==this&&(ck[e].move==b&&ck[e].end==d)&&ck.splice(e++,1);!ck.length&&a.unmousemove(cl).unmouseup(cm)};k.circle=function(a,b,c){return bP(this,a||0,b||0,c||0)};k.rect=function(a,b,c,d,e){return bQ(this,a||0,b||0,c||0,d||0,e||0)};k.ellipse=function(a,b,c,d){return bR(this,a||0,b||0,c||0,d||0)};k.path=function(b){b&&!a.is(b,F)&&!a.is(b[0],G)&&(b+=p);return bH(a.format[m](a,arguments),this)};k.image=function(a,b,c,d,e){return bS(this,a||"about:blank",b||0,c||0,d||0,e||0)};k.text=function(a,b,c){return bT(this,a||0,b||0,r(c))};k.set=function(a){arguments[w]>1&&(a=Array[e].splice.call(arguments,0,arguments[w]));return new cC(a)};k.setSize=bU;k.top=k.bottom=null;k.raphael=a;function co(){return this.x+q+this.y}bO.resetScale=function(){if(this.removed)return this;this._.sx=1;this._.sy=1;this.attrs.scale="1 1"};bO.scale=function(a,b,c,d){if(this.removed)return this;if(a==null&&b==null)return{x:this._.sx,y:this._.sy,toString:co};b=b||a;!(+b)&&(b=a);var e,f,g,h,i=this.attrs;if(a!=0){var j=this.getBBox(),k=j.x+j.width/2,l=j.y+j.height/2,m=B(a/this._.sx),o=B(b/this._.sy);c=+c||c==0?c:k;d=+d||d==0?d:l;var r=this._.sx>0,s=this._.sy>0,t=~(~(a/B(a))),u=~(~(b/B(b))),x=m*t,y=o*u,z=this.node.style,A=c+B(k-c)*x*(k>c==r?1:-1),C=d+B(l-d)*y*(l>d==s?1:-1),D=a*t>b*u?o:m;switch(this.type){case"rect":case"image":var E=i.width*m,F=i.height*o;this.attr({height:F,r:i.r*D,width:E,x:A-E/2,y:C-F/2});break;case"circle":case"ellipse":this.attr({rx:i.rx*m,ry:i.ry*o,r:i.r*D,cx:A,cy:C});break;case"text":this.attr({x:A,y:C});break;case"path":var G=bp(i.path),H=true,I=r?x:m,J=s?y:o;for(var K=0,L=G[w];K<L;K++){var M=G[K],N=V.call(M[0]);{if(N=="M"&&H)continue;H=false}if(N=="A"){M[G[K][w]-2]*=I;M[G[K][w]-1]*=J;M[1]*=m;M[2]*=o;M[5]=+(t+u?!(!(+M[5])):!(+M[5]))}else if(N=="H")for(var O=1,P=M[w];O<P;O++)M[O]*=I;else if(N=="V")for(O=1,P=M[w];O<P;O++)M[O]*=J;else for(O=1,P=M[w];O<P;O++)M[O]*=O%2?I:J}var Q=bn(G);e=A-Q.x-Q.width/2;f=C-Q.y-Q.height/2;G[0][1]+=e;G[0][2]+=f;this.attr({path:G});break}if(this.type in{text:1,image:1}&&(t!=1||u!=1))if(this.transformations){this.transformations[2]="scale("[n](t,",",u,")");this.node[R]("transform",this.transformations[v](q));e=t==-1?-i.x-(E||0):i.x;f=u==-1?-i.y-(F||0):i.y;this.attr({x:e,y:f});i.fx=t-1;i.fy=u-1}else{this.node.filterMatrix=U+".Matrix(M11="[n](t,", M12=0, M21=0, M22=",u,", Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')");z.filter=(this.node.filterMatrix||p)+(this.node.filterOpacity||p)}else if(this.transformations){this.transformations[2]=p;this.node[R]("transform",this.transformations[v](q));i.fx=0;i.fy=0}else{this.node.filterMatrix=p;z.filter=(this.node.filterMatrix||p)+(this.node.filterOpacity||p)}i.scale=[a,b,c,d][v](q);this._.sx=a;this._.sy=b}return this};bO.clone=function(){if(this.removed)return null;var a=this.attr();delete a.scale;delete a.translation;return this.paper[this.type]().attr(a)};var cp={},cq=function(b,c,d,e,f,g,h,i,j){var k=0,l=100,m=[b,c,d,e,f,g,h,i].join(),n=cp[m],o,p;!n&&(cp[m]=n={data:[]});n.timer&&clearTimeout(n.timer);n.timer=setTimeout(function(){delete cp[m]},2000);if(j!=null){var q=cq(b,c,d,e,f,g,h,i);l=~(~q)*10}for(var r=0;r<l+1;r++){if(n.data[j]>r)p=n.data[r*l];else{p=a.findDotsAtSegment(b,c,d,e,f,g,h,i,r/l);n.data[r]=p}r&&(k+=C(C(o.x-p.x,2)+C(o.y-p.y,2),0.5));if(j!=null&&k>=j)return p;o=p}if(j==null)return k},cr=function(b,c){return function(d,e,f){d=bw(d);var g,h,i,j,k="",l={},m,n=0;for(var o=0,p=d.length;o<p;o++){i=d[o];if(i[0]=="M"){g=+i[1];h=+i[2]}else{j=cq(g,h,i[1],i[2],i[3],i[4],i[5],i[6]);if(n+j>e){if(c&&!l.start){m=cq(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);k+=["C",m.start.x,m.start.y,m.m.x,m.m.y,m.x,m.y];if(f)return k;l.start=k;k=["M",m.x,m.y+"C",m.n.x,m.n.y,m.end.x,m.end.y,i[5],i[6]][v]();n+=j;g=+i[5];h=+i[6];continue}if(!b&&!c){m=cq(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);return{x:m.x,y:m.y,alpha:m.alpha}}}n+=j;g=+i[5];h=+i[6]}k+=i}l.end=k;m=b?n:c?l:a.findDotsAtSegment(g,h,i[1],i[2],i[3],i[4],i[5],i[6],1);m.alpha&&(m={x:m.x,y:m.y,alpha:m.alpha});return m}},cs=cr(1),ct=cr(),cu=cr(0,1);bO.getTotalLength=function(){if(this.type!="path")return;if(this.node.getTotalLength)return this.node.getTotalLength();return cs(this.attrs.path)};bO.getPointAtLength=function(a){if(this.type!="path")return;return ct(this.attrs.path,a)};bO.getSubpath=function(a,b){if(this.type!="path")return;if(B(this.getTotalLength()-b)<"1e-6")return cu(this.attrs.path,a).end;var c=cu(this.attrs.path,b,1);return a?cu(c,a).end:c};a.easing_formulas={linear:function(a){return a},"<":function(a){return C(a,3)},">":function(a){return C(a-1,3)+1},"<>":function(a){a=a*2;if(a<1)return C(a,3)/2;a-=2;return(C(a,3)+2)/2},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a=a-1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==0||a==1)return a;var b=0.3,c=b/4;return C(2,-10*a)*y.sin((a-c)*(2*D)/b)+1},bounce:function(a){var b=7.5625,c=2.75,d;if(a<1/c)d=b*a*a;else if(a<2/c){a-=1.5/c;d=b*a*a+0.75}else if(a<2.5/c){a-=2.25/c;d=b*a*a+0.9375}else{a-=2.625/c;d=b*a*a+0.984375}return d}};var cv=[],cw=function(){var b=+(new Date);for(var c=0;c<cv[w];c++){var d=cv[c];if(d.stop||d.el.removed)continue;var e=b-d.start,g=d.ms,h=d.easing,i=d.from,j=d.diff,k=d.to,l=d.t,m=d.el,n={},o;if(e<g){var r=h(e/g);for(var s in i)if(i[f](s)){switch(X[s]){case"along":o=r*g*j[s];k.back&&(o=k.len-o);var t=ct(k[s],o);m.translate(j.sx-j.x||0,j.sy-j.y||0);j.x=t.x;j.y=t.y;m.translate(t.x-j.sx,t.y-j.sy);k.rot&&m.rotate(j.r+t.alpha,t.x,t.y);break;case E:o=+i[s]+r*g*j[s];break;case"colour":o="rgb("+[cy(Q(i[s].r+r*g*j[s].r)),cy(Q(i[s].g+r*g*j[s].g)),cy(Q(i[s].b+r*g*j[s].b))][v](",")+")";break;case"path":o=[];for(var u=0,x=i[s][w];u<x;u++){o[u]=[i[s][u][0]];for(var y=1,z=i[s][u][w];y<z;y++)o[u][y]=+i[s][u][y]+r*g*j[s][u][y];o[u]=o[u][v](q)}o=o[v](q);break;case"csv":switch(s){case"translation":var A=r*g*j[s][0]-l.x,B=r*g*j[s][1]-l.y;l.x+=A;l.y+=B;o=A+q+B;break;case"rotation":o=+i[s][0]+r*g*j[s][0];i[s][1]&&(o+=","+i[s][1]+","+i[s][2]);break;case"scale":o=[+i[s][0]+r*g*j[s][0],+i[s][1]+r*g*j[s][1],2 in k[s]?k[s][2]:p,3 in k[s]?k[s][3]:p][v](q);break;case"clip-rect":o=[];u=4;while(u--)o[u]=+i[s][u]+r*g*j[s][u];break}break;default:var C=[].concat(i[s]);o=[];u=m.paper.customAttributes[s].length;while(u--)o[u]=+C[u]+r*g*j[s][u];break}n[s]=o}m.attr(n);m._run&&m._run.call(m)}else{if(k.along){t=ct(k.along,k.len*!k.back);m.translate(j.sx-(j.x||0)+t.x-j.sx,j.sy-(j.y||0)+t.y-j.sy);k.rot&&m.rotate(j.r+t.alpha,t.x,t.y)}(l.x||l.y)&&m.translate(-l.x,-l.y);k.scale&&(k.scale+=p);m.attr(k);cv.splice(c--,1)}}a.svg&&m&&m.paper&&m.paper.safari();cv[w]&&setTimeout(cw)},cx=function(b,c,d,e,f){var g=d-e;c.timeouts.push(setTimeout(function(){a.is(f,"function")&&f.call(c);c.animate(b,g,b.easing)},e))},cy=function(a){return z(A(a,255),0)},cz=function(a,b){if(a==null)return{x:this._.tx,y:this._.ty,toString:co};this._.tx+=+a;this._.ty+=+b;switch(this.type){case"circle":case"ellipse":this.attr({cx:+a+this.attrs.cx,cy:+b+this.attrs.cy});break;case"rect":case"image":case"text":this.attr({x:+a+this.attrs.x,y:+b+this.attrs.y});break;case"path":var c=bp(this.attrs.path);c[0][1]+=+a;c[0][2]+=+b;this.attr({path:c});break}return this};bO.animateWith=function(a,b,c,d,e){for(var f=0,g=cv.length;f<g;f++)cv[f].el.id==a.id&&(b.start=cv[f].start);return this.animate(b,c,d,e)};bO.animateAlong=cA();bO.animateAlongBack=cA(1);function cA(b){return function(c,d,e,f){var g={back:b};a.is(e,"function")?f=e:g.rot=e;c&&c.constructor==bN&&(c=c.attrs.path);c&&(g.along=c);return this.animate(g,d,f)}}function cB(a,b,c,d,e,f){var g=3*b,h=3*(d-b)-g,i=1-g-h,j=3*c,k=3*(e-c)-j,l=1-j-k;function m(a){return((i*a+h)*a+g)*a}function n(a,b){var c=o(a,b);return((l*c+k)*c+j)*c}function o(a,b){var c,d,e,f,j,k;for(e=a,k=0;k<8;k++){f=m(e)-a;if(B(f)<b)return e;j=(3*i*e+2*h)*e+g;if(B(j)<0.000001)break;e=e-f/j}c=0;d=1;e=a;if(e<c)return c;if(e>d)return d;while(c<d){f=m(e);if(B(f-a)<b)return e;a>f?c=e:d=e;e=(d-c)/2+c}return e}return n(a,1/(200*f))}bO.onAnimation=function(a){this._run=a||0;return this};bO.animate=function(c,d,e,g){var h=this;h.timeouts=h.timeouts||[];if(a.is(e,"function")||!e)g=e||null;if(h.removed){g&&g.call(h);return h}var i={},j={},k=false,l={};for(var m in c)if(c[f](m)){if(X[f](m)||h.paper.customAttributes[f](m)){k=true;i[m]=h.attr(m);i[m]==null&&(i[m]=W[m]);j[m]=c[m];switch(X[m]){case"along":var n=cs(c[m]),o=ct(c[m],n*!(!c.back)),p=h.getBBox();l[m]=n/d;l.tx=p.x;l.ty=p.y;l.sx=o.x;l.sy=o.y;j.rot=c.rot;j.back=c.back;j.len=n;c.rot&&(l.r=S(h.rotate())||0);break;case E:l[m]=(j[m]-i[m])/d;break;case"colour":i[m]=a.getRGB(i[m]);var q=a.getRGB(j[m]);l[m]={r:(q.r-i[m].r)/d,g:(q.g-i[m].g)/d,b:(q.b-i[m].b)/d};break;case"path":var t=bw(i[m],j[m]);i[m]=t[0];var u=t[1];l[m]=[];for(var v=0,x=i[m][w];v<x;v++){l[m][v]=[0];for(var y=1,z=i[m][v][w];y<z;y++)l[m][v][y]=(u[v][y]-i[m][v][y])/d}break;case"csv":var A=r(c[m])[s](b),B=r(i[m])[s](b);switch(m){case"translation":i[m]=[0,0];l[m]=[A[0]/d,A[1]/d];break;case"rotation":i[m]=B[1]==A[1]&&B[2]==A[2]?B:[0,A[1],A[2]];l[m]=[(A[0]-i[m][0])/d,0,0];break;case"scale":c[m]=A;i[m]=r(i[m])[s](b);l[m]=[(A[0]-i[m][0])/d,(A[1]-i[m][1])/d,0,0];break;case"clip-rect":i[m]=r(i[m])[s](b);l[m]=[];v=4;while(v--)l[m][v]=(A[v]-i[m][v])/d;break}j[m]=A;break;default:A=[].concat(c[m]);B=[].concat(i[m]);l[m]=[];v=h.paper.customAttributes[m][w];while(v--)l[m][v]=((A[v]||0)-(B[v]||0))/d;break}}}if(k){var G=a.easing_formulas[e];if(!G){G=r(e).match(P);if(G&&G[w]==5){var H=G;G=function(a){return cB(a,+H[1],+H[2],+H[3],+H[4],d)}}else G=function(a){return a}}cv.push({start:c.start||+(new Date),ms:d,easing:G,from:i,diff:l,to:j,el:h,t:{x:0,y:0}});a.is(g,"function")&&(h._ac=setTimeout(function(){g.call(h)},d));cv[w]==1&&setTimeout(cw)}else{var C=[],D;for(var F in c)if(c[f](F)&&Z.test(F)){m={value:c[F]};F=="from"&&(F=0);F=="to"&&(F=100);m.key=T(F,10);C.push(m)}C.sort(be);C[0].key&&C.unshift({key:0,value:h.attrs});for(v=0,x=C[w];v<x;v++)cx(C[v].value,h,d/100*C[v].key,d/100*(C[v-1]&&C[v-1].key||0),C[v-1]&&C[v-1].value.callback);D=C[C[w]-1].value.callback;D&&h.timeouts.push(setTimeout(function(){D.call(h)},d))}return this};bO.stop=function(){for(var a=0;a<cv.length;a++)cv[a].el.id==this.id&&cv.splice(a--,1);for(a=0,ii=this.timeouts&&this.timeouts.length;a<ii;a++)clearTimeout(this.timeouts[a]);this.timeouts=[];clearTimeout(this._ac);delete this._ac;return this};bO.translate=function(a,b){return this.attr({translation:a+" "+b})};bO[H]=function(){return"Raphaël’s object"};a.ae=cv;var cC=function(a){this.items=[];this[w]=0;this.type="set";if(a)for(var b=0,c=a[w];b<c;b++){if(a[b]&&(a[b].constructor==bN||a[b].constructor==cC)){this[this.items[w]]=this.items[this.items[w]]=a[b];this[w]++}}};cC[e][L]=function(){var a,b;for(var c=0,d=arguments[w];c<d;c++){a=arguments[c];if(a&&(a.constructor==bN||a.constructor==cC)){b=this.items[w];this[b]=this.items[b]=a;this[w]++}}return this};cC[e].pop=function(){delete this[this[w]--];return this.items.pop()};for(var cD in bO)bO[f](cD)&&(cC[e][cD]=(function(a){return function(){for(var b=0,c=this.items[w];b<c;b++)this.items[b][a][m](this.items[b],arguments);return this}})(cD));cC[e].attr=function(b,c){if(b&&a.is(b,G)&&a.is(b[0],"object"))for(var d=0,e=b[w];d<e;d++)this.items[d].attr(b[d]);else for(var f=0,g=this.items[w];f<g;f++)this.items[f].attr(b,c);return this};cC[e].animate=function(b,c,d,e){(a.is(d,"function")||!d)&&(e=d||null);var f=this.items[w],g=f,h,i=this,j;e&&(j=function(){!(--f)&&e.call(i)});d=a.is(d,F)?d:j;h=this.items[--g].animate(b,c,d,j);while(g--)this.items[g]&&!this.items[g].removed&&this.items[g].animateWith(h,b,c,d,j);return this};cC[e].insertAfter=function(a){var b=this.items[w];while(b--)this.items[b].insertAfter(a);return this};cC[e].getBBox=function(){var a=[],b=[],c=[],d=[];for(var e=this.items[w];e--;){var f=this.items[e].getBBox();a[L](f.x);b[L](f.y);c[L](f.x+f.width);d[L](f.y+f.height)}a=A[m](0,a);b=A[m](0,b);return{x:a,y:b,width:z[m](0,c)-a,height:z[m](0,d)-b}};cC[e].clone=function(a){a=new cC;for(var b=0,c=this.items[w];b<c;b++)a[L](this.items[b].clone());return a};a.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[f](d)&&(b.face[d]=a.face[d]);this.fonts[c]?this.fonts[c][L](b):this.fonts[c]=[b];if(!a.svg){b.face["units-per-em"]=T(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[f](e)){var g=a.glyphs[e];b.glyphs[e]={w:g.w,k:{},d:g.d&&"M"+g.d[Y](/[mlcxtrv]/g,function(a){return({l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"})[a]||"M"})+"z"};if(g.k)for(var h in g.k)g[f](h)&&(b.glyphs[e].k[h]=g.k[h])}}return a};k.getFont=function(b,c,d,e){e=e||"normal";d=d||"normal";c=+c||({normal:400,bold:700,lighter:300,bolder:800})[c]||400;if(!a.fonts)return;var g=a.fonts[b];if(!g){var h=new RegExp("(^|\\s)"+b[Y](/[^\w\d\s+!~.:_-]/g,p)+"(\\s|$)","i");for(var i in a.fonts)if(a.fonts[f](i)){if(h.test(i)){g=a.fonts[i];break}}}var j;if(g)for(var k=0,l=g[w];k<l;k++){j=g[k];if(j.face["font-weight"]==c&&(j.face["font-style"]==d||!j.face["font-style"])&&j.face["font-stretch"]==e)break}return j};k.print=function(c,d,e,f,g,h,i){h=h||"middle";i=z(A(i||0,1),-1);var j=this.set(),k=r(e)[s](p),l=0,m=p,n;a.is(f,e)&&(f=this.getFont(f));if(f){n=(g||16)/f.face["units-per-em"];var o=f.face.bbox.split(b),q=+o[0],t=+o[1]+(h=="baseline"?o[3]-o[1]+ +f.face.descent:(o[3]-o[1])/2);for(var u=0,v=k[w];u<v;u++){var x=u&&f.glyphs[k[u-1]]||{},y=f.glyphs[k[u]];l+=u?(x.w||f.w)+(x.k&&x.k[k[u]]||0)+f.w*i:0;y&&y.d&&j[L](this.path(y.d).attr({fill:"#000",stroke:"none",translation:[l,0]}))}j.scale(n,n,q,t).translate(c-q,d-t)}return j};a.format=function(b,c){var e=a.is(c,G)?[0][n](c):arguments;b&&a.is(b,F)&&e[w]-1&&(b=b[Y](d,function(a,b){return e[++b]==null?p:e[b]}));return b||p};a.ninja=function(){i.was?h.Raphael=i.is:delete Raphael;return a};a.el=bO;a.st=cC[e];i.was?h.Raphael=a:Raphael=a})()
\ No newline at end of file
diff --git a/plugins/scheduler2/static/js/angular/angular.min.js.map b/plugins/scheduler2/static/js/angular/angular.min.js.map
new file mode 100644 (file)
index 0000000..178bdf4
--- /dev/null
@@ -0,0 +1,8 @@
+{
+"version":3,
+"file":"angular.min.js",
+"lineCount":246,
+"mappings":"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",
+"sources":["angular.js"],
+"names":["window","document","undefined","minErr","isArrayLike","obj","isWindow","length","nodeType","NODE_TYPE_ELEMENT","isString","isArray","forEach","iterator","context","key","isFunction","hasOwnProperty","call","isPrimitive","sortedKeys","keys","push","sort","forEachSorted","i","reverseParams","iteratorFn","value","nextUid","uid","setHashKey","h","$$hashKey","extend","dst","ii","arguments","Object","j","jj","int","str","parseInt","inherit","parent","extra","prototype","noop","identity","$","valueFn","isUndefined","isDefined","isObject","isNumber","isDate","toString","isRegExp","isScope","$evalAsync","$watch","isBoolean","isElement","node","nodeName","prop","attr","find","makeMap","items","split","nodeName_","element","lowercase","arrayRemove","array","index","indexOf","splice","copy","source","destination","stackSource","stackDest","ngMinErr","result","Date","getTime","RegExp","match","lastIndex","emptyObject","create","getPrototypeOf","shallowCopy","src","charAt","equals","o1","o2","t1","t2","keySet","concat","array1","array2","slice","bind","self","fn","curryArgs","startIndex","apply","toJsonReplacer","val","toJson","pretty","JSON","stringify","fromJson","json","parse","startingTag","jqLite","clone","empty","e","elemHtml","append","html","NODE_TYPE_TEXT","replace","tryDecodeURIComponent","decodeURIComponent","parseKeyValue","keyValue","key_value","toKeyValue","parts","arrayValue","encodeUriQuery","join","encodeUriSegment","pctEncodeSpaces","encodeURIComponent","getNgAttribute","ngAttr","ngAttrPrefixes","angularInit","bootstrap","appElement","module","config","prefix","name","hasAttribute","getAttribute","candidate","querySelector","strictDi","modules","defaultConfig","doBootstrap","injector","tag","unshift","$provide","debugInfoEnabled","$compileProvider","createInjector","invoke","bootstrapApply","scope","compile","$apply","data","NG_ENABLE_DEBUG_INFO","NG_DEFER_BOOTSTRAP","test","angular","resumeBootstrap","angular.resumeBootstrap","extraModules","reloadWithDebugInfo","location","reload","getTestability","rootElement","get","snake_case","separator","SNAKE_CASE_REGEXP","letter","pos","toLowerCase","bindJQuery","originalCleanData","bindJQueryFired","jQuery","on","JQLitePrototype","isolateScope","controller","inheritedData","cleanData","jQuery.cleanData","elems","events","skipDestroyOnNextJQueryCleanData","elem","_data","$destroy","triggerHandler","JQLite","assertArg","arg","reason","assertArgFn","acceptArrayAnnotation","constructor","assertNotHasOwnProperty","getter","path","bindFnToScope","lastInstance","len","getBlockNodes","nodes","endNode","blockNodes","nextSibling","createMap","setupModuleLoader","ensure","factory","$injectorMinErr","$$minErr","requires","configFn","invokeLater","provider","method","insertMethod","queue","invokeQueue","moduleInstance","configBlocks","runBlocks","_invokeQueue","_configBlocks","_runBlocks","service","constant","animation","filter","directive","run","block","publishExternalAPI","version","uppercase","counter","csp","angularModule","$LocaleProvider","ngModule","$$sanitizeUri","$$SanitizeUriProvider","$CompileProvider","a","htmlAnchorDirective","input","inputDirective","textarea","form","formDirective","script","scriptDirective","select","selectDirective","style","styleDirective","option","optionDirective","ngBind","ngBindDirective","ngBindHtml","ngBindHtmlDirective","ngBindTemplate","ngBindTemplateDirective","ngClass","ngClassDirective","ngClassEven","ngClassEvenDirective","ngClassOdd","ngClassOddDirective","ngCloak","ngCloakDirective","ngController","ngControllerDirective","ngForm","ngFormDirective","ngHide","ngHideDirective","ngIf","ngIfDirective","ngInclude","ngIncludeDirective","ngInit","ngInitDirective","ngNonBindable","ngNonBindableDirective","ngPluralize","ngPluralizeDirective","ngRepeat","ngRepeatDirective","ngShow","ngShowDirective","ngStyle","ngStyleDirective","ngSwitch","ngSwitchDirective","ngSwitchWhen","ngSwitchWhenDirective","ngSwitchDefault","ngSwitchDefaultDirective","ngOptions","ngOptionsDirective","ngTransclude","ngTranscludeDirective","ngModel","ngModelDirective","ngList","ngListDirective","ngChange","ngChangeDirective","pattern","patternDirective","ngPattern","required","requiredDirective","ngRequired","minlength","minlengthDirective","ngMinlength","maxlength","maxlengthDirective","ngMaxlength","ngValue","ngValueDirective","ngModelOptions","ngModelOptionsDirective","ngIncludeFillContentDirective","ngAttributeAliasDirectives","ngEventDirectives","$anchorScroll","$AnchorScrollProvider","$animate","$AnimateProvider","$browser","$BrowserProvider","$cacheFactory","$CacheFactoryProvider","$controller","$ControllerProvider","$document","$DocumentProvider","$exceptionHandler","$ExceptionHandlerProvider","$filter","$FilterProvider","$interpolate","$InterpolateProvider","$interval","$IntervalProvider","$http","$HttpProvider","$httpBackend","$HttpBackendProvider","$location","$LocationProvider","$log","$LogProvider","$parse","$ParseProvider","$rootScope","$RootScopeProvider","$q","$QProvider","$$q","$$QProvider","$sce","$SceProvider","$sceDelegate","$SceDelegateProvider","$sniffer","$SnifferProvider","$templateCache","$TemplateCacheProvider","$templateRequest","$TemplateRequestProvider","$$testability","$$TestabilityProvider","$timeout","$TimeoutProvider","$window","$WindowProvider","$$rAF","$$RAFProvider","$$asyncCallback","$$AsyncCallbackProvider","camelCase","SPECIAL_CHARS_REGEXP","_","offset","toUpperCase","MOZ_HACK_REGEXP","jqLiteAcceptsData","NODE_TYPE_DOCUMENT","jqLiteBuildFragment","tmp","fragment","createDocumentFragment","HTML_REGEXP","appendChild","createElement","TAG_NAME_REGEXP","exec","wrap","wrapMap","_default","innerHTML","XHTML_TAG_REGEXP","lastChild","childNodes","firstChild","textContent","createTextNode","argIsString","trim","jqLiteMinErr","parsed","SINGLE_TAG_REGEXP","jqLiteAddNodes","jqLiteClone","cloneNode","jqLiteDealoc","onlyDescendants","jqLiteRemoveData","querySelectorAll","descendants","l","jqLiteOff","type","unsupported","expandoStore","jqLiteExpandoStore","handle","listenerFns","removeEventListener","expandoId","ng339","jqCache","createIfNecessary","jqId","jqLiteData","isSimpleSetter","isSimpleGetter","massGetter","jqLiteHasClass","selector","jqLiteRemoveClass","cssClasses","setAttribute","cssClass","jqLiteAddClass","existingClasses","root","elements","jqLiteController","jqLiteInheritedData","documentElement","names","parentNode","NODE_TYPE_DOCUMENT_FRAGMENT","host","jqLiteEmpty","removeChild","jqLiteRemove","keepData","jqLiteDocumentLoaded","action","win","readyState","setTimeout","getBooleanAttrName","booleanAttr","BOOLEAN_ATTR","BOOLEAN_ELEMENTS","getAliasedAttrName","ALIASED_ATTR","createEventHandler","eventHandler","event","isDefaultPrevented","event.isDefaultPrevented","defaultPrevented","eventFns","eventFnsLength","immediatePropagationStopped","originalStopImmediatePropagation","stopImmediatePropagation","event.stopImmediatePropagation","stopPropagation","isImmediatePropagationStopped","event.isImmediatePropagationStopped","hashKey","nextUidFn","objType","HashMap","isolatedUid","this.nextUid","put","anonFn","args","fnText","STRIP_COMMENTS","FN_ARGS","annotate","$inject","argDecl","FN_ARG_SPLIT","FN_ARG","all","underscore","last","modulesToLoad","supportObject","delegate","provider_","providerInjector","instantiate","$get","providerCache","providerSuffix","enforceReturnValue","enforcedReturnValue","instanceInjector","factoryFn","enforce","loadModules","moduleFn","runInvokeQueue","invokeArgs","loadedModules","message","stack","createInternalInjector","cache","getService","serviceName","INSTANTIATING","err","shift","locals","Type","Constructor","instance","returnedValue","has","$injector","instanceCache","decorator","decorFn","origProvider","orig$get","origProvider.$get","origInstance","$delegate","servicename","autoScrollingEnabled","disableAutoScrolling","this.disableAutoScrolling","getFirstAnchor","list","Array","some","scrollTo","scrollIntoView","scroll","yOffset","getComputedStyle","position","getBoundingClientRect","bottom","elemTop","top","scrollBy","hash","elm","getElementById","getElementsByName","autoScrollWatch","autoScrollWatchAction","newVal","oldVal","supported","Browser","completeOutstandingRequest","outstandingRequestCount","outstandingRequestCallbacks","pop","error","startPoller","interval","check","pollFns","pollFn","pollTimeout","cacheStateAndFireUrlChange","cacheState","fireUrlChange","cachedState","history","state","lastCachedState","lastBrowserUrl","url","lastHistoryState","urlChangeListeners","listener","safeDecodeURIComponent","rawDocument","clearTimeout","pendingDeferIds","isMock","$$completeOutstandingRequest","$$incOutstandingRequestCount","self.$$incOutstandingRequestCount","notifyWhenNoOutstandingRequests","self.notifyWhenNoOutstandingRequests","callback","addPollFn","self.addPollFn","href","baseElement","reloadLocation","self.url","sameState","sameBase","stripHash","self.state","urlChangeInit","onUrlChange","self.onUrlChange","$$checkUrlChange","baseHref","self.baseHref","lastCookies","lastCookieString","cookiePath","cookies","self.cookies","cookieLength","cookie","warn","cookieArray","substring","defer","self.defer","delay","timeoutId","cancel","self.defer.cancel","deferId","this.$get","cacheFactory","cacheId","options","refresh","entry","freshEnd","staleEnd","n","link","p","nextEntry","prevEntry","caches","size","stats","id","capacity","Number","MAX_VALUE","lruHash","lruEntry","remove","removeAll","destroy","info","cacheFactory.info","cacheFactory.get","$$sanitizeUriProvider","parseIsolateBindings","directiveName","LOCAL_REGEXP","bindings","definition","scopeName","$compileMinErr","attrName","mode","optional","hasDirectives","COMMENT_DIRECTIVE_REGEXP","CLASS_DIRECTIVE_REGEXP","ALL_OR_NOTHING_ATTRS","REQUIRE_PREFIX_REGEXP","EVENT_HANDLER_ATTR_REGEXP","this.directive","registerDirective","directiveFactory","Suffix","directives","priority","require","restrict","$$isolateBindings","aHrefSanitizationWhitelist","this.aHrefSanitizationWhitelist","regexp","imgSrcSanitizationWhitelist","this.imgSrcSanitizationWhitelist","this.debugInfoEnabled","enabled","safeAddClass","$element","className","addClass","$compileNodes","transcludeFn","maxPriority","ignoreDirective","previousCompileContext","nodeValue","compositeLinkFn","compileNodes","$$addScopeClass","namespace","publicLinkFn","cloneConnectFn","transcludeControllers","parentBoundTranscludeFn","futureParentElement","$linkNode","wrapTemplate","controllerName","$$addScopeInfo","nodeList","$rootElement","childLinkFn","childScope","childBoundTranscludeFn","stableNodeList","nodeLinkFnFound","linkFns","idx","nodeLinkFn","$new","transcludeOnThisElement","createBoundTranscludeFn","transclude","elementTranscludeOnThisElement","templateOnThisElement","attrs","linkFnFound","Attributes","collectDirectives","applyDirectivesToNode","$$element","terminal","previousBoundTranscludeFn","elementTransclusion","boundTranscludeFn","transcludedScope","cloneFn","controllers","containingScope","$$transcluded","attrsMap","$attr","addDirective","directiveNormalize","nName","isNgAttr","nAttrs","attributes","attrStartName","attrEndName","ngAttrName","NG_ATTR_BINDING","substr","directiveNName","multiElement","addAttrInterpolateDirective","addTextInterpolateDirective","NODE_TYPE_COMMENT","byPriority","groupScan","attrStart","attrEnd","depth","groupElementsLinkFnWrapper","linkFn","compileNode","templateAttrs","jqCollection","originalReplaceDirective","preLinkFns","postLinkFns","addLinkFns","pre","post","newIsolateScopeDirective","$$isolateScope","cloneAndAnnotateFn","getControllers","elementControllers","retrievalMethod","$searchElement","linkNode","controllersBoundTransclude","cloneAttachFn","hasElementTranscludeDirective","scopeToChild","controllerDirectives","$scope","$attrs","$transclude","controllerInstance","controllerAs","templateDirective","$$originalDirective","isolateScopeController","isolateBindingContext","identifier","bindToController","lastValue","parentGet","parentSet","compare","$observe","$$observers","$$scope","literal","b","assign","parentValueWatch","parentValue","$stateful","unwatch","$on","invokeLinkFn","template","templateUrl","terminalPriority","newScopeDirective","nonTlbTranscludeDirective","hasTranscludeDirective","hasTemplate","$compileNode","$template","childTranscludeFn","$$start","$$end","directiveValue","assertNoDuplicate","$$tlb","createComment","replaceWith","replaceDirective","contents","denormalizeTemplate","removeComments","templateNamespace","newTemplateAttrs","templateDirectives","unprocessedDirectives","markDirectivesAsIsolate","mergeTemplateAttributes","compileTemplateUrl","Math","max","tDirectives","startAttrName","endAttrName","srcAttr","dstAttr","$set","tAttrs","linkQueue","afterTemplateNodeLinkFn","afterTemplateChildLinkFn","beforeTemplateCompileNode","origAsyncDirective","derivedSyncDirective","getTrustedResourceUrl","then","content","tempTemplateAttrs","beforeTemplateLinkNode","linkRootElement","$$destroyed","oldClasses","delayedNodeLinkFn","ignoreChildLinkFn","diff","what","previousDirective","text","interpolateFn","textInterpolateCompileFn","templateNode","templateNodeParent","hasCompileParent","$$addBindingClass","textInterpolateLinkFn","$$addBindingInfo","expressions","interpolateFnWatchAction","wrapper","getTrustedContext","attrNormalizedName","HTML","RESOURCE_URL","allOrNothing","attrInterpolatePreLinkFn","$$inter","newValue","oldValue","$updateClass","elementsToRemove","newNode","firstElementToRemove","removeCount","j2","replaceChild","expando","k","kk","annotation","attributesToCopy","$normalize","$addClass","classVal","$removeClass","removeClass","newClasses","toAdd","tokenDifference","toRemove","writeAttr","booleanKey","aliasedKey","observer","trimmedSrcset","srcPattern","rawUris","nbrUrisWith2parts","floor","innerIdx","lastTuple","removeAttr","listeners","startSymbol","endSymbol","binding","isolated","noTemplate","dataName","PREFIX_REGEXP","str1","str2","values","tokens1","tokens2","token","jqNodes","globals","CNTRL_REG","register","this.register","allowGlobals","this.allowGlobals","addIdentifier","expression","later","ident","exception","cause","parseHeaders","headers","line","headersGetter","headersObj","transformData","fns","JSON_START","JSON_END","PROTECTION_PREFIX","CONTENT_TYPE_APPLICATION_JSON","defaults","transformResponse","defaultHttpResponseTransform","contentType","APPLICATION_JSON","transformRequest","d","common","patch","xsrfCookieName","xsrfHeaderName","useApplyAsync","this.useApplyAsync","interceptorFactories","interceptors","requestConfig","response","resp","status","reject","mergeHeaders","defHeaders","reqHeaders","defHeaderName","reqHeaderName","lowercaseDefHeaderName","execHeaders","headerContent","headerFn","header","chain","serverRequest","reqData","withCredentials","sendReq","promise","when","reversedInterceptors","interceptor","request","requestError","responseError","thenFn","rejectFn","success","promise.success","promise.error","done","headersString","statusText","resolveHttpPromise","resolvePromise","$applyAsync","$$phase","deferred","resolve","removePendingReq","pendingRequests","cachedResp","buildUrl","params","defaultCache","xsrfValue","urlIsSameOrigin","timeout","responseType","v","toISOString","interceptorFactory","createShortMethods","createShortMethodsWithData","createXhr","XMLHttpRequest","createHttpBackend","callbacks","$browserDefer","jsonpReq","callbackId","async","body","called","addEventListener","timeoutRequest","jsonpDone","xhr","abort","completeRequest","open","setRequestHeader","onload","xhr.onload","responseText","urlResolve","protocol","getAllResponseHeaders","onerror","onabort","send","this.startSymbol","this.endSymbol","escape","ch","mustHaveExpression","trustedContext","unescapeText","escapedStartRegexp","escapedEndRegexp","parseStringifyInterceptor","getTrusted","valueOf","newErr","$interpolateMinErr","endIndex","parseFns","textLength","expressionPositions","startSymbolLength","exp","endSymbolLength","compute","interpolationFn","$$watchDelegate","objectEquality","$watchGroup","interpolateFnWatcher","oldValues","currValue","$interpolate.startSymbol","$interpolate.endSymbol","count","invokeApply","setInterval","clearInterval","iteration","skipApply","$$intervalId","tick","notify","intervals","interval.cancel","NUMBER_FORMATS","DECIMAL_SEP","GROUP_SEP","PATTERNS","minInt","minFrac","maxFrac","posPre","posSuf","negPre","negSuf","gSize","lgSize","CURRENCY_SYM","DATETIME_FORMATS","MONTH","SHORTMONTH","DAY","SHORTDAY","AMPMS","medium","short","fullDate","longDate","mediumDate","shortDate","mediumTime","shortTime","pluralCat","num","encodePath","segments","parseAbsoluteUrl","absoluteUrl","locationObj","appBase","parsedUrl","$$protocol","$$host","hostname","$$port","port","DEFAULT_PORTS","parseAppUrl","relativeUrl","prefixed","$$path","pathname","$$search","search","$$hash","beginsWith","begin","whole","stripFile","lastIndexOf","LocationHtml5Url","basePrefix","$$html5","appBaseNoFile","$$parse","this.$$parse","pathUrl","$locationMinErr","$$compose","this.$$compose","$$url","$$absUrl","$$parseLinkUrl","this.$$parseLinkUrl","relHref","appUrl","prevAppUrl","rewrittenUrl","LocationHashbangUrl","hashPrefix","withoutBaseUrl","withoutHashUrl","windowsFilePathExp","firstPathSegmentMatch","LocationHashbangInHtml5Url","locationGetter","property","locationGetterSetter","preprocess","html5Mode","requireBase","rewriteLinks","this.hashPrefix","this.html5Mode","setBrowserUrlWithFallback","oldUrl","oldState","$$state","afterLocationChange","$broadcast","absUrl","LocationMode","initialUrl","IGNORE_URI_REGEXP","ctrlKey","metaKey","which","target","absHref","animVal","preventDefault","initializing","newUrl","newState","$digest","$locationWatch","currentReplace","$$replace","urlOrStateChanged","debug","debugEnabled","this.debugEnabled","flag","formatError","Error","sourceURL","consoleLog","console","logFn","log","hasApply","arg1","arg2","ensureSafeMemberName","fullExpression","$parseMinErr","ensureSafeObject","children","isConstant","setter","setValue","fullExp","propertyObj","cspSafeGetterFn","key0","key1","key2","key3","key4","cspSafeGetter","pathVal","getterFn","getterFnCache","pathKeys","pathKeysLength","code","evaledFnGetter","Function","sharedGetter","fn.assign","$parseOptions","wrapSharedExpression","wrapped","collectExpressionInputs","inputs","expressionInputDirtyCheck","oldValueOfValue","inputsWatchDelegate","parsedExpression","inputExpressions","$$inputs","lastResult","oldInputValue","expressionInputWatch","newInputValue","oldInputValueOfValues","expressionInputsWatch","changed","oneTimeWatchDelegate","oneTimeWatch","oneTimeListener","old","$$postDigest","oneTimeLiteralWatchDelegate","isAllDefined","allDefined","constantWatchDelegate","constantWatch","constantListener","addInterceptor","interceptorFn","oneTime","cacheKey","lexer","Lexer","parser","Parser","qFactory","nextTick","exceptionHandler","callOnce","resolveFn","Promise","simpleBind","scheduleProcessQueue","processScheduled","pending","Deferred","$qMinErr","TypeError","onFulfilled","onRejected","progressBack","catch","finally","handleCallback","$$reject","$$resolve","progress","makePromise","resolved","isResolved","callbackOutput","errback","$Q","Q","resolver","promises","results","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","cancelAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","webkitCancelRequestAnimationFrame","rafSupported","raf","timer","TTL","$rootScopeMinErr","lastDirtyWatch","applyAsyncId","digestTtl","this.digestTtl","Scope","$id","$parent","$$watchers","$$nextSibling","$$prevSibling","$$childHead","$$childTail","$root","$$listeners","$$listenerCount","beginPhase","phase","decrementListenerCount","current","initWatchVal","flushApplyAsync","applyAsyncQueue","scheduleApplyAsync","isolate","destroyChild","child","$$ChildScope","this.$$ChildScope","watchExp","watcher","eq","deregisterWatch","watchExpressions","watchGroupAction","changeReactionScheduled","firstRun","newValues","deregisterFns","shouldCall","deregisterWatchGroup","expr","unwatchFn","watchGroupSubAction","$watchCollection","$watchCollectionInterceptor","_value","bothNaN","newItem","oldItem","internalArray","oldLength","changeDetected","newLength","internalObject","veryOldValue","trackVeryOldValue","changeDetector","initRun","$watchCollectionAction","watch","watchers","dirty","ttl","watchLog","logIdx","logMsg","asyncTask","asyncQueue","$eval","isNaN","next","postDigestQueue","eventName","this.$watchGroup","$applyAsyncExpression","namedListeners","$emit","targetScope","listenerArgs","currentScope","$$asyncQueue","$$postDigestQueue","$$applyAsyncQueue","sanitizeUri","uri","isImage","regex","normalizedVal","adjustMatcher","matcher","$sceMinErr","adjustMatchers","matchers","adjustedMatchers","SCE_CONTEXTS","resourceUrlWhitelist","resourceUrlBlacklist","this.resourceUrlWhitelist","this.resourceUrlBlacklist","matchUrl","generateHolderType","Base","holderType","trustedValue","$$unwrapTrustedValue","this.$$unwrapTrustedValue","holderType.prototype.valueOf","holderType.prototype.toString","htmlSanitizer","trustedValueHolderBase","byType","CSS","URL","JS","trustAs","maybeTrusted","allowed","this.enabled","documentMode","sce","isEnabled","sce.isEnabled","sce.getTrusted","parseAs","sce.parseAs","enumValue","lName","eventSupport","android","userAgent","navigator","boxee","vendorPrefix","vendorRegex","bodyStyle","transitions","animations","webkitTransition","webkitAnimation","pushState","hasEvent","msie","divElm","handleRequestFn","tpl","ignoreRequestError","handleError","totalPendingRequests","testability","testability.findBindings","opt_exactMatch","getElementsByClassName","matches","dataBinding","bindingName","testability.findModels","prefixes","attributeEquals","testability.getLocation","testability.setLocation","testability.whenStable","deferreds","$$timeoutId","timeout.cancel","base","urlParsingNode","requestUrl","originUrl","filters","suffix","currencyFilter","dateFilter","filterFilter","jsonFilter","limitToFilter","lowercaseFilter","numberFilter","orderByFilter","uppercaseFilter","comparator","comparatorType","predicates","predicates.check","objKey","filtered","$locale","formats","amount","currencySymbol","fractionSize","formatNumber","number","groupSep","decimalSep","isFinite","isNegative","abs","numStr","formatedText","hasExponent","toFixed","fractionLen","min","round","fraction","lgroup","group","padNumber","digits","neg","dateGetter","date","dateStrGetter","shortForm","getFirstThursdayOfYear","year","dayOfWeekOnFirst","getDay","weekGetter","firstThurs","getFullYear","thisThurs","getMonth","getDate","jsonStringToDate","string","R_ISO8601_STR","tzHour","tzMin","dateSetter","setUTCFullYear","setFullYear","timeSetter","setUTCHours","setHours","m","s","ms","parseFloat","format","timezone","NUMBER_STRING","DATE_FORMATS_SPLIT","setMinutes","getMinutes","getTimezoneOffset","DATE_FORMATS","object","limit","Infinity","out","sortPredicate","reverseOrder","reverseComparator","comp","descending","v1","v2","map","predicate","arrayCopy","ngDirective","FormController","controls","parentForm","$$parentForm","nullFormCtrl","$error","$$success","$pending","$name","$dirty","$pristine","$valid","$invalid","$submitted","$addControl","$rollbackViewValue","form.$rollbackViewValue","control","$commitViewValue","form.$commitViewValue","form.$addControl","$$renameControl","form.$$renameControl","newName","oldName","$removeControl","form.$removeControl","$setValidity","addSetValidityMethod","ctrl","set","unset","$setDirty","form.$setDirty","PRISTINE_CLASS","DIRTY_CLASS","$setPristine","form.$setPristine","setClass","SUBMITTED_CLASS","$setUntouched","form.$setUntouched","$setSubmitted","form.$setSubmitted","stringBasedInputType","$formatters","$isEmpty","baseInputType","VALIDITY_STATE_PROPERTY","placeholder","noevent","composing","ev","ngTrim","$viewValue","$$hasNativeValidators","$setViewValue","deferListener","keyCode","$render","ctrl.$render","$modelValue","createDateParser","mapping","iso","ISO_DATE_REGEXP","yyyy","MM","dd","HH","getHours","mm","ss","getSeconds","sss","getMilliseconds","part","NaN","createDateInputType","parseDate","dynamicDateInputType","parseObservedDateValue","badInputChecker","$options","previousDate","$$parserName","$parsers","parsedDate","$ngModelMinErr","timezoneOffset","ngMin","minVal","$validators","ctrl.$validators.min","$validate","ngMax","maxVal","ctrl.$validators.max","ctrl.$isEmpty","validity","badInput","typeMismatch","parseConstantExpr","fallback","parseFn","cachedToggleClass","switchValue","classCache","toggleValidationCss","validationErrorKey","isValid","VALID_CLASS","INVALID_CLASS","hasClass","setValidity","isObjectEmpty","PENDING_CLASS","combinedState","classDirective","arrayDifference","arrayClasses","classes","digestClassCounts","classCounts","classesToUpdate","ngClassWatchAction","$index","old$index","mod","REGEX_STRING_REGEXP","isActive_","active","full","major","minor","dot","codeName","JQLite._data","MOUSE_EVENT_MAP","mouseleave","mouseenter","optgroup","tbody","tfoot","colgroup","caption","thead","th","td","ready","trigger","fired","removeData","removeAttribute","css","lowercasedName","specified","getNamedItem","ret","getText","$dv","multiple","selected","nodeCount","jqLiteOn","types","related","relatedTarget","contains","off","one","onFn","replaceNode","insertBefore","contentDocument","prepend","wrapNode","detach","after","newElement","toggleClass","condition","classCondition","nextElementSibling","getElementsByTagName","extraParameters","dummyEvent","handlerArgs","eventFnsCopy","arg3","unbind","$$annotate","$animateMinErr","$$selectors","classNameFilter","this.classNameFilter","$$classNameFilter","runAnimationPostDigest","cancelFn","$$cancelFn","defer.promise.$$cancelFn","ngAnimatePostDigest","ngAnimateNotifyComplete","resolveElementClasses","hasClasses","cachedClassManipulation","op","asyncPromise","currentDefer","applyStyles","styles","from","to","animate","enter","leave","move","$$addClassImmediately","$$removeClassImmediately","add","createdCache","STORAGE_KEY","$$setClassImmediately","PATH_MATCH","locationPrototype","paramValue","Location","Location.prototype.state","CALL","APPLY","BIND","CONSTANTS","null","true","false","constantGetter","OPERATORS","+","-","*","/","%","===","!==","==","!=","<",">","<=",">=","&&","||","!","ESCAPE","lex","tokens","is","readString","peek","readNumber","isIdent","readIdent","isWhitespace","ch2","ch3","fn2","fn3","throwError","chars","isExpOperator","start","end","colStr","peekCh","lastDot","peekIndex","methodName","quote","rawString","hex","String","fromCharCode","rep","ZERO","statements","primary","expect","filterChain","consume","arrayDeclaration","functionCall","objectIndex","fieldAccess","msg","peekToken","e1","e2","e3","e4","t","unaryFn","right","$parseUnaryFn","binaryFn","left","isBranching","$parseBinaryFn","$parseStatements","inputFn","argsFn","$parseFilter","every","assignment","ternary","$parseAssignment","logicalOR","middle","$parseTernary","logicalAND","equality","relational","additive","multiplicative","unary","field","$parseFieldAccess","o","indexFn","$parseObjectIndex","fnGetter","contextGetter","expressionText","$parseFunctionCall","elementFns","elementFn","$parseArrayLiteral","valueFns","$parseObjectLiteral","yy","y","MMMM","MMM","M","H","hh","EEEE","EEE","ampmGetter","Z","timeZoneGetter","zone","paddedZone","ww","w","xlinkHref","propName","normalized","ngBooleanAttrWatchAction","htmlAttr","ngAttrAliasWatchAction","nullFormRenameControl","formDirectiveFactory","isNgForm","ngFormCompile","formElement","ngFormPreLink","handleFormSubmission","returnValue","parentFormCtrl","alias","URL_REGEXP","EMAIL_REGEXP","NUMBER_REGEXP","DATE_REGEXP","DATETIMELOCAL_REGEXP","WEEK_REGEXP","MONTH_REGEXP","TIME_REGEXP","DEFAULT_REGEXP","inputType","textInputType","weekParser","isoWeek","existingDate","week","minutes","hours","seconds","milliseconds","addDays","numberInputType","urlInputType","ctrl.$validators.url","emailInputType","email","ctrl.$validators.email","radioInputType","checked","checkboxInputType","trueValue","ngTrueValue","falseValue","ngFalseValue","ctrls","NgModelController","$asyncValidators","$viewChangeListeners","$untouched","$touched","parsedNgModel","pendingDebounce","ngModelGet","modelValue","getterSetter","ngModelSet","$$setOptions","this.$$setOptions","this.$isEmpty","currentValidationRunId","this.$setPristine","this.$setUntouched","UNTOUCHED_CLASS","TOUCHED_CLASS","$setTouched","this.$setTouched","this.$rollbackViewValue","$$lastCommittedViewValue","this.$validate","$$parseAndValidate","$$runValidators","this.$$runValidators","parseValid","viewValue","doneCallback","processSyncValidators","syncValidatorsValid","validator","processAsyncValidators","validatorPromises","allValid","validationDone","localValidationRunId","processParseErrors","errorKey","this.$commitViewValue","this.$$parseAndValidate","parserValid","prevModelValue","allowInvalid","$$writeModelToScope","this.$$writeModelToScope","this.$setViewValue","updateOnDefault","$$debounceViewValueCommit","this.$$debounceViewValueCommit","debounceDelay","debounce","ngModelWatch","formatters","ngModelCompile","ngModelPreLink","modelCtrl","formCtrl","ngModelPostLink","updateOn","ctrl.$validators.required","patternExp","ctrl.$validators.pattern","ctrl.$validators.maxlength","ctrl.$validators.minlength","trimValues","CONSTANT_VALUE_REGEXP","tplAttr","ngValueConstantLink","ngValueLink","valueWatchAction","that","$compile","ngBindCompile","templateElement","ngBindLink","ngBindWatchAction","ngBindTemplateCompile","ngBindTemplateLink","ngBindHtmlCompile","tElement","ngBindHtmlGetter","ngBindHtmlWatch","getStringValue","ngBindHtmlLink","ngBindHtmlWatchAction","getTrustedHtml","forceAsyncEvents","ngEventHandler","$event","previousElements","ngIfWatchAction","newScope","srcExp","onloadExp","autoScrollExp","autoscroll","changeCounter","previousElement","currentElement","cleanupLastIncludeContent","parseAsResourceUrl","ngIncludeWatchAction","afterAnimation","thisChangeId","namespaceAdaptedClone","BRACE","numberExp","whenExp","whens","whensExpFns","isWhen","attributeName","ngPluralizeWatch","ngPluralizeWatchAction","ngRepeatMinErr","updateScope","valueIdentifier","keyIdentifier","arrayLength","$first","$last","$middle","$odd","$even","ngRepeatCompile","ngRepeatEndComment","lhs","rhs","aliasAs","trackByExp","trackByExpGetter","trackByIdExpFn","trackByIdArrayFn","trackByIdObjFn","hashFnLocals","ngRepeatLink","lastBlockMap","ngRepeatAction","collection","previousNode","nextNode","nextBlockMap","collectionLength","trackById","collectionKeys","nextBlockOrder","trackByIdFn","itemKey","blockKey","ngRepeatTransclude","ngShowWatchAction","NG_HIDE_CLASS","tempClasses","NG_HIDE_IN_PROGRESS_CLASS","ngHideWatchAction","ngStyleWatchAction","newStyles","oldStyles","ngSwitchController","cases","selectedTranscludes","selectedElements","previousLeaveAnimations","selectedScopes","spliceFactory","ngSwitchWatchAction","selectedTransclude","caseElement","selectedScope","anchor","ngOptionsMinErr","NG_OPTIONS_REGEXP","nullModelCtrl","optionsMap","ngModelCtrl","unknownOption","databound","init","self.init","ngModelCtrl_","nullOption_","unknownOption_","addOption","self.addOption","removeOption","self.removeOption","hasOption","renderUnknownOption","self.renderUnknownOption","unknownVal","self.hasOption","setupAsSingle","selectElement","selectCtrl","ngModelCtrl.$render","emptyOption","setupAsMultiple","lastView","selectMultipleWatch","setupAsOptions","callExpression","exprFn","valueName","keyName","createIsSelectedFn","selectedSet","trackFn","trackIndex","isSelected","compareValueFn","selectAsFn","scheduleRendering","renderScheduled","render","updateLabelMap","labelMap","label","added","optionGroups","optionGroupNames","optionGroupName","optionGroup","existingParent","existingOptions","existingOption","valuesFn","groupIndex","anySelected","groupByFn","displayFn","nullOption","groupLength","optionGroupsCache","optGroupTemplate","lastElement","optionTemplate","optionsExp","selectAs","track","selectionChanged","selectedKey","viewValueFn","getLabels","toDisplay","ngModelCtrl.$isEmpty","nullSelectCtrl","selectCtrlName","interpolateWatchAction","$$csp"]
+}
index 933f32f..ed11974 100755 (executable)
@@ -637,12 +637,17 @@ var SCHEDULER_COLWIDTH = 50;
                 // Setup leases with a default free status...
                 $.each(this.scope_resources_by_key, function(resource_key, resource) {
                     resource.leases = [];
+                    if(resource.available == 'false' || resource.boot_state == 'disabled'){
+                        state = 'maintenance';
+                    }else{
+                        state = 'free';
+                    }
                     var colspan_lease = resource.granularity / self._slot_length; //eg. 3600 / 1800 => 2 cells
                     time = SchedulerDateSelected.getTime();
                     for (i=0; i < self._all_slots.length / colspan_lease; i++) { // divide by granularity
                         resource.leases.push({
                             id:     'coucou',
-                            status: (time < now) ? 'disabled':  'free', // 'selected', 'reserved', 'maintenance' XXX pending ??
+                            status: (time < now) ? 'disabled':  state, //'free', // 'selected', 'reserved', 'maintenance' XXX pending ??
                         });
                         time += resource.granularity * 1000;
                     }
@@ -872,7 +877,6 @@ var SCHEDULER_COLWIDTH = 50;
                 var scope = self._get_scope();
 
                 var num_hidden_cells;
-
                 $("#DateToRes").datepicker({
                        dateFormat: "D, d M yy",
                     onRender: function(date) {
index 4dda370..523a9e1 100644 (file)
@@ -16,6 +16,8 @@ from myslice.configengine           import ConfigEngine
 
 from myslice.settings import logger
 
+from rest.sfa_api import sfa_client
+
 theme = ThemeView()
 
 import activity.slice
@@ -78,6 +80,22 @@ def get_jfed_identity(request):
         print e
         return None
 
+def getAuthorities(request, admin = False):
+    # XXX theme has to be the same as the root authority 
+    result = sfa_client(request,'List',hrn=theme.theme,object_type='authority',platforms=['myslice'],admin=admin)
+    authorities = list()
+    try:
+        for item in result['myslice']:
+            t_hrn = item['hrn'].split('.')
+            if 'name' in item:
+                authorities.append({'authority_hrn':item['hrn'], 'name':item['name'], 'shortname':t_hrn[-1].upper()})    
+            else:
+                authorities.append({'authority_hrn':item['hrn']})    
+    except:
+        logger.error(result)
+    return sorted(authorities)
+
+
 # Get the list of pis in a given authority
 def authority_get_pis(request, authority_hrn):
     # CACHE PB with fields
@@ -382,7 +400,7 @@ def manifold_add_user(wsgi_request, request):
     if not results:
         raise Exception, "Failed creating manifold user: %s" % user_params['email']
     result = results[0]
-    return result['email']
+    return result['user_id']
 
 def manifold_update_user(request, email, user_params):
     # user_params: password, config e.g., 
@@ -445,7 +463,8 @@ def delete_local_user(wsgi_request, user_email):
         user_config = json.loads(user[0]['config'])
         authority_hrn = user_config.get('authority', None)
         
-        if is_pi(wsgi_request, '$user_hrn', authority_hrn):
+        #if is_pi(wsgi_request, '$user_hrn', authority_hrn):
+        try:
             # removing from Django auth_user
             UserModel = get_user_model()
             UserModel._default_manager.filter(email__iexact = user_email).delete()
@@ -455,9 +474,9 @@ def delete_local_user(wsgi_request, user_email):
                      
             # removing manifold user
             manifold_delete_user(wsgi_request, user_id)
-        else:
-            return False
-            #raise Exception, "No sufficient rights on authority = ",authority_hrn
+        except Exception, e:
+            #return False
+            print "No sufficient rights on authority = ",authority_hrn
 
     return True      
 
@@ -659,31 +678,30 @@ def portal_validate_request(wsgi_request, request_ids):
             elif request['type'] == 'authority':
                 #hrn = "%s.%s" % (request['authority_hrn'], request['site_authority'])
                 hrn = request['site_authority']
+                name = request['site_name']
                 # XXX tmp sfa dependency
                 from sfa.util.xrn import Xrn 
                 urn = Xrn(hrn, request['type']).get_urn()
                 
                 # Only hrn is required for Manifold Query 
                 sfa_authority_params = {
-                    'authority_hrn'        : hrn,
-                    #'authority_urn'        : urn,
-                    #'type'       : request['type'],
-                    #'pi'        : None,
-                    #'enabled'    : True
+                    'authority_hrn' : hrn,
+                    'name'          : name       
                 }
-                logger.info("ADD Authority")
+                #logger.info("ADD Authority")
                 sfa_add_authority(wsgi_request, sfa_authority_params)
                 request_status['SFA authority'] = {'status': True }
                 a = PendingAuthority.objects.get(id=request['id'])
                 ctx = { 
                     'site_name'     : a.site_name,
-                    'short_name'    : a.short_name,
-                    'url'           : a.url,
-                    'city'          : a.city,
-                    'country'       : a.country,                          
-                    'portal_url'    : a.current_site,
+                    #'short_name'    : a.short_name,
+                    #'url'           : a.url,
+                    'city'          : a.address_city,
+                    'country'       : a.address_country,                          
+                    #'portal_url'    : a.current_site,
                 }
-                user_email = a.email
+                # address_line1 contains the email of the user in pending_authority table
+                user_email = a.address_line1
 
                 PendingAuthority.objects.get(id=request['id']).delete()
                 
@@ -907,7 +925,7 @@ def send_status_email(request, ctx, user_email, obj_type, status):
         sender =  render_to_string(theme.template, ctx)
         sender = sender.replace('\n', '')
                        
-        subject = obj_type + ' request '+ status +'.'
+        subject = obj_type.title() + ' request '+ status
     
         msg = EmailMultiAlternatives(subject, text_content, sender, [user_email])
         msg.attach_alternative(html_content, "text/html")
@@ -1282,8 +1300,6 @@ def create_pending_user(wsgi_request, request, user_detail):
     if request['private_key']:
         account_config['user_private_key'] = request['private_key']
 
-    user_id = user_detail['user_id'] + 1 # the user_id for the newly created user in local:user
-
     # XXX TODO: Require a myslice platform
     # ALERT: this will disapear with ROUTERV2 of Manifold
     # We have to consider the case where several registries can be used
index 47e6974..bbe5094 100644 (file)
@@ -195,7 +195,7 @@ class UserView(LoginRequiredAutoLogoutView, ThemeView):
             for t in itertools.izip_longest(total_platform_list)]
 
         ## check pi or no
-        pi_status = authority_check_pis(self.request, user_email)
+        pi_status = self.request.session['user']['pi']
 
         context = super(UserView, self).get_context_data(**kwargs)
         context['principal_acc'] = principal_acc_list
index 2c1fd6d..9b58fae 100644 (file)
@@ -22,18 +22,75 @@ class Migration(SchemaMigration):
             ('last_name', self.gf('django.db.models.fields.TextField')()),
             ('email', self.gf('django.db.models.fields.EmailField')(max_length=75)),
             ('password', self.gf('django.db.models.fields.TextField')()),
-            ('keypair', self.gf('django.db.models.fields.TextField')()),
+            ('user_hrn', self.gf('django.db.models.fields.TextField')()),
+            ('public_key', self.gf('django.db.models.fields.TextField')()),
+            ('private_key', self.gf('django.db.models.fields.TextField')()),
             ('authority_hrn', self.gf('django.db.models.fields.TextField')()),
+            ('login', self.gf('django.db.models.fields.TextField')()),
+            ('pi', self.gf('django.db.models.fields.TextField')()),
+            ('email_hash', self.gf('django.db.models.fields.TextField')()),
+            ('status', self.gf('django.db.models.fields.TextField')()),
+            ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
         ))
         db.send_create_signal(u'portal', ['PendingUser'])
 
+        # Adding model 'PendingAuthority'
+        db.create_table(u'portal_pendingauthority', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('site_name', self.gf('django.db.models.fields.TextField')()),
+            ('site_authority', self.gf('django.db.models.fields.TextField')()),
+            ('site_abbreviated_name', self.gf('django.db.models.fields.TextField')()),
+            ('site_url', self.gf('django.db.models.fields.TextField')()),
+            ('site_latitude', self.gf('django.db.models.fields.TextField')()),
+            ('site_longitude', self.gf('django.db.models.fields.TextField')()),
+            ('address_line1', self.gf('django.db.models.fields.TextField')()),
+            ('address_line2', self.gf('django.db.models.fields.TextField')()),
+            ('address_line3', self.gf('django.db.models.fields.TextField')()),
+            ('address_city', self.gf('django.db.models.fields.TextField')()),
+            ('address_postalcode', self.gf('django.db.models.fields.TextField')()),
+            ('address_state', self.gf('django.db.models.fields.TextField')()),
+            ('address_country', self.gf('django.db.models.fields.TextField')()),
+            ('authority_hrn', self.gf('django.db.models.fields.TextField')()),
+            ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
+        ))
+        db.send_create_signal(u'portal', ['PendingAuthority'])
+
         # Adding model 'PendingSlice'
         db.create_table(u'portal_pendingslice', (
             (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
             ('slice_name', self.gf('django.db.models.fields.TextField')()),
+            ('user_hrn', self.gf('django.db.models.fields.TextField')()),
+            ('authority_hrn', self.gf('django.db.models.fields.TextField')(null=True)),
+            ('number_of_nodes', self.gf('django.db.models.fields.TextField')(default=0)),
+            ('type_of_nodes', self.gf('django.db.models.fields.TextField')(default='NA')),
+            ('purpose', self.gf('django.db.models.fields.TextField')(default='NA')),
+            ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
         ))
         db.send_create_signal(u'portal', ['PendingSlice'])
 
+        # Adding model 'PendingProject'
+        db.create_table(u'portal_pendingproject', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('project_name', self.gf('django.db.models.fields.TextField')()),
+            ('user_hrn', self.gf('django.db.models.fields.TextField')()),
+            ('email', self.gf('django.db.models.fields.TextField')()),
+            ('authority_hrn', self.gf('django.db.models.fields.TextField')(null=True)),
+            ('purpose', self.gf('django.db.models.fields.TextField')(default='NA')),
+            ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
+        ))
+        db.send_create_signal(u'portal', ['PendingProject'])
+
+        # Adding model 'PendingJoin'
+        db.create_table(u'portal_pendingjoin', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('user_hrn', self.gf('django.db.models.fields.TextField')()),
+            ('email', self.gf('django.db.models.fields.TextField')()),
+            ('project_name', self.gf('django.db.models.fields.TextField')(null=True)),
+            ('authority_hrn', self.gf('django.db.models.fields.TextField')()),
+            ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
+        ))
+        db.send_create_signal(u'portal', ['PendingJoin'])
+
 
     def backwards(self, orm):
         # Deleting model 'Institution'
@@ -42,9 +99,18 @@ class Migration(SchemaMigration):
         # Deleting model 'PendingUser'
         db.delete_table(u'portal_pendinguser')
 
+        # Deleting model 'PendingAuthority'
+        db.delete_table(u'portal_pendingauthority')
+
         # Deleting model 'PendingSlice'
         db.delete_table(u'portal_pendingslice')
 
+        # Deleting model 'PendingProject'
+        db.delete_table(u'portal_pendingproject')
+
+        # Deleting model 'PendingJoin'
+        db.delete_table(u'portal_pendingjoin')
+
 
     models = {
         u'portal.institution': {
@@ -52,21 +118,72 @@ class Migration(SchemaMigration):
             u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
             'name': ('django.db.models.fields.TextField', [], {})
         },
+        u'portal.pendingauthority': {
+            'Meta': {'object_name': 'PendingAuthority'},
+            'address_city': ('django.db.models.fields.TextField', [], {}),
+            'address_country': ('django.db.models.fields.TextField', [], {}),
+            'address_line1': ('django.db.models.fields.TextField', [], {}),
+            'address_line2': ('django.db.models.fields.TextField', [], {}),
+            'address_line3': ('django.db.models.fields.TextField', [], {}),
+            'address_postalcode': ('django.db.models.fields.TextField', [], {}),
+            'address_state': ('django.db.models.fields.TextField', [], {}),
+            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'site_abbreviated_name': ('django.db.models.fields.TextField', [], {}),
+            'site_authority': ('django.db.models.fields.TextField', [], {}),
+            'site_latitude': ('django.db.models.fields.TextField', [], {}),
+            'site_longitude': ('django.db.models.fields.TextField', [], {}),
+            'site_name': ('django.db.models.fields.TextField', [], {}),
+            'site_url': ('django.db.models.fields.TextField', [], {})
+        },
+        u'portal.pendingjoin': {
+            'Meta': {'object_name': 'PendingJoin'},
+            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'email': ('django.db.models.fields.TextField', [], {}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'project_name': ('django.db.models.fields.TextField', [], {'null': 'True'}),
+            'user_hrn': ('django.db.models.fields.TextField', [], {})
+        },
+        u'portal.pendingproject': {
+            'Meta': {'object_name': 'PendingProject'},
+            'authority_hrn': ('django.db.models.fields.TextField', [], {'null': 'True'}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'email': ('django.db.models.fields.TextField', [], {}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'project_name': ('django.db.models.fields.TextField', [], {}),
+            'purpose': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
+            'user_hrn': ('django.db.models.fields.TextField', [], {})
+        },
         u'portal.pendingslice': {
             'Meta': {'object_name': 'PendingSlice'},
+            'authority_hrn': ('django.db.models.fields.TextField', [], {'null': 'True'}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
             u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'slice_name': ('django.db.models.fields.TextField', [], {})
+            'number_of_nodes': ('django.db.models.fields.TextField', [], {'default': '0'}),
+            'purpose': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
+            'slice_name': ('django.db.models.fields.TextField', [], {}),
+            'type_of_nodes': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
+            'user_hrn': ('django.db.models.fields.TextField', [], {})
         },
         u'portal.pendinguser': {
             'Meta': {'object_name': 'PendingUser'},
             'authority_hrn': ('django.db.models.fields.TextField', [], {}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
             'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
+            'email_hash': ('django.db.models.fields.TextField', [], {}),
             'first_name': ('django.db.models.fields.TextField', [], {}),
             u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'keypair': ('django.db.models.fields.TextField', [], {}),
             'last_name': ('django.db.models.fields.TextField', [], {}),
-            'password': ('django.db.models.fields.TextField', [], {})
+            'login': ('django.db.models.fields.TextField', [], {}),
+            'password': ('django.db.models.fields.TextField', [], {}),
+            'pi': ('django.db.models.fields.TextField', [], {}),
+            'private_key': ('django.db.models.fields.TextField', [], {}),
+            'public_key': ('django.db.models.fields.TextField', [], {}),
+            'status': ('django.db.models.fields.TextField', [], {}),
+            'user_hrn': ('django.db.models.fields.TextField', [], {})
         }
     }
 
-    complete_apps = ['portal']
+    complete_apps = ['portal']
\ No newline at end of file
diff --git a/portal/migrations/0002_extend_slice.py b/portal/migrations/0002_extend_slice.py
deleted file mode 100644 (file)
index c6de6c5..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-# -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-
-class Migration(SchemaMigration):
-
-    def forwards(self, orm):
-        # Adding field 'PendingSlice.authority_hrn'
-        db.add_column(u'portal_pendingslice', 'authority_hrn',
-                      self.gf('django.db.models.fields.TextField')(null=True),
-                      keep_default=False)
-
-
-    def backwards(self, orm):
-        # Deleting field 'PendingSlice.authority_hrn'
-        db.delete_column(u'portal_pendingslice', 'authority_hrn')
-
-
-    models = {
-        u'portal.institution': {
-            'Meta': {'object_name': 'Institution'},
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendingslice': {
-            'Meta': {'object_name': 'PendingSlice'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {'null': 'True'}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'slice_name': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendinguser': {
-            'Meta': {'object_name': 'PendingUser'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
-            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
-            'first_name': ('django.db.models.fields.TextField', [], {}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'keypair': ('django.db.models.fields.TextField', [], {}),
-            'last_name': ('django.db.models.fields.TextField', [], {}),
-            'password': ('django.db.models.fields.TextField', [], {})
-        }
-    }
-
-    complete_apps = ['portal']
diff --git a/portal/migrations/0003_extend_slice.py b/portal/migrations/0003_extend_slice.py
deleted file mode 100644 (file)
index 10fe0fa..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-# -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-
-class Migration(SchemaMigration):
-
-    def forwards(self, orm):
-        # Adding field 'PendingSlice.number_of_nodes'
-        db.add_column(u'portal_pendingslice', 'number_of_nodes',
-                      self.gf('django.db.models.fields.TextField')(default=0),
-                      keep_default=False)
-
-        # Adding field 'PendingSlice.type_of_nodes'
-        db.add_column(u'portal_pendingslice', 'type_of_nodes',
-                      self.gf('django.db.models.fields.TextField')(default='NA'),
-                      keep_default=False)
-
-        # Adding field 'PendingSlice.purpose'
-        db.add_column(u'portal_pendingslice', 'purpose',
-                      self.gf('django.db.models.fields.TextField')(default='NA'),
-                      keep_default=False)
-
-
-    def backwards(self, orm):
-        # Deleting field 'PendingSlice.number_of_nodes'
-        db.delete_column(u'portal_pendingslice', 'number_of_nodes')
-
-        # Deleting field 'PendingSlice.type_of_nodes'
-        db.delete_column(u'portal_pendingslice', 'type_of_nodes')
-
-        # Deleting field 'PendingSlice.purpose'
-        db.delete_column(u'portal_pendingslice', 'purpose')
-
-
-    models = {
-        u'portal.institution': {
-            'Meta': {'object_name': 'Institution'},
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendingslice': {
-            'Meta': {'object_name': 'PendingSlice'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {'null': 'True'}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'number_of_nodes': ('django.db.models.fields.TextField', [], {'default': '0'}),
-            'purpose': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
-            'slice_name': ('django.db.models.fields.TextField', [], {}),
-            'type_of_nodes': ('django.db.models.fields.TextField', [], {'default': "'NA'"})
-        },
-        u'portal.pendinguser': {
-            'Meta': {'object_name': 'PendingUser'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
-            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
-            'first_name': ('django.db.models.fields.TextField', [], {}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'keypair': ('django.db.models.fields.TextField', [], {}),
-            'last_name': ('django.db.models.fields.TextField', [], {}),
-            'password': ('django.db.models.fields.TextField', [], {})
-        }
-    }
-
-    complete_apps = ['portal']
diff --git a/portal/migrations/0004_extend_user.py b/portal/migrations/0004_extend_user.py
deleted file mode 100644 (file)
index 50be2b9..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-# -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-
-class Migration(SchemaMigration):
-
-    def forwards(self, orm):
-        # Adding field 'PendingUser.login'
-        db.add_column(u'portal_pendinguser', 'login',
-                      self.gf('django.db.models.fields.TextField')(default='dummy'),
-                      keep_default=False)
-
-
-    def backwards(self, orm):
-        # Deleting field 'PendingUser.login'
-        db.delete_column(u'portal_pendinguser', 'login')
-
-
-    models = {
-        u'portal.institution': {
-            'Meta': {'object_name': 'Institution'},
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendingslice': {
-            'Meta': {'object_name': 'PendingSlice'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {'null': 'True'}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'number_of_nodes': ('django.db.models.fields.TextField', [], {'default': '0'}),
-            'purpose': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
-            'slice_name': ('django.db.models.fields.TextField', [], {}),
-            'type_of_nodes': ('django.db.models.fields.TextField', [], {'default': "'NA'"})
-        },
-        u'portal.pendinguser': {
-            'Meta': {'object_name': 'PendingUser'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
-            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
-            'first_name': ('django.db.models.fields.TextField', [], {}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'keypair': ('django.db.models.fields.TextField', [], {}),
-            'last_name': ('django.db.models.fields.TextField', [], {}),
-            'login': ('django.db.models.fields.TextField', [], {}),
-            'password': ('django.db.models.fields.TextField', [], {})
-        }
-    }
-
-    complete_apps = ['portal']
\ No newline at end of file
diff --git a/portal/migrations/0005_extend_user.py b/portal/migrations/0005_extend_user.py
deleted file mode 100644 (file)
index c3725b1..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-# -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-
-class Migration(SchemaMigration):
-
-    def forwards(self, orm):
-        # Adding field 'PendingUser.created'
-        db.add_column(u'portal_pendinguser', 'created',
-                      self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=datetime.datetime(2013, 10, 25, 0, 0), blank=True),
-                      keep_default=False)
-
-
-    def backwards(self, orm):
-        # Deleting field 'PendingUser.created'
-        db.delete_column(u'portal_pendinguser', 'created')
-
-
-    models = {
-        u'portal.institution': {
-            'Meta': {'object_name': 'Institution'},
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendingslice': {
-            'Meta': {'object_name': 'PendingSlice'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {'null': 'True'}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'number_of_nodes': ('django.db.models.fields.TextField', [], {'default': '0'}),
-            'purpose': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
-            'slice_name': ('django.db.models.fields.TextField', [], {}),
-            'type_of_nodes': ('django.db.models.fields.TextField', [], {'default': "'NA'"})
-        },
-        u'portal.pendinguser': {
-            'Meta': {'object_name': 'PendingUser'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
-            'first_name': ('django.db.models.fields.TextField', [], {}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'keypair': ('django.db.models.fields.TextField', [], {}),
-            'last_name': ('django.db.models.fields.TextField', [], {}),
-            'login': ('django.db.models.fields.TextField', [], {}),
-            'password': ('django.db.models.fields.TextField', [], {})
-        }
-    }
-
-    complete_apps = ['portal']
\ No newline at end of file
diff --git a/portal/migrations/0006_extend_slice.py b/portal/migrations/0006_extend_slice.py
deleted file mode 100644 (file)
index b2c593d..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-# -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-
-class Migration(SchemaMigration):
-
-    def forwards(self, orm):
-        # Adding field 'PendingSlice.created'
-        db.add_column(u'portal_pendingslice', 'created',
-                      self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=datetime.datetime(2013, 10, 25, 0, 0), blank=True),
-                      keep_default=False)
-
-
-    def backwards(self, orm):
-        # Deleting field 'PendingSlice.created'
-        db.delete_column(u'portal_pendingslice', 'created')
-
-
-    models = {
-        u'portal.institution': {
-            'Meta': {'object_name': 'Institution'},
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendingslice': {
-            'Meta': {'object_name': 'PendingSlice'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {'null': 'True'}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'number_of_nodes': ('django.db.models.fields.TextField', [], {'default': '0'}),
-            'purpose': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
-            'slice_name': ('django.db.models.fields.TextField', [], {}),
-            'type_of_nodes': ('django.db.models.fields.TextField', [], {'default': "'NA'"})
-        },
-        u'portal.pendinguser': {
-            'Meta': {'object_name': 'PendingUser'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
-            'first_name': ('django.db.models.fields.TextField', [], {}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'keypair': ('django.db.models.fields.TextField', [], {}),
-            'last_name': ('django.db.models.fields.TextField', [], {}),
-            'login': ('django.db.models.fields.TextField', [], {}),
-            'password': ('django.db.models.fields.TextField', [], {})
-        }
-    }
-
-    complete_apps = ['portal']
\ No newline at end of file
diff --git a/portal/migrations/0007_extend_slice_user.py b/portal/migrations/0007_extend_slice_user.py
deleted file mode 100644 (file)
index b065781..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-# -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-
-class Migration(SchemaMigration):
-
-    def forwards(self, orm):
-        # Adding model 'PendingAuthority'
-        db.create_table(u'portal_pendingauthority', (
-            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('site_name', self.gf('django.db.models.fields.TextField')()),
-            ('site_authority', self.gf('django.db.models.fields.TextField')()),
-            ('site_abbreviated_name', self.gf('django.db.models.fields.TextField')()),
-            ('site_url', self.gf('django.db.models.fields.TextField')()),
-            ('site_latitude', self.gf('django.db.models.fields.TextField')()),
-            ('site_longitude', self.gf('django.db.models.fields.TextField')()),
-            ('address_line1', self.gf('django.db.models.fields.TextField')()),
-            ('address_line2', self.gf('django.db.models.fields.TextField')()),
-            ('address_line3', self.gf('django.db.models.fields.TextField')()),
-            ('address_city', self.gf('django.db.models.fields.TextField')()),
-            ('address_postalcode', self.gf('django.db.models.fields.TextField')()),
-            ('address_state', self.gf('django.db.models.fields.TextField')()),
-            ('address_country', self.gf('django.db.models.fields.TextField')()),
-            ('authority_hrn', self.gf('django.db.models.fields.TextField')()),
-            ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
-        ))
-        db.send_create_signal(u'portal', ['PendingAuthority'])
-
-        # Adding field 'PendingSlice.user_hrn'
-        db.add_column(u'portal_pendingslice', 'user_hrn',
-                      self.gf('django.db.models.fields.TextField')(default=''),
-                      keep_default=False)
-
-        # Adding field 'PendingUser.pi'
-        db.add_column(u'portal_pendinguser', 'pi',
-                      self.gf('django.db.models.fields.TextField')(default=''),
-                      keep_default=False)
-
-
-    def backwards(self, orm):
-        # Deleting model 'PendingAuthority'
-        db.delete_table(u'portal_pendingauthority')
-
-        # Deleting field 'PendingSlice.user_hrn'
-        db.delete_column(u'portal_pendingslice', 'user_hrn')
-
-        # Deleting field 'PendingUser.pi'
-        db.delete_column(u'portal_pendinguser', 'pi')
-
-
-    models = {
-        u'portal.institution': {
-            'Meta': {'object_name': 'Institution'},
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendingauthority': {
-            'Meta': {'object_name': 'PendingAuthority'},
-            'address_city': ('django.db.models.fields.TextField', [], {}),
-            'address_country': ('django.db.models.fields.TextField', [], {}),
-            'address_line1': ('django.db.models.fields.TextField', [], {}),
-            'address_line2': ('django.db.models.fields.TextField', [], {}),
-            'address_line3': ('django.db.models.fields.TextField', [], {}),
-            'address_postalcode': ('django.db.models.fields.TextField', [], {}),
-            'address_state': ('django.db.models.fields.TextField', [], {}),
-            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'site_abbreviated_name': ('django.db.models.fields.TextField', [], {}),
-            'site_authority': ('django.db.models.fields.TextField', [], {}),
-            'site_latitude': ('django.db.models.fields.TextField', [], {}),
-            'site_longitude': ('django.db.models.fields.TextField', [], {}),
-            'site_name': ('django.db.models.fields.TextField', [], {}),
-            'site_url': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendingslice': {
-            'Meta': {'object_name': 'PendingSlice'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {'null': 'True'}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'number_of_nodes': ('django.db.models.fields.TextField', [], {'default': '0'}),
-            'purpose': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
-            'slice_name': ('django.db.models.fields.TextField', [], {}),
-            'type_of_nodes': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
-            'user_hrn': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendinguser': {
-            'Meta': {'object_name': 'PendingUser'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
-            'first_name': ('django.db.models.fields.TextField', [], {}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'keypair': ('django.db.models.fields.TextField', [], {}),
-            'last_name': ('django.db.models.fields.TextField', [], {}),
-            'login': ('django.db.models.fields.TextField', [], {}),
-            'password': ('django.db.models.fields.TextField', [], {}),
-            'pi': ('django.db.models.fields.TextField', [], {})
-        }
-    }
-
-    complete_apps = ['portal']
\ No newline at end of file
diff --git a/portal/migrations/0008_extend_user.py b/portal/migrations/0008_extend_user.py
deleted file mode 100644 (file)
index 579584e..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-# -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-
-class Migration(SchemaMigration):
-
-    def forwards(self, orm):
-        # Deleting field 'PendingUser.keypair'
-        db.delete_column(u'portal_pendinguser', 'keypair')
-
-        # Adding field 'PendingUser.user_hrn'
-        db.add_column(u'portal_pendinguser', 'user_hrn',
-                      self.gf('django.db.models.fields.TextField')(default=''),
-                      keep_default=False)
-
-        # Adding field 'PendingUser.public_key'
-        db.add_column(u'portal_pendinguser', 'public_key',
-                      self.gf('django.db.models.fields.TextField')(default=''),
-                      keep_default=False)
-
-        # Adding field 'PendingUser.private_key'
-        db.add_column(u'portal_pendinguser', 'private_key',
-                      self.gf('django.db.models.fields.TextField')(default=''),
-                      keep_default=False)
-
-
-    def backwards(self, orm):
-        # Adding field 'PendingUser.keypair'
-        db.add_column(u'portal_pendinguser', 'keypair',
-                      self.gf('django.db.models.fields.TextField')(default=''),
-                      keep_default=False)
-
-        # Deleting field 'PendingUser.user_hrn'
-        db.delete_column(u'portal_pendinguser', 'user_hrn')
-
-        # Deleting field 'PendingUser.public_key'
-        db.delete_column(u'portal_pendinguser', 'public_key')
-
-        # Deleting field 'PendingUser.private_key'
-        db.delete_column(u'portal_pendinguser', 'private_key')
-
-
-    models = {
-        u'portal.institution': {
-            'Meta': {'object_name': 'Institution'},
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendingauthority': {
-            'Meta': {'object_name': 'PendingAuthority'},
-            'address_city': ('django.db.models.fields.TextField', [], {}),
-            'address_country': ('django.db.models.fields.TextField', [], {}),
-            'address_line1': ('django.db.models.fields.TextField', [], {}),
-            'address_line2': ('django.db.models.fields.TextField', [], {}),
-            'address_line3': ('django.db.models.fields.TextField', [], {}),
-            'address_postalcode': ('django.db.models.fields.TextField', [], {}),
-            'address_state': ('django.db.models.fields.TextField', [], {}),
-            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'site_abbreviated_name': ('django.db.models.fields.TextField', [], {}),
-            'site_authority': ('django.db.models.fields.TextField', [], {}),
-            'site_latitude': ('django.db.models.fields.TextField', [], {}),
-            'site_longitude': ('django.db.models.fields.TextField', [], {}),
-            'site_name': ('django.db.models.fields.TextField', [], {}),
-            'site_url': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendingslice': {
-            'Meta': {'object_name': 'PendingSlice'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {'null': 'True'}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'number_of_nodes': ('django.db.models.fields.TextField', [], {'default': '0'}),
-            'purpose': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
-            'slice_name': ('django.db.models.fields.TextField', [], {}),
-            'type_of_nodes': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
-            'user_hrn': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendinguser': {
-            'Meta': {'object_name': 'PendingUser'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
-            'first_name': ('django.db.models.fields.TextField', [], {}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'last_name': ('django.db.models.fields.TextField', [], {}),
-            'login': ('django.db.models.fields.TextField', [], {}),
-            'password': ('django.db.models.fields.TextField', [], {}),
-            'pi': ('django.db.models.fields.TextField', [], {}),
-            'private_key': ('django.db.models.fields.TextField', [], {}),
-            'public_key': ('django.db.models.fields.TextField', [], {}),
-            'user_hrn': ('django.db.models.fields.TextField', [], {})
-        }
-    }
-
-    complete_apps = ['portal']
\ No newline at end of file
diff --git a/portal/migrations/0009_initial.py b/portal/migrations/0009_initial.py
deleted file mode 100644 (file)
index 4e7e20a..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-# -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-
-class Migration(SchemaMigration):
-
-    def forwards(self, orm):
-        # Adding model 'Institution'
-        db.create_table(u'portal_institution', (
-            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.TextField')()),
-        ))
-        db.send_create_signal(u'portal', ['Institution'])
-
-        # Adding model 'PendingUser'
-        db.create_table(u'portal_pendinguser', (
-            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('first_name', self.gf('django.db.models.fields.TextField')()),
-            ('last_name', self.gf('django.db.models.fields.TextField')()),
-            ('email', self.gf('django.db.models.fields.EmailField')(max_length=75)),
-            ('password', self.gf('django.db.models.fields.TextField')()),
-            ('user_hrn', self.gf('django.db.models.fields.TextField')()),
-            ('public_key', self.gf('django.db.models.fields.TextField')()),
-            ('private_key', self.gf('django.db.models.fields.TextField')()),
-            ('authority_hrn', self.gf('django.db.models.fields.TextField')()),
-            ('login', self.gf('django.db.models.fields.TextField')()),
-            ('pi', self.gf('django.db.models.fields.TextField')()),
-            ('email_hash', self.gf('django.db.models.fields.TextField')()),
-            ('status', self.gf('django.db.models.fields.TextField')()),
-            ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
-        ))
-        db.send_create_signal(u'portal', ['PendingUser'])
-
-        # Adding model 'PendingAuthority'
-        db.create_table(u'portal_pendingauthority', (
-            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('site_name', self.gf('django.db.models.fields.TextField')()),
-            ('site_authority', self.gf('django.db.models.fields.TextField')()),
-            ('site_abbreviated_name', self.gf('django.db.models.fields.TextField')()),
-            ('site_url', self.gf('django.db.models.fields.TextField')()),
-            ('site_latitude', self.gf('django.db.models.fields.TextField')()),
-            ('site_longitude', self.gf('django.db.models.fields.TextField')()),
-            ('address_line1', self.gf('django.db.models.fields.TextField')()),
-            ('address_line2', self.gf('django.db.models.fields.TextField')()),
-            ('address_line3', self.gf('django.db.models.fields.TextField')()),
-            ('address_city', self.gf('django.db.models.fields.TextField')()),
-            ('address_postalcode', self.gf('django.db.models.fields.TextField')()),
-            ('address_state', self.gf('django.db.models.fields.TextField')()),
-            ('address_country', self.gf('django.db.models.fields.TextField')()),
-            ('authority_hrn', self.gf('django.db.models.fields.TextField')()),
-            ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
-        ))
-        db.send_create_signal(u'portal', ['PendingAuthority'])
-
-        # Adding model 'PendingSlice'
-        db.create_table(u'portal_pendingslice', (
-            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('slice_name', self.gf('django.db.models.fields.TextField')()),
-            ('user_hrn', self.gf('django.db.models.fields.TextField')()),
-            ('authority_hrn', self.gf('django.db.models.fields.TextField')(null=True)),
-            ('number_of_nodes', self.gf('django.db.models.fields.TextField')(default=0)),
-            ('type_of_nodes', self.gf('django.db.models.fields.TextField')(default='NA')),
-            ('purpose', self.gf('django.db.models.fields.TextField')(default='NA')),
-            ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
-        ))
-        db.send_create_signal(u'portal', ['PendingSlice'])
-
-
-    def backwards(self, orm):
-        # Deleting model 'Institution'
-        db.delete_table(u'portal_institution')
-
-        # Deleting model 'PendingUser'
-        db.delete_table(u'portal_pendinguser')
-
-        # Deleting model 'PendingAuthority'
-        db.delete_table(u'portal_pendingauthority')
-
-        # Deleting model 'PendingSlice'
-        db.delete_table(u'portal_pendingslice')
-
-
-    models = {
-        u'portal.institution': {
-            'Meta': {'object_name': 'Institution'},
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendingauthority': {
-            'Meta': {'object_name': 'PendingAuthority'},
-            'address_city': ('django.db.models.fields.TextField', [], {}),
-            'address_country': ('django.db.models.fields.TextField', [], {}),
-            'address_line1': ('django.db.models.fields.TextField', [], {}),
-            'address_line2': ('django.db.models.fields.TextField', [], {}),
-            'address_line3': ('django.db.models.fields.TextField', [], {}),
-            'address_postalcode': ('django.db.models.fields.TextField', [], {}),
-            'address_state': ('django.db.models.fields.TextField', [], {}),
-            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'site_abbreviated_name': ('django.db.models.fields.TextField', [], {}),
-            'site_authority': ('django.db.models.fields.TextField', [], {}),
-            'site_latitude': ('django.db.models.fields.TextField', [], {}),
-            'site_longitude': ('django.db.models.fields.TextField', [], {}),
-            'site_name': ('django.db.models.fields.TextField', [], {}),
-            'site_url': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendingslice': {
-            'Meta': {'object_name': 'PendingSlice'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {'null': 'True'}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'number_of_nodes': ('django.db.models.fields.TextField', [], {'default': '0'}),
-            'purpose': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
-            'slice_name': ('django.db.models.fields.TextField', [], {}),
-            'type_of_nodes': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
-            'user_hrn': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendinguser': {
-            'Meta': {'object_name': 'PendingUser'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
-            'email_hash': ('django.db.models.fields.TextField', [], {}),
-            'first_name': ('django.db.models.fields.TextField', [], {}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'last_name': ('django.db.models.fields.TextField', [], {}),
-            'login': ('django.db.models.fields.TextField', [], {}),
-            'password': ('django.db.models.fields.TextField', [], {}),
-            'pi': ('django.db.models.fields.TextField', [], {}),
-            'private_key': ('django.db.models.fields.TextField', [], {}),
-            'public_key': ('django.db.models.fields.TextField', [], {}),
-            'status': ('django.db.models.fields.TextField', [], {}),
-            'user_hrn': ('django.db.models.fields.TextField', [], {})
-        }
-    }
-
-    complete_apps = ['portal']
\ No newline at end of file
diff --git a/portal/migrations/0010_project.py b/portal/migrations/0010_project.py
deleted file mode 100644 (file)
index 7046204..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-# -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-
-class Migration(SchemaMigration):
-
-    def forwards(self, orm):
-        # Adding model 'PendingProject'
-        db.create_table(u'portal_pendingproject', (
-            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('project_name', self.gf('django.db.models.fields.TextField')()),
-            ('user_hrn', self.gf('django.db.models.fields.TextField')()),
-            ('authority_hrn', self.gf('django.db.models.fields.TextField')(null=True)),
-            ('purpose', self.gf('django.db.models.fields.TextField')(default='NA')),
-            ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
-        ))
-        db.send_create_signal(u'portal', ['PendingProject'])
-
-
-    def backwards(self, orm):
-        # Deleting model 'PendingProject'
-        db.delete_table(u'portal_pendingproject')
-
-
-    models = {
-        u'portal.institution': {
-            'Meta': {'object_name': 'Institution'},
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendingauthority': {
-            'Meta': {'object_name': 'PendingAuthority'},
-            'address_city': ('django.db.models.fields.TextField', [], {}),
-            'address_country': ('django.db.models.fields.TextField', [], {}),
-            'address_line1': ('django.db.models.fields.TextField', [], {}),
-            'address_line2': ('django.db.models.fields.TextField', [], {}),
-            'address_line3': ('django.db.models.fields.TextField', [], {}),
-            'address_postalcode': ('django.db.models.fields.TextField', [], {}),
-            'address_state': ('django.db.models.fields.TextField', [], {}),
-            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'site_abbreviated_name': ('django.db.models.fields.TextField', [], {}),
-            'site_authority': ('django.db.models.fields.TextField', [], {}),
-            'site_latitude': ('django.db.models.fields.TextField', [], {}),
-            'site_longitude': ('django.db.models.fields.TextField', [], {}),
-            'site_name': ('django.db.models.fields.TextField', [], {}),
-            'site_url': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendingproject': {
-            'Meta': {'object_name': 'PendingProject'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {'null': 'True'}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'project_name': ('django.db.models.fields.TextField', [], {}),
-            'purpose': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
-            'user_hrn': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendingslice': {
-            'Meta': {'object_name': 'PendingSlice'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {'null': 'True'}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'number_of_nodes': ('django.db.models.fields.TextField', [], {'default': '0'}),
-            'purpose': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
-            'slice_name': ('django.db.models.fields.TextField', [], {}),
-            'type_of_nodes': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
-            'user_hrn': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendinguser': {
-            'Meta': {'object_name': 'PendingUser'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
-            'email_hash': ('django.db.models.fields.TextField', [], {}),
-            'first_name': ('django.db.models.fields.TextField', [], {}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'last_name': ('django.db.models.fields.TextField', [], {}),
-            'login': ('django.db.models.fields.TextField', [], {}),
-            'password': ('django.db.models.fields.TextField', [], {}),
-            'pi': ('django.db.models.fields.TextField', [], {}),
-            'private_key': ('django.db.models.fields.TextField', [], {}),
-            'public_key': ('django.db.models.fields.TextField', [], {}),
-            'status': ('django.db.models.fields.TextField', [], {}),
-            'user_hrn': ('django.db.models.fields.TextField', [], {})
-        }
-    }
-
-    complete_apps = ['portal']
\ No newline at end of file
diff --git a/portal/migrations/0011_join.py b/portal/migrations/0011_join.py
deleted file mode 100644 (file)
index f403289..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-# -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import DataMigration
-from django.db import models
-
-class Migration(DataMigration):
-
-    def forwards(self, orm):
-        "Write your forwards methods here."
-        # Note: Remember to use orm['appname.ModelName'] rather than "from appname.models..."
-
-    def backwards(self, orm):
-        "Write your backwards methods here."
-
-    models = {
-        u'portal.institution': {
-            'Meta': {'object_name': 'Institution'},
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendingauthority': {
-            'Meta': {'object_name': 'PendingAuthority'},
-            'address_city': ('django.db.models.fields.TextField', [], {}),
-            'address_country': ('django.db.models.fields.TextField', [], {}),
-            'address_line1': ('django.db.models.fields.TextField', [], {}),
-            'address_line2': ('django.db.models.fields.TextField', [], {}),
-            'address_line3': ('django.db.models.fields.TextField', [], {}),
-            'address_postalcode': ('django.db.models.fields.TextField', [], {}),
-            'address_state': ('django.db.models.fields.TextField', [], {}),
-            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'site_abbreviated_name': ('django.db.models.fields.TextField', [], {}),
-            'site_authority': ('django.db.models.fields.TextField', [], {}),
-            'site_latitude': ('django.db.models.fields.TextField', [], {}),
-            'site_longitude': ('django.db.models.fields.TextField', [], {}),
-            'site_name': ('django.db.models.fields.TextField', [], {}),
-            'site_url': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendingjoin': {
-            'Meta': {'object_name': 'PendingJoin'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            'email': ('django.db.models.fields.TextField', [], {}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'project_name': ('django.db.models.fields.TextField', [], {'null': 'True'}),
-            'user_hrn': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendingproject': {
-            'Meta': {'object_name': 'PendingProject'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {'null': 'True'}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            'email': ('django.db.models.fields.TextField', [], {}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'project_name': ('django.db.models.fields.TextField', [], {}),
-            'purpose': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
-            'user_hrn': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendingslice': {
-            'Meta': {'object_name': 'PendingSlice'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {'null': 'True'}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'number_of_nodes': ('django.db.models.fields.TextField', [], {'default': '0'}),
-            'purpose': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
-            'slice_name': ('django.db.models.fields.TextField', [], {}),
-            'type_of_nodes': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
-            'user_hrn': ('django.db.models.fields.TextField', [], {})
-        },
-        u'portal.pendinguser': {
-            'Meta': {'object_name': 'PendingUser'},
-            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
-            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
-            'email_hash': ('django.db.models.fields.TextField', [], {}),
-            'first_name': ('django.db.models.fields.TextField', [], {}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'last_name': ('django.db.models.fields.TextField', [], {}),
-            'login': ('django.db.models.fields.TextField', [], {}),
-            'password': ('django.db.models.fields.TextField', [], {}),
-            'pi': ('django.db.models.fields.TextField', [], {}),
-            'private_key': ('django.db.models.fields.TextField', [], {}),
-            'public_key': ('django.db.models.fields.TextField', [], {}),
-            'status': ('django.db.models.fields.TextField', [], {}),
-            'user_hrn': ('django.db.models.fields.TextField', [], {})
-        }
-    }
-
-    complete_apps = ['portal']
-    symmetrical = True
index fdccd16..1f6e921 100644 (file)
@@ -1,3 +1,4 @@
+import requests
 import json
 import time
 import re
@@ -10,7 +11,7 @@ from manifoldapi.manifoldapi    import execute_admin_query, execute_query
 
 from unfold.loginrequired       import LoginRequiredAutoLogoutView
 
-from portal.actions import create_pending_project, create_pending_join, sfa_add_authority, authority_add_pis, is_pi
+from portal.actions import create_pending_project, create_pending_join, sfa_add_authority, authority_add_pis, is_pi, getAuthorities
 from portal.models import PendingProject, PendingJoin
 
 from myslice.theme import ThemeView
@@ -19,20 +20,6 @@ from myslice.settings import logger
 class ProjectRequestView(LoginRequiredAutoLogoutView, ThemeView):
     template_name = 'projectrequest_view.html'
     
-    def getAuthorities(self, request):
-        #if self.theme == 'fed4fire':
-        authorities_query = Query.get('myslice:authority').select('authority_hrn')
-        #else:
-        #    authorities_query = Query.get('authority').select('name', 'authority_hrn')
-        authorities = execute_admin_query(request, authorities_query)
-        if authorities is not None:
-            # Remove the root authority from the list
-            matching = [s for s in authorities if "." in s['authority_hrn']]
-            authorities = sorted(matching, key=lambda k: k['authority_hrn'])
-            #if self.theme != 'fed4fire':
-            #    authorities = sorted(matching, key=lambda k: k['name'])
-        return authorities
-    
     def getUserAuthority(self, request):
         # Get user_email (XXX Would deserve to be simplified)
         user_query  = Query().get('local:user').select('email','config')
@@ -86,7 +73,7 @@ class ProjectRequestView(LoginRequiredAutoLogoutView, ThemeView):
 
         user_email = self.getUserEmail(wsgi_request)
         
-        authorities = self.getAuthorities(wsgi_request)
+        authorities = getAuthorities(wsgi_request)
         
         user_authority = self.getUserAuthority(wsgi_request)
         
index 47fcd05..76d712d 100644 (file)
@@ -18,7 +18,7 @@ from manifoldapi.manifoldapi    import execute_admin_query
 from manifold.core.query        import Query
 
 from portal.models              import PendingUser
-from portal.actions             import create_pending_user
+from portal.actions             import create_pending_user, getAuthorities
 
 from myslice.theme import ThemeView
 from myslice.settings import logger
@@ -41,15 +41,18 @@ class RegistrationView (FreeAccessView, ThemeView):
         """
         """
         errors = []
-        authority_hrn = None
-        # REGISTRY ONLY TO BE REMOVED WITH MANIFOLD-V2
-        authorities_query = Query.get('authority').select('name', 'authority_hrn')
-        authorities = execute_admin_query(wsgi_request, authorities_query)
-        if authorities is not None:
-            # Remove the root authority from the list
-            matching = [s for s in authorities if "." in s['authority_hrn']]
-            authorities = sorted(matching, key=lambda k: k['authority_hrn'])
-            authorities = sorted(matching, key=lambda k: k['name'])
+
+        authorities = getAuthorities(wsgi_request, admin = True)
+
+        #authority_hrn = None
+        ## REGISTRY ONLY TO BE REMOVED WITH MANIFOLD-V2
+        #authorities_query = Query.get('authority').select('name', 'authority_hrn')
+        #authorities = execute_admin_query(wsgi_request, authorities_query)
+        #if authorities is not None:
+        #    # Remove the root authority from the list
+        #    matching = [s for s in authorities if "." in s['authority_hrn']]
+        #    authorities = sorted(matching, key=lambda k: k['authority_hrn'])
+        #    authorities = sorted(matching, key=lambda k: k['name'])
         
         logger.debug("############ BREAKPOINT 1 #################")
         # Page rendering
diff --git a/portal/releasenotesview.py b/portal/releasenotesview.py
new file mode 100644 (file)
index 0000000..ae407fd
--- /dev/null
@@ -0,0 +1,23 @@
+# this somehow is not used anymore - should it not be ?
+from django.core.context_processors import csrf
+from django.http import HttpResponseRedirect
+from django.contrib.auth import authenticate, login, logout
+from django.template import RequestContext
+from django.shortcuts import render_to_response
+from django.shortcuts import render
+
+from unfold.loginrequired import FreeAccessView
+
+from manifoldapi.manifoldresult import ManifoldResult
+from ui.topmenu import topmenu_items, the_user
+from myslice.configengine import ConfigEngine
+
+from myslice.theme import ThemeView
+
+class ReleaseNotesView (FreeAccessView, ThemeView):
+    template_name = 'release-notes-view.html'
+
+    def get (self, request, state=None):
+        
+        return render_to_response(self.template, { 'theme' : self.theme }, context_instance=RequestContext(request))
+
index 47951a3..a2b0dd0 100644 (file)
@@ -11,7 +11,7 @@ from unfold.page                import Page
 from manifold.core.query        import Query
 from manifoldapi.manifoldapi    import execute_admin_query, execute_query
 
-from portal.actions             import is_pi, create_slice, create_pending_slice, clear_user_creds, authority_check_pis
+from portal.actions             import is_pi, create_slice, create_pending_slice, clear_user_creds, authority_check_pis, getAuthorities
 #from portal.forms               import SliceRequestForm
 from unfold.loginrequired       import LoginRequiredAutoLogoutView
 from ui.topmenu                 import topmenu_items_live, the_user
@@ -44,15 +44,18 @@ class SliceRequestView (LoginRequiredAutoLogoutView, ThemeView):
         authority_hrn = None
         authority_name = None
         # Retrieve the list of authorities
-        #if self.theme == 'fed4fire' or self.theme == 'onelab':
-        authorities_query = Query.get('myslice:authority').select('authority_hrn')
-        #else:
-        #    authorities_query = Query.get('authority').select('name', 'authority_hrn')
-        authorities = execute_admin_query(request, authorities_query)
-        if authorities is not None:
-            authorities = sorted(authorities, key=lambda k: k['authority_hrn'])
-            #if self.theme != 'fed4fire' or  self.theme != 'onelab':
-            #    authorities = sorted(authorities, key=lambda k: k['name'])
+
+        authorities = getAuthorities(request, admin=True)
+
+        ##if self.theme == 'fed4fire' or self.theme == 'onelab':
+        #authorities_query = Query.get('myslice:authority').select('authority_hrn')
+        ##else:
+        ##    authorities_query = Query.get('authority').select('name', 'authority_hrn')
+        #authorities = execute_admin_query(request, authorities_query)
+        #if authorities is not None:
+        #    authorities = sorted(authorities, key=lambda k: k['authority_hrn'])
+        #    #if self.theme != 'fed4fire' or  self.theme != 'onelab':
+        #    #    authorities = sorted(authorities, key=lambda k: k['name'])
 
         # Get user_email (XXX Would deserve to be simplified)
         user_query  = Query().get('local:user').select('email','config')
@@ -88,15 +91,7 @@ class SliceRequestView (LoginRequiredAutoLogoutView, ThemeView):
                         user_hrn = account_config.get('user_hrn','N/A')
         #                acc_auth_cred = account_config.get('delegated_authority_credentials','N/A')
 
-
-        # checking if pi or not
-        #if acc_auth_cred == {} or acc_auth_cred == 'N/A':
-        #    pi = "is_not_pi"
-        #else:
-        #    pi = "is_pi"
-
-        pi = authority_check_pis (request, user_email)
-        logger.debug("SLICEREQUESTVIEW.PY -----  pi= {}".format(pi))
+        pi = request.session['user']['pi']
 
         # Page rendering
         page = Page(request)
index 341fa4b..cdd5f13 100644 (file)
@@ -22,6 +22,7 @@ from plugins.googlemap                  import GoogleMap
 from plugins.filter_status              import FilterStatusPlugin
 from plugins.testbeds                   import TestbedsPlugin
 from plugins.scheduler2                 import Scheduler2
+from plugins.asap                       import AsapPlugin
 
 # Bristol plugin
 from plugins.univbris                   import Univbris
@@ -79,17 +80,17 @@ class SliceResourceView (LoginRequiredView, ThemeView):
         main_query.select(slice_fields)
 
         # Columns shown by default in Query_table plugin
-        page.expose_js_var("QUERYTABLE_MAP","{'Resource name': 'hostname', 'Type': 'type', 'Facility': 'facility_name','Testbed': 'testbed_name', 'Status':'boot_state'}")
+        page.expose_js_var("QUERYTABLE_MAP","{'Resource name': 'hostname', 'Type': 'type', 'Facility': 'facility_name','Testbed': 'testbed_name', 'Available':'available'}")
        
         # Columns checked by default in Columns_selector plugin
-        query_default_fields = ['hostname', 'type', 'facility_name', 'testbed_name', 'boot_state']
+        query_default_fields = ['hostname', 'type', 'facility_name', 'testbed_name', 'available']
 
         QUERYTABLE_MAP = { 
             'hostname'      :   'Resource name',
             'type'          :   'Type',
             'facility_name' :   'Facility',
             'testbed_name'  :   'Testbed',
-            'boot_state'    :   'Status',
+            'available'     :   'Available',
         }
 
 
@@ -239,6 +240,20 @@ class SliceResourceView (LoginRequiredView, ThemeView):
             query_lease = sq_lease,
         )
 
+        # --------------------------------------------------------------------------
+        # LEASES Asap Scheduler
+        # Select an end_time for all unconfigured resources
+        # start_time is as soon as possible
+
+        #resources_as_asap = AsapPlugin( 
+        #    page       = page,
+        #    domid      = 'asap',
+        #    title      = 'Asap',
+        #    # this is the query at the core of the slice list
+        #    query = sq_resource,
+        #    query_lease = sq_lease,
+        #)
+
         # --------------------------------------------------------------------------
         # QueryUpdater (Pending Operations)
  
@@ -429,6 +444,7 @@ class SliceResourceView (LoginRequiredView, ThemeView):
 
         template_env['map_resources'] = map_resources.render(self.request)
         template_env['scheduler'] = resources_as_scheduler2.render(self.request)
+        #template_env['asap'] = resources_as_asap.render(self.request)
 
         # Bristol plugin
        # template_env['welcome'] = univbriswelcome.render(self.request)
index cc20df2..79471d2 100644 (file)
@@ -31,85 +31,91 @@ class ExperimentView (FreeAccessView, ThemeView):
   
         username = self.request.user    
         
-        query_current_resources = Query.get('slice').select('resource','parent_authority').filter_by('slice_hrn','==',slicename)
-        current_resources = execute_query(request, query_current_resources)
+        pf_query = Query().get('local:platform').filter_by('disabled', '==', '0').filter_by('gateway_type', '==', 'sfa').select('platform')
+        res_platforms = execute_query(request, pf_query)
+        platforms = [p['platform'] for p in res_platforms]
+        len_platforms = len(platforms)
+        #query_current_resources = Query.get('slice').select('resource','parent_authority').filter_by('slice_hrn','==',slicename)
+        #current_resources = execute_query(request, query_current_resources)
 
-        parent_authority = current_resources[0]['parent_authority']
-        
-        split_slicename = slicename.split('.')
-        ple_slicename = hash_loginbase(parent_authority) + '_' + split_slicename[-1]
+        #parent_authority = current_resources[0]['parent_authority']
+        #
+        #split_slicename = slicename.split('.')
+        #ple_slicename = hash_loginbase(parent_authority) + '_' + split_slicename[-1]
 
-        ple_resource_list=[]
-        nitos_resource_list=[]
-        nitos_paris_resource_list=[]
-        iotlab_resource_list=[]
-        try:
-            for resources in current_resources:
-                list_res = resources['resource']
-                for res in list_res:
-                    split_list = res.split('+') # split the resource urn
-                    if [s for s in split_list if 'ple' in s]: # find ple resources
-                        res_hrn = split_list[-1] # last element is resource hrn
-                        ple_resource_list.append(res_hrn)
-                    if [s for s in split_list if 'omf:paris.fit-nitos.fr' in s]: # find nitos_paris resources
-                        res_hrn = split_list[-1] # last element is resource hrn
-                        nitos_paris_resource_list.append(res_hrn)
-                    if [s for s in split_list if 'iotlab' in s]: # find iotlab resources
-                        res_hrn = split_list[-1] # last element is resource hrn
-                        iotlab_resource_list.append(res_hrn)
-                    if [s for s in split_list if 'omf:nitos.indoor' in s]: # find nitos_indoor resources
-                        res_hrn = split_list[-1] # last element is resource hrn
-                        nitos_resource_list.append(res_hrn)
-                    if [s for s in split_list if 'omf:nitos.outdoor' in s]: # find nitos_outdoor resources
-                        res_hrn = split_list[-1] # last element is resource hrn
-                        nitos_resource_list.append(res_hrn)
+        #ple_resource_list=[]
+        #nitos_resource_list=[]
+        #nitos_paris_resource_list=[]
+        #iotlab_resource_list=[]
+        #try:
+        #    for resources in current_resources:
+        #        list_res = resources['resource']
+        #        for res in list_res:
+        #            split_list = res.split('+') # split the resource urn
+        #            if [s for s in split_list if 'ple' in s]: # find ple resources
+        #                res_hrn = split_list[-1] # last element is resource hrn
+        #                ple_resource_list.append(res_hrn)
+        #            if [s for s in split_list if 'omf:paris.fit-nitos.fr' in s]: # find nitos_paris resources
+        #                res_hrn = split_list[-1] # last element is resource hrn
+        #                nitos_paris_resource_list.append(res_hrn)
+        #            if [s for s in split_list if 'iotlab' in s]: # find iotlab resources
+        #                res_hrn = split_list[-1] # last element is resource hrn
+        #                iotlab_resource_list.append(res_hrn)
+        #            if [s for s in split_list if 'omf:nitos.indoor' in s]: # find nitos_indoor resources
+        #                res_hrn = split_list[-1] # last element is resource hrn
+        #                nitos_resource_list.append(res_hrn)
+        #            if [s for s in split_list if 'omf:nitos.outdoor' in s]: # find nitos_outdoor resources
+        #                res_hrn = split_list[-1] # last element is resource hrn
+        #                nitos_resource_list.append(res_hrn)
 
 
-        except Exception as e:
-            logger.error("Exception in slicetabexperiment.py in OneLab resource search {}".format(e))
-        
-        #logger.debug("list of ple res hrns")
-        #logger.debug(ple_resource_list)
-        #logger.debug("list of nit_paris res hrns")
-        #logger.debug(nitos_paris_resource_list)
-        #logger.debug("list of iotLab res hrns")
-        #logger.debug(iotlab_resource_list)
-        #logger.debug("list of nitos res hrns")
-        #logger.debug(nitos_resource_list)
+        #except Exception as e:
+        #    logger.error("Exception in slicetabexperiment.py in OneLab resource search {}".format(e))
+        #
+        ##logger.debug("list of ple res hrns")
+        ##logger.debug(ple_resource_list)
+        ##logger.debug("list of nit_paris res hrns")
+        ##logger.debug(nitos_paris_resource_list)
+        ##logger.debug("list of iotLab res hrns")
+        ##logger.debug(iotlab_resource_list)
+        ##logger.debug("list of nitos res hrns")
+        ##logger.debug(nitos_resource_list)
 
-        all_users = list() 
-        #get all  iotlab users
-        all_users = list() 
-        try:
-            engine = ConfigEngine()
-            userData = "Basic " + (engine.iotlab_admin_user() + ":" + engine.iotlab_admin_password()).encode("base64").rstrip()
-            req = urllib2.Request(engine.iotlab_url())
-            req.add_header('Accept', 'application/json')
-            req.add_header("Content-type", "application/x-www-form-urlencoded")
-            req.add_header('Authorization', userData)
-            # make the request and print the results
-            res = urllib2.urlopen(req)
-            all_users = json.load(res) 
-        except urllib2.URLError as e:
-            logger.error("There is a problem in getting iotlab users {}".format(e.reason))
+        #all_users = list() 
+        ##get all  iotlab users
+        #all_users = list() 
+        #try:
+        #    engine = ConfigEngine()
+        #    userData = "Basic " + (engine.iotlab_admin_user() + ":" + engine.iotlab_admin_password()).encode("base64").rstrip()
+        #    req = urllib2.Request(engine.iotlab_url())
+        #    req.add_header('Accept', 'application/json')
+        #    req.add_header("Content-type", "application/x-www-form-urlencoded")
+        #    req.add_header('Authorization', userData)
+        #    # make the request and print the results
+        #    res = urllib2.urlopen(req)
+        #    all_users = json.load(res) 
+        #except urllib2.URLError as e:
+        #    logger.error("There is a problem in getting iotlab users {}".format(e.reason))
        
 
-        #getting the login from email
-        #initial value  no-account == contact_admin
-        iot_login = 'contact_admin'
-        username = str(username)
-        for user in all_users:
-            if user['email'] == username:
-                iot_login = user['login']
+        ##getting the login from email
+        ##initial value  no-account == contact_admin
+        #iot_login = 'contact_admin'
+        #username = str(username)
+        #for user in all_users:
+        #    if user['email'] == username:
+        #        iot_login = user['login']
         env = { 'theme' : self.theme,
                 'slicename':slicename, 
-                'ple_slicename':ple_slicename, 
-                'username':username, 
-                'ple_resources':ple_resource_list, 
-                'nitos_resources': nitos_resource_list, 
-                'nitos_paris_resources':nitos_paris_resource_list, 
-                'iotlab_resources':iotlab_resource_list, 
-                'iot_login':iot_login,
+                'platforms':platforms,
+                'len_platforms': len_platforms,
+                #'ple_slicename':ple_slicename, 
+                #'username':username, 
+                #'ple_resources':ple_resource_list, 
+                #'nitos_resources': nitos_resource_list, 
+                #'nitos_paris_resources':nitos_paris_resource_list, 
+                #'iotlab_resources':iotlab_resource_list, 
+                #'iot_login':iot_login,
                 'request':self.request,
               }
         return render_to_response(self.template, env, context_instance=RequestContext(request))
index 712c723..ecc97e3 100644 (file)
@@ -36,6 +36,14 @@ h4 {
     letter-spacing:0.6pt;
     color:#201E62;
 }
+div.slogan {
+    margin-left: 0px;
+}
+div.login-widget{
+    width:400px; 
+    top:16px; 
+    float:left;
+}
 label {
     font-weight:normal;
     font-size:13px;
@@ -746,6 +754,7 @@ div.experiment-tools button {
     padding:7px 10px 4px 0;
     color:white;
     vertical-align:middle;
+    height: 35px;
 }
 
 div.experiment-tools button span {
index e7c200a..8715561 100644 (file)
@@ -1,3 +1,5 @@
+@import url("../fonts/opensans_bold_macroman/stylesheet.css");
+
 .myslice-message {
     position:relative;
     left:-491px;
@@ -6,3 +8,894 @@
     box-shadow: 10px 10px 5px #888888;
     margin-bottom: 15px;
 }
+
+html { height: 100% }
+
+body {
+    background-color:white;
+    color:black;
+    margin:0;
+    padding:0;
+    height: 100%;
+    letter-spacing:0.3px;
+}
+
+p.command {
+    padding:15px;
+    margin:15px 0;
+    color:#890000;
+    background-color:#E0E0E0; 
+    font-family:Courier, monospace;
+}
+h1 {
+    border-bottom:1px solid #DDDDDD;
+    padding:0 0 0 0;
+    margin:15px 0 15px 0;
+    font-size:14pt;
+}
+h1 img {
+    vertical-align:middle;
+    margin-bottom:4px;
+    margin-right:10px;
+}
+h2 {
+    margin:0 0 15px 0;
+    font-size:14pt;
+    color:#333333;
+}
+h3 {
+    margin:0 0 5px 0;
+    font-size:13pt;
+    color:#201E62;
+}
+h4 {
+    margin:0 0 5px 0;
+    font-size:12pt;
+    color:#333333;
+}
+label {
+    font-weight:normal;
+    font-size:13px;
+    color:#201E62;
+}
+.sublabel {
+    color:gray;
+    font-style:italic;
+    font-weight:normal;
+}
+span.subtitle {
+    color:#454545;
+    font-size:9pt;
+    font-weight:normal;
+    text-transform:uppercase;
+}
+span.small {
+    font-size:9pt;
+}
+span.gray {
+    color:gray;
+}
+span.type {
+    color:#201E62;
+    font-weight:bold;
+    font-size:9pt;
+}
+span.htitle {
+    color:#454545;
+    font-size:9pt;
+    font-weight:normal;
+}
+span.version {
+    font-size:8pt;
+    color:#888888;
+}
+input[type=checkbox] {
+  min-width:5px !important;
+  margin-left:0 !important;
+}
+input[type=text], input[type=password], input[type=email], input[type=tel], input[type=number], select, option {
+    min-width:260px;
+    padding:6px;
+    border:1pt solid #22606D;
+    vertical-align:bottom;
+    border-radius:0;
+}
+
+textarea {
+    padding:6px;
+    border:1pt solid #22606D !important;
+    border-radius:0 !important;
+}
+
+span.label {
+    font-size:11pt;
+    color:gray;
+    font-weight:normal;
+    padding:0;
+}
+div.el {
+    padding-bottom:15px;
+}
+div.breadcrumbs {
+    margin:15px 0;
+    color:gray;
+    font-size:10pt;
+}
+div.breadcrumbs a {
+    color:gray;
+}
+div.breadcrumbs a:hover {
+    text-decoration:underline;
+}
+.tab-pane {
+    padding-top:15px;
+}
+/* buttons */
+button.btn, input.btn {
+    padding:6px 10px;
+    border-radius:5px;
+    font-size:10pt;
+    font-weight:normal;
+}
+button.btn span.glyphicon {
+    margin-right:6px;
+}
+button.btn-default {
+    border-bottom:3px solid #cccccc;
+}
+button.btn-default:hover {
+    background-color:white;
+    border:1px solid #ADADAD;
+    border-bottom:3px solid #ADADAD;
+}
+button.btn-default:active {
+    background-color:white;
+    border:1px solid #ADADAD;
+    border-bottom:1px solid #ADADAD;
+    margin-top:2px;
+    box-shadow:none;
+}
+button.btn-primary {
+    border-bottom:3px solid #3071A9;
+}
+button.btn-primary:hover {
+    box-shadow:none;
+    background-color:#428bca;
+    border:1px solid #357ebd;
+    border-bottom:3px solid #3071A9;
+}
+button.btn-primary:active {
+    box-shadow:none;
+    border-bottom:1px solid #3071A9;
+    margin-top:2px;
+}
+button.btn-danger {
+    border-bottom:3px solid #A13F3A;
+}
+button.btn-danger:hover {
+    box-shadow:none;
+    background-color:#d9534f;
+    border:1px solid #d43f3a;
+    border-bottom:3px solid #A13F3A;
+}
+button.btn-danger:active {
+    border:1px solid #d43f3a;
+    box-shadow:none;
+    margin-top:2px;
+}
+button.btn-onelab, input.btn-onelab {
+    border:0;
+    border-bottom:3px solid #4cae4c;
+    background-color:#5cb85c;
+    color:white;
+    width: 150px;
+    height: 30px;
+}
+button.btn-onelab:hover, input.btn-onelab:hover {
+    border:0;
+    border-bottom:3px solid #47a447;
+    background-color:#398439;
+    color:white;
+}
+button.btn-onelab:active, input.btn-onelab:active {
+    box-shadow:none;
+    border-bottom:1px solid #760073;
+    margin-top:2px;
+}
+
+.container-resource button {
+    padding:2px 4px;
+    border-radius:3px;
+    font-size:9pt;
+    font-weight:normal;
+}
+.container-resource select,.container-resource option, .container-resource input {
+    padding:2px 4px;
+    font-size:9pt;
+}
+.badge {
+    font-size:9pt;
+    margin-left:4px;
+}
+/***** Notifications *****/
+.warning {
+    border: 1px solid red;
+    margin: 20px 60px;
+    padding: 10px 20px;
+    color: red;
+    background-color: #f2dbdb;
+    text-align: center;
+}
+div#menu-slice-list{
+    display:none;
+    position:absolute;
+    background-color:orange;
+    padding:15px;
+    left:-15px;
+    z-index:10;
+}
+div.dashboard div.projects-tree {
+    margin-left:49px;
+}
+/* HOME DASHBOARD */
+div#home-dashboard {
+    color:black;
+    margin:0 auto 25px auto;
+}
+div#home-dashboard table {
+    margin:25px;
+    width:100%;
+}
+div#home-dashboard table td {
+    text-align:center;
+    padding:15px 0;
+    width:33%;
+}
+div#home-dashboard table tr:first-child td {
+    font-size:12pt;
+    font-weight:bold;
+    color:#270A5A;
+}
+div#home-dashboard table tr:last-child td {
+    vertical-align:top;
+    padding:25px 0;
+}
+div#home-dashboard table tr:last-child td.logged-in {
+    border-right:1px solid #DDDDDD;
+    padding:25px;
+}
+div#home-dashboard table tr:last-child td.support {
+    border-left:1px solid #DDDDDD;
+    padding:25px;
+}
+div#home-dashboard table tr:last-child td:first-child {
+}
+div#home-dashboard table tr:last-child td:last-child {
+    border-right:0;
+}
+div#home-dashboard table tr:last-child td.logged-in div {
+    text-align:left;
+    padding:25px 0;
+}
+div#home-dashboard table tr:last-child td.support div {
+    text-align:left;
+    padding:25px 0;
+}
+div#home-dashboard div.login-widget {
+    padding:20px;
+}
+div#home-dashboard table td.support {
+}
+div#home-dashboard table td.support a {
+}
+div#home-dashboard table td.support a:hover {
+    text-decoration:none;
+}
+
+div#home-dashboard div#manager {
+    display:none;
+}
+
+div#home-dashboard div#home-slice-list {
+    margin:25px 0;
+    padding:0 25px;
+    text-align:left;
+}
+div#home-dashboard div#home-slice-list ul {
+    list-style: none;
+    padding:0;
+    margin:0;
+}
+div#home-dashboard div#home-slice-list li {
+    
+}
+
+/**/
+
+/**/
+/* WELL */
+div.well {
+}
+/**/
+/* TABLE */
+table.table {
+    margin:0;
+}
+table.table thead {
+    padding:0;
+}
+table.table tbody {
+    padding:0;
+}
+table.table tr {
+    padding:0;
+}
+table.table td {
+    padding:0;
+}
+/* INSTITUTION */
+div#institution {
+    color:black;
+}
+.form-hint {
+    font-size:11pt;
+    font-style:italic;
+    color:gray;
+}
+
+
+.form-hint {
+    font-size:11pt;
+    font-style:italic;
+    color:gray;
+}
+
+
+
+/* TICKET REQUEST */
+div#ticket-request {
+    color:black;
+}
+.form-hint {
+    font-size:11pt;
+    font-style:italic;
+    color:gray;
+}
+div#ticket-request p {
+    margin:20px 0;
+}
+
+ul.nav-tabs {
+    margin:0 0 15px 0;
+}
+ul.nav-tabs ul {}
+ul.nav-tabs li {}
+
+ul.nav-section li a {
+    color:black;
+    border-bottom:0;
+}
+ul.nav-section li:first-child {
+    padding:0;
+}
+ul.nav-section li:first-child a {
+}
+ul.nav-section li:first-child.active a {
+}
+
+ul.nav-resources {
+    margin:15px 0;
+}
+ul.nav-resources a {
+    padding: 4px 10px 5px 10px;
+}
+
+/* SLICE VIEW */
+div.container-resource, div.container-slice {
+    padding-right:15px;
+    padding-left:15px;
+}
+.table th {
+    border-top:0 !important;
+}
+div#slice-view {
+    margin:0;
+}
+
+div.sl-filter-facilities {
+    padding:0 5px;
+}
+div.sl-filter-facilities h4 {
+    margin-bottom:15px;
+    
+}
+img.sl-image {
+    margin:0 5px 5px 0;
+    padding:0;
+    vertical-align:middle;
+}
+a.sl-facility {
+    color:gray;
+    text-decoration:none;
+}
+a.sl-facility:hover {
+    color:#342961;
+}
+a.sl-facility.active {
+    color:black;
+    text-decoration:none;
+}
+a.sl-facility::before {
+    content: " ";
+}
+div.sl-facilities {
+    border-bottom:#CCCCCC 1px solid;
+    padding-bottom:15px;
+    margin-bottom:15px;
+}
+div.sl-facilities:last-child {
+    border:0;
+}
+a.sl-testbed {
+    color:gray;
+    text-decoration:none;
+    margin-left:25px;
+    margin-bottom:5px;
+}
+a.sl-testbed:hover {
+    color:#342961;
+}
+a.sl-testbed.active {
+    color:black;
+}
+div.sl-filter-resources {
+    margin:0 0 10px 0;
+    text-align:center;
+}
+span.sl-resources {
+    font-size:9pt;
+    color:gray;
+}
+a.sl-resources {
+    font-size:9pt;
+    border:0;
+    padding:2px 8px;
+    margin:0 5px;
+    -moz-border-radius: 2px;
+    border-radius: 2px;
+    text-align: center;
+}
+a.sl-resources.active, a.sl-resources.active:hover, a.sl-resources.active:focus {
+    border:0;
+    padding:2px 8px;
+    -moz-border-radius: 2px;
+    border-radius: 2px;
+    background-color:#E7A6E7;
+    color:#000000;
+}
+a.sl-resources:first-child {
+}
+button.btn-apply {
+    font-size:13px;
+    padding:2px 8px;
+    margin:0 5px;
+    -moz-border-radius: 2px;
+    border-radius: 2px;
+    text-align: center;
+}
+div#slice-info {
+    margin-top:25px;
+}
+div#slice-info table {
+    width:100%;
+    margin:0 auto;
+}
+div#slice-info table td:first-child {
+    text-align:right;
+    font-weight:bold;
+    padding-right:15px;
+}
+div#slice-info td {
+    padding:5px;
+}
+
+/* SLICE VIEW sections */
+.slice-sections, .slice-pending {
+    margin:0;
+    padding:0;
+}
+.slice-sections ul, .slice-pending ul {
+    margin:0;
+    padding:0;
+}
+.slice-pending ul {
+    width:400px;
+    margin:0 auto 15px auto;
+}
+.slice-sections li {
+    text-align:left;
+    margin:0;
+    padding:0;
+}
+.slice-pending li {
+    padding-right:15px;
+}
+.slice-sections li a, .slice-pending li a {
+    font-size:14px;
+    color:black;
+    padding:0;
+}
+.slice-sections li.active a, .slice-pending li.active a  {
+    color:#201E62;
+    background-color:#EFEFEF;
+    text-decoration:underline;
+    padding:0;
+}
+.slice-sections ul.nav-pills li a:hover, .slice-pending ul.nav-pills li a:hover {
+    text-decoration:underline;
+    background-color:#EFEFEF;
+    color:black;
+}
+.slice-sections ul.nav-pills li.active, .slice-pending ul.nav-pills li.active {
+
+}
+.slice-sections li:first-child, .slice-sections li:first-child a {
+    color:#201E62;
+    font-weight:bold;
+}
+.slice-experiment {
+    text-align:right;
+    padding:0;
+}
+.slice-experiment button {
+    margin:3px 0 0 0;
+    background-color:#CC4125;
+    color:white;
+}
+
+.slice-pending {
+}
+.slice-pending button {
+    font-size:9pt;
+    margin:-2px 0 0 0;
+    padding:3px 5px;
+}
+.slice-pending button.apply {
+    font-size:14px;
+    padding:2px 5px;
+}
+.slice-pending button.clear {
+}
+tr.active, tr.active td {
+    background-color:#FFFFCC !important;
+}
+div.dataTables_filter label{
+    float:left;
+    width:400px;
+}
+
+/* HEADER */
+
+
+.header {
+  -moz-box-shadow:    0 0 1px rgba(82,82,82,0.6);
+  -webkit-box-shadow: 0 0 1px rgba(82,82,82,0.6);
+  box-shadow:         0 0 1px rgba(82,82,82,0.6);
+  height:61px;
+  background-color:white;
+}
+
+div.navigation {
+    
+}
+div.navigation ul {
+    margin:26px 0 0 0;
+    padding:0;
+    display: inline-block;
+    list-style-type: none;
+    white-space: nowrap;
+}
+
+div.navigation li {
+    color:#0C0047;
+    font-family:open_sansbold, sans-serif;
+    font-size:9pt;
+    font-weight:normal;
+    line-height:0.8em;
+    letter-spacing:0.4pt;
+    list-style:none;
+    float:left;
+    padding:0 15px;
+    margin:0;
+    text-transform:uppercase;
+}
+div.navigation li:hover {
+}
+div.navigation li a {
+    color:#0C0047;
+}
+div.navigation li a:hover, div.navigation li a.current {
+    color:#760073;
+    text-decoration:none;
+}
+
+div.navigation li:last-child {
+    margin-right:0;
+}
+
+
+div.navigation .dropdown-menu {
+    color:black;
+    -moz-box-shadow:    1px 1px 0px 0 rgba(58, 48, 100,0.8);
+    -webkit-box-shadow: 1px 1px 0px 0 rgba(58, 48, 100,0.8);
+    box-shadow:         1px 1px 0px 0 rgba(58, 48, 100,0.8);
+    border-radius:2px;
+    padding:0 5px 5px 5px;
+    margin-top:5px;
+    margin-left:20px;
+}
+div.navigation .dropdown-menu ul {
+    margin:0;
+    padding:15px 5px 5px 5px;
+    display:list-item;
+}
+div.navigation .dropdown-menu li {
+    margin:0 10px 0 0;
+    padding:0 0 8px 0;
+    display:list-item;
+    float:none;
+    text-transform: none;
+}
+
+div.navigation .dropdown-menu a {
+    font-family:Helvetica,sans-serif;
+    font-size:10pt;
+    color:black;
+}
+div.navigation .dropdown-menu li.title {
+    margin-bottom:10px;
+}
+div.navigation .dropdown-menu li.title a {
+    font-family:open_sansbold, sans-serif;
+}
+
+
+div.navigation .dropdown-menu li:first-child {
+    border-bottom:1px solid white;
+    padding-bottom:5px;
+     
+}
+
+div.secondary {
+    text-align:right;
+}
+
+div.secondary ul {
+   margin:6px 0 0 0;
+   padding:0;
+}
+
+div.secondary li {
+    font-size:9pt;
+    display:inline;
+    list-style:none;
+    margin:0px;
+    padding:0;
+    margin-right:15px;
+    color:#747474;
+    letter-spacing:0.4px;
+}
+div.secondary li:last-child {
+    margin-right:0;
+}
+div.secondary li a {
+    color:#747474;
+}
+div.secondary li a:hover {
+    text-decoration:underline;
+}
+div.secondary .button {    
+    width:300px;
+    margin-top:15px;
+}
+div.secondary .account {
+    margin-top:10px;
+    padding:0;
+    font-size:9pt;
+    color:gray;
+    text-align:right;
+}
+div.secondary .account span {
+    font-size:8pt;
+}
+div.secondary .account a {
+    color:black;
+}
+
+
+div.footer {
+    padding-top:15px;
+}
+div.footer div.bottom {
+    position:absolute;
+    bottom:0;
+}
+div.footer ul {
+   margin:6px 0 0 0;
+   padding:0;
+}
+
+div.footer li {
+    font-size:9pt;
+    display:inline;
+    list-style:none;
+    margin:0px;
+    padding:0;
+    margin-right:15px;
+    color:#747474;
+    letter-spacing:0.4px;
+}
+
+div.footer li a {
+    color:#747474;
+}
+div.footer li a:hover {
+    text-decoration:underline;
+}
+div.copy {
+    font-size:8pt;
+    color:gray;
+    padding-top:15px;
+    padding-bottom:15px;
+}
+
+div.home {
+    font-size:11pt;
+    line-height:1.2em;
+    letter-spacing:0.3pt;
+    min-height:500px;
+    padding:100px 0;
+}
+div.home h2 {
+    color:white;
+    line-height:1.2em;
+    font-size:18pt;
+}
+div.home h3 {
+    color:white;
+    line-height:1.4em;
+}
+/*
+div.dashboard {
+    text-align:center;
+}
+div.dashboard div {
+    margin:25px 0;
+}
+div.dashboard ul {
+    text-align:left;
+    margin-left:24px;
+    list-style:none;
+}
+div.home {
+    padding-top:50px;
+}
+div.home h1 {
+    font-size:22pt;
+    border:0;
+}
+div.home h3, div.home h4 {
+    color:#424242;
+    line-height:1.4em;
+}
+
+div.home h3 a {
+    color:#FD6D2C;
+}*/
+div.dashboard {
+}
+div.dashboard a {
+    color:#206090;
+}
+
+div.dashboard a:hover {
+    text-decoration:underline;
+}
+div.dashboard div.projects-tree {
+    margin-left:49px;
+}
+div.dashboard ul {
+    list-style-type:disc;
+    list-style-position:inside;
+    text-align:left;
+    margin:0 0 15px 0;
+    padding:0;
+    
+}
+div.dashboard ul ul {
+    margin:5px 0 15px 25px;
+    list-style:none;
+}
+div.dashboard li {
+    margin:0 0 5px 0;
+    padding:0;
+}
+div.dashboard ul ul li {
+    margin:0;
+}
+div.dashboard ul ul a {
+}
+div.dashboard h3 {
+    border-bottom:1px solid #E0E0E0;
+    margin-right:15px;
+    margin-bottom:25px;
+}
+div.dashboard h3 a {
+     color:#201E62;
+}
+div.dashboard h3 img {
+    margin:15px 15px 15px 0;
+}
+div.dashboard span.glyphicon {
+    text-align:center;
+    width:45px;
+    height:25px;
+}
+div.dashboard-create-slice {
+    display:none;
+}
+
+div.registration-form {
+    padding-top:150px;
+    text-align:center;
+}
+div.registration-form {
+    padding-top:150px;
+    text-align:center;
+}
+
+.login-form input {
+    width:320px;
+}
+.login-form input[type=submit] {
+    width:108px;
+}
+
+.login-submit {
+    vertical-align:middle;
+    padding:0;
+}
+
+th {
+    border:0 !important;
+}
+
+div.monitor {
+    padding:40px 0 25px 0;
+}
+div.monitor h1 {
+    margin-bottom:25px;
+}
+div.s-monitor {
+    padding-bottom:25px;
+}
+span#stats-period-txt {
+    text-transform:lowercase;
+}
+
+// resource info modal
+a.resource-info:hover {
+    cursor:pointer;
+}
+table.modal-resource-info tr td:first-child {
+    font-weight:bold;
+    text-align:right;
+}
+table.modal-resource-info tr:first-child td {
+    border-top:0;
+    text-align:center;
+}
+table.modal-resource-info tr:last-child td {
+    border-bottom:0;
+    text-align:center;
+}
index ac35d43..c644247 100644 (file)
-@import url("../fonts/opensans_bold_macroman/stylesheet.css");
-
-html { height: 100% }
-
-body {
-    background-color:white;
-    color:black;
-    margin:0;
-    padding:0;
-    height: 100%;
-    letter-spacing:0.3px;
-}
-a, a:active, a:focus {
-    outline: 0;
-    text-decoration:none;
-    color:#760073;
-}
-a:hover {
-    color:#0D0049;
-}
-
-a.current {
-    text-decoration:underline;
-    color:#333333;
-}
-p.command {
-    padding:15px;
-    margin:15px 0;
-    color:#890000;
-    background-color:#E0E0E0; 
-    font-family:Courier, monospace;
-}
-h1 {
-    border-bottom:1px solid #DDDDDD;
-    padding:0 0 0 0;
-    margin:15px 0 15px 0;
-    font-size:14pt;
-}
-h1 img {
-    vertical-align:middle;
-    margin-bottom:4px;
-    margin-right:10px;
-}
-h2 {
-    margin:0 0 15px 0;
-    font-size:14pt;
-    color:#333333;
-}
-h3 {
-    margin:0 0 5px 0;
-    font-size:13pt;
-    color:#201E62;
-}
-h4 {
-    margin:0 0 5px 0;
-    font-size:12pt;
-    color:#333333;
-}
-label {
-    font-weight:normal;
-    font-size:13px;
-    color:#201E62;
-}
-.sublabel {
-    color:gray;
-    font-style:italic;
-    font-weight:normal;
-}
-span.subtitle {
-    color:#454545;
-    font-size:9pt;
-    font-weight:normal;
-    text-transform:uppercase;
-}
-span.small {
-    font-size:9pt;
-}
-span.gray {
-    color:gray;
-}
-span.type {
-    color:#201E62;
-    font-weight:bold;
-    font-size:9pt;
-}
-span.htitle {
-    color:#454545;
-    font-size:9pt;
-    font-weight:normal;
-}
-span.version {
-    font-size:8pt;
-    color:#888888;
-}
-input[type=checkbox] {
-  min-width:5px !important;
-  margin-left:0 !important;
-}
-input[type=text], input[type=password], input[type=email], input[type=tel], input[type=number], select, option {
-    min-width:260px;
-    padding:6px;
-    border:1pt solid #22606D;
-    vertical-align:bottom;
-    border-radius:0;
-}
-
-textarea {
-    padding:6px;
-    border:1pt solid #22606D !important;
-    border-radius:0 !important;
-}
-
-span.label {
-    font-size:11pt;
-    color:gray;
-    font-weight:normal;
-    padding:0;
-}
-div.el {
-    padding-bottom:15px;
-}
-div.breadcrumbs {
-    margin:15px 0;
-    color:gray;
-    font-size:10pt;
-}
-div.breadcrumbs a {
-    color:gray;
-}
-div.breadcrumbs a:hover {
-    text-decoration:underline;
-}
-.tab-pane {
-    padding-top:15px;
-}
-/* buttons */
-button.btn, input.btn {
-    padding:6px 10px;
-    border-radius:5px;
-    font-size:10pt;
-    font-weight:normal;
-}
-button.btn span.glyphicon {
-    margin-right:6px;
-}
-button.btn-default {
-    border-bottom:3px solid #cccccc;
-}
-button.btn-default:hover {
-    background-color:white;
-    border:1px solid #ADADAD;
-    border-bottom:3px solid #ADADAD;
-}
-button.btn-default:active {
-    background-color:white;
-    border:1px solid #ADADAD;
-    border-bottom:1px solid #ADADAD;
-    margin-top:2px;
-    box-shadow:none;
-}
-button.btn-primary {
-    border-bottom:3px solid #3071A9;
-}
-button.btn-primary:hover {
-    box-shadow:none;
-    background-color:#428bca;
-    border:1px solid #357ebd;
-    border-bottom:3px solid #3071A9;
-}
-button.btn-primary:active {
-    box-shadow:none;
-    border-bottom:1px solid #3071A9;
-    margin-top:2px;
-}
-button.btn-danger {
-    border-bottom:3px solid #A13F3A;
-}
-button.btn-danger:hover {
-    box-shadow:none;
-    background-color:#d9534f;
-    border:1px solid #d43f3a;
-    border-bottom:3px solid #A13F3A;
-}
-button.btn-danger:active {
-    border:1px solid #d43f3a;
-    box-shadow:none;
-    margin-top:2px;
-}
 button.btn-onelab, input.btn-onelab {
-    border:0;
-    border-bottom:3px solid #760073;
+    border-bottom-color: #302562;
     background-color:#302562;
     color:white;
 }
 button.btn-onelab:hover, input.btn-onelab:hover {
-    border:0;
-    border-bottom:3px solid #760073;
-    background-color:#302562;
+    border-bottom-color:#760073;
+    background-color:#760073;
     color:white;
 }
-button.btn-onelab:active, input.btn-onelab:active {
-    box-shadow:none;
-    border-bottom:1px solid #760073;
-    margin-top:2px;
-}
-
-.container-resource button {
-    padding:2px 4px;
-    border-radius:3px;
-    font-size:9pt;
-    font-weight:normal;
-}
-.container-resource select,.container-resource option, .container-resource input {
-    padding:2px 4px;
-    font-size:9pt;
-}
-.badge {
-    font-size:9pt;
-    margin-left:4px;
-}
-/***** Notifications *****/
-.warning {
-    border: 1px solid red;
-    margin: 20px 60px;
-    padding: 10px 20px;
-    color: red;
-    background-color: #f2dbdb;
-    text-align: center;
-}
-div#menu-slice-list{
-    display:none;
-    position:absolute;
-    background-color:orange;
-    padding:15px;
-    left:-15px;
-    z-index:10;
-}
-div.dashboard div.projects-tree {
-    margin-left:49px;
-}
-/* HOME DASHBOARD */
-div#home-dashboard {
-    color:black;
-    margin:0 auto 25px auto;
-}
-div#home-dashboard table {
-    margin:25px;
-    width:100%;
-}
-div#home-dashboard table td {
-    text-align:center;
-    padding:15px 0;
-    width:33%;
-}
-div#home-dashboard table tr:first-child td {
-    font-size:12pt;
-    font-weight:bold;
-    color:#270A5A;
-}
-div#home-dashboard table tr:last-child td {
-    vertical-align:top;
-    padding:25px 0;
-}
-div#home-dashboard table tr:last-child td.logged-in {
-    border-right:1px solid #DDDDDD;
-    padding:25px;
-}
-div#home-dashboard table tr:last-child td.support {
-    border-left:1px solid #DDDDDD;
-    padding:25px;
-}
-div#home-dashboard table tr:last-child td:first-child {
-}
-div#home-dashboard table tr:last-child td:last-child {
-    border-right:0;
-}
-div#home-dashboard table tr:last-child td.logged-in div {
-    text-align:left;
-    padding:25px 0;
-}
-div#home-dashboard table tr:last-child td.support div {
-    text-align:left;
-    padding:25px 0;
-}
-div#home-dashboard div.login-widget {
-    padding:20px;
-}
-div#home-dashboard table td.support {
-}
-div#home-dashboard table td.support a {
-}
-div#home-dashboard table td.support a:hover {
-    text-decoration:none;
-}
-
-div#home-dashboard div#manager {
-    display:none;
-}
-
-div#home-dashboard div#home-slice-list {
-    margin:25px 0;
-    padding:0 25px;
-    text-align:left;
-}
-div#home-dashboard div#home-slice-list ul {
-    list-style: none;
-    padding:0;
-    margin:0;
-}
-div#home-dashboard div#home-slice-list li {
-    
-}
-
-/**/
-
-/**/
-/* WELL */
-div.well {
-}
-/**/
-/* TABLE */
-table.table {
-    margin:0;
-}
-table.table thead {
-    padding:0;
-}
-table.table tbody {
-    padding:0;
-}
-table.table tr {
-    padding:0;
-}
-table.table td {
-    padding:0;
-}
-/* INSTITUTION */
-div#institution {
-    color:black;
-}
-.form-hint {
-    font-size:11pt;
-    font-style:italic;
-    color:gray;
-}
-
-
-.form-hint {
-    font-size:11pt;
-    font-style:italic;
-    color:gray;
-}
-
-
-
-/* TICKET REQUEST */
-div#ticket-request {
-    color:black;
-}
-.form-hint {
-    font-size:11pt;
-    font-style:italic;
-    color:gray;
-}
-div#ticket-request p {
-    margin:20px 0;
-}
-
-ul.nav-tabs {
-    margin:0 0 15px 0;
-}
-ul.nav-tabs ul {}
-ul.nav-tabs li {}
-
-ul.nav-section li a {
-    color:black;
-    border-bottom:0;
-}
-ul.nav-section li:first-child {
-    padding:0;
-}
-ul.nav-section li:first-child a {
-}
-ul.nav-section li:first-child.active a {
-}
-
-ul.nav-resources {
-    margin:15px 0;
-}
-ul.nav-resources a {
-    padding: 4px 10px 5px 10px;
-}
-
-/* SLICE VIEW */
-div.container-resource, div.container-slice {
-    padding-right:15px;
-    padding-left:15px;
-}
-.table th {
-    border-top:0 !important;
-}
-div#slice-view {
-    margin:0;
-}
-
-div.sl-filter-facilities {
-    padding:0 5px;
-}
-div.sl-filter-facilities h4 {
-    margin-bottom:15px;
-    
-}
-img.sl-image {
-    margin:0 5px 5px 0;
-    padding:0;
-    vertical-align:middle;
-}
-a.sl-facility {
-    color:gray;
-    text-decoration:none;
-}
-a.sl-facility:hover {
-    color:#342961;
-}
-a.sl-facility.active {
-    color:black;
-    text-decoration:none;
-}
-a.sl-facility::before {
-    content: " ";
-}
-div.sl-facilities {
-    border-bottom:#CCCCCC 1px solid;
-    padding-bottom:15px;
-    margin-bottom:15px;
-}
-div.sl-facilities:last-child {
-    border:0;
-}
-a.sl-testbed {
-    color:gray;
-    text-decoration:none;
-    margin-left:25px;
-    margin-bottom:5px;
-}
-a.sl-testbed:hover {
-    color:#342961;
-}
-a.sl-testbed.active {
-    color:black;
-}
-div.sl-filter-resources {
-    margin:0 0 10px 0;
-    text-align:center;
-}
-span.sl-resources {
-    font-size:9pt;
-    color:gray;
-}
-a.sl-resources {
-    font-size:9pt;
-    border:0;
-    padding:2px 8px;
-    margin:0 5px;
-    -moz-border-radius: 2px;
-    border-radius: 2px;
-    text-align: center;
-}
-a.sl-resources.active, a.sl-resources.active:hover, a.sl-resources.active:focus {
-    border:0;
-    padding:2px 8px;
-    -moz-border-radius: 2px;
-    border-radius: 2px;
-    background-color:#E7A6E7;
-    color:#000000;
-}
-a.sl-resources:first-child {
-}
-button.btn-apply {
-    font-size:13px;
-    padding:2px 8px;
-    margin:0 5px;
-    -moz-border-radius: 2px;
-    border-radius: 2px;
-    text-align: center;
-}
-div#slice-info {
-    margin-top:25px;
-}
-div#slice-info table {
-    width:100%;
-    margin:0 auto;
-}
-div#slice-info table td:first-child {
-    text-align:right;
-    font-weight:bold;
-    padding-right:15px;
-}
-div#slice-info td {
-    padding:5px;
-}
-
-/* SLICE VIEW sections */
-.slice-sections, .slice-pending {
-    margin:0;
-    padding:0;
-}
-.slice-sections ul, .slice-pending ul {
-    margin:0;
-    padding:0;
-}
-.slice-pending ul {
-    width:400px;
-    margin:0 auto 15px auto;
-}
-.slice-sections li {
-    text-align:left;
-    margin:0;
-    padding:0;
-}
-.slice-pending li {
-    padding-right:15px;
-}
-.slice-sections li a, .slice-pending li a {
-    font-size:14px;
-    color:black;
-    padding:0;
-}
-.slice-sections li.active a, .slice-pending li.active a  {
-    color:#201E62;
-    background-color:#EFEFEF;
-    text-decoration:underline;
-    padding:0;
-}
-.slice-sections ul.nav-pills li a:hover, .slice-pending ul.nav-pills li a:hover {
-    text-decoration:underline;
-    background-color:#EFEFEF;
-    color:black;
-}
-.slice-sections ul.nav-pills li.active, .slice-pending ul.nav-pills li.active {
-
-}
-.slice-sections li:first-child, .slice-sections li:first-child a {
-    color:#201E62;
-    font-weight:bold;
-}
-.slice-experiment {
-    text-align:right;
-    padding:0;
-}
-.slice-experiment button {
-    margin:3px 0 0 0;
-    background-color:#CC4125;
-    color:white;
-}
-
-.slice-pending {
-}
-.slice-pending button {
-    font-size:9pt;
-    margin:-2px 0 0 0;
-    padding:3px 5px;
-}
-.slice-pending button.apply {
-    font-size:14px;
-    padding:2px 5px;
-}
-.slice-pending button.clear {
-}
-tr.active, tr.active td {
-    background-color:#FFFFCC !important;
-}
-div.dataTables_filter label{
-    float:left;
-    width:400px;
-}
-
-/* HEADER */
-
-
-.header {
-  -moz-box-shadow:    0 0 1px rgba(82,82,82,0.6);
-  -webkit-box-shadow: 0 0 1px rgba(82,82,82,0.6);
-  box-shadow:         0 0 1px rgba(82,82,82,0.6);
-  height:61px;
-  background-color:white;
-}
-
-div.navigation {
-    
-}
-div.navigation ul {
-    margin:26px 0 0 0;
-    padding:0;
-    display: inline-block;
-    list-style-type: none;
-    white-space: nowrap;
-}
-
-div.navigation li {
-    color:#0C0047;
-    font-family:open_sansbold, sans-serif;
-    font-size:9pt;
-    font-weight:normal;
-    line-height:0.8em;
-    letter-spacing:0.4pt;
-    list-style:none;
-    float:left;
-    padding:0 15px;
-    margin:0;
-    text-transform:uppercase;
-}
-div.navigation li:hover {
-}
-div.navigation li a {
-    color:#0C0047;
-}
-div.navigation li a:hover, div.navigation li a.current {
-    color:#760073;
-    text-decoration:none;
-}
-
-div.navigation li:last-child {
-    margin-right:0;
-}
-
-
-div.navigation .dropdown-menu {
-    color:black;
-    -moz-box-shadow:    1px 1px 0px 0 rgba(58, 48, 100,0.8);
-    -webkit-box-shadow: 1px 1px 0px 0 rgba(58, 48, 100,0.8);
-    box-shadow:         1px 1px 0px 0 rgba(58, 48, 100,0.8);
-    border-radius:2px;
-    padding:0 5px 5px 5px;
-    margin-top:5px;
-    margin-left:20px;
-}
-div.navigation .dropdown-menu ul {
-    margin:0;
-    padding:15px 5px 5px 5px;
-    display:list-item;
-}
-div.navigation .dropdown-menu li {
-    margin:0 10px 0 0;
-    padding:0 0 8px 0;
-    display:list-item;
-    float:none;
-    text-transform: none;
-}
-
-div.navigation .dropdown-menu a {
-    font-family:Helvetica,sans-serif;
-    font-size:10pt;
-    color:black;
-}
-div.navigation .dropdown-menu li.title {
-    margin-bottom:10px;
-}
-div.navigation .dropdown-menu li.title a {
-    font-family:open_sansbold, sans-serif;
-}
-
-
-div.navigation .dropdown-menu li:first-child {
-    border-bottom:1px solid white;
-    padding-bottom:5px;
-     
-}
-
-div.secondary {
-    text-align:right;
-}
-
-div.secondary ul {
-   margin:6px 0 0 0;
-   padding:0;
-}
-
-div.secondary li {
-    font-size:9pt;
-    display:inline;
-    list-style:none;
-    margin:0px;
-    padding:0;
-    margin-right:15px;
-    color:#747474;
-    letter-spacing:0.4px;
-}
-div.secondary li:last-child {
-    margin-right:0;
-}
-div.secondary li a {
-    color:#747474;
-}
-div.secondary li a:hover {
-    text-decoration:underline;
-}
-div.secondary .button {    
-    width:300px;
-    margin-top:15px;
-}
-div.secondary .account {
-    margin-top:10px;
-    padding:0;
-    font-size:9pt;
-    color:gray;
-    text-align:right;
-}
-div.secondary .account span {
-    font-size:8pt;
-}
-div.secondary .account a {
-    color:black;
-}
-
-
-div.footer {
-    padding-top:15px;
-}
-div.footer div.bottom {
-    position:absolute;
-    bottom:0;
-}
-div.footer ul {
-   margin:6px 0 0 0;
-   padding:0;
-}
-
-div.footer li {
-    font-size:9pt;
-    display:inline;
-    list-style:none;
-    margin:0px;
-    padding:0;
-    margin-right:15px;
-    color:#747474;
-    letter-spacing:0.4px;
-}
-
-div.footer li a {
-    color:#747474;
-}
-div.footer li a:hover {
-    text-decoration:underline;
-}
-div.copy {
-    font-size:8pt;
-    color:gray;
-    padding-top:15px;
-    padding-bottom:15px;
-}
-
 div.home {
-    font-size:11pt;
-    line-height:1.2em;
-    letter-spacing:0.3pt;
-    min-height:500px;
     background-image: url('../img/bg-experiment.jpg');
     background-repeat:no-repeat;
     background-size:cover;
     background-position:center top;
     background-color:#086274;
-    padding:100px 0;
-}
-div.home h2 {
-    color:white;
-    line-height:1.2em;
-    font-size:18pt;
-}
-div.home h3 {
-    color:white;
-    line-height:1.4em;
-}
-/*
-div.dashboard {
-    text-align:center;
-}
-div.dashboard div {
-    margin:25px 0;
-}
-div.dashboard ul {
-    text-align:left;
-    margin-left:24px;
-    list-style:none;
-}
-div.home {
-    padding-top:50px;
-}
-div.home h1 {
-    font-size:22pt;
-    border:0;
-}
-div.home h3, div.home h4 {
-    color:#424242;
-    line-height:1.4em;
-}
-
-div.home h3 a {
-    color:#FD6D2C;
-}*/
-div.dashboard {
-}
-div.dashboard a {
-    color:#206090;
-}
-
-div.dashboard a:hover {
-    text-decoration:underline;
-}
-div.dashboard div.projects-tree {
-    margin-left:49px;
-}
-div.dashboard ul {
-    list-style-type:disc;
-    list-style-position:inside;
-    text-align:left;
-    margin:0 0 15px 0;
-    padding:0;
-    
-}
-div.dashboard ul ul {
-    margin:5px 0 15px 25px;
-    list-style:none;
-}
-div.dashboard li {
-    margin:0 0 5px 0;
-    padding:0;
-}
-div.dashboard ul ul li {
-    margin:0;
-}
-div.dashboard ul ul a {
-}
-div.dashboard h3 {
-    border-bottom:1px solid #E0E0E0;
-    margin-right:15px;
-    margin-bottom:25px;
-}
-div.dashboard h3 a {
-     color:#201E62;
-}
-div.dashboard h3 img {
-    margin:15px 15px 15px 0;
-}
-div.dashboard span.glyphicon {
-    text-align:center;
-    width:45px;
-    height:25px;
 }
-div.dashboard-create-slice {
-    display:none;
-}
-
-div.registration-form {
-    padding-top:150px;
-    text-align:center;
-}
-div.registration-form {
-    padding-top:150px;
+div.slogan {
     text-align:center;
-}
-
-.login-form input {
-    width:320px;
-}
-.login-form input[type=submit] {
-    width:108px;
-}
-
-.login-submit {
-    vertical-align:middle;
-    padding:0;
+    color:white;
+    padding-top:60px;
+    text-shadow: 1px 1px #013540;
 }
 .lost-password {
     font-size:10pt;
@@ -881,6 +31,7 @@ div.registration-form {
     color:white;
     text-shadow:0.5px 0.5px black;
 }
+
 .login-signup {
     font-size:12pt;
     color:white;
@@ -908,43 +59,16 @@ div.registration-form {
     border-radius:5px;
     font-size:12pt;
 }
-div.slogan {
-    text-align:center;
-    color:white;
-    padding-top:60px;
-    text-shadow: 1px 1px #013540;
-}
-
-th {
-    border:0 !important;
-}
-
-div.monitor {
-    padding:40px 0 25px 0;
-}
-div.monitor h1 {
-    margin-bottom:25px;
-}
-div.s-monitor {
-    padding-bottom:25px;
+a, a:active, a:focus {
+    outline: 0;
+    text-decoration:none;
+    color:#760073;
 }
-span#stats-period-txt {
-    text-transform:lowercase;
+a:hover {
+    color:#0D0049;
 }
 
-// resource info modal
-a.resource-info:hover {
-    cursor:pointer;
-}
-table.modal-resource-info tr td:first-child {
-    font-weight:bold;
-    text-align:right;
-}
-table.modal-resource-info tr:first-child td {
-    border-top:0;
-    text-align:center;
-}
-table.modal-resource-info tr:last-child td {
-    border-bottom:0;
-    text-align:center;
+a.current {
+    text-decoration:underline;
+    color:#333333;
 }
index 4627124..57cee36 100644 (file)
@@ -1,181 +1,6 @@
-@import url("../fonts/opensans_bold_macroman/stylesheet.css");
-
-html { height: 100% }
-
-body {
-    background-color:white;
-    color:black;
-    margin:0;
-    padding:0;
-    height: 100%;
-    letter-spacing:0.3px;
-}
 a, a:active, a:focus {
-    outline: 0;
-    text-decoration:none;
     color:#FF4400;
 }
-a:hover {
-    color:#0D0049;
-}
-
-a.current {
-    text-decoration:underline;
-    color:#333333;
-}
-p.command {
-    padding:15px;
-    margin:15px 0;
-    color:#890000;
-    background-color:#E0E0E0; 
-    font-family:Courier, monospace;
-}
-h1 {
-    border-bottom:1px solid #DDDDDD;
-    padding:0 0 0 0;
-    margin:15px 0 15px 0;
-    font-size:14pt;
-}
-h1 img {
-    vertical-align:middle;
-    margin-bottom:4px;
-    margin-right:10px;
-}
-h2 {
-    margin:0 0 15px 0;
-    font-size:14pt;
-    color:#333333;
-}
-h3 {
-    margin:0 0 5px 0;
-    font-size:13pt;
-    color:#201E62;
-}
-h4 {
-    margin:0 0 5px 0;
-    font-size:12pt;
-    color:#333333;
-}
-span.subtitle {
-    color:#454545;
-    font-size:9pt;
-    font-weight:normal;
-    text-transform:uppercase;
-}
-span.small {
-    font-size:9pt;
-}
-span.gray {
-    color:gray;
-}
-span.type {
-    color:#201E62;
-    font-weight:bold;
-    font-size:9pt;
-}
-span.htitle {
-    color:#454545;
-    font-size:9pt;
-    font-weight:normal;
-}
-span.version {
-    font-size:8pt;
-    color:#888888;
-}
-input[type=checkbox] {
-  min-width:5px !important;
-  margin-left:0 !important;
-}
-input[type=text], input[type=password], input[type=email], input[type=tel], input[type=number], select, option {
-    min-width:260px;
-    padding:6px;
-    border:1pt solid #22606D;
-    vertical-align:bottom;
-    border-radius:0;
-}
-
-textarea {
-    padding:6px;
-    border:1pt solid #22606D !important;
-    border-radius:0 !important;
-}
-
-span.label {
-    font-size:11pt;
-    color:gray;
-    font-weight:normal;
-    padding:0;
-}
-div.el {
-    padding-bottom:15px;
-}
-div.breadcrumbs {
-    margin:15px 0;
-    color:gray;
-    font-size:10pt;
-}
-div.breadcrumbs a {
-    color:gray;
-}
-div.breadcrumbs a:hover {
-    text-decoration:underline;
-}
-.tab-pane {
-    padding-top:15px;
-}
-/* buttons */
-button.btn, input.btn {
-    padding:6px 10px;
-    border-radius:5px;
-    font-size:10pt;
-    font-weight:normal;
-}
-button.btn span.glyphicon {
-    margin-right:6px;
-}
-button.btn-default {
-    border-bottom:3px solid #cccccc;
-}
-button.btn-default:hover {
-    background-color:white;
-    border:1px solid #ADADAD;
-    border-bottom:3px solid #ADADAD;
-}
-button.btn-default:active {
-    background-color:white;
-    border:1px solid #ADADAD;
-    border-bottom:1px solid #ADADAD;
-    margin-top:2px;
-    box-shadow:none;
-}
-button.btn-primary {
-    border-bottom:3px solid #3071A9;
-}
-button.btn-primary:hover {
-    box-shadow:none;
-    background-color:#428bca;
-    border:1px solid #357ebd;
-    border-bottom:3px solid #3071A9;
-}
-button.btn-primary:active {
-    box-shadow:none;
-    border-bottom:1px solid #3071A9;
-    margin-top:2px;
-}
-button.btn-danger {
-    border-bottom:3px solid #A13F3A;
-}
-button.btn-danger:hover {
-    box-shadow:none;
-    background-color:#d9534f;
-    border:1px solid #d43f3a;
-    border-bottom:3px solid #A13F3A;
-}
-button.btn-danger:active {
-    border:1px solid #d43f3a;
-    box-shadow:none;
-    margin-top:2px;
-}
 button.btn-onelab, input.btn-onelab {
     border:0;
     border-bottom:3px solid #FFA315;
@@ -193,641 +18,17 @@ button.btn-onelab:active, input.btn-onelab:active {
     border-bottom:1px solid #760073;
     margin-top:2px;
 }
-
-.container-resource button {
-    padding:2px 4px;
-    border-radius:3px;
-    font-size:9pt;
-    font-weight:normal;
-}
-.container-resource select,.container-resource option, .container-resource input {
-    padding:2px 4px;
-    font-size:9pt;
-}
-.badge {
-    font-size:9pt;
-    margin-left:4px;
-}
-/***** Notifications *****/
-.warning {
-    border: 1px solid red;
-    margin: 20px 60px;
-    padding: 10px 20px;
-    color: red;
-    background-color: #f2dbdb;
-    text-align: center;
-}
-
-/* HOME DASHBOARD */
-div#home-dashboard {
-    color:black;
-    margin:0 auto 25px auto;
-}
-div#home-dashboard table {
-    margin:25px;
-    width:100%;
-}
-div#home-dashboard table td {
-    text-align:center;
-    padding:15px 0;
-    width:33%;
-}
-div#home-dashboard table tr:first-child td {
-    font-size:12pt;
-    font-weight:bold;
-    color:#270A5A;
-}
-div#home-dashboard table tr:last-child td {
-    vertical-align:top;
-    padding:25px 0;
-}
-div#home-dashboard table tr:last-child td.logged-in {
-    border-right:1px solid #DDDDDD;
-    padding:25px;
-}
-div#home-dashboard table tr:last-child td.support {
-    border-left:1px solid #DDDDDD;
-    padding:25px;
-}
-div#home-dashboard table tr:last-child td:first-child {
-}
-div#home-dashboard table tr:last-child td:last-child {
-    border-right:0;
-}
-div#home-dashboard table tr:last-child td.logged-in div {
-    text-align:left;
-    padding:25px 0;
-}
-div#home-dashboard table tr:last-child td.support div {
-    text-align:left;
-    padding:25px 0;
-}
-div#home-dashboard div.login-widget {
-    padding:20px;
-}
-div#home-dashboard table td.support {
-}
-div#home-dashboard table td.support a {
-}
-div#home-dashboard table td.support a:hover {
-    text-decoration:none;
-}
-
-div#home-dashboard div#manager {
-    display:none;
-}
-
-div#home-dashboard div#home-slice-list {
-    margin:25px 0;
-    padding:0 25px;
-    text-align:left;
-}
-div#home-dashboard div#home-slice-list ul {
-    list-style: none;
-    padding:0;
-    margin:0;
-}
-div#home-dashboard div#home-slice-list li {
-    
-}
-
-/**/
-
-/**/
-/* WELL */
-div.well {
-}
-/**/
-/* TABLE */
-table.table {
-    margin:0;
-}
-table.table thead {
-    padding:0;
-}
-table.table tbody {
-    padding:0;
-}
-table.table tr {
-    padding:0;
-}
-table.table td {
-    padding:0;
-}
-/* INSTITUTION */
-div#institution {
-    color:black;
-}
-.form-hint {
-    font-size:11pt;
-    font-style:italic;
-    color:gray;
-}
-
-
-.form-hint {
-    font-size:11pt;
-    font-style:italic;
-    color:gray;
-}
-
-
-
-/* TICKET REQUEST */
-div#ticket-request {
-    color:black;
-}
-.form-hint {
-    font-size:11pt;
-    font-style:italic;
-    color:gray;
-}
-div#ticket-request p {
-    margin:20px 0;
-}
-
-ul.nav-tabs {
-    margin:0 0 15px 0;
-}
-ul.nav-tabs ul {}
-ul.nav-tabs li {}
-
-ul.nav-section li a {
-    color:black;
-    border-bottom:0;
-}
-ul.nav-section li:first-child {
-    padding:0;
-}
-ul.nav-section li:first-child a {
-}
-ul.nav-section li:first-child.active a {
-}
-
-ul.nav-resources {
-    margin:15px 0;
-}
-ul.nav-resources a {
-    padding: 4px 10px 5px 10px;
-}
-
-/* SLICE VIEW */
-div.container-resource, div.container-slice {
-    padding-right:15px;
-    padding-left:15px;
-}
-.table th {
-    border-top:0 !important;
-}
-div#slice-view {
-    margin:0;
-}
-
-/* FACILITY/TESTBED filters */
-div.sl-filter-facilities {
-    padding:0 5px;
-}
-div.sl-filter-facilities h4 {
-    margin-bottom:15px;
-    
-}
-img.sl-image {
-    margin:0 5px 5px 0;
-    padding:0;
-    vertical-align:middle;
-}
-a.sl-facility {
-    color:gray;
-    text-decoration:none;
-}
-a.sl-facility:hover {
-    color:#342961;
-}
-a.sl-facility.active {
-    color:black;
-    text-decoration:none;
-}
-a.sl-facility::before {
-    content: " ";
-}
-div.sl-facilities {
-    border-bottom:#CCCCCC 1px solid;
-    padding-bottom:15px;
-    margin-bottom:15px;
-}
-div.sl-facilities:last-child {
-    border:0;
-}
-a.sl-testbed {
-    color:gray;
-    text-decoration:none;
-    margin-left:25px;
-    margin-bottom:5px;
-}
-a.sl-testbed:hover {
-    color:#342961;
-}
-a.sl-testbed.active {
-    color:black;
-}
-
-span.sl-resources {
-    font-size:9pt;
-    color:gray;
-}
-a.sl-resources, a.sl-resources:hover {
-    font-size:9pt;
-    border:0;
-    padding:2px 4px;
-    -moz-border-radius: 4px;
-    border-radius: 4px;
-    width:105px;
-    margin-left:4px;
-    margin-bottom:8px;
-    text-align: center;
-}
-a.sl-resources.active, a.sl-resources.active:hover, a.sl-resources.active:focus {
-    border:0;
-    -moz-border-radius: 4px;
-    border-radius: 4px;
-}
-a.sl-resources:first-child {
-    margin-left:12px;
-}
-button.btn-apply {
-    font-size:13px;
-    padding:2px 8px;
-}
-div#slice-info {
-    margin-top:25px;
-}
-div#slice-info table {
-    width:100%;
-    margin:0 auto;
-}
-div#slice-info table td:first-child {
-    text-align:right;
-    font-weight:bold;
-    padding-right:15px;
-}
-div#slice-info td {
-    padding:5px;
-}
-
-/* SLICE VIEW sections */
-.slice-sections, .slice-pending {
-    margin:0;
-    padding:0;
-}
-.slice-sections ul, .slice-pending ul {
-    margin:0;
-    padding:0;
-}
-.slice-pending ul {
-    width:400px;
-    margin:0 auto 15px auto;
-}
-.slice-sections li {
-    text-align:left;
-    margin:0;
-    padding:0;
-}
-.slice-pending li {
-    padding-right:15px;
-}
-.slice-sections li a, .slice-pending li a {
-    font-size:14px;
-    color:black;
-    padding:0;
-}
-.slice-sections li.active a, .slice-pending li.active a  {
-    color:#201E62;
-    background-color:#EFEFEF;
-    text-decoration:underline;
-    padding:0;
-}
-.slice-sections ul.nav-pills li a:hover, .slice-pending ul.nav-pills li a:hover {
-    text-decoration:underline;
-    background-color:#EFEFEF;
-    color:black;
-}
-.slice-sections ul.nav-pills li.active, .slice-pending ul.nav-pills li.active {
-
-}
-.slice-sections li:first-child, .slice-sections li:first-child a {
-    color:#201E62;
-    font-weight:bold;
-}
-.slice-experiment {
-    text-align:right;
-    padding:0;
-}
-.slice-experiment button {
-    margin:3px 0 0 0;
-    background-color:#CC4125;
-    color:white;
-}
-
-.slice-pending {
-}
-.slice-pending button {
-    font-size:9pt;
-    margin:-2px 0 0 0;
-    padding:3px 5px;
-}
-.slice-pending button.apply {
-    font-size:14px;
-    padding:2px 5px;
-}
-.slice-pending button.clear {
-}
-tr.active, tr.active td {
-    background-color:#FFFFCC !important;
-}
-div.dataTables_filter label{
-    float:left;
-    width:400px;
-}
-
-/* HEADER */
-
-
-.header {
-  -moz-box-shadow:    0 0 1px rgba(82,82,82,0.6);
-  -webkit-box-shadow: 0 0 1px rgba(82,82,82,0.6);
-  box-shadow:         0 0 1px rgba(82,82,82,0.6);
-  height:61px;
-  background-color:white;
-}
-
-div.navigation {
-    
-}
-div.navigation ul {
-    margin:26px 0 0 0;
-    padding:0;
-    display: inline-block;
-    list-style-type: none;
-    white-space: nowrap;
-}
-
-div.navigation li {
-    color:#0C0047;
-    font-family:open_sansbold, sans-serif;
-    font-size:9pt;
-    font-weight:normal;
-    line-height:0.8em;
-    letter-spacing:0.4pt;
-    list-style:none;
-    float:left;
-    padding:0 15px;
-    margin:0;
-    text-transform:uppercase;
-}
-div.navigation li:hover {
-}
-div.navigation li a {
-    color:#0C0047;
-}
 div.navigation li a:hover, div.navigation li a.current {
     color:#FF4400;
     text-decoration:none;
 }
-
-div.navigation li:last-child {
-    margin-right:0;
-}
-
-
-div.navigation .dropdown-menu {
-    color:black;
-    -moz-box-shadow:    1px 1px 0px 0 rgba(58, 48, 100,0.8);
-    -webkit-box-shadow: 1px 1px 0px 0 rgba(58, 48, 100,0.8);
-    box-shadow:         1px 1px 0px 0 rgba(58, 48, 100,0.8);
-    border-radius:2px;
-    padding:0 5px 5px 5px;
-    margin-top:5px;
-    margin-left:20px;
-}
-div.navigation .dropdown-menu ul {
-    margin:0;
-    padding:15px 5px 5px 5px;
-    display:list-item;
-}
-div.navigation .dropdown-menu li {
-    margin:0 10px 0 0;
-    padding:0 0 8px 0;
-    display:list-item;
-    float:none;
-    text-transform: none;
-}
-
-div.navigation .dropdown-menu a {
-    font-family:Helvetica,sans-serif;
-    font-size:10pt;
-    color:black;
-}
-div.navigation .dropdown-menu li.title {
-    margin-bottom:10px;
-}
-div.navigation .dropdown-menu li.title a {
-    font-family:open_sansbold, sans-serif;
-}
-
-
-div.navigation .dropdown-menu li:first-child {
-    border-bottom:1px solid white;
-    padding-bottom:5px;
-     
-}
-
-div.secondary {
-    text-align:right;
-}
-
-div.secondary ul {
-   margin:6px 0 0 0;
-   padding:0;
-}
-
-div.secondary li {
-    font-size:9pt;
-    display:inline;
-    list-style:none;
-    margin:0px;
-    padding:0;
-    margin-right:15px;
-    color:#747474;
-    letter-spacing:0.4px;
-}
-div.secondary li:last-child {
-    margin-right:0;
-}
-div.secondary li a {
-    color:#747474;
-}
-div.secondary li a:hover {
-    text-decoration:underline;
-}
-div.secondary .button {    
-    width:300px;
-    margin-top:15px;
-}
-div.secondary .account {
-    margin-top:10px;
-    padding:0;
-    font-size:9pt;
-    color:gray;
-    text-align:right;
-}
-div.secondary .account span {
-    font-size:8pt;
-}
-div.secondary .account a {
-    color:black;
-}
-
-
-div.footer {
-    padding-top:15px;
-}
-div.footer div.bottom {
-    position:absolute;
-    bottom:0;
-}
-div.footer ul {
-   margin:6px 0 0 0;
-   padding:0;
-}
-
-div.footer li {
-    font-size:9pt;
-    display:inline;
-    list-style:none;
-    margin:0px;
-    padding:0;
-    margin-right:15px;
-    color:#747474;
-    letter-spacing:0.4px;
-}
-
-div.footer li a {
-    color:#747474;
-}
-div.footer li a:hover {
-    text-decoration:underline;
-}
-div.copy {
-    font-size:8pt;
-    color:gray;
-    padding-top:15px;
-    padding-bottom:15px;
-}
-
 div.home {
-    font-size:11pt;
-    line-height:1.2em;
-    letter-spacing:0.3pt;
-    min-height:500px;
     background-image: url('../img/bg-smartfire.png');
-    background-repeat:no-repeat;
-    background-size:cover;
-    background-position:center top;
-    background-color:#4FABA3;
-    padding:100px 0;
-}
-div.home h2 {
-    color:white;
-    line-height:1.2em;
-    font-size:18pt;
-}
-div.home h3 {
-    color:white;
-    line-height:1.4em;
-}
-div.dashboard {
-    text-align:center;
-}
-div.dashboard div {
-    margin:25px 0;
-}
-div.dashboard ul {
-    text-align:left;
-    margin-left:24px;
-    list-style:none;
-}
-div.registration-form {
-    padding-top:150px;
-    text-align:center;
-}
-
-.login-form input {
-    width:320px;
-}
-.login-form input[type=submit] {
-    width:108px;
-}
-
-.login-submit {
-    vertical-align:middle;
-    padding:0;
-}
-.lost-password {
-    font-size:10pt;
-    color:black;
-    text-align:right;
-    padding:0px;
-}
-.lost-password a {
-    color:white;
-    text-shadow:0.5px 0.5px black;
-}
-.login-signup {
-    font-size:12pt;
-    color:white;
-    text-shadow:0.5px 0.5px black;
-    margin-top:45px;
-    padding:5px 0 0 4px;
-    
-}
-.login-signup a {
-    color:white;
-    text-shadow:0.5px 0.5px black;
-    padding-bottom:2px;
-    border-bottom:2pt solid white;
-}
-.login-signup a:hover {
-    text-decoration:none;
-}
-.login-signup button {
-    padding:8px;
-    border:0;
-    border-bottom:2px solid #540086;
-    background-color:#302562;
-    color:white;
-    width:100px;
-    border-radius:5px;
-    font-size:12pt;
+    background-color:#FFFFFF;
 }
 div.slogan {
     text-align:center;
     color:white;
+    padding-top:60px;
     text-shadow: 1px 1px #013540;
 }
-
-th {
-    border:0 !important;
-}
-
-div.monitor {
-    padding:40px 0 25px 0;
-}
-div.monitor h1 {
-    margin-bottom:25px;
-}
-div.s-monitor {
-    padding-bottom:25px;
-}
-span#stats-period-txt {
-    text-transform:lowercase;
-}
diff --git a/portal/static/icons/emulab.png b/portal/static/icons/emulab.png
new file mode 100644 (file)
index 0000000..2d6df73
Binary files /dev/null and b/portal/static/icons/emulab.png differ
diff --git a/portal/static/img/smartfire_favicon.ico b/portal/static/img/smartfire_favicon.ico
new file mode 100644 (file)
index 0000000..860043e
Binary files /dev/null and b/portal/static/img/smartfire_favicon.ico differ
diff --git a/portal/static/img/testbeds/FIT NITOS Paris.png b/portal/static/img/testbeds/FIT NITOS Paris.png
new file mode 100644 (file)
index 0000000..1030227
Binary files /dev/null and b/portal/static/img/testbeds/FIT NITOS Paris.png differ
diff --git a/portal/static/img/testbeds/FIT NITOS R2Lab.png b/portal/static/img/testbeds/FIT NITOS R2Lab.png
new file mode 100644 (file)
index 0000000..1030227
Binary files /dev/null and b/portal/static/img/testbeds/FIT NITOS R2Lab.png differ
diff --git a/portal/static/js/experiment.js b/portal/static/js/experiment.js
new file mode 100644 (file)
index 0000000..2094cda
--- /dev/null
@@ -0,0 +1,71 @@
+function render_node(platform, node){
+    //console.log(platform,node);
+    nitos = false;
+    if('@component_manager_id' in node){
+        // urn:publicid:IDN+ple+authority+cm
+        t_urn = node['@component_manager_id'].split('+');
+        //if(t_urn[1].indexOf(":") > -1)
+        testbed = t_urn[1];
+        t_testbed = testbed.split(':');
+        if(t_testbed.length > 1){
+            testbed = t_testbed[1];
+            if(t_testbed[0] == 'omf' || t_testbed[1].includes('nitos')){
+                nitos = true;
+            }
+        }
+        if(!document.getElementById(testbed)){
+        //if(!$('#'+testbed).length){
+            testbed = 'default';
+        }
+    }else{
+        testbed = 'default';
+    }
+    elm = document.getElementById(testbed);
+    newElement = document.createElement('p');
+    if('services' in node && 'login' in node['services']){
+        //console.log(node['services']['login']);
+        login = node['services']['login'];
+        // TODO: Check if this login info has already been printed or not
+        // Ex: IoT-Lab 1 ssh gateway per site, but info is per node in the RSpec
+        if(!document.getElementById(login['@username']+'_'+login['@hostname'])){
+            if('@port' in login && login['@port']!='22'){
+                newElement.innerHTML = "<p class='command' id='"+login['@username']+"_"+login['@hostname']+"'>$ ssh "+login['@username']+"@"+login['@hostname']+" -p "+login['@port']+"</p>";
+            }else{
+                newElement.innerHTML = "<p class='command' id='"+login['@username']+"_"+login['@hostname']+"'>$ ssh "+login['@username']+"@"+login['@hostname']+"</p>";
+            }
+            elm.appendChild(newElement); 
+        }
+    }else if('@component_name' in node){
+        console.log(node['@component_name']);
+    }else{
+        console.log(node);
+    }
+    if(nitos){
+        newElement = document.createElement('p');
+        var commands = "$ omf stat -t "+node['@component_name']+" # check the status of the node <br>"; 
+        commands += "$ omf tell -a on -t "+node['@component_name']+" # turn on the node <br>";
+        commands += "$ omf load -i baseline.ndz -t "+node['@component_name']+" # loading OMF image on the node <br>";
+        commands += "$ ssh root@"+node['@component_name']+" # ssh to the node";
+
+        newElement.innerHTML = "<p class='command'>"+commands+"</p>";
+        elm.appendChild(newElement); 
+    }
+    $("#loading").hide();
+    elm.style.display = "block";
+    //$('#'+testbed).show();
+    if(document.getElementById(testbed + '_header')){
+        document.getElementById(testbed + '_header').style.display = "block";
+    }
+    if(document.getElementById(testbed + '_footer')){
+        document.getElementById(testbed + '_footer').style.display = "block";
+    }
+    /*
+    if($('#'+testbed+'_header').length){
+        $('#'+testbed+'_header').show();
+    }
+    if($('#'+testbed+'_footer').length){
+        $('#'+testbed+'_footer').show();
+    }
+    */
+}
+
index 44d8c75..87a7c28 100644 (file)
@@ -40,9 +40,9 @@ jQuery(document).ready(function(){
           pi_title: {
               required: true
           },
-          pi_phone: {
+          /*pi_phone: {
               required: true
-          },
+          },*/
           pi_email: {
               required: true
           },
index 17f0a38..6bf5bb8 100644 (file)
@@ -8,10 +8,12 @@
         </div>
     </div>
     <div class="row">
-        <div class="col-md-10 copy">
-            Copyright © UPMC Sorbonne Universités, on behalf of the OneLab consortium
+        <div class="col-md-9 copy" style="text-align:left;">
+            Copyrights &copy; 2015 UPMC Sorbonne Universit&eacute;s. All rights reserved.
         </div>
-        <div id="portal_version" class="col-md-2 copy">
+        <div class="col-md-3 copy">
+        powerd by &nbsp;<a href="http://myslice.info" target="_blank"><img src="//myslice.info/images/logo.png" style="width:50px;"></a>&nbsp;&nbsp;
+        <a href="/portal/release_notes" id="portal_version"></a>
         </div>
     </div>
 </div>
@@ -19,7 +21,6 @@
 <script type="text/javascript">
     $(document).ready(function() {
         $.post("/portal_version/", function( data ) {
-            console.log(data);
             $("#portal_version").html(data);
         });
     });
index 4424695..299e0ec 100644 (file)
@@ -1,8 +1,4 @@
 <div class="col-sm-4 slogan">
-    <h2>
-        Your Easy Access to Computer Networking Testbeds:
-    </h2>
-    <h3>
-        A wide variety of world class testbeds available through your one account
-    </h3>
+<h1>Welcome!</h1>
+&nbsp;
 </div>
diff --git a/portal/templates/_widget-email_footer.html b/portal/templates/_widget-email_footer.html
new file mode 100644 (file)
index 0000000..31ee882
--- /dev/null
@@ -0,0 +1 @@
+<p></p>
index 0856bd8..63902e4 100644 (file)
@@ -1,25 +1,39 @@
+<div class="container">
+       <div class="row">
+               <div class="col-md-12">
+                        <div class="breadcrumbs">
+                                Experiment &nbsp;>&nbsp; Slice: {{ slice }}
+                        </div>
+               </div>
+       </div>
+</div>
+<div class="container-fluid container-slice">
+<div class="row">
+               <div class="col-md-12">
 {% if section == "resources" %}
 <ul class="nav nav-tabs nav-section">
-       <li><a href="/slice/{{ slice }}#info"><img src="{{ STATIC_URL }}icons/slices-xs.png" alt="About MySlice" /> {{ slice }}</a></li>
-       <li><a href="/slice/{{ slice }}#testbeds">Testbeds</a></li>
+       
+       <!-- <li><a href="/slice/{{ slice }}#testbeds">Testbeds</a></li> -->
        <li class="active"><a class="link" href="/resources/{{ slice }}">Resources</a></li>
        <li><a href="/slice/{{ slice }}#users">Users</a></li>
-       <li><a href="/slice/{{ slice }}#statistics">Statistics</a></li>
-       <li><a href="/slice/{{ slice }}#measurements">Measurements</a></li>
-       <li><a href="/slice/{{ slice }}#experiment" data-toggle="tab">Experiment</a></li>
-       <li><a href="/slice/{{ slice }}#sla">SLA</a></li>
+       <li><a href="/slice/{{ slice }}#info">Information</a></li>
+       <!-- <li><a href="/slice/{{ slice }}#experiment">Statistics</a></li> -->
+       <!-- <li><a href="/slice/{{ slice }}#measurements">Measurements</a></li> -->
+       <li><a href="/slice/{{ slice }}#experiment">Tools</a></li>
+       <!-- <li><a href="/slice/{{ slice }}#studentslabs">Students Labs</a></li> -->
 </ul>
 {% else %}
 <ul class="nav nav-tabs nav-section">
-       <li class="active"><a href="#info"><img src="{{ STATIC_URL }}icons/slices-xs.png" alt="About MySlice" /> {{ slice }}</a></li>
-       <li class="testbeds"><a href="#testbeds">Testbeds</a></li>
+       <!-- <li class="testbeds"><a href="#testbeds">Testbeds</a></li> -->
        <li><a class="link" href="/resources/{{ slice }}">Resources</a></li>
        <li class="users"><a href="#users">Users</a></li>
-       <li class="statistics"><a href="#statistics">Statistics</a></li>
-       <li class="measurements"><a href="#measurements">Measurements</a></li>
-       <li class="experiment"><a href="#experiment" data-toggle="tab">Experiment</a></li>
-       <li class="sla"><a href="#sla" data-toggle="tab">SLA</a></li>
+       <li class="active"><a href="#info">Information</a></li>
+       <!-- <li class="statistics"><a href="#experiment">Statistics</a></li> -->
+       <!-- <li class="measurements"><a href="#measurements">Measurements</a></li> -->
+       <li class="experiment"><a href="#experiment">Tools</a></li>
+       <!-- <li class="studentslabs"><a href="#studentslabs">Students Labs</a></li> -->
 </ul>
+
 <script>
 $(document).ready(function() {
        $('.nav-tabs a').click(function (e) {
@@ -29,7 +43,16 @@ $(document).ready(function() {
        var id = $(this).attr('href').substr(1);        
        $("#" + id).load('/' + id + '/{{ slice }}/');
        });
-       $('div#info').load('/info/{{ slice }}/');
+       
+       var hash = window.location.hash;
+       if (hash) {
+               $('.nav-tabs a[href='+hash+']').click();
+       } else {
+               $('div#info').load('/info/{{ slice }}/');
+       }
 });
 </script>
 {% endif %}
+</div>
+</div>
+</div>
index 0692b0b..1ae1cda 100644 (file)
@@ -1,9 +1,9 @@
-<img src="https://onelab.eu/static/images/onelab.png">
+<img src="{{current_site}}/static/img/{{theme.logo}}">
 <br>
 <p>We have received a user signup request for your email address at {{current_site}}</p>
 <p>You have the following user details:</p>
 
-Organization: {{organization}}<br>
+Authority: {{authority_hrn}}<br>
 First name: {{first_name}}<br>
 Last name: {{last_name}}<br>
 Email: {{email}}<br>
@@ -24,6 +24,8 @@ A manager from your organization must also validate your request. Upon confirmat
 </li>
 </ul>
 <p>
-We look forward to welcoming you to OneLab. You will find answers to frequently asked questions <a href="{{current_site}}/support/">here</a>. 
+We look forward to welcoming you to {{theme.label}}. You will find answers to frequently asked questions <a href="{{current_site}}/support/">here</a>. 
 Please don't hesitate to <a href="{{current_site}}/contact/">contact us</a> with any additional questions that you might have.
 </p>
+<p>Yours sincerely,</p>
+<p>The {{theme.label}} team</p>
index a68d1ce..8ae9f2c 100644 (file)
@@ -2,7 +2,7 @@ We have received a user signup request for your email address at {{current_site}
 
 You have the following user details:
 
-Organization: {{organization}}
+Authority: {{authority_hrn}}
 First name: {{first_name}}
 Last name: {{last_name}}
 Email: {{email}}
@@ -17,8 +17,11 @@ You may now log in to the portal using your email address and the password that
 
        2. A manager from your organization must also validate your request. Upon confirmation of your signup request, we will send an email to the managers at your organization with a validation request.
 
-We look forward to welcoming you to OneLab. 
-Please don't hesitate to contact us at support@onelab.eu with any additional questions that you might have.
+We look forward to welcoming you to {{theme.label}}. 
+Please don't hesitate to contact us at support@{{theme.theme}}.eu with any additional questions that you might have.
+
+Yours sincerely,
+The {{theme.label}} team
 
 
 
index 64bf981..1dede4f 100644 (file)
@@ -1,4 +1,4 @@
-<img src="https://onelab.eu/static/images/onelab.png">
+<img src="{{current_site}}/static/img/{{theme.logo}}" width="80px">
 <br>
 <h1>NEW AUTHORITY REQUEST</h1>
 <br>
index 8fbc2bb..347fe99 100644 (file)
@@ -54,8 +54,8 @@
 {% insert_str prelude "css/slider.css" %}
 {% insert_str prelude "css/topmenu.css" %}
 {% insert_str prelude "js/logout.js" %}
-<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/{{ theme }}.css">
 <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/myslice.css">
+<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/{{ theme }}.css">
 <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/jquery.qtip.min.css">
 
 
@@ -77,22 +77,17 @@ $(document).ready(function() {
             slices.push("no slice");
         }else{
             slices = user.slices;
-            {% if theme != "fed4fire" or  "onelab" in theme %}
-            drawSlices(slices);
-            {% endif %}
         }
-        {% if theme == "fed4fire" or "onelab" in theme%}
         p = myslice.get_projects();
         if(p != null){
             //drawProjects(p);
             drawProjectsTree(p,slices);
         }
-        {% endif %}
     });
 
     function drawSlices(slices){
         var items = [];
-               
+        console.log(slices);
         $.each( slices, function(i, val) {
             items.push( "<li><a href=\"/resources/"+val+"\" title='Add resources to slice "+val+"'><img src='/static/img/icon_slices_small.png' style='width: 12px;'>" + val + "</a></li>" );
         });
@@ -100,7 +95,6 @@ $(document).ready(function() {
         $("ul#dropdown-slice-list").append(items.join( "" ));
     }
     
-    {% if theme == "fed4fire" or "onelab" in theme%}
     function drawProjects(projects){
         var items = [];
                
@@ -113,11 +107,12 @@ $(document).ready(function() {
     function drawProjectsTree(projects,slices) {
         var items = [];
         var items_sl = [];
+        var slices_no_project = [];
         $.each( projects, function(i, p) {
             $.each( slices, function(y, s) {
                 if (s.match('^' + escapeRegExp(p))) {
-                     slicename = s.replace(p + '.','')
-                     items_sl.push( "<li><a href=\"/resources/" + s + "\" title='Add resources to slice "+slicename+"'><img src='/static/img/icon_slices_small.png' style='width: 12px;'>  " + slicename + "</a></li>" );
+                    slicename = s.replace(p + '.','')
+                    items_sl.push( "<li><a href=\"/resources/" + s + "\" title='Add resources to slice "+slicename+"'><img src='/static/img/icon_slices_small.png' style='width: 12px;'>  " + slicename + "</a></li>" );
                 }
             });
             el = "<li><a href=\"/portal/project/" + p + "\" title='Manage project "+p+"' >" + p + "</a>";
@@ -128,6 +123,19 @@ $(document).ready(function() {
             items.push(el);
             items_sl = [];
         });
+
+        $.each( slices, function(y, s) {
+            if(s.split('.').length < 4){
+                slices_no_project.push( "<li><a href=\"/resources/" + s + "\" title='Add resources to slice "+s+"'><img src='/static/img/icon_slices_small.png' style='width: 12px;'>  " + s + "</a></li>" );
+            }
+        });
+        if (slices_no_project.length > 0) {
+            elm = '<li>other slices <span class="glyphicon glyphicon-info-sign" title="these are <b>legacy slices</b> from now on, slices must be created within a project">&nbsp;</span>';
+            elm += "<ul>" + slices_no_project.join( "" ) + "</ul>";
+            elm += "</li>";
+            items.push(elm);
+        }
+
         $("div#home-project-tree").html($( "<ul/>", { html: items.join( "" ) }));
         if (projects.length > 0) {
             $('.dashboard-create-slice').show();
@@ -137,7 +145,6 @@ $(document).ready(function() {
     window.setTimeout(function() {
         $('.projects-loading').hide();
     },20000);
-    {% endif %}
 {% endif %}
        jQuery('[title!=""]').qtip();
 });
index 9848087..54c1190 100644 (file)
@@ -1,4 +1,4 @@
-<img src="https://onelab.eu/static/images/onelab.png">
+<img src="{{current_site}}/static/img/{{theme.logo}}">
 <br>
 <h1>User details</h1>
 <br>
index dd21e44..e413c62 100644 (file)
@@ -1 +1 @@
-OneLab support: user ticket
+{{theme.label}} support: {{email}} submitted a query
diff --git a/portal/templates/fed4fire/fed4fire_activate_user.html b/portal/templates/fed4fire/fed4fire_activate_user.html
deleted file mode 100644 (file)
index e1fa009..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<img src="https://portal.fed4fire.eu/static/img/f4f-logo.png" width="80px">
-<br>
-<p>We have received a user signup request for your email address at {{current_site}}</p>
-<p>You have the following user details:</p>
-
-First name: {{first_name}}<br>
-Last name: {{last_name}}<br>
-Email: {{email}}<br>
-
-<p></p>
-<p>
-You may now <a href="{{current_site}}">log</a> in to the portal using your email address and the password that you provided, but your access will be limited. To gain full access, two steps are required:
-</p>
-
-<ul style="list-style-type:decimal;">
-<li>
-You must confirm that you have indeed made this request by clicking on the following link: <br>
-       <a href={{validation_link}}>{{validation_link}}</a> 
-       <ul><li>If you did not make this request, we apologise. You may disregard this email or you may advise us the error by replying to this email.</li></ul>
-</li>
-<li>
-A manager from your organization must also validate your request. Upon confirmation of your signup request, we will send an email to the managers at your organization with a validation request.
-</li>
-</ul>
-<p>
-We look forward to welcoming you to Fed4FIRE portal. You will find answers to frequently asked questions <a href="{{current_site}}/support/">here</a>. 
-Please don't hesitate to <a href="{{current_site}}/contact/">contact us</a> with any additional questions that you might have.
-</p>
diff --git a/portal/templates/fed4fire/fed4fire_activate_user.txt b/portal/templates/fed4fire/fed4fire_activate_user.txt
deleted file mode 100644 (file)
index b5eb224..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-You have registered to {{current_site}}
-Please validate your email address by clicking the following link:
-
-{{validation_link}}
-
-
-
index 74ca3da..31096ba 100644 (file)
@@ -4,5 +4,5 @@
 
 <h1>Query details</h1>
 
-<b>Subject             :</b> {{subject}}
-<b>Query               :</b> {{description}}
+<b>Subject      :</b> {{subject}}
+<b>Query        :</b> {{description}}
diff --git a/portal/templates/fed4fire/fed4fire_email_activation.html b/portal/templates/fed4fire/fed4fire_email_activation.html
deleted file mode 100644 (file)
index ae7627a..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-{% extends "layout.html" %}
-
-{% block content %}
-
-<div class="row">
-       <h1><img src="{{ STATIC_URL }}img/icon_user_small.png" alt="User Registration" />User sign-up</h1>
-</div>
-<div class="row">
-       {% if activation_status == 'success' %}
-               <h3>Signup request confirmed.</h3>
-               <p>You are currently able to log in to the portal using your email address and the password that you have provided; however, your access is still limited.</p> 
-               <p>You will have full access as soon as your account is validated by a manager at your organization. We have sent an email to your organisation's managers with a validation request.</p>
-       {%else%}
-               <h3>Signup confirmation failed.</h3>
-               <p>You have probably arrived at this page by clicking a confirmation link in an email that we have sent to you. 
-               We have been unable to match the link that you have clicked to a signup request in our database.</p>
-               <p>Please <a href="/portal/contact/">contact support</a> so that we may help you complete the signup process.</p>
-       {%endif%}
- </div>
-
-{% endblock %}
diff --git a/portal/templates/fed4fire/fed4fire_footer.html b/portal/templates/fed4fire/fed4fire_footer.html
deleted file mode 100644 (file)
index 6c05c87..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<!--No foorter added for the moment -->
-<div id="portal_version" class="col-md-2 copy"></div>
-
-<script type="text/javascript">
-    $(document).ready(function() {
-        $.post("/portal_version/", function( data ) {
-            console.log(data);
-            $("#portal_version").html(data);
-        });
-    });
-</script>
diff --git a/portal/templates/fed4fire/fed4fire_join_request_validated.html b/portal/templates/fed4fire/fed4fire_join_request_validated.html
deleted file mode 100644 (file)
index 62ec312..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-<img src="https://portal.fed4fire.eu/static/img/f4f-logo.png" width="80px">
-<br>
-<p>Dear Fed4FIRE user,</p>
-<p></p>
-<p>You have recently requested to join a project in the Fed4FIRE portal.</p>
-<br>
-<b>Project name  :</b> {{project_name}}</br>
-<b>Authority     :</b> {{authority_hrn}}</br>
-<b>Email         :</b> {{email}}</br>
-<p></p>
-<p>
-       We are pleased to inform you that a project manager has validated your request on the Fed4FIRE portal. You have automatically been added to all existing slices in this project. You may also create new slices in this project and start experimenting.
-</p>
-<p></p>
-<p>We wish you a fruitful user experience with the Fed4FIRE portal.</p>
-<p></p>
-<p>Yours sincerely,</p>
-<p>The Fed4FIRE team</p>
-
-
diff --git a/portal/templates/fed4fire/fed4fire_join_request_validated.txt b/portal/templates/fed4fire/fed4fire_join_request_validated.txt
deleted file mode 100644 (file)
index 2b61cfe..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-Dear Fed4FIRE user,
-
-You have recently requested to join a project in the Fed4FIRE portal.
-
-Project name  : {{project_name}}
-Authority     : {{authority_hrn}}
-Email         : {{email}}
-
-We are pleased to inform you that a project manager has validated your request on the Fed4FIRE portal. You have automatically been added to all existing slices in this project. You may also create new slices in this project and start experimenting.
-
-We wish you a fruitful user experience with the Fed4FIRE portal.
-
-Yours sincerely,
-The Fed4FIRE team
diff --git a/portal/templates/fed4fire/fed4fire_slice-request-done-view.html b/portal/templates/fed4fire/fed4fire_slice-request-done-view.html
deleted file mode 100644 (file)
index c848b06..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{% extends "layout.html" %}
-
-{% block content %}
-
-  <h1>Success</h1>
-
-Your slice has been created. You can view all your slices in the <a href="/">dashboard.</a>
-<script>
-$(document).ready(function() {
-    localStorage.clear();
-});
-</script>
-{% endblock %}
-
index 650092f..960ffcb 100644 (file)
@@ -33,7 +33,7 @@ $(document).ready(function() {
                </div>
        
                <div class="row">
-                       <div class="col-md-6">
+                       <div class="col-md-8">
                                {{ filter_status }}
                        </div>
                        <div class="col-md-1">
index 05a43a6..5303a93 100644 (file)
@@ -1,19 +1,20 @@
 {% extends "layout_wide.html" %}
+{% load portal_filters %}
 
 {% block head %}
+<script type="text/javascript" src="{{STATIC_URL}}js/experiment.js"></script>
 {% endblock %}
 
 {% block content %}
-{% include theme|add:"_widget-slice-sections.html" %}
-         
+{% widget "_widget-slice-sections.html" %}
 <div class="container-fluid tab-content container-slice">
-  <div class="tab-pane active row" id="info">...</div>
-  <div class="tab-pane row" id="testbeds">...</div>
-  <div class="tab-pane row" id="resources">...</div>
+  <div class="tab-pane active row" id="resources"></div>
   <div class="tab-pane row" id="users">...</div>
+  <div class="tab-pane row" id="info">...</div>
   <!-- <div class="tab-pane row" id="statistics">...</div> -->
   <!-- <div class="tab-pane row" id="measurements">...</div> -->
   <div class="tab-pane row" id="experiment">...</div>
   <div class="tab-pane row" id="sla">...</div>
+  <!-- <div class="tab-pane row" id="testbeds">...</div> -->
 </div>         
 {% endblock %}
diff --git a/portal/templates/fed4fire/fed4fire_slice_request_denied.html b/portal/templates/fed4fire/fed4fire_slice_request_denied.html
deleted file mode 100644 (file)
index 7a1c12c..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-<img src="https://portal.fed4fire.eu/static/img/f4f-logo.png" width="80px">
-<br>
-<p>Dear Fed4FIRE user,</p>
-<p></p>
-<p>You have recently requested the following slice on the Fed4FIRE portal({{portal_url}}):</p> 
-<br>
-<b>Slice name   :</b> {{slice_name}}<br>
-<b>URL          :</b> {{url}}<br>
-<b>Purpose      :</b> {{purpose}}<br>
-<br>
-<p>We regret to inform you that, a manager of your institution has not confirmed your request. Please contact the manager of your institution for further information. 
-For any other queries, please contact us by replying to this email.</p>
-<br>
-<p>We wish you a fruitful user experience on Fed4FIRE.</p>
-<br>
-<p>Yours sincerely,</p>
-<p>The Fed4FIRE team</p>
diff --git a/portal/templates/fed4fire/fed4fire_slice_request_denied.txt b/portal/templates/fed4fire/fed4fire_slice_request_denied.txt
deleted file mode 100644 (file)
index 21897b4..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-Dear Fed4FIRE user,
-
-You have recently requested the following slice on the Fed4FIRE portal({{portal_url}}):
-
-Slice name   : {{slice_name}}
-URL          : {{url}}
-Purpose      : {{purpose}}
-We regret to inform you that, a manager of your institution has not confirmed your request. Please contact the manager of your institution for further information. For any other queries, please contact us by replying to this email.
-
-We wish you a fruitful user experience on Fed4FIRE.
-
-Yours sincerely,
-The Fed4FIRE team
-
diff --git a/portal/templates/fed4fire/fed4fire_slice_request_email.html b/portal/templates/fed4fire/fed4fire_slice_request_email.html
deleted file mode 100644 (file)
index 5a217d8..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-<img src="https://portal.fed4fire.eu/static/img/f4f-logo.png" width="80px">
-<br>
-<h1>NEW SLICE REQUEST</h1>
-<br>
-<p>You are receiving this request because we have you listed as a manager at an organization that uses Fed4FIRE.</p>
-<p>A user from your organization has requested the creation of a new slice, which will allow him or her to reserve testbed resources to conduct an experiment.</p>
-<br>
-<b>Slice name      :</b> {{slice_name}}</br>
-<b>URL                            :</b> {{url}}</br>
-<b>Purpose         :</b> {{purpose}}</br>
-<b>Organization           :</b> {{organization}}</br>
-<b>Email           :</b> {{email}}</br>
-<b>Portal url     :</b> {{current_site}}</br> 
-<p></p>
-<p>You can see new slice request <a href="{{current_site}}/portal/institution#requests">in the portal.</a><p>
-<p>Please be sure that you know the user who is requesting this slice, as you are responsible for his or her actions.</p>
-<p>And kindly ensure that the stated experiment purpose is clear, and, if there is a website that explains the website, that a URL is provided.</p>
-<p>Fed4FIRE and its affiliated testbeds exist purely to support useful and interesting work. To ensure the future of these environments, we need to know what work is actually being done.</p>
-<p></p>
-<p>If you believe that you have received this message in error, or if you have any questions, kindly contact contact@fed4fire.eu</p>
-
-
diff --git a/portal/templates/fed4fire/fed4fire_slice_request_email.txt b/portal/templates/fed4fire/fed4fire_slice_request_email.txt
deleted file mode 100644 (file)
index 5e8d24d..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-NEW SLICE REQUEST
-
-You are receiving this request because we have you listed as a manager at an organization that uses Fed4FIRE.
-A user from your organization has requested the creation of a new slice, which will allow him or her to reserve testbed resources to conduct an experiment.
-
-Slice name      : {{slice_name}}
-URL                    : {{url}}
-Purpose         : {{purpose}}
-Email           : {{email}}
-Organization   : {{organization}}
-Portal url             : {{current_site}}
-
-You can see new slice request in: {{current_site}}/portal/institution#requests
-Please be sure that you know the user who is requesting this slice, as you are responsible for his or her actions.
-And kindly ensure that the stated experiment purpose is clear, and, if there is a website that explains the website, that a URL is provided. 
-Fed4FIRE and its affiliated testbeds exist purely to support useful and interesting work. To ensure the future of these environments, we need to know what work is actually being done. 
-
-If you believe that you have received this message in error, or if you have any questions, kindly contact contact@fed4fire.eu
-
diff --git a/portal/templates/fed4fire/fed4fire_slice_request_validated.html b/portal/templates/fed4fire/fed4fire_slice_request_validated.html
deleted file mode 100644 (file)
index 6fdcbbf..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<img src="https://portal.fed4fire.eu/static/img/f4f-logo.png" width="80px">
-<br>
-<p>Dear Fed4FIRE user,</p>
-<p></p>
-<p>You have recently requested a slice in the Fed4FIRE portal.</p>
-<br>
-<b>Slice name   :</b> {{slice_name}}<br>
-<b>URL          :</b> {{url}}<br>
-<b>Purpose      :</b> {{purpose}}<br>
-<p></p>
-<p>
-       We are pleased to inform you that a manager from your institution has validated your slice request on the Fed4FIRE portal. 
-       You can now add resources to you slice and start experimenting.
-</p>
-<p></p>
-<p>We wish you a fruitful user experience with the Fed4FIRE portal.</p>
-<p></p>
-<p>Yours sincerely,</p>
-<p>The Fed4FIRE team</p>
-
-
diff --git a/portal/templates/fed4fire/fed4fire_slice_request_validated.txt b/portal/templates/fed4fire/fed4fire_slice_request_validated.txt
deleted file mode 100644 (file)
index a89be97..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-Dear Fed4FIRE user,
-
-You have recently requested a slice in the Fed4FIRE portal.
-
-Slice name      : {{slice_name}}
-URL             : {{url}}
-Purpose         : {{purpose}}
-
-
-We are pleased to inform you that a manager from your institution has validated your slice request on the Fed4FIRE portal. You can now add resources to you slice and start experimenting.
-
-We wish you a fruitful user experience with the Fed4FIRE portal.
-
-Yours sincerely,
-The Fed4FIRE team
diff --git a/portal/templates/fed4fire/fed4fire_user_register_complete.html b/portal/templates/fed4fire/fed4fire_user_register_complete.html
deleted file mode 100644 (file)
index bcecea0..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-{% extends "layout.html" %}
-
-{% block content %}
-
-<div class="row">
-       <h1><img src="{{ STATIC_URL }}img/icon_user_small.png" alt="User Registration" /> User sign-up</h1>
-</div>
-<div class="row">
-  <h3>Sign up information received.</h3>
-  <p>You can now log in to the portal. You will have limited access. </p>
-  <p>To gain full access, two steps are required:</p>
-  <ul>
-       <li>1. You confirm your signup request by clicking on the link in the email that we have sent to your email address.<br>
-               Please be aware that it can happen that this email was automatically filtered to your spam box.<br>
-               Please check your spam box if you do not receive the email in a few minutes</li>
-       <li>2. A manager from your organization validates your request. Upon confirmation of your signup request,<br> 
-               we will send an email to the managers at your organization with a validation request.</li>
-  </ul>                
-</div>
-
-{% endblock %}
diff --git a/portal/templates/fed4fire/fed4fire_user_request_denied.html b/portal/templates/fed4fire/fed4fire_user_request_denied.html
deleted file mode 100644 (file)
index 9245cbd..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<img src="https://portal.fed4fire.eu/static/img/f4f-logo.png" width="80px">
-<br>
-<p>Dear {{first_name}} {{last_name}},</p>
-<p></p>
-<p>You have recently registered as a user to Fed4FIRE portal. We are sorry to inform you that, a manager of your institution has rejected your request. Please contact the manager of your institution for further information. For any other queries, contact us by replying to this email.</p>
-<p></p>
-<p>We  wish you all the best.</p>
-<p></p>
-<p>Yours sincerely,</p>
-<p>The Fed4FIRE team</p>
-
diff --git a/portal/templates/fed4fire/fed4fire_user_request_denied.txt b/portal/templates/fed4fire/fed4fire_user_request_denied.txt
deleted file mode 100644 (file)
index b3afba5..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-Dear {{first_name}} {{last_name}},
-
-You have recently registered as a user to Fed4FIRE portal. We are sorry to inform you that, a manager of your institution has rejected your request. Please contact the manager of your institution for further information. For any other queries, contact us by replying to this email.
-
-We wish you all the best.
-
-Yours sincerely,
-The Fed4FIRE team
diff --git a/portal/templates/fed4fire/fed4fire_user_request_email.html b/portal/templates/fed4fire/fed4fire_user_request_email.html
deleted file mode 100644 (file)
index b9b090f..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-<img src="https://portal.fed4fire.eu/static/img/f4f-logo.png" width="80px">
-<br>
-<h1>NEW USER REQUEST</h1>
-<br>
-<b>First name   :</b> {{first_name}}<br>
-<b>Last name    :</b> {{last_name}}<br>
-<b>Organization :</b> {{organization}}<br>
-<b>Authority hrn:</b> {{authority_hrn}}<br>
-<b>Public key   :</b> {{public_key}}<br>
-<b>Email        :</b> {{email}}<br>
-<b>User hrn     :</b> {{user_hrn}}<br>
-<b>Portal url  :</b> {{ current_site }}<br>
-<p></p>
-<p>You can validate the user <a href="{{current_site}}/portal/institution#requests">here</a>.<p>
-<br>
-<p>Please note that the validation request will only become visible once the user has confirmed his/her email address.</p>
diff --git a/portal/templates/fed4fire/fed4fire_user_request_email.txt b/portal/templates/fed4fire/fed4fire_user_request_email.txt
deleted file mode 100644 (file)
index 17ce184..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-NEW USER REQUEST
-
-First name   : {{first_name}}
-Last name    : {{last_name}} 
-Organization :{{organization}}
-Authority hrn: {{authority_hrn}}
-Public key   : {{public_key}}
-Email        : {{email}}
-User hrn     : {{user_hrn}}
-Portal url   : {{ current_site }}
-
-Please note that the validation request will only become visible once the user has confirmed his/her email address.
-
-
diff --git a/portal/templates/fed4fire/fed4fire_widget-email_footer.html b/portal/templates/fed4fire/fed4fire_widget-email_footer.html
new file mode 100644 (file)
index 0000000..9e0d281
--- /dev/null
@@ -0,0 +1,3 @@
+<p></p>
+<p>Yours sincerely,</p>
+<p>The Fed4FIRE team</p>
index 955ab16..55d7403 100644 (file)
@@ -93,7 +93,7 @@
 <div class="container-fluid home">
        <div class="">
         <div class="col-sm-2"></div>
-        {% include theme|add:"_slogan.html" %}
+        {% widget '_slogan.html' %}
         <div class="col-sm-5 col-sm-offset-1">
             <div class="row">
                 {% widget '_widget-login-user.html' %}
@@ -1,8 +1,8 @@
-<img src="https://portal.fed4fire.eu/static/img/f4f-logo.png" width="80px">
+<img src="{{current_site}}/static/img/{{theme.logo}}" width="80px">
 <br>
-<p>Dear Fed4FIRE user,</p>
+<p>Dear {{theme.label}} user,</p>
 <p></p>
-<p>You have recently requested to join a project in the Fed4FIRE portal.</p>
+<p>You have recently requested to join a project in the {{theme.label}} portal.</p>
 <br>
 <b>Project name  :</b> {{project_name}}</br>
 <b>Authority     :</b> {{authority_hrn}}</br>
@@ -12,7 +12,7 @@
 <p>We regret to inform you that, a manager of your institution has rejected your request. Please contact the manager of your institution for further information. 
 For any other queries, please contact us by replying to this email.</p>
 <br>
-<p>We wish you a fruitful user experience on Fed4FIRE.</p>
+<p>We wish you a fruitful user experience on {{theme.label}}.</p>
 <br>
 <p>Yours sincerely,</p>
-<p>The Fed4FIRE team</p>
+<p>The {{theme.label}} team</p>
@@ -1,6 +1,6 @@
-Dear Fed4FIRE user,
+Dear {{theme.label}} user,
 
-You have recently requested to join a project in the Fed4FIRE portal.
+You have recently requested to join a project in the {{theme.label}} portal.
 
 Project name  : {{project_name}}
 Authority     : {{authority_hrn}}
@@ -8,8 +8,8 @@ Email         : {{email}}
  
 We regret to inform you that, a manager of your institution has rejected your request. Please contact the manager of your institution for further information. For any other queries, please contact us by replying to this email.
 
-We wish you a fruitful user experience on Fed4FIRE.
+We wish you a fruitful user experience on {{theme.label}}.
 
 Yours sincerely,
-The Fed4FIRE team
+The {{theme.label}} team
 
@@ -1,8 +1,8 @@
-<img src="https://portal.fed4fire.eu/static/img/f4f-logo.png" width="80px">
+<img src="{{current_site}}/static/img/{{theme.logo}}" width="80px">
 <br>
 <h1>JOIN PROJECT REQUEST</h1>
 <br>
-<p>You are receiving this request because we have you listed as a manager of a project that uses Fed4FIRE.</p>
+<p>You are receiving this request because we have you listed as a manager of a project that uses {{theme.label}}.</p>
 <p>A user has requested to join your project, which will allow him or her to reserve testbed resources to conduct an experiment.</p>
 <br>
 <b>Project name  :</b> {{project_name}}</br>
@@ -11,8 +11,8 @@
 <p></p>
 <p>You can accept or reject this request <a href="{{current_site}}/portal/project/{{authority_hrn}}.{{project_name}}#requests">in the portal.</a><p>
 <p>Please be sure that you know the user who is requesting to join your project.</p>
-<p>Fed4FIRE and its affiliated testbeds exist purely to support useful and interesting work. To ensure the future of these environments, we need to know what work is actually being done.</p>
+<p>{{theme.label}} and its affiliated testbeds exist purely to support useful and interesting work. To ensure the future of these environments, we need to know what work is actually being done.</p>
 <p></p>
-<p>If you believe that you have received this message in error, or if you have any questions, kindly contact contact@fed4fire.eu</p>
+<p>If you believe that you have received this message in error, or if you have any questions, kindly contact contact@{{theme.theme}}.eu</p>
 
 
@@ -1,6 +1,6 @@
 JOIN PROJECT REQUEST
 
-You are receiving this request because we have you listed as a manager a project that uses Fed4FIRE.
+You are receiving this request because we have you listed as a manager a project that uses {{theme.label}}.
 A user has requested to join your project, which will allow him or her to reserve testbed resources to conduct an experiment.
 
 Project name  : {{project_name}}
@@ -13,7 +13,7 @@ You can accept or reject thisrequest in:
 
 Please be sure that you know the user who is requesting to join your project.
 
-Fed4FIRE and its affiliated testbeds exist purely to support useful and interesting work. To ensure the future of these environments, we need to know what work is actually being done. 
+{{theme.label}} and its affiliated testbeds exist purely to support useful and interesting work. To ensure the future of these environments, we need to know what work is actually being done. 
 
-If you believe that you have received this message in error, or if you have any questions, kindly contact contact@fed4fire.eu
+If you believe that you have received this message in error, or if you have any questions, kindly contact contact@{{theme.theme}}.eu
 
diff --git a/portal/templates/join_request_validated.html b/portal/templates/join_request_validated.html
new file mode 100644 (file)
index 0000000..f630fc3
--- /dev/null
@@ -0,0 +1,20 @@
+<img src="{{current_site}}/static/img/{{theme.logo}}" width="80px">
+<br>
+<p>Dear {{theme.label}} user,</p>
+<p></p>
+<p>You have recently requested to join a project in the {{theme.label}} portal.</p>
+<br>
+<b>Project name  :</b> {{project_name}}</br>
+<b>Authority     :</b> {{authority_hrn}}</br>
+<b>Email         :</b> {{email}}</br>
+<p></p>
+<p>
+       We are pleased to inform you that a project manager has validated your request on the {{theme.label}} portal. You have automatically been added to all existing slices in this project. You may also create new slices in this project and start experimenting.
+</p>
+<p></p>
+<p>We wish you a fruitful user experience with the {{theme.label}} portal.</p>
+<p></p>
+<p>Yours sincerely,</p>
+<p>The {{theme.label}} team</p>
+
+
diff --git a/portal/templates/join_request_validated.txt b/portal/templates/join_request_validated.txt
new file mode 100644 (file)
index 0000000..25e3069
--- /dev/null
@@ -0,0 +1,14 @@
+Dear {{theme.label}} user,
+
+You have recently requested to join a project in the {{theme.label}} portal.
+
+Project name  : {{project_name}}
+Authority     : {{authority_hrn}}
+Email         : {{email}}
+
+We are pleased to inform you that a project manager has validated your request on the {{theme.label}} portal. You have automatically been added to all existing slices in this project. You may also create new slices in this project and start experimenting.
+
+We wish you a fruitful user experience with the {{theme.label}} portal.
+
+Yours sincerely,
+The {{theme.label}} team
index 89d06ba..d065766 100644 (file)
        <div class="form-group">
        <input type="tel" id="pi_phone" name="pi_phone" value="{{ pi_phone }}" 
                title="We may phone the manager as part of the validation process, and in case any issues arise with the use of the system."
-               style="width:200px" placeholder="Phone number"  maxlength="20" class="form-control" required>
+               style="width:200px" placeholder="Phone number"  maxlength="20" class="form-control">
     </div>
        <div class="form-group">
-               <input type="password"  id="password" name="pi_password"   class="form-control" style="width:200px" minlength="4" value="{{ password }}" placeholder="Password" required/>
+               <input type="password"  id="password" name="pi_password"   class="form-control" style="width:200px" minlength="8" value="{{ password }}" placeholder="Password" required/>
        </div>
        <div class="form-group">
-       <input type="password"  id="confirmpassword" name="confirmpassword" style="width:200px"  minlength="4" class="form-control" value="" placeholder="Confirm Password" required/>
+       <input type="password"  id="confirmpassword" name="confirmpassword" style="width:200px"  minlength="8" class="form-control" value="" placeholder="Confirm Password" required/>
        </div>
 
        </div>
diff --git a/portal/templates/onelab/onelab_contact_support_email.html b/portal/templates/onelab/onelab_contact_support_email.html
new file mode 100644 (file)
index 0000000..61fb144
--- /dev/null
@@ -0,0 +1,9 @@
+<img src="https://portal.onelab.eu/static/img/onelab-portal.png" width="80px">
+<br>
+<b>Email        :</b> {{email}}
+
+<h1>Query details</h1>
+
+<b>Subject      :</b> {{subject}}
+<b>Query        :</b> {{description}}
+
diff --git a/portal/templates/onelab/onelab_contact_support_email_subject.txt b/portal/templates/onelab/onelab_contact_support_email_subject.txt
new file mode 100644 (file)
index 0000000..8020a04
--- /dev/null
@@ -0,0 +1 @@
+OneLab support: {{email}} submitted a query.
diff --git a/portal/templates/onelab/onelab_slice-resource-view.html b/portal/templates/onelab/onelab_slice-resource-view.html
deleted file mode 100644 (file)
index 3fefedf..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-{% extends "layout_wide.html" %}
-{% load portal_filters %}
-
-{% block head %}
-<!-- <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=AIzaSyC1RUj824JAiHRVqgc2CSIg4CpKHhh84Lw&sensor=false"></script> -->
-<script src="{{ STATIC_URL }}js/onelab_slice-resource-view.js"></script>
-<script>
-       //myslice.slice = "{{ slice }}";
-
-$(document).ready(function() {
-            $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
-        // find the plugin object inside the tab content referenced by the current tabs
-        $('.plugin', $($(e.target).attr('href'))).trigger('shown.bs.tab');
-        $('.plugin', $($(e.target).attr('href'))).trigger('show');
-            });
-});
-</script>
-{% endblock %}
-
-{% block content %}
-{% widget '_widget-slice-sections.html' %}
-<div class="container-fluid container-resource">
-       <div class="row">
-       <div class="col-md-2">
-               <!-- <div id="select-platform" class="list-group"></div> -->
-               {{filter_testbeds}}
-       </div>
-       <div class="col-md-10" style="height:100%;">
-               <div class="row">
-                       {% if msg %}
-                       <div class="col-md-12"><p class="alert-success">{{ msg }}</p></div>
-                       {% endif %}
-               </div>
-       
-               <div class="row">
-                       <div class="col-md-6">
-                               {{ filter_status }}
-                       </div>
-                       <div class="col-md-1">
-                               {{ apply }}
-                       </div>
-               </div>
-               <!--
-               <div class="list-group-item list-resources">
-                       <span class="list-group-item-heading" style="padding-left: 0;">Resource status:</span>
-                       <a class="list-group-item active" data-panel="resources" href="#" style='display: inline-block !important;'>All</a>
-                       <a class="list-group-item" data-panel="reserved" href="#" style='display: inline-block !important;'>Reserved</a>
-                       <a class="list-group-item" data-panel="pending" href="#" style='display: inline-block !important;'>Pending <span class="badge" id="badge-pending" data-number="0"></span></a>
-               </div>
-               -->
-
-               <div class="row">
-                       <div class="col-md-12">
-                       <ul class="nav nav-tabs">
-                         <li class="active"><a href="#resourcelist" role="tab" data-toggle="tab">Table</a></li>
-                         <li> <a href="#resourcemap" role="tab" data-toggle="tab">Map</a></li>
-                         <li> <a href="#resourcescheduler" role="tab" data-toggle="tab">Scheduler</a></li>
-                       </ul>
-                       </div>
-               </div>
-               
-               <!-- Modal - columns selector -->
-               <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
-                       <div class="modal-dialog">
-                       <div class="modal-content">
-                               <div class="modal-header">
-                                       <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
-                                               <h4 class="modal-title" id="myModalLabel">Columns selector</h4>
-                               </div>
-                               <div class="modal-body">
-                                       {{columns_editor}}
-                               </div>
-                               <div class="modal-footer">
-                                       <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
-                               </div>
-                       </div>
-                       </div>
-               </div>
-               
-               
-               <div class="row">
-                       <div class="col-md-12">
-                       <div class="tab-content" style="height:100%;">
-                               <div class="tab-pane active" id="resourcelist">
-                                        <!-- Button trigger modal - columns selector -->
-                                       <button class="btn btn-default btn-sm" style="float:right;" data-toggle="modal" data-target="#myModal">...</button>
-                       {{list_resources}}
-                                       <!-- <table cellpadding="0" cellspacing="0" border="0" class="table" id="objectList"></table> -->
-                               </div>
-                               <div class="tab-pane" id="resourcemap">
-                       {{map_resources}}
-                               </div>
-                               <div class="tab-pane" id="resourcescheduler">
-                       {{scheduler}}
-                               </div>
-       
-                               <!--
-                               <div id="reserved" class="tab-pane" style="height:370px;display:none;">
-                       <table width="80%">
-                           <tr><th width="50%" style="text-align:center;">resources</th><th width="50%" style="text-align:center;">leases</th></tr>
-                           <tr>
-                               <td style="text-align:center">{{list_reserved_resources}}</td>
-                               <td style="text-align:center">{{list_reserved_leases}}</td>
-                           </tr>
-                       </table>
-                               </div>
-                               <div id="pending" class="tab-pane" style="height:370px;display:none;">
-                       {{pending_resources}}
-                               </div>
-                               <div id="sla_dialog" class="tab-pane" style="height:370px;display:none;">
-                       {{sla_dialog}}
-                               </div>
-       -->
-       
-                       </div>
-               </div>
-       </div>
-       </div>
-       </div>
-</div>
-{% endblock %}
diff --git a/portal/templates/onelab/onelab_slice-view.html b/portal/templates/onelab/onelab_slice-view.html
deleted file mode 100644 (file)
index 21a7dae..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-{% extends "layout_wide.html" %}
-
-{% block head %}
-{% endblock %}
-
-{% block content %}
-{% include theme|add:"_widget-slice-sections.html" %}
-<div class="container-fluid tab-content container-slice">
-  <div class="tab-pane active row" id="info"></div>
-  <div class="tab-pane row" id="testbeds"></div>
-  <div class="tab-pane row" id="resources"></div>
-  <div class="tab-pane row" id="users"></div>
-  <!-- <div class="tab-pane row" id="statistics"></div> -->
-  <div class="tab-pane row" id="measurements"></div>
-  <div class="tab-pane row" id="experiment"></div>
-  <!-- <div class="tab-pane row" id="studentslabs"></div> -->
-</div>         
-{% endblock %}
diff --git a/portal/templates/onelab/onelab_user_request_email.html b/portal/templates/onelab/onelab_user_request_email.html
deleted file mode 100644 (file)
index f5f4573..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-<img src="https://onelab.eu/static/images/onelab.png"> 
-<br>
-<h1>NEW USER REQUEST</h1>
-<br>
-<p>You are receiving this request because we have you listed as a manager at an organization that uses OneLab.</p> 
-<p>If you believe that you have received this message in error, or if you have any questions, kindly contact support@onelab.eu.</p>
-<br>
-<b>First name   :</b> {{first_name}}<br>
-<b>Last name    :</b> {{last_name}}<br>
-<b>Organization :</b> {{organization}}<br>
-<b>Authority hrn:</b> {{authority_hrn}}<br>
-<b>Public key   :</b> {{public_key}}<br>
-<b>Email        :</b> {{email}}<br>
-<b>User hrn     :</b> {{user_hrn}}<br>
-<b>Portal url  :</b> {{ current_site }}<br>
-<p></p>
-<p>You can see new user request <a href="{{current_site}}/portal/institution#requests">in the portal.</a><p>
-<p>Please note that the request will only become visible to you on the OneLab portal once the user has confirmed his/her email address.</p>
-<p>Please only validate users who you know for whose actions you are prepared to take responsibility, as described in the 
-<a href="{{current_site}}/terms">OneLab terms and conditions.</a> If you find any anomalies in the request 
-(mistakes/spam/unauthorized persons) please <a href="mailto:support@onelab.eu">notify us.</a></p>
-
diff --git a/portal/templates/onelab/onelab_user_request_email.txt b/portal/templates/onelab/onelab_user_request_email.txt
deleted file mode 100644 (file)
index 68a8253..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-NEW USER REQUEST
-
-You are receiving this request because we have you listed as a manager at an organization that uses OneLab. 
-If you believe that you have received this message in error, or if you have any questions, kindly contact support@onelab.eu.
-
-First name   : {{first_name}}
-Last name    : {{last_name}} 
-Organization :{{organization}}
-Authority hrn: {{authority_hrn}}
-Public key   : {{public_key}}
-Email        : {{email}}
-User hrn     : {{user_hrn}}
-Portal url   : {{ current_site }}
-
-You can see new user request in the portal: {{current_site}}/portal/institution#requests
-
-Please note that the request will only become visible to you on the OneLab portal once the user has confirmed his/her email address.
-
-Please only validate users who you know for whose actions you are prepared to take responsibility, as described in the OneLab terms and conditions. 
-If you find any anomalies in the request (mistakes/spam/unauthorized persons)  please notify us at support@onelab.eu.
-
diff --git a/portal/templates/onelab/onelab_widget-email_footer.html b/portal/templates/onelab/onelab_widget-email_footer.html
new file mode 100644 (file)
index 0000000..dfb7557
--- /dev/null
@@ -0,0 +1,6 @@
+<p></p>
+<p>Yours sincerely,</p>
+
+<p>Timur Friedman</p>
+<p>Executive Director</p>
+
diff --git a/portal/templates/onelab/onelab_widget-slice-sections.html b/portal/templates/onelab/onelab_widget-slice-sections.html
deleted file mode 100644 (file)
index 44b5d63..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-<div class="container">
-       <div class="row">
-               <div class="col-md-12">
-                        <div class="breadcrumbs">
-                                Experiment &nbsp;>&nbsp; Slice: {{ slice }}
-                        </div>
-               </div>
-       </div>
-</div>
-<div class="container-fluid container-slice">
-<div class="row">
-               <div class="col-md-12">
-{% if section == "resources" %}
-<ul class="nav nav-tabs nav-section">
-       
-       <!-- <li><a href="/slice/{{ slice }}#testbeds">Testbeds</a></li> -->
-       <li class="active"><a class="link" href="/resources/{{ slice }}">Resources</a></li>
-       <li><a href="/slice/{{ slice }}#users">Users</a></li>
-       <li><a href="/slice/{{ slice }}#info">Information</a></li>
-       <!-- <li><a href="/slice/{{ slice }}#experiment">Statistics</a></li> -->
-       <li><a href="/slice/{{ slice }}#measurements">Measurements</a></li>
-       <li><a href="/slice/{{ slice }}#experiment">Tools</a></li>
-       <!-- <li><a href="/slice/{{ slice }}#studentslabs">Students Labs</a></li> -->
-</ul>
-{% else %}
-<ul class="nav nav-tabs nav-section">
-       <!-- <li class="testbeds"><a href="#testbeds">Testbeds</a></li> -->
-       <li><a class="link" href="/resources/{{ slice }}">Resources</a></li>
-       <li class="users"><a href="#users">Users</a></li>
-       <li class="active"><a href="#info">Information</a></li>
-       <!-- <li class="statistics"><a href="#experiment">Statistics</a></li> -->
-       <li class="measurements"><a href="#measurements">Measurements</a></li>
-       <li class="experiment"><a href="#experiment">Tools</a></li>
-       <!-- <li class="studentslabs"><a href="#studentslabs">Students Labs</a></li> -->
-</ul>
-
-<script>
-$(document).ready(function() {
-       $('.nav-tabs a').click(function (e) {
-               if ($(this).hasClass('link')) return;
-               e.preventDefault();
-               $(this).tab('show');
-       var id = $(this).attr('href').substr(1);        
-       $("#" + id).load('/' + id + '/{{ slice }}/');
-       });
-       
-       var hash = window.location.hash;
-       if (hash) {
-               $('.nav-tabs a[href='+hash+']').click();
-       } else {
-               $('div#info').load('/info/{{ slice }}/');
-       }
-});
-</script>
-{% endif %}
-</div>
-</div>
-</div>
diff --git a/portal/templates/onelab/onelab_widget-user_request_email.html b/portal/templates/onelab/onelab_widget-user_request_email.html
new file mode 100644 (file)
index 0000000..b380885
--- /dev/null
@@ -0,0 +1,3 @@
+<p>Please only validate users who you know for whose actions you are prepared to take responsibility, as described in the 
+<a href="{{current_site}}/terms">OneLab terms and conditions.</a> If you find any anomalies in the request 
+(mistakes/spam/unauthorized persons) please <a href="mailto:support@onelab.eu">notify us.</a></p>
index 33532fd..158ad11 100644 (file)
@@ -2,18 +2,15 @@
 <br>
 <p>Dear {{theme.label}} user,</p>
 <p></p>
-<p>You have recently requested a project in the {{theme}} portal.</p>
-<br>
+<p>You have recently requested a project in the {{theme.label}} portal.</p>
+
 <b>Project name  :</b> {{project_name}}</br>
 <b>Authority     :</b> {{authority_hrn}}</br>
 <b>Email         :</b> {{email}}</br>
 <b>Purpose       :</b> {{purpose}}</br>
-<p></p>
-<br>
+
 <p>We regret to inform you that, a manager of your institution has rejected your request. Please contact the manager of your institution for further information. 
 For any other queries, please contact us by replying to this email.</p>
-<br>
-<p>We wish you a fruitful user experience on {{{{theme.label}}}}.</p>
-<br>
+<p>We wish you a fruitful user experience on {{theme.label}}.</p>
 <p>Yours sincerely,</p>
-<p>The {{{{theme.label}}}} team</p>
+<p>The {{theme.label}} team</p>
index 5422769..991127f 100644 (file)
@@ -19,6 +19,4 @@
 <p>If you believe that you have received this message in error, or if you have any questions, kindly contact contact@{{theme.theme}}.eu</p>
 <br>
 <p>Yours sincerely,</p>            
-<p>The {{{{theme.label}}}} team</p>
-
-{%# include theme|add:"_widget-email_footer.html" %}
+<p>The {{theme.label}} team</p>
index 3b267bf..8558228 100644 (file)
@@ -130,7 +130,7 @@ $(document).ready(function() {
             $('.project-list').append('<tr><td>'+ val +'</td></tr>');
         });
     } else {
-        $('.project-list').html('<tr><td>no projetcs</td></tr>');
+        $('.project-list').html('<tr><td>no projects</td></tr>');
     }
     
     $('.nav-tabs a').click(function (e) {
index b0bb14a..ec90abf 100644 (file)
@@ -40,7 +40,7 @@
                 {% if authorities %}
                     {% for authority in authorities %}
                         {% if authority.name %}
-                                <option value="{{ authority.authority_hrn }}">{{authority.name}}</option>
+                                <option value="{{ authority.authority_hrn }}">{{authority.shortname}} - {{authority.name}}</option>
                         {% else %}
                             <option value="{{ authority.authority_hrn }}">{{authority.authority_hrn}}</option>
                         {% endif %}
diff --git a/portal/templates/release-notes-view.html b/portal/templates/release-notes-view.html
new file mode 100644 (file)
index 0000000..35852df
--- /dev/null
@@ -0,0 +1,44 @@
+{% extends "layout.html" %}
+
+{% block content %}
+
+<div class="col-md-8">
+       <br>
+       <h2>Release Notes</h2>
+       <h3>Version</h3>
+       <h4>1.5</h4>
+    <h5>Release date: 17 June 2015</h5>
+           <ul>
+            <li>Improved loading time for registration</li>
+            <li>Tools tab is dynamically sending Describe calls using SFA Rest</li>
+            <li>Various bugfixes</li>
+        </ul>
+    <br>
+       <h4>1.4</h4>
+    <h5>Release date: 12 May 2015</h5>
+           <ul>
+            <li>Create projects within any organization (requires validation)</li>
+            <li>Join any projects under any organizations (requires validation)</li>
+            <li>
+                Manage your projects (All users within a project can manage it)
+                <ul>
+                    <li>Accept/reject users willing to join your project</li>
+                    <li>Create/delete slices within your project</li>
+                </ul>
+            </li>
+            <li>
+                Now create slices within a project, instead of directly under your organization
+                <ul>
+                    <li>
+                        Create as many slices as you wish within a project, without requiring approval from the organization manager
+                    </li>
+                </ul>
+            </li>
+            <li>Faster loading time for resources, slices, and organizations</li>
+            <li>Improved automatic email communication</li>
+            <li>Improved stability, reliability and user-friendliness</li>
+            <li>Several bug fixes</li>
+        </ul>  
+</div>
+{% endblock %}
+
index 9ab6807..c848b06 100644 (file)
@@ -2,9 +2,9 @@
 
 {% block content %}
 
-  <h1>Slice created</h1>
+  <h1>Success</h1>
 
-As a manager of your institution, your slice has directly been created directly.
+Your slice has been created. You can view all your slices in the <a href="/">dashboard.</a>
 <script>
 $(document).ready(function() {
     localStorage.clear();
index 3fefedf..cbd8d1b 100644 (file)
@@ -33,7 +33,7 @@ $(document).ready(function() {
                </div>
        
                <div class="row">
-                       <div class="col-md-6">
+                       <div class="col-md-8">
                                {{ filter_status }}
                        </div>
                        <div class="col-md-1">
@@ -55,6 +55,7 @@ $(document).ready(function() {
                          <li class="active"><a href="#resourcelist" role="tab" data-toggle="tab">Table</a></li>
                          <li> <a href="#resourcemap" role="tab" data-toggle="tab">Map</a></li>
                          <li> <a href="#resourcescheduler" role="tab" data-toggle="tab">Scheduler</a></li>
+                         <!--<li> <a href="#resourcesasap" role="tab" data-toggle="tab">ASAP</a></li> -->
                        </ul>
                        </div>
                </div>
@@ -93,7 +94,10 @@ $(document).ready(function() {
                                <div class="tab-pane" id="resourcescheduler">
                        {{scheduler}}
                                </div>
-       
+                                       <!-- <div class="tab-pane" id="resourcesasap">
+                       {{asap}}
+                               </div> -->
+
                                <!--
                                <div id="reserved" class="tab-pane" style="height:370px;display:none;">
                        <table width="80%">
index e10c88f..1af5661 100644 (file)
@@ -1,20 +1,68 @@
+<script type="text/javascript">
+function is_finished(len_platforms, pf_status){
+    if(len_platforms == pf_status){
+        return true;
+    }else{
+        return false;
+    }
+}
+
+// Specific DIVs for each type of testbed
+$(document).ready(function() {
+    var platform_status = Array();
+    var platform_empty = Array();
+    {% for platform in platforms %}
+    // /sfa/Describe?hrn=onelab.upmc.projectx.slicex&platform[]={{platform}}&type=slice
+    $.post("/sfa/Describe",{'hrn':'{{slicename}}', 'type':'slice', 'platform':['{{platform}}']}, function( data ) {
+        if('parsed' in data['{{platform}}'] && 'rspec' in data['{{platform}}']['parsed']){
+            rspec = data['{{platform}}']['parsed']['rspec'];
+            if('node' in rspec){
+                if(rspec['node'] instanceof Array) {
+                    jQuery.each( rspec['node'], function( i, node ) {
+                        render_node('{{platform}}',node);
+                    });
+                }else{
+                    render_node('{{platform}}',rspec['node']);
+                }
+            }else{
+                platform_empty.push('{{platform}}');
+            }
+        }else{
+            platform_empty.push('{{platform}}');
+        }
+        platform_status.push('{{platform}}');
+        if(is_finished({{len_platforms}},platform_status.length)){
+            $("#loading").hide();
+            if(platform_empty.length == {{len_platforms}}){
+                $("#warning_message").show();
+            }
+        }
+    });
+    {% endfor %}
+});
+</script>
 <div class="col-md-10 col-md-offset-1">
-       {% if ple_resources or iotlab_resources or nitos_resources or nitos_paris_resources%}
-               <h2>How to access your reserved resources</h2>
-       {% endif %}
-       {% if ple_resources %}
+<div id="access">
+    <h2>How to access your reserved resources?</h2>
+    <img src="{{ STATIC_URL }}img/loading.gif" id="loading" alt="Loading reserved resources" />
+</div>
+<div id="warning_message" style="display:none; color:orange; font-weigh:bold;">
+Please add resources to your slice from the left tab <a href="/resources/{{slicename}}">"Resources"</a>
+</div>
+<div id="default">
+</div>
+{% if "ple" in platforms %}
+<div id="ple_header" style="display:none;">
        <h3>PlanetLab Europe</h3>
        
        <p>
                PlanetLab Europe resources are accessible directly via SSH. Your SSH public key is deployed automatically
                on the reserved nodes. To access your slice on a resource just type the following command:
        </p>
-       <p class="command">
-       {%for resource in ple_resources %}
-               <b>Resource</b><br>
-               $ ssh {{ple_slicename}}@{{resource}}<br>
-       {%endfor%}
-       </p>
+</div>
+<div id="ple" style="display:none;">
+</div>
+<div id="ple_footer" style="display:none;">
        <p><strong>NOTE:</strong> Your original slicename <b>{{slicename}}</b> has been converted to PlanetLab specific format <b>{{ple_slicename}}</b> in order to do SSH.</p>
        <p>
                Be aware that after you reserve a PlanetLab Europe resource your slice will be deployed with a delay of about 15 minutes, 
             <i>This bash script will be deployed on all PLE nodes of your slice</i>
         </div>
         <textarea style="width:100%; height:100px;" id="initscript_code"></textarea><br>
+<!-- TODO !!!
+        <div>
+            <select>
+                <option>All</option>
+                <option>node1</option>
+                <option>node2</option>
+            </select>
+        </div>
+-->
         <button name="deploy" class="btn btn-success btn-sm" onclick="deploy('{{slicename}}');">Deploy</button>
         <button name="delete" class="btn btn-danger btn-xs" onclick="del('{{slicename}}');">Delete</button>
     </div>
     <script type="text/javascript">
     $(document).ready(function() {
-        $.post("/initscript/get/",{'slice_hrn':'onelab.upmc.express'}, function( data ) {
-            console.log(data);
+        $.post("/initscript/get/",{'slice_hrn':'{{slicename}}'}, function( data ) {
             jQuery('#initscript_code').val(data['initscript_code']);
         });
     });
     function deploy(slice_hrn){
-        console.log("deploy = "+slice_hrn);
         var initscript_code = jQuery('#initscript_code').val()
         $.post("/initscript/update/",{'slice_hrn':slice_hrn, 'initscript_code':initscript_code}, function( data ) {
-            console.log(data);
             if (data['ret'] == 0) {
                 mysliceAlert('Success: initscript deployed','success', true);
             }else{
         });
     }
     function del(slice_hrn){
-        console.log("delete");
         $.post("/initscript/delete/",{'slice_hrn':slice_hrn}, function( data ) {
-            console.log(data);
             if (data['ret'] == 0) {
                 mysliceAlert('Success: initscript deleted','success', true);
                 jQuery('#initscript_code').val('');
     }
     </script>
     <br>
-       {% endif %}
-
-       {% if iotlab_resources %}       
+</div>
+{% endif %}
+{% if "iotlab" in platforms %}
+<div id="iotlab_header" style="display:none;">
        <h3>FIT IoT-Lab</h3>
-       <p>FIT IoT-Lab resources are accessible directly via SSH and <a href="https://devgrenoble.senslab.info/testbed/" target="_blank">web GUI.</a>
+       <p>FIT IoT-Lab resources are accessible directly via SSH and <a href="https://www.iot-lab.info/testbed/" target="_blank">web GUI.</a>
                To acess IoT-Lab resources using web GUI, use the same login and  password of OneLab portal. To acess Iot-Lab resources using SSH type
                the following command:
        </p>
-       <p class="command">
-               ssh {{iot_login}}@grenoble.iot-lab.info
-       </p>
-       {% endif %}
-       {% if nitos_resources or nitos_paris_resources %}
-       <h3>NITOS</h3>
+</div>
+<div id="iotlab" style="display:none;">
+</div>
+{% endif %}
+{% if "nitos" in platforms %}
+<div id="nitos_header" style="display:none;">
+       <h3>NITOS Volos (Greece)</h3>
        
        <p>
         NITOS resources are not directly accessible. You will need to log in on a gateway server and from there access the node.
         You will find the ssh commands to connect to NITOS nodes below:
        </p>
-
-       {% if nitos_resources %}        
        <h4>NITLab</h4>
-       <p class="command">
-           $ ssh {{slicename}}@nitlab.inf.uth.gr #nodes 001-040<br>
-        $ ssh {{slicename}}@nitlab2.inf.uth.gr #nodes 041-049<br>
-        $ ssh {{slicename}}@nitlab3.inf.uth.gr #nodes > 049
-    </p>
-       
-       <p>Loading an OMF-compatible image on your resource:</p>
-       <p class="command">
-       {%for resource in nitos_resources %}
-               <b>Resource</b><br>
-        $ omf6 stat -t {{resource}} #check the status of the node<br>
-        $ omf6 tell -a on -t {{resource}}  #turn on/off the node <br>
-       $ omf6 load -i baseline.ndz -t {{resource}}  #for orbit-like node (002-009) use "baseline_orbit.ndz"<br>
-               $ ssh root@{{resource}}  #ssh to the node<br>
-       {%endfor%}
-       </p>
+</div>
+<div id="nitos" style="display:none;">
+</div>
+<div id="nitos_footer" style="display:none;">
     <p><b>NOTE:</b> Nodes 002-009 are orbit-like nodes. For these nodes use "baseline_orbit.ndz". All these images come with OMF5.4 resource controller. To do OMF6 experiments use "baseline_omf6_1_1.ndz" and  "baseline_orbit_omf6_1_1.ndz" for grid nodes and orbit nodes respectively. </p>
-       {% endif %}
-
-       {% if nitos_paris_resources %}
-       <h4>FIT NITOS-Lab Paris</h4>
-        <p class="command">
-               $ ssh {{slicename}}@griffin.ipv6.lip6.fr
-        </p>
-       <p>For each of the reserved nodes, follo the steps given below:</p>
-       <p class="command">
-       {%for resource in nitos_paris_resources %}
-               <b>Resource</b><br>
-       $ omf load -i baseline_grid.ndz -t {{resource}}  #loading OMF image on the node<br>
-       $ omf tell -a on -t {{resource}}  #turn on the node <br>
-       $ ssh root@{{resource}}  #ssh to the node<br><br>
-       {%endfor%}
+       <p>
+       The complete tutorial on NITOS nodes:
+       <a target="_blank" href="http://nitlab.inf.uth.gr/NITlab/index.php/testbed/instructions/basic-tutorial">NITOS basic tutorial</a>
        </p>
-       {%endif%}
+    <p>OMF based experiments' tutorials are available <a href="http://nitlab.inf.uth.gr/NITlab/index.php/testbed/instructions/omf-tutorials-scenarios" target="_blank">here.</a></p> 
+       <p>To learn more about OMF, please click <a href="http://omf.mytestbed.net/projects/omf/wiki/OMF_Main_Page" target="_blank">here.</a></p>
 
+</div>
+{% endif %}
+{% if "nitos-paris" in platforms %}
+<div id="paris.fit-nitos.fr_header" style="display:none;">
+       <h4>FIT NITOS-Lab Paris</h4>
+</div>
+<div id="paris.fit-nitos.fr" style="display:none;">
+</div>
+<div id="paris.fit-nitos.fr_footer" style="display:none;">
        <p>
                On the node itself you will have to modify the file /etc/omf-resctl-5.3/omf-resctl.yaml (OMF5.4 only) according to your slice settings and then
                restart the OMF Resource Controller and finally execute the experiment:
        <p class="command">
                $ omf exec --slice {{slicename}} your_exp.rb
        </p>
+
        <p>
-       The complete tutorial on NITOS nodes:
-       <a target="_blank" href="http://nitlab.inf.uth.gr/NITlab/index.php/testbed/instructions/basic-tutorial">NITOS basic tutorial</a>
+       The complete tutorial on FIT NITOS nodes:
+       <a target="_blank" href="http://doc.onelab.eu/nitos.html">basic tutorial</a>
        </p>
     <p>OMF based experiments' tutorials are available <a href="http://nitlab.inf.uth.gr/NITlab/index.php/testbed/instructions/omf-tutorials-scenarios" target="_blank">here.</a></p> 
        <p>To learn more about OMF, please click <a href="http://omf.mytestbed.net/projects/omf/wiki/OMF_Main_Page" target="_blank">here.</a></p>
-
-       {% endif %}
-       
+</div>
+{% endif %}
+<div style="padding-top:20px;">        
        <h2>Available Tools</h2>
        <p><img src="{{ STATIC_URL }}img/terminal_icon.png" width="50"> <b>SSH</b></p>
        <p>
        <p>In addition to the main OMF software, this site also hosts OMF sub-projects addressing various related aspects of a testbed's control, measurement, and management.</p>
        <p>More Info: <a href="http://mytestbed.net/projects/omf" target="_blank">http://mytestbed.net/projects/omf</a></p>
 </div>
+</div>
index 4aebe06..963cac9 100644 (file)
@@ -2,25 +2,20 @@
 {% load portal_filters %}
 
 {% block head %}
-
+<script type="text/javascript" src="{{STATIC_URL}}js/experiment.js"></script>
 {% endblock %}
 
 {% block content %}
-<div class="container">
-       <div class="row">
-               <div class="col-md-12">
-                       {% widget "_widget-slice-sections.html" %}
-           </div>
-       </div>
-</div>
-<div class="container-fluid tab-content">
-  <div class="tab-pane active row" id="info"></div>
-  <div class="tab-pane row" id="testbeds"></div>
-  <div class="tab-pane row" id="resources"></div>
+{% widget "_widget-slice-sections.html" %}
+<div class="container-fluid tab-content container-slice">
+  <div class="tab-pane active row" id="resources"></div>
   <div class="tab-pane row" id="users"></div>
+  <div class="tab-pane row" id="info"></div>
   <!-- <div class="tab-pane row" id="statistics">...</div> -->
-  <div class="tab-pane row" id="measurements"></div>
+  <!-- <div class="tab-pane row" id="measurements"></div> -->
   <div class="tab-pane row" id="experiment"></div>
-  <div class="tab-pane row" id="sla"></div>
+  <!-- <div class="tab-pane row" id="studentslabs"></div> -->
+  <!-- <div class="tab-pane row" id="sla"></div> -->
+  <!-- <div class="tab-pane row" id="testbeds"></div> -->
 </div>         
 {% endblock %}
index ab95dee..dec31b4 100644 (file)
@@ -1,4 +1,4 @@
-<img src="https://onelab.eu/static/images/onelab.png">
+<img src="{{portal_url}}/static/img/{{theme.logo}}">
 <br>
 <p>Dear OneLab user,</p>
 <p></p>
index a9ca8f2..226829c 100644 (file)
@@ -1,8 +1,8 @@
-<img src="https://onelab.eu/static/images/onelab.png">
+<img src="https://{{current_site}}/static/img/{{theme.logo}}" width="80px">
 <br>
 <h1>NEW SLICE REQUEST</h1>
 <br>
-<p>You are receiving this request because we have you listed as a manager at an organization that uses OneLab.</p>
+<p>You are receiving this request because we have you listed as a manager at an organization that uses {{theme.label}}.</p>
 <p>A user from your organization has requested the creation of a new slice, which will allow him or her to reserve testbed resources to conduct an experiment.</p>
 <br>
 <b>Slice name      :</b> {{slice_name}}</br>
 <b>Portal url     :</b> {{current_site}}</br> 
 <p></p>
 <p>You can see new slice request <a href="{{current_site}}/portal/institution#requests">in the portal.</a><p>
-<p>Please be sure that you know the user who is requesting this slice, as you are responsible for his or her actions, as described in the 
-<a href="{{current_site}}/terms">OneLab terms and conditions.</a></p>
+<p>Please be sure that you know the user who is requesting this slice, as you are responsible for his or her actions.
 <p>And kindly ensure that the stated experiment purpose is clear, and, if there is a website that explains the website, that a URL is provided.</p>
-<p>OneLab and its affiliated testbeds exist purely to support useful and interesting work. To ensure the future of these environments, we need to know what work is actually being done.</p>
+<p>{{theme.label}} and its affiliated testbeds exist purely to support useful and interesting work. To ensure the future of these environments, we need to know what work is actually being done.</p>
 <p></p>
-<p>If you believe that you have received this message in error, or if you have any questions, kindly contact support@onelab.eu.</p>
+<p>If you believe that you have received this message in error, or if you have any questions, kindly contact support@{{theme.theme}}.eu.</p>
+
+<p>Yours sincerely,</p>
+<p>The {{theme.label}} team</p>
+
 
 
index 0f3c5b9..013a12c 100644 (file)
@@ -1,6 +1,6 @@
 NEW SLICE REQUEST
 
-You are receiving this request because we have you listed as a manager at an organization that uses OneLab.
+You are receiving this request because we have you listed as a manager at an organization that uses {{theme.label}}.
 A user from your organization has requested the creation of a new slice, which will allow him or her to reserve testbed resources to conduct an experiment.
 
 Slice name      : {{slice_name}}
@@ -11,11 +11,13 @@ Organization        : {{organization}}
 Portal url             : {{current_site}}
 
 You can see new slice request in: {{current_site}}/portal/institution#requests
-Please be sure that you know the user who is requesting this slice, as you are responsible for his or her actions, as described in the OneLab terms and conditions:
-       {{current_site}}/terms
+Please be sure that you know the user who is requesting this slice, as you are responsible for his or her actions.  
 And kindly ensure that the stated experiment purpose is clear, and, if there is a website that explains the website, that a URL is provided. 
-OneLab and its affiliated testbeds exist purely to support useful and interesting work. To ensure the future of these environments, we need to know what work is actually being done. 
+{{theme.label}} and its affiliated testbeds exist purely to support useful and interesting work. To ensure the future of these environments, we need to know what work is actually being done. 
 
 If you believe that you have received this message in error, or if you have any questions, kindly contact support@onelab.eu.
 
+Yours sincerely,
+The {{theme.label}} team
+
+
index 7fac65c..ceea370 100644 (file)
@@ -1,23 +1,20 @@
-<img src="https://onelab.eu/static/images/onelab.png">
+<img src="{{current_site}}/static/img/{{theme.logo}}">
 <br>
-<p>Dear OneLab user,</p>
+<p>Dear {{theme.label}} user,</p>
 <p></p>
-<p>You have recently requested a slice in the OneLab portal.</p>
+<p>You have recently requested a slice in the {{theme.label}} portal.</p>
 <br>
 <b>Slice name   :</b> {{slice_name}}<br>
 <b>URL          :</b> {{number_of_nodes}}<br>
 <b>Purpose      :</b> {{purpose}}<br>
 <p></p>
 <p>
-       We are pleased to inform you that a manager from your institution has validated your slice request on the OneLab portal. 
+       We are pleased to inform you that a manager from your institution has validated your slice request on the {{theme.label}} portal. 
        You can now add resources to you slice and start experimenting.
 </p>
 <p></p>
-<p>On behalf of the entire team, I wish you a fruitful user experience with the OneLab portal.</p>
-<p></p>
-<p>Yours sincerely,</p>
-
-<p>Timur Friedman</p>
-<p>Executive Director</p>
-
+<p>We wish you a fruitful user experience with the {{theme.label}} portal.</p>      
+<p></p>                                                                      
+<p>Yours sincerely,</p>                                                      
+<p>The {{theme.label}} team</p>                                                     
 
index 993e6ef..fb00fe7 100644 (file)
@@ -1,19 +1,17 @@
-Dear OneLab user,
+ne
+Dear {{theme.{{theme.label}}} user,
 
-You have recently requested a slice in the OneLab portal.
+You have recently requested a slice in the {{theme.label}} portal.
 
 Slice name      : {{slice_name}}
 URL             : {{number_of_nodes}}
 Purpose         : {{purpose}}
 
 
-We are pleased to inform you that a manager from your institution has validated your slice request on the OneLab portal. You can now add resources to you slice and start experimenting.
-
-On behalf of the entire team, I wish you a fruitful user experience with the OneLab portal.
-
-Yours sincerely,
-
-Timur Friedman
-Executive Director
+We are pleased to inform you that a manager from your institution has validated your slice request on the {{theme.label}} portal. You can now add resources to you slice and start experimenting.
 
+We wish you a fruitful user experience with the {{theme.label}} portal.             
+                                                                                    
+Yours sincerely,                                                                
+The {{theme.label}} team                                                       
 
diff --git a/portal/templates/smartfire/smartfire_account-view.html b/portal/templates/smartfire/smartfire_account-view.html
deleted file mode 100644 (file)
index 985974f..0000000
+++ /dev/null
@@ -1,374 +0,0 @@
-{% extends "layout.html" %}
-{% load portal_filters %}
-{% block content %}
-{% widget "_widget-no_credentials.html" %}
-{% widget "_widget-tradeoff.html" %}
-<div class="row">
-       <div class="col-md-12">
-                <div class="breadcrumbs">
-                        Account &nbsp;>&nbsp; <a href="/account">{{ person.email }}</a>
-                </div>
-       </div>
-        {%if 'no_creds' in user_cred %}
-    <p class="command"><a href="#" style="color:red" data-toggle="modal" data-target="#myModal">NO CREDENTIALS</a> are delegated to the portal!</p>
-    {%endif%}
-        {%if 'creds_expired' in user_cred %}
-    <p class="command"><a href="#" style="color:red" data-toggle="modal" data-target="#myModal">EXPIRED CREDENTIALS</a> Please delegate again your credentials to the portal!</p>
-    {%endif%}
-
-</div>
-{% if messages %}
-<ul class="messages">
-    {% for message in messages %}
-    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
-    {% endfor %}
-</ul>
-{% endif %}
-
-<form id="editForm" method="post" action="account_process" enctype="multipart/form-data">
-<input type="hidden" id="button_value"  name="button_value" value="" />
-
-<div class="row">
-       <div class="col-md-12">
-               <ul class="nav nav-tabs nav-section">
-                       <li class="active"><a href="#profile">User Profile</a></li>
-                       <li><a href="#account">Account</a></li>
-                       <li><a href="#access">Testbed Access</a></li>
-               </ul>
-    </div>
-</div>
-<div class="tab-content">
-       <div class="tab-pane active row" id="profile">
-               
-               <div class="col-md-12">
-
-                               {% csrf_token %}
-                                       <table class="profile">          
-                                       <tr>
-                                               <td colspan="2">
-                                                               <div><h3>Platform: Myslice</h3></div>
-                                               </td>
-                                       </tr>
-                                       <tr>
-                                               <td class="key">Email</td>
-                                               <td class="value">
-                                                               <span id="emailval" class="value" >{{ person.email }}</span>
-                                                               <button class="btn btn-default" type="button" id="edit_email" onclick="editAlert();"  title="To change your affiliation please contact the administrator">
-                                                               <span class="glyphicon glyphicon-question-sign"></span> Edit
-                                                               </button>
-                                                       </td>
-                                       </tr>
-                                       <tr class="odd">
-                                                       <td class="key">Password</td>
-                                                       <td class="value"> 
-                                                               <button class="btn btn-default btn-xs" type="button" title="Password" name="edit_pass" id="edit_pass">
-                                                                       <span class="glyphicon glyphicon-edit"></span> Edit
-                                                               </button>
-                                                               <span id="passval"class="value">******** </span>
-                                                               <span class="hide_this" id="span_pass">
-                                                               <button type="button" class="btn btn-default btn-xs" title="Cancel" id="cancel_pass_change"> Cancel </button>
-                                                               <div style='display:none;' id="pass_form">
-                                                               <input type='hidden'  value='' /></div>
-                                                               <table id="edit_password">
-                                                                       <tr>
-                                                                                       <td>Enter password: </td>
-                                                                                       <td class="field"> <input type="password" name="password" id="password" /> </td>
-                                                                               </tr>
-                                                                               <tr>
-                                                                                       <td>Confirm password: </td>
-                                                                                       <td class="field"> 
-                                                                                               <input type="password" name="confirmpassword" id="confirmpassword" /> 
-                                                                                               <input type="submit" class="btn btn-default btn-xs" name="submit_pass" value="Save"/> 
-                                                                                       </td>
-                                                                       </tr>
-                                                               </table>
-                                                               </span> 
-                                                       </td>
-                                       </tr>
-                                       <tr class="even">
-                                                       <td class="key">Full Name</td>
-                                                       <td class="value">
-                                                               <span id="nameval" class="value" >{{ fullname }} </span>
-                                                               <span class="hide_this" id="span_name">
-                                                               <button type="button" class="btn btn-default btn-xs" title="Cancel" id="cancel_name_change"> Cancel </button> 
-                                                               <div style='display:none;'><input type='hidden'  name='nameform'  /></div>
-                                                               <input id="fname" type="text" name="fname" class="required"  maxlength="200" value="{{firstname}}" />
-                                                               <input id="lname" type="text" name="lname" class="required"  maxlength="200" value="{{lastname}}" />
-                                                               <input type="submit" class="btn btn-default btn-xs" name="submit_name" value="Save"/>
-                                                               </span>
-                                                               <button class="btn btn-default btn-xs" type="button"title="Full Name" id="edit_name">
-                                                                       <span class="glyphicon glyphicon-edit"></span> Edit
-                                                               </button>
-                                                       </td>
-                                       </tr>
-                                       <tr class="odd">
-                                                       <td class="key">Authority</td>
-                                                       <td class="value">
-                                                               <span id="affval" class="value">{{ authority }}</span>
-                                                                <button class="btn btn-default btn-xs" type="button" id="edit_auth" onclick="editAlert()"  title="To change your authority please contact the administrator">
-                                                               <span class="glyphicon glyphicon-question-sign"></span> Edit
-                                                                </button>
-                                                       </td>
-                                               </tr>
-                                               {%if 'Enabled'  in user_status %}
-                                               <tr class="even">
-                                                       <td class="key">Generate Keys</td>
-                                                       <td>
-                                                               <input type="submit" name="generate" class="btn btn-primary" value="Generate a new Key Pair" id="generate_keypair" 
-                                                                          onclick="return confirm('Are you sure? If you do so, your current credentials will be overwritten.');" 
-                                                                          title="It will generate a new key Pair and your current credentials will be overwritten."/>
-                                               </td> 
-                                       </tr>
-                                       <tr class="odd">
-                                               <td class="key">Public Key</td>
-                                               <td class="value">
-                                                               <span id="keyval" class="value">******** </span>
-                                                               <span class="hide_this" id="span_upload">
-                                                                       <button type="button" class="btn btn-default" title="Cancel" id="cancel_upload"> Cancel </button>
-                                                                       <div style='display:none;'>
-                                                                               <input type='hidden'  name='upload'  /></div>
-                                                                               <input type="file" name="pubkey" class="required" id="pubkey"/>  
-                                                                               <input class="btn btn-default btn-xs" name="upload_key" id="upload_key"  type="submit" title="Upload your public key" value="Upload"
-                                                                                  onclick="return confirm('Are you sure? It will overwrite your current credentials and you have delegate it manually.');"/>
-                                                               </span>
-                                                               <div style='display:none;'> <input type='hidden'  name='dload'  /> </div> 
-                                                               <button type="submit" name="dl_pubkey" class="btn btn-default btn-xs" title="Download your public key" id="dl_pubkey" onclick="javascript:document.getElementById('button_value').value='dl_pubkey';">
-                                                                       <span class="glyphicon glyphicon-download"></span> Download
-                                                               </button>
-                                                               <button class="btn btn-default btn-xs" id="upload_file" type="button" title="Upload a public key">
-                                                                       <span class="glyphicon glyphicon-upload"></span> Upload
-                                                               </button>       
-                                               </td>
-                                       </tr>
-                                       <tr class="even" id="pkey_row">
-                                                {%if 'N/A' not in user_private_key%}
-                                               <td class="key">Private Key </td> <!-- Hide if priv_key doesn't exist in myslice platform   -->
-                                               <td class="value">********<a href="#"></a>
-                                                       <button type="submit" name="dl_pkey" class="btn btn-default" title="Download your privaye key" id="dl_pkey" value="dl_pkey" onclick="javascript:document.getElementById('button_value').value='dl_pkey';">
-                                                                       <span class="glyphicon glyphicon-download"></span> Download     
-                                                               </button>
-                                                       <input class="btn btn-danger btn-xs" id="delete" name="delete" type="submit"  value="Delete" title="Delete your private key"
-                                                                               onclick="javascript:document.getElementById('button_value').value='delete'; return confirm('Are you sure? If you do so, you have to delegate your credentials manually.');"/> 
-                                               </td>
-                                                 {%else%}
-                                                       <td class="key">Private Key </td> <!-- Hide if priv_key doesn't exist in myslice platform   -->
-                                                       <td class="value">********<a href="#"></a>
-                                                       <button type="submit" name="dl_pkey" class="btn btn-default disabled" title="Download your privaye key" id="dl_pkey" value="dl_pkey">
-                                                               <span class="glyphicon glyphicon-download"></span> Download 
-                                                       </button>
-                                                       <input class="btn btn-danger btn-xs disabled" id="delete" name="delete" type="submit" title="Delete your private key" value="Delete" />
-                                                       </td>
-                                                {%endif%}              
-                                               </tr>
-                                       <tr class="even" id="sfi_config_row">
-                                               <td class="key">sfi_config </td>
-                                               <td class="value">use sfi_config file with sfi.py package (pip install sfa)<a href="#"></a>
-                                                       <button type="submit" name="dl_sfi_config" class="btn btn-default btn-xs" title="Download your sfi_config" id="dl_sfi_config" value="dl_sfi_config" onclick="javascript:document.getElementById('button_value').value='dl_sfi_config';">
-                                                                       <span class="glyphicon glyphicon-download"></span> Download
-                                                               </button>
-                                               </td>
-                        </tr>
-                                               <tr class="odd">
-                                                       {%if 'N/A' not in user_private_key%}
-                                                       <td class="key">Identity</td> 
-                                               <td>
-                                                               <button type="submit" name="dl_identity" class="btn btn-default btn-xs" title="You will require it to use jfed" id="dl_identity" onclick="javascript:document.getElementById('button_value').value='dl_identity';">
-                                                               <span class="glyphicon glyphicon-download"></span> Download 
-                                                               </button>
-                                                       </td>
-                                                       {%else%}
-                                                       <td class="key">Identity</td> 
-                                                       <td>
-                                                       <button type="submit" name="dl_identity" class="btn btn-default btn-xs disabled" title="You will require it to use jfed" id="dl_identity">
-                                                               <span class="glyphicon glyphicon-download"></span> Download 
-                                                       </button>
-                                                       </td>
-                                                       {%endif%} 
-                                               </tr>
-
-                                               <tr class="even">
-                                               <td colspan="2">
-                                                               <p class="command">
-                                                                       <a href="#" style="color:green" data-toggle="modal" data-target="#tradeoffmodal">Automatic vs. Manual delegation of credentials:</a>
-                                                                       Trade-off between ease-of-use & security</p>
-                                                               </p>
-                                               </td>
-                                               </tr>
-                                               {%endif%}
-                                       </table>
-                       
-               </div>
-       </div>
-
-       <div class="tab-pane row" id="account">
-               <div class="col-md-12">
-       
-               <h3>Principal Account <small>Account used for delegating credentials</small></h3>
-               <table class="table"> 
-                       <tr class="odd"> 
-                       <th>Platform</th> 
-                       <th>Account Type</th>
-                               <th>Account Delegation</th>
-                       <th>User hrn</th>
-                               <th>User Status</th>
-                       <!--<th>Pub Key</th> -->
-               </tr>   
-                       {% for row in principal_acc %}         
-                       <tr class="border_bottom">
-                       <td class="odd"> {{ row.platform_name }} </td>
-                       <td class="odd"> {{ row.account_type }} </td>
-                               <td class="odd"> {{ row.delegation_type }} </td>
-                               <td class="odd"> {{ row.usr_hrn }}  </td>
-                               <td class="odd"> {{ row.user_status }}  </td>
-               <!--    <td class="even"> {{ row.usr_pubkey }} </td> -->
-               </tr> 
-                       {%endfor%}               
-               </table>
-       
-               </div>
-
-       {%if 'Enabled'  in user_status %}
-               <div class="col-md-12">
-               <h3>Credentials <small>Delegated to Principal Account</small></h3>
-                   <table class="table">
-                               <caption><b>Delegated User Credential</b></caption> 
-                       <tr class="odd"> 
-                           <th>Expiration Date</th>
-                                       <th>Download</th>
-                       </tr>
-                               {% for row in my_users %}         
-                               <tr class="border_bottom">
-                               <td class="odd"> {{ row.cred_exp }} </td>
-                                       <td class="odd">
-                                               <button class="btn btn-default btn-xs" name= "dl_user_cred" type="submit" title="Download User Credential" onclick="javascript:document.getElementById('button_value').value='dl_user_cred';">
-                                                       <span class="glyphicon glyphicon-download"></span> Credential
-                                               </button>
-                                               <button class="btn btn-default btn-xs" name= "dl_user_cert" type="submit" title="Download User Certificate" onclick="javascript:document.getElementById('button_value').value='dl_user_cert';">
-                                                       <span class="glyphicon glyphicon-download"></span> Certificate
-                                               </button>
-                         <button class="btn btn-default btn-xs" name= "dl_user_p12" type="submit" title="Download User PKCS12" onclick="javascript:document.getElementById('button_value').value='dl_user_p12';">
-                             <span class="glyphicon glyphicon-download"></span> PKCS p12
-                         </button>
-                                       </td>
-                               </tr>
-                               {%endfor%}
-                        </table>
-                       <p></p>
-                       <table class="mytable table table-bordered table-hover">
-                               <caption><b>Delegated Slice Credentials</b></caption>  
-                       <tr class="odd"> 
-                                       <th>Slice Name</th> 
-                               <th>Expiration Date</th>
-                                       <th>Download</th>
-                       </tr>
-                               {% for row in my_slices %}     
-                       <tr class="border_bottom">
-                               <td class="odd"> {{ row.slice_name }} </td>
-                                       <td class="odd"> {{ row.cred_exp }} </td>
-                                       <td class="odd"> 
-                                               <button class="btn btn-default btn-xs" name= "dl_{{row.slice_name}}" type="submit" title="Download Slice Credentials" onclick="javascript:document.getElementById('button_value').value='dl_{{row.slice_name}}';">
-                                                       <span class="glyphicon glyphicon-download"></span> Download
-                                               </button> 
-                                       </td>
-                       </tr>
-                       {%endfor%}
-                       </table>
-                       <p></p>
-                       <table class="mytable table table-bordered table-hover">
-                               <caption><b>Delegated Authority Credentials</b></caption>
-                               <tr class="odd"> 
-                               <th>Authority Name</th> 
-                               <th>Expiration Date</th>
-                                       <th>Download</th>
-                               </tr>
-                               {% for row in my_auths %}
-                               <tr class="border_bottom">
-                               <td class="odd"> {{ row.auth_name }} </td>
-                               <td class="odd"> {{ row.cred_exp }} </td>
-                                       <td class="odd">
-                                               <button class="btn btn-default btn-xs" name= "dl_{{row.auth_name}}" type="submit" title="Download Authority Credentials" onclick="javascript:document.getElementById('button_value').value='dl_{{row.auth_name}}';">
-                                                       <span class="glyphicon glyphicon-download"></span> Download
-                                               </button>
-                                       </td>
-                               </tr>
-                               {%endfor%}
-                       </table>
-                       <p></p>
-                        {%if '' not in my_users%}      
-                       <p><button class="btn btn-danger btn-lg btn-block"   name= "clear_cred" type="submit" title="Clear All Credentials" onclick="javascript:document.getElementById('button_value').value='clear_cred';">Clear Credentials</button></p>
-                       {%else%}
-                       <p><button class="btn btn-danger btn-lg btn-block disabled"   name= "clear_cred" type="submit" title="Clear All Credentials">Clear Credentials</button></p>
-                       {%endif%}
-               </div>
-       </div>
-
-
-       <div class="tab-pane row" id="access">
-               <div class="col-md-12">
-       
-               <h3>Testbed Access <small>Reference Accounts in the following testbeds</small></h3>
-        <table class="mytable table table-bordered table-hover"> 
-            <tr class="odd"> 
-                <th>Platform</th> 
-                <th>Account Type</th>
-                               <th>Reference to</th>
-                               <th>Remove Account</th>
-            </tr>   
-            {% for row in ref_acc %}         
-            <tr class="border_bottom">
-                <td class="odd"> {{ row.platform_name }} </td>
-                <td class="odd"> {{ row.account_type }} </td>
-                               <td class="odd"> {{ row.account_reference }} </td>
-                               <td class="odd">
-                               <button class="btn btn-danger" name="delete_{{row.platform_name}}" type="submit" title="Delete account from this platform" onclick="javascript:document.getElementById('button_value').value='delete_{{row.platform_name}}';">
-                                               <span class="glyphicon glyphicon-minus"></span>
-                                       </button>
-                               </td>
-            </tr> 
-            {%endfor%}               
-        </table>               
-               
-               
-               <h3>Add reference account to the following testbeds</h3>
-        <table class="mytable table table-bordered table-hover"> 
-            <tr class="odd"> 
-                <th>Platforms</th> 
-                <th>Add Account</th>
-            </tr>   
-            {% for platform in platform_list %}         
-            <tr class="border_bottom">
-                <td class="odd"> {{ platform.platform_no_access }} </td>
-                <td class="odd">
-                                       <button class="btn btn-success btn-sm" name= "add_{{platform.platform_no_access}}" type="submit" title="Add account to this platform" onclick="javascript:document.getElementById('button_value').value='add_{{platform.platform_no_access}}';">
-                                               <span class="glyphicon glyphicon-plus"></span>
-                                       </button>
-                               </td>
-            </tr> 
-            {%endfor%}               
-        </table>
-       </div>
-{%endif%} 
-</div>
-</div>
-
-</form>
-<script>
-    $(document).ready(function() {
-           {%if 'no_creds' in user_cred or 'creds_expired' in user_cred %}
-        localStorage.clear();
-        $.post("/cache/clear/", function( data ) {
-        });
-        {% endif %}
-       $('.nav-tabs a').click(function (e) {
-                       e.preventDefault();
-                       $(this).tab('show');
-                       id = $(this).attr('href').substr(1);
-               });
-               
-        $('button#createslice').click(function() {
-            window.location="/portal/slice_request/";
-        });
-    });
-</script>
-
-{% endblock %}
diff --git a/portal/templates/smartfire/smartfire_activate_user.html b/portal/templates/smartfire/smartfire_activate_user.html
deleted file mode 100644 (file)
index 04884b0..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<img src="http://eukorea-fire.eu/wp-content/uploads/2014/02/SmartFIRE_logo.png">
-<br>
-<p>We have received a user signup request for your email address at {{current_site}}</p>
-<p>You have the following user details:</p>
-
-Organization: {{organization}}<br>
-First name: {{first_name}}<br>
-Last name: {{last_name}}<br>
-Email: {{email}}<br>
-
-<p></p>
-<p>
-You may now <a href="{{current_site}}">log</a> in to the portal using your email address and the password that you provided, but your access will be limited. To gain full access, two steps are required:
-</p>
-
-<ul style="list-style-type:decimal;">
-<li>
-You must confirm that you have indeed made this request by clicking on the following link: <br>
-       <a href={{validation_link}}>{{validation_link}}</a> 
-       <ul><li>If you did not make this request, we apologise. You may disregard this email or you may advise us the error by replying to this email.</li></ul>
-</li>
-<li>
-A manager from your organization must also validate your request. Upon confirmation of your signup request, we will send an email to the managers at your organization with a validation request.
-</li>
-</ul>
-<p>
-We look forward to welcoming you to SmartFIRE. You will find answers to frequently asked questions <a href="{{current_site}}/support/">here</a>. 
-Please don't hesitate to <a href="{{current_site}}/contact/">contact us</a> with any additional questions that you might have.
-</p>
diff --git a/portal/templates/smartfire/smartfire_activate_user.txt b/portal/templates/smartfire/smartfire_activate_user.txt
deleted file mode 100644 (file)
index ac84bc3..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-We have received a user signup request for your email address at {{current_site}}
-
-You have the following user details:
-
-Organization: {{organization}}
-First name: {{first_name}}
-Last name: {{last_name}}
-Email: {{email}}
-
-You may now log in to the portal using your email address and the password that you provided, but your access will be limited. To gain full access, two steps are required:
-
-       1. You must confirm that you have indeed made this request by clicking on the following link:
-
-               {{validation_link}}
-
-               If you did not make this request, we apologise. You may disregard this email or you may advise us the error by replying to this email.
-
-       2. A manager from your organization must also validate your request. Upon confirmation of your signup request, we will send an email to the managers at your organization with a validation request.
-
-We look forward to welcoming you to SmartFIRE portal. 
-Please don't hesitate to contact us at support@onelab.eu with any additional questions that you might have.
-
-
-
diff --git a/portal/templates/smartfire/smartfire_authority_request_denied.html b/portal/templates/smartfire/smartfire_authority_request_denied.html
deleted file mode 100644 (file)
index e4da271..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-<img src="http://eukorea-fire.eu/wp-content/uploads/2014/02/SmartFIRE_logo.png">
-<br>
-<p>Dear SmartFIRE user,</p>
-<p></p>
-<p>You have recently requested an addition of the following authority in the SmartFIRE portal ({{portal_url}}):</p> 
-<p></p>
-<b>Name of organization:</b> {{site_name}}<br>
-<b>Short name:</b> {{short_name}}<br>
-<b>Url:</b> {{url}}<br>
-<b>City:</b> {{city}}<br>
-<b>Country:</b> {{country}}<br>
-<p></p>
-</p>After verifying your request, we regret to inform you that, we are unable to validate your request.</p>
-<p>For any queries, contact us by replying to this email.</p>
-<br>
-<p>We wish you all the best.</p>
-<br>
-<p>Yours sincerely,</p>
-<p>The SmartFIRE team</p>
-
diff --git a/portal/templates/smartfire/smartfire_authority_request_denied.txt b/portal/templates/smartfire/smartfire_authority_request_denied.txt
deleted file mode 100644 (file)
index 44d522b..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-Dear SmartFIRE user,
-
-You have recently requested an addition of the following authority in the SmartFIRE portal ({{portal_url}}): 
-
-Name of organization: {{site_name}}
-Short name: {{short_name}}
-Url: {{url}}
-City: {{city}}
-Country: {{country}}
-
-
-After verifying your request, we regret to inform you that, we are unable to validate your request.
-For any queries, contact us by replying to this email.
-
-We wish you all the best.
-
-Yours sincerely,
-The SmartFIRE team
diff --git a/portal/templates/smartfire/smartfire_authority_request_email.html b/portal/templates/smartfire/smartfire_authority_request_email.html
deleted file mode 100644 (file)
index 72af5a7..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-<img src="http://eukorea-fire.eu/wp-content/uploads/2014/02/SmartFIRE_logo.png">
-<br>
-<h1>NEW AUTHORITY REQUEST</h1>
-<br>
-<p>This email is only for SmartFIRE admins</p>
-<br>
-<h2>{{site_name}}</h2>             
-<b>Authority hrn    :</b> {{authority_hrn}}<br>         
-<b>Abreviated name  :</b> {{site_abbreviated_name}}<br>
-<b>URL              :</b> {{site_url}}<br>              
-<b>City             :</b> {{address_city}}<br>          
-<b>Country          :</b> {{address_country}}<br>  
-
-<br><br>
-
-<h2>PI for this Authority</h2>     
-<b>First Name   :</b> {{first_name}}<br>
-<b>Last Name    :</b> {{last_name}}<br>
-<b>Authority hrn:</b> {{authority_hrn}}<br>
-<b>Public key   :</b> {{public_key}}<br>
-<b>Email        :</b> {{email}}<br>
-<b>User Hrn     :</b> {{user_hrn}}<br>
diff --git a/portal/templates/smartfire/smartfire_authority_request_email.txt b/portal/templates/smartfire/smartfire_authority_request_email.txt
deleted file mode 100644 (file)
index 93daae0..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-This email is only for SmartFIRE admins.
-
-NEW AUTHORITY REQUEST
-
-Site             : {{site_name}}             
-
-Authority hrn    : {{authority_hrn}}         
-Abreviated name  : {{site_abbreviated_name}} 
-URL              : {{site_url}}              
-
-
-City             : {{address_city}}          
-Country          : {{address_country}}  
-
-
-PI for this Authority     
-First Name   : {{first_name}}
-Last Name    : {{last_name}}
-Authority hrn: {{authority_hrn}}
-Public key   : {{public_key}}
-Email        : {{email}}
-User Hrn     : {{user_hrn}}
diff --git a/portal/templates/smartfire/smartfire_authority_request_email_subject.txt b/portal/templates/smartfire/smartfire_authority_request_email_subject.txt
deleted file mode 100644 (file)
index 1366a27..0000000
+++ /dev/null
@@ -1 +0,0 @@
-SmartFIRE new Authority request submitted
diff --git a/portal/templates/smartfire/smartfire_email_activation.html b/portal/templates/smartfire/smartfire_email_activation.html
deleted file mode 100644 (file)
index 124f32a..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-{% extends "layout.html" %}
-
-{% block content %}
-
-<div class="row">
-       <h1><img src="{{ STATIC_URL }}img/icon_user_small.png" alt="User Registration" />User sign-up</h1>
-</div>
-<div class="row">
-       {% if activation_status == 'success' %}
-               <h3>Signup request confirmed.</h3>
-               <p>You are currently able to log in to the portal using your email address and the password that you have provided; however, your access is still limited.</p> 
-               <p>You will have full access as soon as your account is validated by a manager at your organization. We have sent an email to your organisation's managers with a validation request.</p>
-    {% elif activation_status == 'validated' %}
-               <h3>Account validated.</h3>
-               <p>We have identified you as a valid PLE user. Your SmartFIRE account has automatically been approved.</p>
-        <p>You have a full access to SmartFIRE testbeds.</p>
-       {%else%}
-               <h3>Signup confirmation failed.</h3>
-               <p>You have probably arrived at this page by clicking a confirmation link in an email that we have sent to you. 
-               We have been unable to match the link that you have clicked to a signup request in our database.</p>
-               <p>Please <a href="/portal/contact/">contact support</a> so that we may help you complete the signup process.</p>
-       {%endif%}
- </div>
-
-{% endblock %}
diff --git a/portal/templates/smartfire/smartfire_footer.html b/portal/templates/smartfire/smartfire_footer.html
deleted file mode 100644 (file)
index 7dd4a22..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-<div class="footer">
-<div class="container">
-    <div class="row">
-        <div class="col-md-12">
-            <ul>
-                <li></li>
-            </ul>
-        </div>
-    </div>
-    <div class="row">
-        <div class="col-md-10 copy"></div>
-        <div id="portal_version" class="col-md-2 copy"></div>
-    </div>
-</div>
-</div>
-<script type="text/javascript">
-    $(document).ready(function() {
-        $.post("/portal_version/", function( data ) {
-            console.log(data);
-            $("#portal_version").html(data);
-        });
-    });
-</script>
diff --git a/portal/templates/smartfire/smartfire_home-view.html b/portal/templates/smartfire/smartfire_home-view.html
deleted file mode 100644 (file)
index 89fdf64..0000000
+++ /dev/null
@@ -1,200 +0,0 @@
-{% extends "layout_base.html" %}
-{% load portal_filters %}
-
-{% block content %}
-<!-- <div class="row">
-{% widget '_widget-news.html' %}
-</div> -->
-{% if username %}
-{% widget "_widget-no_credentials.html" %}
-<div class="container dashboard">
-       {%if 'no_creds'  in user_cred %}
-        <p class="command"><a href="#" style="color:red" data-toggle="modal" data-target="#myModal">NO CREDENTIALS</a> are delegated to the portal!</p>
-    {%endif%}
-       {%if 'creds_expired'  in user_cred %}
-        <p class="command"><a href="#" style="color:red" data-toggle="modal" data-target="#myModal">EXPIRED CREDENTIALS</a> Please delegate again your credentials to the portal!</p>
-    {%endif%}
-
-       <div class="row">
-               {% if pi %}
-               <div class="col-md-3">
-                       <h3>
-                               EXPERIMENT
-                       </h3>
-                       <div>
-                               <a href="#"><img src="{{ STATIC_URL }}img/icon_slices.png" alt="" /></a>
-                       </div>
-                       <div>
-                               <button id="slicerequestbtn" type="button" class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> Create Slice</button>
-                       </div>
-                       <div>
-                               <p><strong>Your slices </strong>
-                                       <span title="A slice is a set of testbed resources on which you can conduct an experiment. 
-                                       Either ask your colleagues to give you access to an existing slice or request a new slice by clicking 'Request Slice'." 
-                                       class="glyphicon glyphicon-info-sign">
-                               </span>
-
-                               </p>
-                       </div>
-                       <div>   
-                               <div id="home-slice-list"><img src="{{ STATIC_URL }}img/loading.gif" alt="Loading Slices" /></div>
-                       </div>
-               </div>
-               <div class="col-md-3">
-                       <h3>MANAGEMENT</h3>
-                       <div>
-                               <a href="/portal/institution"><img src="{{ STATIC_URL }}img/icon_authority_color.png" alt="" /></a>
-                       </div>
-                       <div>
-                               <button id="validaterequestbtn" type="button" class="btn btn-default"><span class="glyphicon glyphicon-ok"></span> Validate Requests</button>
-                       </div>
-               </div>
-               <div class="col-md-3">
-                       <h3>
-                               SUPPORT
-                       </h3>
-                       <div>
-                               <a href="/portal/support"><img src="{{ STATIC_URL }}img/icon_support.png" alt="" /></a>
-                       </div>
-                       <div>
-                               <button id="ticketbtn" type="button" class="btn btn-default"><span class="glyphicon glyphicon-envelope"></span> Contact</button>
-                       </div>
-               </div>
-               
-               <div class="col-md-3">
-                       <h3>
-                               ACCOUNT
-                       </h3>
-                       <div>
-                               <a href="/portal/account/"><img src="{{ STATIC_URL }}img/icon_user_color.png" alt="" /></a>
-                       </div>
-                       <div>
-                               <button id="logoutbtn" type="button" class="btn btn-default" data-username="{{ username }}"><span class="glyphicon glyphicon-off"></span> Logout</button>
-                       </div>
-                       <div>
-                               {% if person.last_name %}
-                                       {{person.first_name}} {{person.last_name}}<br />
-                               {% endif %}
-                       <span class="label">Username:</span> <a href='/portal/account/' title="Click here to see and edit your account details.">{{person.email}}</a>
-               </div>
-               </div>
-       </div>
-       {%else%}
-       <div class="row">
-               <div class="col-md-4">
-                       <h3>
-                               EXPERIMENT
-                       </h3>
-                       <div>
-                               <a href="#"><img src="{{ STATIC_URL }}img/icon_slices.png" alt="" /></a>
-                       </div>
-                       <div>
-                               <button id="slicerequestbtn" type="button" class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> Request Slice</button>
-                       </div>
-                       <div>
-                               <p><strong>Your slices </strong>
-                               <span title="A slice is a set of testbed resources on which you can conduct an experiment. 
-                                       Either ask your colleagues to give you access to an existing slice or request a new slice by clicking 'Request Slice'."
-                                       class="glyphicon glyphicon-info-sign">
-                               </span>
-                               </p>
-                       </div>
-                       <div>   
-                               <div id="home-slice-list"><img src="{{ STATIC_URL }}img/loading.gif" alt="Loading Slices" /></div>
-                       </div>
-                       {% if pending_slices %}
-                       <p><strong>Pending slices</strong>
-                       <span title="Slices that you have requested and are pending for validation by the contact person of your organization."
-                               class="glyphicon glyphicon-info-sign">
-                       <ul>
-                       {% for slices in pending_slices %}
-                       <li>{{slices}}</li>
-                       {% endfor %}
-                       </ul>
-                       </span>
-                       </p>
-                       {%endif%}       
-               </div>
-               <div class="col-md-4">
-                       <h3>
-                               SUPPORT
-                       </h3>
-                       <div>
-                               <a href="/portal/support"><img src="{{ STATIC_URL }}img/icon_support.png" alt="" /></a>
-                       </div>
-                       <div>
-                               <button id="ticketbtn" type="button" class="btn btn-default"><span class="glyphicon glyphicon-envelope"></span> Contact</button>
-                       </div>
-               </div>
-               
-               <div class="col-md-4">
-                       <h3>
-                               ACCOUNT
-                       </h3>
-                       <div>
-                               <a href="/portal/account/"><img src="{{ STATIC_URL }}img/icon_user_color.png" alt="" /></a>
-                       </div>
-                       <div>
-                               <button id="logoutbtn" type="button" class="btn btn-default" data-username="{{ username }}"><span class="glyphicon glyphicon-off"></span> Logout</button>
-                       </div>
-                       <div>
-                               {% if person.last_name %}
-                                       {{person.first_name}} {{person.last_name}}<br />
-                               {% endif %}
-                       <span class="label">Username:</span> <a href='/portal/account/' title="Click here to see and edit your account details.">{{person.email}}</a>
-               </div>
-               </div>
-       </div>
-       {%endif%}
-
-</div>
-{% else %}
-<div class="container-fluid home">
-       <div class="">
-               <div class="col-sm-2"></div>
-               <div class="col-sm-4 slogan">
-                       <h2>
-                               Your Easy Access to Computer Networking Testbeds:
-                       </h2>
-                       <h3>
-                               A wide variety of world class testbeds available through your one account
-                       </h3>
-               </div>
-               <div class="col-sm-5 col-sm-offset-1">
-                       <div class="row">
-                               {% widget '_widget-login-user.html' %}
-                       </div>
-               </div>
-               <div class="col-sm-1"></div>
-       </div>
-</div>
-{% endif %}
-
-
-<script type="text/javascript">
-       $(document).ready(function() {
-               $('a.home-tab').click(function() {
-                       $('ul.nav-tabs li').removeClass('active');
-                       $(this).parent().addClass('active');
-                       $('div.home-panel').hide();
-                       $('div#'+$(this).data('panel')).show();
-               });
-               $('button#validaterequestbtn').click(function() {
-                       window.location="/portal/institution#requests";
-               });
-               $('button#ticketbtn').click(function() {
-                       window.location="/portal/contact/";
-               });
-               $('button#signupbtn').click(function() {
-                       window.location="/portal/register/";
-               });
-               $('button#slicerequestbtn').click(function() {
-                       window.location="/portal/slice_request/";
-               });
-
-        myslice.loadSlices();
-        
-});
-</script>
-
-{% endblock %}
diff --git a/portal/templates/smartfire/smartfire_management-tab-requests.html b/portal/templates/smartfire/smartfire_management-tab-requests.html
deleted file mode 100644 (file)
index e255779..0000000
+++ /dev/null
@@ -1,226 +0,0 @@
-<script type="text/javascript">
-       $(document).ready(function() {
-               $("li#nav-request").addClass("active");
-       });
-       function on_click_event() {
-               var ids = []; 
-               $('.portal__validate__checkbox').each(function(i, el) {
-                       if ($(el).prop('checked')) {
-                               // portal__validate__checkbox__slice__2
-                               var id_array = $(el).attr('id').split('__');
-                               // push(slice__2)
-                               ids.push(id_array[3] + '__' + id_array[4]);
-                       }
-               });
-               if (ids.length > 0) {
-                       var id_str = ids.join('/');
-                       // XXX spinner
-                       $.getJSON('/portal/validate_action/' + id_str,
-                               function(status) {
-                                       $.each(status, function(request_type__id, request_status) {
-                                               // request_status: NAME -> dict (status, description)
-                                               var status_str = '';
-                                               $.each(request_status, function(name, result) {
-                                                       if (status_str != '')
-                                                               status_str += ' -- ';
-
-                                                       if (result.status) {
-                                                               status_str += '<font color="green">OK</font>';
-                                                               $('#portal__validate__checkbox__' + request_type__id).hide();
-                                                       } else {
-                                                               status_str += '<font color="red">ERROR: ' + result.description + '</font>';
-                                                       }
-                                               });
-                                               $('#portal__status__' + request_type__id).html(status_str);
-
-
-                                       });
-                               }
-                       );
-               }
-       }
-</script>
-
-<div class="col-md-12">
-       <h2>From your authorities</h2>
-</div>
-{% if my_authorities %}
-       
-       {% for authority, requests in my_authorities.items %}
-       
-       <div class="col-md-12">
-               <h2>{{authority}}</h2>
-       </div>
-       
-    <table class="table">
-      <th>
-        <td>Type</td>
-        <td>Id</td>
-        <td>Details</td>
-        <td>Timestamp</td>
-        <td>Status</td>
-      </th>
-    {% for request in requests %}
-
-         <tr>
-               <td>
-               {% if request.allowed == 'allowed' %}
-               <input class='portal__validate__checkbox' id='portal__validate__checkbox__{{request.type}}__{{request.id}}' type='checkbox'/>
-               {% else %}
-                       {% if request.allowed == 'expired' %}
-                               expired
-                       {% else %} {# denied #}
-                               denied
-                       {% endif %}
-               {% endif %}
-               </td>
-               <td>{{ request.type }}</td>
-               <td>{{ request.id }}</td>
-               <td>
-        {% if request.type == 'user' %}
-            <b>{{request.first_name}} {{request.last_name}}</b> <a href="mailto:{{request.email}}">{{request.email}}</a>
-        {% else %}
-            {% if request.type == 'slice' %}
-            <b>{{request.slice_name}}</b> -- Number of nodes: {{request.number_of_nodes}} -- Type of nodes: {{request.type_of_nodes}} -- Purpose: {{request.purpose}}
-            {% else %} {# authority #}
-            <b>{{request.site_name}}</b> ({{request.site_authority}}) -- {{request.address_city}}, {{request.address_country}}
-            {% endif %}
-        {% endif %}
-               </td>
-               <td>{{ request.timestamp }}</td>
-               
-               <td><span id='portal__status__{{request.type}}__{{request.id}}'></span></td>
-
-    <!--<div class='portal_validate_request {{request.type}} {% if forloop.counter|divisibleby:2 %}even{% else %}odd{% endif %}'> -->
-         </tr>
-
-    {% endfor %}
-       </table>
-       {% endfor %}
-
-{% else %}
-       <div class="col-md-12">
-               <i>There is no pending request waiting for validation.</i>
-       </div>
-{% endif %}
-<div>nnllknjkn<br /><br /></div>
-<div class="col-md-12">
-       <h2>From your sub-authorities</h2>
-</div>
-{% if sub_authorities %}
-       
-       {% for authority, requests in sub_authorities.items %}
-       <div class="col-md-12">
-               <h2>{{authority}}</h2>
-       </div>
-       
-       <table class="table">
-             <th>
-               <td>Type</td>
-               <td>Id</td>
-               <td>Details</td>
-               <td>Timestamp</td>
-               <td>Status</td>
-             </th>
-           {% for request in requests %}
-                 <tr>
-                       <td>
-                       {% if request.allowed == 'allowed' %}
-                       <input class='portal__validate__checkbox' id='portal__validate__checkbox__{{request.type}}__{{request.id}}' type='checkbox'/>
-                       {% else %}
-                               {% if request.allowed == 'expired' %}
-                                       expired
-                               {% else %} {# denied #}
-                                       denied
-                               {% endif %}
-                       {% endif %}
-                       </td>
-                       <td>{{ request.type }}</td>
-                       <td>{{ request.id }}</td>
-                       <td>
-               {% if request.type == 'user' %}
-               Login: {{request.login}} -- First name: {{request.first_name}} -- Last name: {{request.last_name}} -- Email: {{request.email}}
-               {% else %}
-                   {% if request.type == 'slice' %}
-               Slice name: {{request.slice_name}} -- Number of nodes: {{request.number_of_nodes}} -- Type of nodes: {{request.type_of_nodes}} -- Purpose: {{request.purpose}}
-                   {% else %} {# authority #}
-               Authority name: {{request.site_name}} -- authority_hrn: {{request.site_authority}} -- City: {{request.address_city}} -- Country: {{request.address_country}}
-                   {% endif %}
-               {% endif %}
-                       </td>
-                       <td>{{ request.timestamp }}</td>
-                       
-                       <td><span id='portal__status__{{request.type}}__{{request.id}}'></span></td>
-       
-           <!--<div class='portal_validate_request {{request.type}} {% if forloop.counter|divisibleby:2 %}even{% else %}odd{% endif %}'> -->
-                 </tr>
-           {% endfor %}
-       </table>
-       {% endfor %}
-{% else %}
-<div class="col-md-12">
-       <i>There is no pending request waiting for validation.</i>
-</div>
-{% endif %}
-
-<div class="col-md-12">
-       <h2>From your authorities with delegation</h2>
-</div>
-
-{% if delegation_authorities %}
-       
-       {% for authority, requests in delegation_authorities.items %}
-       <div class="col-md-12">
-               <h3>{{authority}}</h3>
-       </div>
-       <table class="table">
-                     <th>
-                       <td>Type</td>
-                       <td>Id</td>
-                       <td>Details</td>
-                       <td>Timestamp</td>
-                       <td>Status</td>
-                     </th>
-                   {% for request in requests %}
-                         <tr>
-                               <td>
-                               {% if request.allowed == 'allowed' %}
-                               <input class='portal__validate__checkbox' id='portal__validate__checkbox__{{request.type}}__{{request.id}}' type='checkbox'/>
-                               {% else %}
-                                       {% if request.allowed == 'expired' %}
-                                               expired
-                                       {% else %} {# denied #}
-                                               denied
-                                       {% endif %}
-                               {% endif %}
-                               </td>
-                               <td>{{ request.type }}</td>
-                               <td>{{ request.id }}</td>
-                               <td>
-                       {% if request.type == 'user' %}
-                       Login: {{request.login}} -- First name: {{request.first_name}} -- Last name: {{request.last_name}} -- Email: {{request.email}}
-                       {% else %}
-                           {% if request.type == 'slice' %}
-                       Slice name: {{request.slice_name}} -- Number of nodes: {{request.number_of_nodes}} -- Type of nodes: {{request.type_of_nodes}} -- Purpose: {{request.purpose}}
-                           {% else %} {# authority #}
-                       Authority name: {{request.site_name}} -- authority_hrn: {{request.site_authority}} -- City: {{request.address_city}} -- Country: {{request.address_country}}
-                           {% endif %}
-                      {% endif %}
-                               </td>
-                               <td>{{ request.timestamp }}</td>
-                               
-                               <td><span id='portal__status__{{request.type}}__{{request.id}}'></span></td>
-               
-                   <!--<div class='portal_validate_request {{request.type}} {% if forloop.counter|divisibleby:2 %}even{% else %}odd{% endif %}'> -->
-                         </tr>
-                   {% endfor %}
-       </table>
-               {% endfor %}
-{% else %}
-<div class="col-md-12">
-       <i>There is no pending request waiting for validation.</i>
-</div>
-{% endif %}
-<div class="col-md-12">
-       <button class="btn btn-onelab" type="button" id="portal__validate" onclick="on_click_event();"><span class="glyphicon glyphicon-ok"></span> Validate</button>
-</div>
diff --git a/portal/templates/smartfire/smartfire_slice_request_denied.html b/portal/templates/smartfire/smartfire_slice_request_denied.html
deleted file mode 100644 (file)
index 6c7d595..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-<img src="http://eukorea-fire.eu/wp-content/uploads/2014/02/SmartFIRE_logo.png">
-<br>
-<p>Dear SmartFIRE user,</p>
-<p></p>
-<p>You have recently requested the following slice on the SmartFIRE portal({{portal_url}}):</p> 
-<br>
-<b>Slice name   :</b> {{slice_name}}<br>
-<b>URL          :</b> {{url}}<br>
-<b>Purpose      :</b> {{purpose}}<br>
-<br>
-<p>We regret to inform you that, a manager of your institution has not confirmed your request. Please contact the manager of your institution for further information. 
-For any other queries, please contact us by replying to this email.</p>
-<br>
-<p>We wish you a fruitful user experience on SmartFIRE.</p>
-<br>
-<p>Yours sincerely,</p>
-<p>The SmartFIRE team</p>
diff --git a/portal/templates/smartfire/smartfire_slice_request_denied.txt b/portal/templates/smartfire/smartfire_slice_request_denied.txt
deleted file mode 100644 (file)
index e4b4990..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-Dear SmartFIRE user,
-
-You have recently requested the following slice on the SmartFIRE portal({{portal_url}}):
-
-Slice name   : {{slice_name}}
-URL          : {{url}}
-Purpose      : {{purpose}}
-We regret to inform you that, a manager of your institution has not confirmed your request. Please contact the manager of your institution for further information. For any other queries, please contact us by replying to this email.
-
-We wish you a fruitful user experience on SmartFIRE.
-
-Yours sincerely,
-The SmartFIRE team
diff --git a/portal/templates/smartfire/smartfire_slice_request_email_subject.txt b/portal/templates/smartfire/smartfire_slice_request_email_subject.txt
deleted file mode 100644 (file)
index e3988df..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Slice request submitted 
diff --git a/portal/templates/smartfire/smartfire_slice_request_validated.html b/portal/templates/smartfire/smartfire_slice_request_validated.html
deleted file mode 100644 (file)
index 2c96a1d..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<img src="http://eukorea-fire.eu/wp-content/uploads/2014/02/SmartFIRE_logo.png">
-<br>
-<p>Dear SmartFIRE user,</p>
-<p></p>
-<p>You have recently requested a slice in the SmartFIRE portal.</p>
-<br>
-<b>Slice name   :</b> {{slice_name}}<br>
-<b>URL          :</b> {{number_of_nodes}}<br>
-<b>Purpose      :</b> {{purpose}}<br>
-<p></p>
-<p>
-       We are pleased to inform you that a manager from your institution has validated your slice request on the SmartFIRE portal. 
-       You can now add resources to you slice and start experimenting.
-</p>
-<p></p>
-<p>We wish you a fruitful user experience with the SmartFIRE portal.</p>
-<p></p>
-<p>Yours sincerely,</p>
-<p>The SmartFIRE team</p>
-
-
diff --git a/portal/templates/smartfire/smartfire_slice_request_validated.txt b/portal/templates/smartfire/smartfire_slice_request_validated.txt
deleted file mode 100644 (file)
index 571a3e4..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-Dear SmartFIRE user,
-
-You have recently requested a slice in the SmartFIRE portal.
-
-Slice name      : {{slice_name}}
-URL             : {{number_of_nodes}}
-Purpose         : {{purpose}}
-
-
-We are pleased to inform you that a manager from your institution has validated your slice request on the SmartFIRE portal. You can now add resources to you slice and start experimenting.
-
-We wish you a fruitful user experience with the SmartFIRE portal.
-
-Yours sincerely,
-The SmartFIRE team
-
diff --git a/portal/templates/smartfire/smartfire_slicerequest_view.html b/portal/templates/smartfire/smartfire_slicerequest_view.html
deleted file mode 100644 (file)
index 211f35d..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-{% extends "layout.html" %}
-{% load i18n %}
-
-{% block content %}
-       <div class="row">
-               <div class="col-md-12">
-                        <div class="breadcrumbs">
-                                Experiment &nbsp;>&nbsp; Request a new Slice
-                        </div>
-               </div>
-       </div>
-
-       {% if errors %}
-       <div class="row">
-               <div class="col-md-12">
-               <ul class="error">
-                 {% for error in errors %}
-                 <li>{{ error }}</li>
-                 {% endfor %}
-               </ul>
-               </div>
-       </div>
-       {% endif %}
-       
-       <div class="row">
-               <div class="col-md-8 el">
-                       <form role="form" method="post">
-                       {% csrf_token %}
-                         <div class="form-group" style="display:none">
-                           <input type="email" class="form-control" id="email" style="width:300px" value="{{ email }}" readonly="readonly">
-                         </div>
-                         <div class="form-group">
-                           <input type="text" class="form-control" name="slice_name" id="slice_name" style="width:300px" placeholder="Slice name" value="{{slice_name}}" 
-                               title="Please enter a name for your slice"required="required">
-                         </div>
-                         <div class="form-group">
-                               {%if 'is_pi'  in pi %}
-                               <input type="text" class="form-control" id="authority_hrn" name="org_name" style="width:300px" placeholder="Organization" 
-                               title="An authority responsible for vetting your slice" required="required">
-                               {%else%}
-                           <input type="text" class="form-control" id="authority_hrn" name="org_name" placeholder="Organization" style="width:300px;" 
-                               title="An authority responsible for vetting your slice" required="required" readonly>
-                               {%endif%}
-                         </div>
-                         <div class="form-group">
-                           <input type="text" class="form-control" name="url" id="url" style="width:300px" placeholder="Experiment URL (if one exists)"
-                               title="Please provide the url of your experiment if you have one." value="{{url}}">
-                         </div>
-                         <div class="form-group">
-                               <textarea id="purpose" name="purpose" class="form-control" rows="6" placeholder="Experiment purpose" style="width:300px" 
-                               title="Purpose of your experiment (informative)" required="required">{{ purpose }}</textarea>
-                         </div>
-                         {%if 'is_pi'  in pi %}        
-                         <button type="submit" id=submit_pi class="btn btn-onelab"><span class="glyphicon glyphicon-plus"></span> Create slice</button>
-                         {%else%}
-                         <button type="submit" class="btn btn-onelab"><span class="glyphicon glyphicon-plus"></span> Request slice</button>
-                         {%endif%}     
-                       </form>
-       
-               </div>
-       </div>
-               
-<script>
-jQuery(document).ready(function(){
-       
-       /*$("#authority_hrn").load("/rest/user/", {"fields" : ["parent_authority"], "filters": {"user_hrn": "{{ user_hrn }}"}}, function(data) {
-               var jsonData = JSON.parse(data);
-        $(this).attr("value", jsonData[0]['parent_authority']);
-    });*/
-       $("#authority_hrn").val("{{authority_name}}");
-       var availableTags = [
-    {% if authorities %}
-        {% for authority in authorities %}
-            {% if authority.name %}
-                {value:"{{ authority.name }}",label:"{{authority.name}}"},
-                       // to show only full name
-           // {% else %}
-           //     {value:"{{ authority.authority_hrn }}",label:"{{authority.authority_hrn}}"},
-            {% endif %}
-        {% endfor %}    
-    {% else %}
-        {value:"",label:"No authority found !!!"}
-    {% endif %}
-    ];
-       // sorting the list
-       availableTags.sort(function(a,b){
-               var nameA=a.value.toLowerCase(), nameB=b.value.toLowerCase();
-               if (nameA < nameB) {
-               return -1;
-               }
-               if (nameA > nameB) {
-               return 1;
-               }
-       return 0;
-       }); 
-    $( "#authority_hrn" ).autocomplete({
-      source: availableTags,
-      minLength: 0,
-      select: function( event, ui ) {console.log(jQuery(this));}
-    });
-
-       $("#submit_pi").click(function() {
-               localStorage.clear();
-       });
-});
-</script>
-{% endblock %}
-
diff --git a/portal/templates/smartfire/smartfire_user_request_denied.html b/portal/templates/smartfire/smartfire_user_request_denied.html
deleted file mode 100644 (file)
index 64678e3..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<img src="http://eukorea-fire.eu/wp-content/uploads/2014/02/SmartFIRE_logo.png">
-<br>
-<p>Dear {{first_name}} {{last_name}},</p>
-<p></p>
-<p>You have recently registered as a user to SmartFIRE portal. We are sorry to inform you that, a manager of your institution has rejected your request. Please contact the manager of your institution for further information. For any other queries, contact us by replying to this email.</p>
-<p></p>
-<p>We wish you all the best.</p>
-<p></p>
-<p>Yours sincerely,</p>
-<p>The SmartFIRE team</p>
-
diff --git a/portal/templates/smartfire/smartfire_user_request_denied.txt b/portal/templates/smartfire/smartfire_user_request_denied.txt
deleted file mode 100644 (file)
index 29edc21..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-Dear {{first_name}} {{last_name}},
-
-You have recently registered as a user to SmartFIRE portal. We are sorry to inform you that, a manager of your institution has rejected your request. Please contact the manager of your institution for further information. For any other queries, contact us by replying to this email.
-
-We wish you all the best.
-
-Yours sincerely,
-The SmartFIRE team
diff --git a/portal/templates/smartfire/smartfire_user_request_email.html b/portal/templates/smartfire/smartfire_user_request_email.html
deleted file mode 100644 (file)
index 92c1cb4..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-<img src="http://eukorea-fire.eu/wp-content/uploads/2014/02/SmartFIRE_logo.png">
-<br>
-<h1>NEW USER REQUEST</h1>
-<br>
-<b>First name   :</b> {{first_name}}<br>
-<b>Last name    :</b> {{last_name}}<br>
-<b>Organization :</b> {{organization}}<br>
-<b>Authority hrn:</b> {{authority_hrn}}<br>
-<b>Public key   :</b> {{public_key}}<br>
-<b>Email        :</b> {{email}}<br>
-<b>User hrn     :</b> {{user_hrn}}<br>
-<b>Portal url  :</b> {{ current_site }}<br>
-<p></p>
-<p>You can validate the user <a href="{{current_site}}/portal/institution#requests">here</a>.<p>
-<br>
-<p>Please note that the validation request will only become visible once the user has confirmed his/her email address.</p>
diff --git a/portal/templates/smartfire/smartfire_user_request_email.txt b/portal/templates/smartfire/smartfire_user_request_email.txt
deleted file mode 100644 (file)
index 17ce184..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-NEW USER REQUEST
-
-First name   : {{first_name}}
-Last name    : {{last_name}} 
-Organization :{{organization}}
-Authority hrn: {{authority_hrn}}
-Public key   : {{public_key}}
-Email        : {{email}}
-User hrn     : {{user_hrn}}
-Portal url   : {{ current_site }}
-
-Please note that the validation request will only become visible once the user has confirmed his/her email address.
-
-
diff --git a/portal/templates/smartfire/smartfire_user_request_email_subject.txt b/portal/templates/smartfire/smartfire_user_request_email_subject.txt
deleted file mode 100644 (file)
index a373b60..0000000
+++ /dev/null
@@ -1 +0,0 @@
-User request submitted
diff --git a/portal/templates/smartfire/smartfire_user_request_validated.html b/portal/templates/smartfire/smartfire_user_request_validated.html
deleted file mode 100644 (file)
index 7997a18..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<img src="http://eukorea-fire.eu/wp-content/uploads/2014/02/SmartFIRE_logo.png">
-<br>
-<p>Dear {{first_name}} {{last_name}},</p>
-<p></p>
-<p>It is my pleasure to welcome you as a fully signed-up user of the SmartFIRE experimental facility. SmartFIRE provides you with access to world class computer networking testbeds. Our aim at SmartFIRE is to promote the use of these testbeds for pre-commercial research and development by industry, for scientific research, and for university level laboratory exercises.</p>
-<p></p>
-</p>
-Your entry point for access to the testbeds is the SmartFIRE portal, which provides a web-based interface for browsing and reserving resources on the various testbeds. To run an experiment using those resources, you may log in to the testbed and/or individual nodes on the testbed with your SmartFIRE public/private key pair, or you may use an experiment control tool such as as OMF. The SmartFIRE  operations team is standing by at support@onelab.eu to provide you with help regarding the portal and to refer your testbed- and tool-specific queries to those best able to answer them.
-</p>
-<p></p>
-<p>We wish you a fruitful user experience with the SmartFIRE portal.</p>
-<p></p>
-<p>Yours sincerely,</p>
-<p>The SmartFIRE team</p>
diff --git a/portal/templates/smartfire/smartfire_user_request_validated.txt b/portal/templates/smartfire/smartfire_user_request_validated.txt
deleted file mode 100644 (file)
index b546b19..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-Dear {{first_name}} {{last_name}},
-
-It is our pleasure to welcome you as a fully signed-up user of the SmartFIRE experimental facility. SmartFIRE provides you with access to world class computer networking testbeds.. Our aim at SmartFIRE is to promote the use of these testbeds for pre-commercial research and development by industry, for scientific research, and for university level laboratory exercises.
-
-Your entry point for access to the testbeds is the SmartFIRE portal, which provides a web-based interface for browsing and reserving resources on the various testbeds. To run an experiment using those resources, you may log in to the testbed and/or to individual nodes on the testbed with your SmartFIRE public/private key pair, or you may use an experiment control tool such as as  OMF. The SmartFIRE operations team is standing by at support@onelab.eu to provide you with help regarding the portal and to refer your testbed- and tool-specific queries to those best able to answer them.
-
-We wish you a fruitful user experience with the SmartFIRE portal.
-
-Yours sincerely,
-The SmartFIRE team
index de34e32..63ae581 100644 (file)
@@ -19,7 +19,7 @@
                                                        </ul>
                                        </div>
                                </li>
-                               {%if pi %}      
+                {% if request.session.user.pi %}
                                <li id="nav-institution" class=""><a href="/institution">MANAGEMENT</a></li>
                                 {%endif%}
                                <li><a href="/support/">SUPPORT</a></li>
index d89e8fb..389386a 100644 (file)
     <a name="_Ref249598367"></a>
     <a name="_Ref254443731"></a>
     <a name="_Ref254443916"></a>
-    TERMS AND CONDITIONS
-    <br/>
-    for OneLab Basic level service
-    <br/>
-    Version 0.6 of 20 May 2014
-</p>
-<h1 align="left">Context</h1>
-<h2 align="left">
-    1.1 OneLab
-</h2>
-<p align="left">
-    OneLab is an experimental facility for testing new ideas and new technologies in the area of computer networking. It consists of a variety of types of
-    platforms, including:
-</p>
-<ul type="disc">
-    <li>
-        <strong>internet overlay testbeds</strong>
-        , testbeds that offer virtual machines distributed across locations in different countries, allowing users to deploy overlays on the internet;
-    </li>
-    <li>
-        <strong>wireless testbeds</strong>
-        , testbeds that consist of clusters of computers that are within Wi-Fi communication range of each other, either in an office environment or in an
-        isolated setting;
-    </li>
-    <li>
-        <strong>internet of things testbeds</strong>
-        , testbeds that consist of embedded computing nodes with sensor capabilities, communicating wirelessly in an isolated environment;
-    </li>
-    <li>
-        <strong>emulation testbeds,</strong>
-        computing clusters that offer virtual machines on servers that are interconnected by a high speed switch, enabling large scale network emulation.
-    </li>
-</ul>
-<p align="left">
-    This list of types of platforms is subject to change, and the current list, along with the identities of the specific platforms of each type, can be found
-    on the OneLab website (onelab.eu).
-</p>
-<p align="left">
-    Each platform has its own owners, and OneLab is the grouping of these platforms through a consortium of institutions. The OneLab consortium is coordinated
-    by UPMC Sorbonne Universités. It operates on a not-for-profit basis.
-</p>
-<p align="left">
-    Access to OneLab may also provide access to additional platforms that are not part of OneLab, due to a federation agreement between OneLab and the owners
-    of those platforms.
-</p>
-<h2 align="left">
-    1.2 Fee-free Basic level service
-</h2>
-<p align="left">
-    These terms and conditions define and apply to OneLab's Basic level service, which is available free of charge.
-</p>
-<p align="left">
-    Users who would like additional services are encouraged to contact support@onelab.eu. Some additional services require a written agreement, but are
-    otherwise free. Others require the payment of fees or in-kind contributions. (An example of an in-kind contribution is the hosting of a PlanetLab Europe
-    server node.)
-</p>
-<h2 align="left">
-    1.3 Managers and standard users
-</h2>
-<p align="left">
-    There are two classes of OneLab user: the manager and the standard user. OneLab grants access rights to managers, who, in turn, provide access rights to
-    standard users. Examples are: for a small enterprise, an executive may be the manager and the employees may be standard users; for a research team, a
-    senior scientist (faculty member or research scientist) may be a manager and doctoral students and other members of the team may be standard users; for a
-    university course, a professor may be a manager and the students may be standard users.
-</p>
-<h2 align="left">
-    1.4 These terms and conditions
-</h2>
-<p align="left">
-    Acceptance of these terms and conditions is a condition of obtaining OneLab Basic level user service. They are posted to the OneLab portal site
-    (portal.onelab.eu). They may be changed without other notice than the posting of a new version to the portal site.
-</p>
-<h1 align="left">
-    2 Services provided by OneLab
-</h1>
-<h2 align="left">
-    2.1 Access to the experimental facility
-</h2>
-<p align="left">
-    OneLab provides users with access to the platforms that make up the experimental facility. Each platform owner determines the specifics of this access (for
-    example, how many nodes are available to a user, what happens in case of oversubscription, etc.), with the proviso that Basic level service requires that
-    users be able to conduct meaningful experiments on every OneLab testbed.
-</p>
-<p align="left">
-    Basic level service may also provide access to platforms that are federated with OneLab, but such access depends upon the terms of the federation
-    agreements with those platforms, which may require that the user have a higher level of service in order to gain access. For example, Basic level service
-    provides access to PlanetLab Europe, a OneLab platform, without providing access to PlanetLab Central, a federated platform. Users wanting full access
-    across the global PlanetLab system should contact support@onelab.eu to arrange to enter into a PlanetLab Europe membership agreement.
-</p>
-<p align="left">
-    OneLab's role is to facilitate access to the platforms. Specifically, it provides each user with:
-</p>
-<ul>
-    <li align="left">
-        <strong>a single account,</strong>
-        the credentials for which can be used to access all of the OneLab testbeds;
-    </li>
-    <li align="left">
-        <strong>tools through which to access the testbeds</strong>
-        , including, notably, a web-based portal (portal.onelab.eu) that allows a user to see the resources available on each testbed and to reserve them,
-        along with a number of experiment control tools that a user can employ to deploy an experiment on those resources;
-    </li>
-    <li align="left">
-        <strong>support</strong>
-        , with documentation on how to use the tools, pointers to documentation for individual testbeds, and a helpdesk to respond to user questions.
-    </li>
-</ul>
-<p align="left">
-    Additional support, such as accompaniment through the design and deployment of experiments and the interpretation of their results, is available through
-    higher levels of service.
-</p>
-<h2 align="left">
-    2.2 Best effort, without guarantees
-</h2>
-<p align="left">
-    OneLab and the owners of the individual OneLab testbeds do their best to provide the services outlined here, with the understanding that Basic level
-    service offers no guarantees. Users should clearly understand the following limitations.
-</p>
-<ul type="disc">
-    <li>
-        <strong>Reliability:</strong>
-        OneLab does not provide any guarantees with respect to the reliability of the portal, of other tools, or of the individual nodes on platforms. These
-        may be taken down for maintenance, rebooted, or reinstalled at any time. Reinstallation implies that disks are wiped, meaning that users should not
-        consider a local disk to be a persistent form of storage.
-    </li>
-    <li>
-        <strong>Fitness:</strong>
-        OneLab does not guarantee that the platforms are suitable for the experiments that users intend to conduct. There may be limitations in the
-        technologies that are offered that prevent certain types of experiments from being carried out.
-    </li>
-    <li>
-        <strong>Privacy</strong>
-        : OneLab does not guarantee the privacy of traffic generated on the platforms (e.g., wireless signals, packets). Unless otherwise specified by an
-        individual platform owner, users should assume that traffic is monitored and logged. Such monitoring may be done intentionally, for example, to allow
-        platform administrators as well as other users to investigate abuse.
-    </li>
-</ul>
-<p align="left">
-    Users who seek such guarantees are invited to consider a higher level of service.
-</p>
-<h2 align="left">
-    2.3 Limitedliability
-</h2>
-<p align="left">
-    In no event shall the partners of the OneLab consortium be liable to any user for any consequential, incidental, punitive, or lost profit damages, or for
-    any damages arising out of loss of use or loss of data, to the extent that such damages arise out of the activities of OneLab consortium partners, or any
-    breach of the present terms and conditions, even if the consortium partner has been advised of the possibility of such damages.
-</p>
-<p align="left">
-    Nothing contained in these terms and conditions shall be deemed as creating any rights or liabilities in or for third parties who are not Basic level users
-    of OneLab.
-</p>
-<h1 align="left">
-    3 Acceptable use policy
-</h1>
-<h2 align="left">
-    3.1 Responsibilities of managers and standard users
-</h2>
-<p align="left">
-    OneLab creates and administers accounts for managers and delegates to managers the responsibility for creating and administering accounts for standard
-    users. Both managers and standard users are required to follow OneLab's acceptable use policy. In addition, managers are fully responsible for the
-    activities of the standard users whose accounts they create.
-</p>
-<p align="left">
-    A manager is expected to grant user access only an individual with whom he or she has a working relationship. In general, this means an individual who
-    works for the same institution as the manager, or, in the case of higher education and research, an individual who is a student at the university where the
-    manager works. Managers may also grant access to individuals from other institutions, provided that they are collaborating on a common project on OneLab.
-    If there is a doubt, a manager should refer the question to support@onelab.eu.
-</p>
-<h2 align="left">
-    3.2 Types of use
-</h2>
-<p align="left">
-    OneLab may be used by enterprise, by scientific researchers, and by educators.
-</p>
-<p align="left">
-    OneLab may be used for pre-commercial research and development. In keeping with OneLab's not-for-profit status, it may not be used to deploy services that
-    are designed to generate a commercial profit.
-</p>
-<p align="left">
-    Not-for-profit use of OneLab to deploy services that are designed to generate revenue requires prior approval through a written agreement, and thus may not
-    be carried out on a Basic level account. Interested users are invited to contact support@onelab.eu.
-</p>
-<p align="left">
-    OneLab may be used for scientific research.
-</p>
-<p align="left">
-    OneLab may be used to host lab exercises for university courses.
-</p>
-<p align="left">
-    Questions about other types of use should be addressed to support@onelab.eu.
-</p>
-<h2 align="left">
-    3.3 Applicable laws and regulations
-</h2>
-<p align="left">
-    OneLab is managed, and the portal is hosted, in France. Information regarding the countries in which individual testbeds are managed and hosted is
-    available from those testbeds. Users are responsible for being aware of the countries in which their experiments are deployed and for ensuring that their
-    use of OneLab fully conforms to the laws and regulations of those countries, as well as the laws and regulations of the country in which they themselves
-    are present when conducting their experiments.
-</p>
-<p align="left">
-    Above and beyond specific national laws, the activities email spamming, phishing through web services, and all types of Internet fraud are prohibited on
-    OneLab.
-</p>
-<h2>
-    3.4 Security and accounting mechanisms
-</h2>
-<p align="left">
-    Users are expected to respect the security and accounting mechanisms put in place by OneLab, its platforms, and federated platforms. For example, access to
-    PlanetLab Europe is designed to take place through the SSH cryptographically-secured connection protocol, which uses public/private key pair
-    authentication, and so users should not attempt to bypass this mechanism. As another example, OneLab's notion of a "slice" associates a set of resources
-    with the group of users who have reserved those resources, and users should not attempt to obscure the identities of participants in a slice.
-</p>
-<p align="left">
-    Hacking attempts against the OneLab portal and testbeds are not permitted. This includes "red team" (hacker test) experiments.
-</p>
-<h2>
-    3.5 Sharing of resources
-</h2>
-<p align="left">
-    OneLab is intended for ambitious experiments. Large numbers of resources and extended leases on resources may legitimately be granted in order to carry
-    these out. At the same time, OneLab and its testbeds are shared environments, and when there is contention for resources, limits must be imposed.
-</p>
-<p align="left">
-    Each OneLab platform sets its own policies for handling resource contention. As a general rule, users are encouraged to design their experiments to use
-    resources efficiently. In particular, spinning/busy-waiting techniques for extended periods of time are strongly discouraged. Some resource contention
-    policies (e.g., PlanetLab Europe's) terminate the jobs that are using the most resources in the case of contention.
-</p>
-<h2>
-    3.6 Internet-connected platforms
-</h2>
-<p align="left">
-    Some of OneLab's platforms allow experiments to take place on resources that have access to the public internet. These experiments can potentially generate
-    traffic to, and receive traffic from, any host or router in the internet.<a></a><a id="_anchor_1" href="#_msocom_1" name="_msoanchor_1">[LB1]</a>
-</p>
-<p align="left">
-    Furthermore, some internet-connected platforms (e.g., PlanetLab Europe) consist of servers that are hosted by a large number of member institutions.
-</p>
-<p align="left">
-    The accessibility of internet-connected platforms and the distributed hosting model of some of these platforms imply certain responsibilities on the part
-    of users, as detailed below.
-</p>
-<h3>
-    3.6.1 General guidance
-</h3>
-<p align="left">
-    A good litmus test when considering whether an experiment is appropriate for such internet-connected platforms is to ask what the network administrator at
-    one's own organisation would say about the experiment running locally. If the experiment disrupts local activity (e.g., uses more than its share of the
-    site's internet bandwidth) or triggers complaints from remote network administrators (e.g., performs systematic port scans), then it is not appropriate for
-    such internet-connected platforms.
-</p>
-<p align="left">
-    It is the responsibility of the user and the user's manager to ensure that an application that will run on an internet-connected platform is tested and
-    debugged in a controlled environment, to better understand its behaviour prior to deployment.
-</p>
-<h3>
-    3.6.2 Standards of network etiquette
-</h3>
-<p align="left">
-    Internet-connected platforms are designed to support experiments that generate unusual traffic, such as network measurements. However, it is expected that
-    all users adhere to widely accepted standards of network etiquette in an effort to minimise complaints from network administrators. Activities that have
-    been interpreted as worm and denial-of-service attacks in the past (and should be avoided) include sending SYN packets to port 80 on random machines,
-    probing random IP addresses, repeatedly pinging routers, overloading bottleneck links with measurement traffic, and probing a single target machine from
-    many nodes.
-</p>
-<p align="left">
-    For internet-connected platforms that have a distributed hosting model, each host institution will have its own acceptable use policy. Users should not
-    knowingly violate such local policies. Conflicts between local policies and OneLab's stated goal of supporting research into wide-area networks should be
-    brought to the attention of OneLab administrators at support@onelab.eu.
-</p>
-<h3>
-    3.6.3 Specific network usage rules
-</h3>
-<p align="left">
-    It is not allowed to use one or more nodes of an internet-connected platform to generate a high number of network flows or flood a site with high traffic
-    to the point of interfering with its normal operation. Use of congestion-controlled flows for large transfers is highly encouraged.
-</p>
-<p align="left">
-    It is not allowed to perform systematic or random port or address block scans from an internet-connected platform.
-</p>
-<p align="left">
-    For internet-connected platforms that use a distributed hosting model, it is not allowed to spoof or sniff traffic on a hosted server or on the network the
-    server belongs to.
-</p>
-<p align="left">
-    Access to a server on a distributed hosting platform may not be used to gain access to other servers or networked equipment that are not part of the
-    testbed.
-</p>
-<h2>
-    3.7 Wireless platforms
-</h2>
-<p align="left">
-    Wireless-connected platforms give users access to nodes that communicate via Wi-Fi and other wireless technologies. They may be capable of detecting
-    wireless activity in the neighbourhood of those nodes: traffic generated by other users of the platform or by individuals not associated with the platform.
-    In general, much of the traffic will be encrypted, with certain aspects (such as SSIDs) not encrypted, but it is also possible that there will be fully
-    unencrypted traffic. They may also be capable of generating wireless activity that reaches equipment outside of the testbed.
-</p>
-<p align="left">
-    Furthermore, some wireless-connected platforms may have built-in limitations to prevent them from generating signals at a strength that exceeds health and
-    safety regulations.
-</p>
-<p align="left">
-    These characteristics of wireless-connected platforms imply certain responsibilities on the part of users, as detailed below.
-</p>
-<h3>
-    3.7.1 Specific network usage rules
-</h3>
-<p align="left">
-    Experimenters may make no attempt to defeat the encryption of encrypted third-party traffic. Furthermore, experimenters must treat with utmost discretion
-    any unencrypted traffic. Limited metadata can be recorded for the bona fide purposes of an experiment, but under no case should third party communications
-    be recorded.
-</p>
-<p align="left">
-    No attempt may be made to reverse engineer traffic in order to learn the identities of the parties who have generated the traffic.
-</p>
-<p align="left">
-    Wireless-connected platforms may not be used to gain access to any network equipment that is not part of the testbed itself.
-</p>
-<p align="left">
-    It is not allowed to perform systematic or random scans of wireless networks that are not part of a wireless-connected platform. Similarly, it is not
-    allowed to spoof or sniff wireless traffic of the institution that hosts a wireless-connected platform or of other networks in the proximity.
-</p>
-<p align="left">
-    Care must be taken so that traffic on wireless-connected platforms does not interfere with the normal functioning of network equipment that is not part of
-    the testbed itself.
-</p>
-<p align="left">
-    No attempt may be made to defeat the mechanisms that limit signal strength on wireless-connected platforms.
-</p>
-<h2>
-    3.8 Handling suspected violations
-</h2>
-<p align="left">
-    Suspected violations of the OneLab acceptable use policy should be reported to support@onelab.eu.
-</p>
-<p align="left">
-    Upon notification or detection of a possible violation, OneLab management will attempt to understand if a violation has in fact occurred. To do so,
-    management will freely communicate with the users concerned, the operators of the platforms concerned, as well as any third parties that might be involved.
-    An example of a third party is a network operator who detects what they believe to be unauthorized traffic emanating from a OneLab platform.
-</p>
-<p align="left">
-    The priority is to resolve any real or apparent violations amicably. However, if OneLab management believes that a violation may have occurred, it can, at
-    its sole discretion, and without prior notice, apply any of the following measures:
-</p>
-<ul type="disc">
-    <li>
-        notification of the users of the concerned slice (set of resources);
-    </li>
-    <li>
-        disabling of the concerned slice;
-    </li>
-    <li>
-        disabling an individual user's account;
-    </li>
-    <li>
-        reporting of the user's activity to his/her manager;
-    </li>
-    <li>
-        disabling of the manager's account and all user accounts for which the manager is responsible;
-    </li>
-    <li>
-        disabling of all accounts associated with the user's institution.
-    </li>
-</ul>
-<p align="left">
-    In the case of suspected illegal activity, OneLab management might need, without prior notice, to notify the relevant authorities.
-</p>
-<div>
-    <div>
-        <div id="_com_1">
-        </div>
     </div>
-</div> 
-</div>
-</div>
-<div class="row">
-       <div class="col-md-12">
 
-</div>
+       <div class="col-md-12">
+    {% include theme|add:"_terms_and_conditions.html" %}
+    </div>
 </div>
 {% endblock %}
 
index 4097b33..bcecea0 100644 (file)
@@ -3,20 +3,19 @@
 {% block content %}
 
 <div class="row">
-       <div class="col-md-12">
-       <h1><img src="{{ STATIC_URL }}icons/user-xs.png" alt="User Registration" />User sign-up</h1>
-       </div>
+       <h1><img src="{{ STATIC_URL }}img/icon_user_small.png" alt="User Registration" /> User sign-up</h1>
 </div>
 <div class="row">
-       <div class="col-md-12">
-         <h3>Sign up information received.</h3>
-         <p>You can now <a href="/">log in</a> to the portal. You will have limited access. </p>
-         <p>To gain full access, two steps are required:</p>
-         <ul style="list-style-type:decimal;">
-               <li>You confirm your signup request by clicking on the link in the email that we have sent to your email address.</li>
-               <li>A manager from your organization validates your request. (We have sent email to your organisation's registered managers.)</li>
-         </ul>
-       </div>
+  <h3>Sign up information received.</h3>
+  <p>You can now log in to the portal. You will have limited access. </p>
+  <p>To gain full access, two steps are required:</p>
+  <ul>
+       <li>1. You confirm your signup request by clicking on the link in the email that we have sent to your email address.<br>
+               Please be aware that it can happen that this email was automatically filtered to your spam box.<br>
+               Please check your spam box if you do not receive the email in a few minutes</li>
+       <li>2. A manager from your organization validates your request. Upon confirmation of your signup request,<br> 
+               we will send an email to the managers at your organization with a validation request.</li>
+  </ul>                
 </div>
 
 {% endblock %}
index 40ad706..825bc14 100644 (file)
@@ -1,13 +1,11 @@
-<img src="https://onelab.eu/static/images/onelab.png">
+<img src="{{current_site}}/static/img/{{theme.logo}}" width="80px">
 <br>
 <p>Dear {{first_name}} {{last_name}},</p>
 <p></p>
-<p>You have recently registered as a user to OneLab portal. We are sorry to inform you that, a manager of your institution has rejected your request. Please contact the manager of your institution for further information. For any other queries, contact us by replying to this email.</p>
+<p>You have recently registered as a user to {{theme.label}} portal. We are sorry to inform you that a manager of your institution has rejected your request. Please contact the manager of your institution for further information. For any other queries, contact us by replying to this email.</p>
 <p></p>
-<p>On behalf of the entire team, I wish you all the best.</p>
+<p>We  wish you all the best.</p>
 <p></p>
 <p>Yours sincerely,</p>
-<p></p>
-<p>Timur Friedman</p>
-<p>Executive Director</p>
+<p>The {{theme.label}} team</p>
 
index 9f931a2..341d1f4 100644 (file)
@@ -1,11 +1,8 @@
 Dear {{first_name}} {{last_name}},
 
-You have recently registered as a user to OneLab portal. We are sorry to inform you that, a manager of your institution has rejected your request. Please contact the manager of your institution for further information. For any other queries, contact us by replying to this email.
+You have recently registered as a user to {{theme.label}} portal. We are sorry to inform you that a manager of your institution has rejected your request. Please contact the manager of your institution for further information. For any other queries, contact us by replying to this email.
 
-On behalf of the entire team, I wish you all the best.
+We wish you all the best.
 
 Yours sincerely,
-
-Timur Friedman
-Executive Director
-
+The {{theme.label}} team
index 37dfb52..0702a92 100644 (file)
@@ -1,16 +1,22 @@
-<img src="https://onelab.eu/static/images/onelab.png">
+<img src="{{current_site}}/static/img/{{theme.logo}}" width="80px">    
 <br>
 <h1>NEW USER REQUEST</h1>
 <br>
+<p>You are receiving this request because we have you listed as a manager at an organization that uses {{theme.label}}.</p> 
+<p>If you believe that you have received this message in error, or if you have any questions, kindly contact support@{{theme.theme}}.eu.</p>
+<br>
 <b>First name   :</b> {{first_name}}<br>
 <b>Last name    :</b> {{last_name}}<br>
-<b>Organization :</b> {{organization}}<br>
+<!--<b>Organization :</b> {{organization}}<br> -->
 <b>Authority hrn:</b> {{authority_hrn}}<br>
 <b>Public key   :</b> {{public_key}}<br>
 <b>Email        :</b> {{email}}<br>
 <b>User hrn     :</b> {{user_hrn}}<br>
 <b>Portal url  :</b> {{ current_site }}<br>
 <p></p>
-<p>You can validate the user <a href="{{current_site}}/portal/validate">here</a>.<p>
-<br>
-<p>Please note that the validation request will only become visible once the user has confirmed his/her email address.</p>
+<p>You can see new user request <a href="{{current_site}}/portal/institution#requests">in the portal.</a><p>
+
+{% include theme|add:"_widget-user_request_email.html" %}
+
+<p>Yours sincerely,</p>        
+<p>The {{theme.label}} team</p>
index 17ce184..af60991 100644 (file)
@@ -1,14 +1,18 @@
 NEW USER REQUEST
 
+You are receiving this request because we have you listed as a manager at an organization that uses {{theme.label}}. 
+If you believe that you have received this message in error, or if you have any questions, kindly contact support@{{theme.theme}}.eu.
+
 First name   : {{first_name}}
 Last name    : {{last_name}} 
-Organization :{{organization}}
 Authority hrn: {{authority_hrn}}
 Public key   : {{public_key}}
 Email        : {{email}}
 User hrn     : {{user_hrn}}
 Portal url   : {{ current_site }}
 
-Please note that the validation request will only become visible once the user has confirmed his/her email address.
+You can see new user request in the portal: {{current_site}}/portal/institution#requests
 
 
+Yours sincerely,      
+The {{theme.label}} team
index 8821b66..daba5b6 100644 (file)
@@ -1,4 +1,4 @@
-<img src="https://onelab.eu/static/images/onelab.png">
+<img src="{{current_site}}/static/img/{{theme.logo}}" width="80px">
 <br>
 <p>Dear {{first_name}} {{last_name}},</p>
 <p></p>
diff --git a/portal/templates/user_request_validated_subject.txt b/portal/templates/user_request_validated_subject.txt
deleted file mode 100644 (file)
index da9ce74..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Account validated
index 905858c..1d6fae8 100644 (file)
@@ -48,6 +48,7 @@ from portal.univbrisview            import UnivbrisView
 from portal.univbrisvtam            import UnivbrisVtam
 
 from portal.manualdelegationview    import ManualDelegationView
+from portal.releasenotesview       import ReleaseNotesView
 
 from portal.servicedirectory        import ServiceDirectoryView
 
@@ -104,6 +105,7 @@ urlpatterns = patterns('',
     url(r'^project_request/?$', ProjectRequestView.as_view(), name='project_request'),
     url(r'^terms/?$', TermsView.as_view(), name='terms'),
     url(r'^manual_delegation/?$', ManualDelegationView.as_view(), name='manual_delegation'),
+    url(r'^release_notes/?$', ReleaseNotesView.as_view(), name='release_notes'),
     # Validate pending requests
     url(r'^validate/?$', ValidatePendingView.as_view()),
     # http://stackoverflow.com/questions/2360179/django-urls-how-to-pass-a-list-of-items-via-clean-urls
index 65ff7e6..fccfede 100644 (file)
@@ -7,8 +7,6 @@ from django.http                    import HttpResponse
 from manifold.core.query            import Query
 from manifoldapi.manifoldapi        import execute_query
 
-from portal.actions                 import is_pi
-
 from myslice.settings               import logger
 
 # handles serialization of datetime in json
index 7729549..d9a4939 100644 (file)
@@ -7,7 +7,8 @@ import ConfigParser
 
 def servicesStatus(request):
     Config = ConfigParser.ConfigParser()
-    Config.read(os.getcwd() + "/myslice/myslice/monitor.ini")
+    monitor_file = os.path.abspath(os.path.dirname(__file__) + '/../myslice/monitor.ini')
+    Config.read(monitor_file)
     
     result = {}
     
index 1ed0941..cc9f9a1 100644 (file)
@@ -14,32 +14,27 @@ from sfa.client.return_value    import ReturnValue
 from sfa.util.xrn               import Xrn, get_leaf, get_authority, hrn_to_urn, urn_to_hrn
 
 from manifold.core.query        import Query
-from manifold.models            import db
-from manifold.models.platform   import Platform
-from manifold.models.user       import User
+
+from manifoldapi.manifoldapi    import execute_admin_query
 
 from unfold.loginrequired       import LoginRequiredView
 
-from myslice.settings           import logger
+from myslice.settings           import logger, config
 
 from rest.json_encoder          import MyEncoder
 
 def dispatch(request, method):
-    Config = ConfigParser.ConfigParser()
-    Config.read(os.getcwd() + "/myslice/monitor.ini")
-
-    #logger.debug(request.session['user']['email'])
-    user_email = request.session['user']['email']
 
-    platforms = list()
-    options   = dict()
-    rspec = ''
-    results = dict()
-    urn = ''
     hrn = ''
+    urn = ''
     object_type = ''
-    display = None
+    rspec = ''
     recursive = False
+    options   = dict()
+    platforms = list()
+
+    results = dict()
+    display = None
 
     if request.method == 'POST':
         req_items = request.POST
@@ -50,7 +45,7 @@ def dispatch(request, method):
         if el[0].startswith('rspec'):
             rspec += el[1]
         elif el[0].startswith('platform'):
-            platforms += req_items.getlist('platform[]')
+            platforms = req_items.getlist('platform[]')
         #elif el[0].startswith('options'):
         #    options += req_items.getlist('options[]')
         elif el[0].startswith('hrn'):
@@ -67,6 +62,63 @@ def dispatch(request, method):
         elif el[0].startswith('display'):
             display = el[1]
 
+    results = sfa_client(request, method, hrn=hrn, urn=urn, object_type=object_type, recursive=recursive, options=options, platforms=platforms)
+    if display == 'table':
+        return render_to_response('table-default.html', {'data' : data, 'fields' : columns, 'id' : '@component_id', 'options' : None})
+    else:
+        return HttpResponse(json.dumps(results, cls=MyEncoder), content_type="application/json")
+
+def get_user_account(request, user_email, platform_name):
+    """
+    Returns the user configuration for a given platform.
+    This function does not resolve references.
+    """
+    user_query  = Query().get('local:user').filter_by('email', '==', user_email).select('user_id')
+    user_details = execute_admin_query(request, user_query)
+    platform_query  = Query().get('local:platform').filter_by('platform', '==', platform_name).select('platform_id')
+    platform_details = execute_admin_query(request, platform_query)
+
+    account_query  = Query().get('local:account').filter_by('platform_id','==',platform_details[0]['platform_id']).filter_by('user_id', '==', user_details[0]['user_id']).select('user_id','platform_id','auth_type','config')
+    accounts = execute_admin_query(request, account_query)
+
+    if not accounts:
+        raise Exception, "this account does not exist"
+
+    if accounts[0]['auth_type'] == 'reference':
+        pf = json.loads(accounts[0]['config'])['reference_platform']
+        return get_user_account(request, user_email, pf)
+
+    return accounts[0]
+
+def sfa_client(request, method, hrn=None, urn=None, object_type=None, rspec=None, recursive=None, options=None, platforms=None, admin=False):
+
+    Config = ConfigParser.ConfigParser()
+    monitor_file = os.path.abspath(os.path.dirname(__file__) + '/../myslice/monitor.ini')
+    Config.read(monitor_file)
+
+    if admin:
+        user_email, admin_password = config.manifold_admin_user_password()
+    else:
+        #logger.debug(request.session['user']['email'])
+        user_email = request.session['user']['email']
+
+    results = dict()
+
+    if hrn is None:
+        hrn = ''
+    if urn is None:
+        urn = ''
+    if object_type is None:
+        object_type = ''
+    if rspec is None:
+        rspec = ''
+    if recursive is None:
+        recursive = False
+    if options is None:
+        options  = dict()
+    if platforms is None:
+        platforms = list()
+
     if method not in ['GetVersion','ListResources']:
         try:
             if not hrn:
@@ -78,7 +130,7 @@ def dispatch(request, method):
             raise Exception, "Provide urn OR hrn + type as parameters of method %s" % method
 
     if len(platforms)==0:
-        platforms = get_platforms()
+        platforms = get_platforms(request)
         #platforms.append('myslice')
     #results = {'method':method,'platforms':platforms,'rspec':rspec,'options':options}
 
@@ -90,9 +142,8 @@ def dispatch(request, method):
     api_options['geni_rspec_version'] = {'type': 'GENI', 'version': '3'}
     api_options['list_leases'] = 'all'
     server_am = False
-    from manifoldapi.manifoldapi    import execute_admin_query
     for pf in platforms:
-        platform = get_platform_config(pf)
+        platform = get_platform_config(request, pf)
         logger.debug("platform={}".format(platform))
         if 'sm' in platform and len(platform['sm']) > 0:
             logger.debug('sm')
@@ -108,27 +159,34 @@ def dispatch(request, method):
             server_url = platform['registry']
     
         if not Config.has_option('monitor', 'cert') :
-             return HttpResponse(json.dumps({'error' : '-1'}), content_type="application/json")
+             #return HttpResponse(json.dumps({'error' : '-1'}), content_type="application/json")
+             return {'error' : '-1', 'msg': 'monitor.ini has no cert configured'}
 
         cert = os.path.abspath(Config.get('monitor', 'cert'))
         if not os.path.isfile(cert) :
-             return HttpResponse(json.dumps({'error' : '-1'}), content_type="application/json")
+             #return HttpResponse(json.dumps({'error' : '-1'}), content_type="application/json")
+             return {'error' : '-1', 'msg': 'check cert file at %s'%cert}
 
         if not Config.has_option('monitor', 'pkey') :
-             return HttpResponse(json.dumps({'error' : '-2'}), content_type="application/json")
+             #return HttpResponse(json.dumps({'error' : '-2'}), content_type="application/json")
+             return {'error' : '-2'}
 
         pkey = os.path.abspath(Config.get('monitor', 'pkey'))
         if not os.path.isfile(pkey) :
-             return HttpResponse(json.dumps({'error' : '-2'}), content_type="application/json")
+             #return HttpResponse(json.dumps({'error' : '-2'}), content_type="application/json")
+             return {'error' : '-2'}
  
         server = SfaServerProxy(server_url, pkey, cert)
 
         try:
             # Get user config from Manifold
-            user_config = get_user_config(user_email, pf)
+            user_config = get_user_config(request, user_email, pf)
             if 'delegated_user_credential' in user_config:
                 user_cred = user_config['delegated_user_credential']
+            elif 'user_credential' in user_config:
+                user_cred = user_config['user_credential']
             else:
+                logger.error("no user credentials for user = ", user_email)
                 user_cred = {}
 
             if object_type:
@@ -136,6 +194,15 @@ def dispatch(request, method):
                     for obj_name, cred in user_config['delegated_%s_credentials'%object_type].items():
                         if obj_name == hrn:
                             object_cred = cred
+                elif '%s_credentials'%object_type in user_config:
+                    for obj_name, cred in user_config['%s_credentials'%object_type].items():
+                        if obj_name == hrn:
+                            object_cred = cred
+                else:
+                    logger.error("no credentials for object")
+                    logger.error(object_type)
+                    logger.error(object_name)
+                    object_cred = {}
 
             # Both AM & Registry
             if method == "GetVersion": 
@@ -145,8 +212,9 @@ def dispatch(request, method):
                 if server_am:
                     if method == "ListResources":
                         result = server.ListResources([user_cred], api_options)
+                        logger.debug(result)
                         dict_result = xmltodict.parse(result['value'])
-                        result['json'] = json.dumps(dict_result)
+                        result['parsed'] = dict_result
                         if isinstance(dict_result['rspec']['node'], list):
                             columns.extend(dict_result['rspec']['node'][0].keys())
                         else:
@@ -164,13 +232,16 @@ def dispatch(request, method):
                         # else GetVersion = v3
                         else:
                             result = server.Describe([urn] ,[object_cred], api_options)
-                            dict_result = xmltodict.parse(result['value']['geni_rspec'])
+                            if isinstance(result, dict):
+                                if result['value'] != 0:
+                                    dict_result = xmltodict.parse(result['value']['geni_rspec'])
 
-                        result['json'] = json.dumps(dict_result)
-                        if isinstance(dict_result['rspec']['node'], list):
-                            columns.extend(dict_result['rspec']['node'][0].keys())
-                        else:
-                            columns.extend(dict_result['rspec']['node'].keys())
+                        result['parsed'] = dict_result
+                        if 'rspec' in dict_result and 'node' in dict_result['rspec']:
+                            if isinstance(dict_result['rspec']['node'], list):
+                                columns.extend(dict_result['rspec']['node'][0].keys())
+                            else:
+                                columns.extend(dict_result['rspec']['node'].keys())
 
                     elif method == 'Renew':
                         # Renew till 1 month from now
@@ -180,28 +251,35 @@ def dispatch(request, method):
                     elif method == 'Delete':
                         result = server.Delete([urn] ,[object_cred], api_options)
                     elif method == 'Allocate':
-                        # if GetVersion = v2
-                        # CreateSliver(slice_hrn)
-                        # else GetVersion = v3
                         api_options['call_id']    = unique_call_id()
                         # List of users comes from the Registry
                         api_options['sfa_users']  = sfa_users
                         api_options['geni_users'] = geni_users
-                        result = server.Allocate([urn] ,[object_cred], rspec, api_options)
+                        # if GetVersion = v2
+                        version = server.GetVersion()
+                        if version['geni_api'] == 2:
+                            result = server.CreateSliver([urn] ,[object_cred], rspec, api_options)
+                        # else GetVersion = v3
+                        else:
+                            result = server.Allocate([urn] ,[object_cred], rspec, api_options)
                     elif method == 'Provision':
                         # if GetVersion = v2
                         # Nothing it is not supported by v2 AMs
-                        api_options['call_id']    = unique_call_id()
-                        # List of users comes from the Registry
-                        api_options['sfa_users']  = sfa_users
-                        api_options['geni_users'] = geni_users
-                        result = server.Provision([urn] ,[object_cred], api_options)
+                        version = server.GetVersion()
+                        if version['geni_api'] == 3:
+                            api_options['call_id']    = unique_call_id()
+                            # List of users comes from the Registry
+                            api_options['sfa_users']  = sfa_users
+                            api_options['geni_users'] = geni_users
+                            result = server.Provision([urn] ,[object_cred], api_options)
                     elif method == 'Status':
                         result = server.Status([urn] ,[object_cred], api_options)
                     elif method == 'PerformOperationalAction':
                         # if GetVersion = v2
                         # Nothing it is not supported by v2 AMs
-                        result = server.PerformOperationalAction([urn] ,[object_cred], action, api_options)
+                        version = server.GetVersion()
+                        if version['geni_api'] == 3:
+                            result = server.PerformOperationalAction([urn] ,[object_cred], action, api_options)
                     elif method == 'Shutdown':
                         result = server.Shutdown(urn ,[object_cred], api_options)
                     else:
@@ -214,15 +292,15 @@ def dispatch(request, method):
                     record_dict = {'urn': urn, 'hrn': hrn, 'type': object_type}
                     if method == "List":
                         # hrn is required
-                        options['recursive'] = recursive
-                        result = server.List(hrn, user_cred, options)
+                        api_options['recursive'] = recursive
+                        result = server.List(hrn, user_cred, api_options)
                         if object_type:
                             result = filter_records(object_type, result)
                     elif method == "Resolve":
                         # hrn is required
                         # details can be True or False
-                        options['details']=True
-                        result = server.Resolve(hrn, user_cred, options)
+                        api_options['details']=True
+                        result = server.Resolve(hrn, user_cred, api_options)
                         if object_type:
                             result = filter_records(object_type, result)
                     elif method == "Register":
@@ -246,53 +324,38 @@ def dispatch(request, method):
 
             results[pf] = result
             if dict_result:
-                if isinstance(dict_result['rspec']['node'], list):
-                    data = data + dict_result['rspec']['node']
-                else:
-                    data.append(dict_result['rspec']['node'])
+                if 'rspec' in dict_result and 'node' in dict_result['rspec']:
+                    if isinstance(dict_result['rspec']['node'], list):
+                        data = data + dict_result['rspec']['node']
+                    else:
+                        data.append(dict_result['rspec']['node'])
         except Exception,e:
             import traceback
             logger.error(traceback.format_exc())
             logger.error(e)
             results[pf] = {'error':'-3', 'error_msg': str(e)}
-    if display == 'table':
-        return render_to_response('table-default.html', {'data' : data, 'fields' : columns, 'id' : '@component_id', 'options' : None})
-    else:
-        results['columns'] = columns
-        return HttpResponse(json.dumps(results, cls=MyEncoder), content_type="application/json")
 
-def get_user_account(user_email, platform_name):
-    """
-    Returns the user configuration for a given platform.
-    This function does not resolve references.
-    """
-    user = db.query(User).filter(User.email == user_email).one()
-    platform = db.query(Platform).filter(Platform.platform == platform_name).one()
-    accounts = [a for a in user.accounts if a.platform == platform]
-    if not accounts:
-        raise Exception, "this account does not exist"
+    results['columns'] = columns
+    return results
 
-    if accounts[0].auth_type == 'reference':
-        pf = json.loads(accounts[0].config)['reference_platform']
-        return get_user_account(user_email, pf)
+def get_user_config(request, user_email, platform_name):
+    account = get_user_account(request, user_email, platform_name)
+    return json.loads(account['config']) if account['config'] else {}
 
-    return accounts[0]
-
-def get_user_config(user_email, platform_name):
-    account = get_user_account(user_email, platform_name)
-    return json.loads(account.config) if account.config else {}
-
-def get_platforms():
+def get_platforms(request):
     ret = list()
-    platforms = db.query(Platform).filter(Platform.gateway_type == 'sfa', Platform.disabled == 0).all()
+    platform_query  = Query().get('local:platform').filter_by('gateway_type', '==', 'sfa').filter_by('disabled','==',0).select('platform')
+    platforms = execute_admin_query(request, platform_query)
+
     for p in platforms:
-        ret.append(p.platform)
+        ret.append(p['platform'])
     return ret
 
+def get_platform_config(request, platform_name):
+    platform_query  = Query().get('local:platform').filter_by('platform', '==', platform_name).select('platform', 'config')
+    platforms = execute_admin_query(request, platform_query)
 
-def get_platform_config(platform_name):
-    platform = db.query(Platform).filter(Platform.platform == platform_name).one()
-    return json.loads(platform.config) if platform.config else {}
+    return json.loads(platforms[0]['config']) if platforms[0]['config'] else {}
 
 def filter_records(type, records):
     filtered_records = []
diff --git a/third-party/angular b/third-party/angular
new file mode 120000 (symlink)
index 0000000..3362875
--- /dev/null
@@ -0,0 +1 @@
+angular-1.3.0/
\ No newline at end of file
diff --git a/third-party/angular-1.3.0/angular.min.js b/third-party/angular-1.3.0/angular.min.js
new file mode 100644 (file)
index 0000000..cf6567a
--- /dev/null
@@ -0,0 +1,247 @@
+/*
+ AngularJS v1.3.0
+ (c) 2010-2014 Google, Inc. http://angularjs.org
+ License: MIT
+*/
+(function(S,X,u){'use strict';function y(b){return function(){var a=arguments[0],c;c="["+(b?b+":":"")+a+"] http://errors.angularjs.org/1.3.0/"+(b?b+"/":"")+a;for(a=1;a<arguments.length;a++){c=c+(1==a?"?":"&")+"p"+(a-1)+"=";var d=encodeURIComponent,e;e=arguments[a];e="function"==typeof e?e.toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof e?"undefined":"string"!=typeof e?JSON.stringify(e):e;c+=d(e)}return Error(c)}}function Ra(b){if(null==b||Sa(b))return!1;var a=b.length;return b.nodeType===
+ka&&a?!0:I(b)||B(b)||0===a||"number"===typeof a&&0<a&&a-1 in b}function r(b,a,c){var d,e;if(b)if(F(b))for(d in b)"prototype"==d||"length"==d||"name"==d||b.hasOwnProperty&&!b.hasOwnProperty(d)||a.call(c,b[d],d,b);else if(B(b)||Ra(b)){var f="object"!==typeof b;d=0;for(e=b.length;d<e;d++)(f||d in b)&&a.call(c,b[d],d,b)}else if(b.forEach&&b.forEach!==r)b.forEach(a,c,b);else for(d in b)b.hasOwnProperty(d)&&a.call(c,b[d],d,b);return b}function ic(b){var a=[],c;for(c in b)b.hasOwnProperty(c)&&a.push(c);
+return a.sort()}function zd(b,a,c){for(var d=ic(b),e=0;e<d.length;e++)a.call(c,b[d[e]],d[e]);return d}function jc(b){return function(a,c){b(c,a)}}function Ad(){return++hb}function kc(b,a){a?b.$$hashKey=a:delete b.$$hashKey}function E(b){for(var a=b.$$hashKey,c=1,d=arguments.length;c<d;c++){var e=arguments[c];if(e)for(var f=Object.keys(e),g=0,k=f.length;g<k;g++){var h=f[g];b[h]=e[h]}}kc(b,a);return b}function ba(b){return parseInt(b,10)}function lc(b,a){return E(new (E(function(){},{prototype:b})),
+a)}function A(){}function Ta(b){return b}function da(b){return function(){return b}}function w(b){return"undefined"===typeof b}function z(b){return"undefined"!==typeof b}function G(b){return null!==b&&"object"===typeof b}function I(b){return"string"===typeof b}function W(b){return"number"===typeof b}function ea(b){return"[object Date]"===Ia.call(b)}function F(b){return"function"===typeof b}function ib(b){return"[object RegExp]"===Ia.call(b)}function Sa(b){return b&&b.window===b}function Ua(b){return b&&
+b.$evalAsync&&b.$watch}function Va(b){return"boolean"===typeof b}function mc(b){return!(!b||!(b.nodeName||b.prop&&b.attr&&b.find))}function Bd(b){var a={};b=b.split(",");var c;for(c=0;c<b.length;c++)a[b[c]]=!0;return a}function pa(b){return N(b.nodeName||b[0].nodeName)}function Wa(b,a){var c=b.indexOf(a);0<=c&&b.splice(c,1);return a}function Ca(b,a,c,d){if(Sa(b)||Ua(b))throw Xa("cpws");if(a){if(b===a)throw Xa("cpi");c=c||[];d=d||[];if(G(b)){var e=c.indexOf(b);if(-1!==e)return d[e];c.push(b);d.push(a)}if(B(b))for(var f=
+a.length=0;f<b.length;f++)e=Ca(b[f],null,c,d),G(b[f])&&(c.push(b[f]),d.push(e)),a.push(e);else{var g=a.$$hashKey;B(a)?a.length=0:r(a,function(b,c){delete a[c]});for(f in b)b.hasOwnProperty(f)&&(e=Ca(b[f],null,c,d),G(b[f])&&(c.push(b[f]),d.push(e)),a[f]=e);kc(a,g)}}else if(a=b)B(b)?a=Ca(b,[],c,d):ea(b)?a=new Date(b.getTime()):ib(b)?(a=new RegExp(b.source,b.toString().match(/[^\/]*$/)[0]),a.lastIndex=b.lastIndex):G(b)&&(e=Object.create(Object.getPrototypeOf(b)),a=Ca(b,e,c,d));return a}function qa(b,
+a){if(B(b)){a=a||[];for(var c=0,d=b.length;c<d;c++)a[c]=b[c]}else if(G(b))for(c in a=a||{},b)if("$"!==c.charAt(0)||"$"!==c.charAt(1))a[c]=b[c];return a||b}function la(b,a){if(b===a)return!0;if(null===b||null===a)return!1;if(b!==b&&a!==a)return!0;var c=typeof b,d;if(c==typeof a&&"object"==c)if(B(b)){if(!B(a))return!1;if((c=b.length)==a.length){for(d=0;d<c;d++)if(!la(b[d],a[d]))return!1;return!0}}else{if(ea(b))return ea(a)?la(b.getTime(),a.getTime()):!1;if(ib(b)&&ib(a))return b.toString()==a.toString();
+if(Ua(b)||Ua(a)||Sa(b)||Sa(a)||B(a))return!1;c={};for(d in b)if("$"!==d.charAt(0)&&!F(b[d])){if(!la(b[d],a[d]))return!1;c[d]=!0}for(d in a)if(!c.hasOwnProperty(d)&&"$"!==d.charAt(0)&&a[d]!==u&&!F(a[d]))return!1;return!0}return!1}function jb(b,a,c){return b.concat(Ya.call(a,c))}function nc(b,a){var c=2<arguments.length?Ya.call(arguments,2):[];return!F(a)||a instanceof RegExp?a:c.length?function(){return arguments.length?a.apply(b,c.concat(Ya.call(arguments,0))):a.apply(b,c)}:function(){return arguments.length?
+a.apply(b,arguments):a.call(b)}}function Cd(b,a){var c=a;"string"===typeof b&&"$"===b.charAt(0)&&"$"===b.charAt(1)?c=u:Sa(a)?c="$WINDOW":a&&X===a?c="$DOCUMENT":Ua(a)&&(c="$SCOPE");return c}function ra(b,a){return"undefined"===typeof b?u:JSON.stringify(b,Cd,a?"  ":null)}function oc(b){return I(b)?JSON.parse(b):b}function sa(b){b=D(b).clone();try{b.empty()}catch(a){}var c=D("<div>").append(b).html();try{return b[0].nodeType===kb?N(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+
+N(b)})}catch(d){return N(c)}}function pc(b){try{return decodeURIComponent(b)}catch(a){}}function qc(b){var a={},c,d;r((b||"").split("&"),function(b){b&&(c=b.replace(/\+/g,"%20").split("="),d=pc(c[0]),z(d)&&(b=z(c[1])?pc(c[1]):!0,Hb.call(a,d)?B(a[d])?a[d].push(b):a[d]=[a[d],b]:a[d]=b))});return a}function Ib(b){var a=[];r(b,function(b,d){B(b)?r(b,function(b){a.push(Da(d,!0)+(!0===b?"":"="+Da(b,!0)))}):a.push(Da(d,!0)+(!0===b?"":"="+Da(b,!0)))});return a.length?a.join("&"):""}function lb(b){return Da(b,
+!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function Da(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,a?"%20":"+")}function Dd(b,a){var c,d,e=mb.length;b=D(b);for(d=0;d<e;++d)if(c=mb[d]+a,I(c=b.attr(c)))return c;return null}function Ed(b,a){var c,d,e={};r(mb,function(a){a+="app";!c&&b.hasAttribute&&b.hasAttribute(a)&&(c=b,d=b.getAttribute(a))});r(mb,function(a){a+="app";
+var e;!c&&(e=b.querySelector("["+a.replace(":","\\:")+"]"))&&(c=e,d=e.getAttribute(a))});c&&(e.strictDi=null!==Dd(c,"strict-di"),a(c,d?[d]:[],e))}function rc(b,a,c){G(c)||(c={});c=E({strictDi:!1},c);var d=function(){b=D(b);if(b.injector()){var d=b[0]===X?"document":sa(b);throw Xa("btstrpd",d.replace(/</,"&lt;").replace(/>/,"&gt;"));}a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);c.debugInfoEnabled&&a.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]);a.unshift("ng");
+d=Jb(a,c.strictDi);d.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return d},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;S&&e.test(S.name)&&(c.debugInfoEnabled=!0,S.name=S.name.replace(e,""));if(S&&!f.test(S.name))return d();S.name=S.name.replace(f,"");ta.resumeBootstrap=function(b){r(b,function(b){a.push(b)});d()}}function Fd(){S.name="NG_ENABLE_DEBUG_INFO!"+S.name;S.location.reload()}function Gd(b){return ta.element(b).injector().get("$$testability")}
+function Kb(b,a){a=a||"_";return b.replace(Hd,function(b,d){return(d?a:"")+b.toLowerCase()})}function Id(){var b;sc||((ma=S.jQuery)&&ma.fn.on?(D=ma,E(ma.fn,{scope:Ja.scope,isolateScope:Ja.isolateScope,controller:Ja.controller,injector:Ja.injector,inheritedData:Ja.inheritedData}),b=ma.cleanData,ma.cleanData=function(a){var c;if(Lb)Lb=!1;else for(var d=0,e;null!=(e=a[d]);d++)(c=ma._data(e,"events"))&&c.$destroy&&ma(e).triggerHandler("$destroy");b(a)}):D=R,ta.element=D,sc=!0)}function Mb(b,a,c){if(!b)throw Xa("areq",
+a||"?",c||"required");return b}function nb(b,a,c){c&&B(b)&&(b=b[b.length-1]);Mb(F(b),a,"not a function, got "+(b&&"object"===typeof b?b.constructor.name||"Object":typeof b));return b}function Ka(b,a){if("hasOwnProperty"===b)throw Xa("badname",a);}function tc(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,f=a.length,g=0;g<f;g++)d=a[g],b&&(b=(e=b)[d]);return!c&&F(b)?nc(e,b):b}function ob(b){var a=b[0];b=b[b.length-1];var c=[a];do{a=a.nextSibling;if(!a)break;c.push(a)}while(a!==b);return D(c)}function wa(){return Object.create(null)}
+function Jd(b){function a(a,b,c){return a[b]||(a[b]=c())}var c=y("$injector"),d=y("ng");b=a(b,"angular",Object);b.$$minErr=b.$$minErr||y;return a(b,"module",function(){var b={};return function(f,g,k){if("hasOwnProperty"===f)throw d("badname","module");g&&b.hasOwnProperty(f)&&(b[f]=null);return a(b,f,function(){function a(c,d,e,f){f||(f=b);return function(){f[e||"push"]([c,d,arguments]);return n}}if(!g)throw c("nomod",f);var b=[],d=[],e=[],p=a("$injector","invoke","push",d),n={_invokeQueue:b,_configBlocks:d,
+_runBlocks:e,requires:g,name:f,provider:a("$provide","provider"),factory:a("$provide","factory"),service:a("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),animation:a("$animateProvider","register"),filter:a("$filterProvider","register"),controller:a("$controllerProvider","register"),directive:a("$compileProvider","directive"),config:p,run:function(a){e.push(a);return this}};k&&p(k);return n})}})}function Kd(b){E(b,{bootstrap:rc,copy:Ca,extend:E,equals:la,
+element:D,forEach:r,injector:Jb,noop:A,bind:nc,toJson:ra,fromJson:oc,identity:Ta,isUndefined:w,isDefined:z,isString:I,isFunction:F,isObject:G,isNumber:W,isElement:mc,isArray:B,version:Ld,isDate:ea,lowercase:N,uppercase:pb,callbacks:{counter:0},getTestability:Gd,$$minErr:y,$$csp:Za,reloadWithDebugInfo:Fd});$a=Jd(S);try{$a("ngLocale")}catch(a){$a("ngLocale",[]).provider("$locale",Md)}$a("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:Nd});a.provider("$compile",uc).directive({a:Od,
+input:vc,textarea:vc,form:Pd,script:Qd,select:Rd,style:Sd,option:Td,ngBind:Ud,ngBindHtml:Vd,ngBindTemplate:Wd,ngClass:Xd,ngClassEven:Yd,ngClassOdd:Zd,ngCloak:$d,ngController:ae,ngForm:be,ngHide:ce,ngIf:de,ngInclude:ee,ngInit:fe,ngNonBindable:ge,ngPluralize:he,ngRepeat:ie,ngShow:je,ngStyle:ke,ngSwitch:le,ngSwitchWhen:me,ngSwitchDefault:ne,ngOptions:oe,ngTransclude:pe,ngModel:qe,ngList:re,ngChange:se,pattern:wc,ngPattern:wc,required:xc,ngRequired:xc,minlength:yc,ngMinlength:yc,maxlength:zc,ngMaxlength:zc,
+ngValue:te,ngModelOptions:ue}).directive({ngInclude:ve}).directive(qb).directive(Ac);a.provider({$anchorScroll:we,$animate:xe,$browser:ye,$cacheFactory:ze,$controller:Ae,$document:Be,$exceptionHandler:Ce,$filter:Bc,$interpolate:De,$interval:Ee,$http:Fe,$httpBackend:Ge,$location:He,$log:Ie,$parse:Je,$rootScope:Ke,$q:Le,$$q:Me,$sce:Ne,$sceDelegate:Oe,$sniffer:Pe,$templateCache:Qe,$templateRequest:Re,$$testability:Se,$timeout:Te,$window:Ue,$$rAF:Ve,$$asyncCallback:We})}])}function ab(b){return b.replace(Xe,
+function(a,b,d,e){return e?d.toUpperCase():d}).replace(Ye,"Moz$1")}function Cc(b){b=b.nodeType;return b===ka||!b||9===b}function Dc(b,a){var c,d,e=a.createDocumentFragment(),f=[];if(Nb.test(b)){c=c||e.appendChild(a.createElement("div"));d=(Ze.exec(b)||["",""])[1].toLowerCase();d=ha[d]||ha._default;c.innerHTML=d[1]+b.replace($e,"<$1></$2>")+d[2];for(d=d[0];d--;)c=c.lastChild;f=jb(f,c.childNodes);c=e.firstChild;c.textContent=""}else f.push(a.createTextNode(b));e.textContent="";e.innerHTML="";r(f,function(a){e.appendChild(a)});
+return e}function R(b){if(b instanceof R)return b;var a;I(b)&&(b=U(b),a=!0);if(!(this instanceof R)){if(a&&"<"!=b.charAt(0))throw Ob("nosel");return new R(b)}if(a){a=X;var c;b=(c=af.exec(b))?[a.createElement(c[1])]:(c=Dc(b,a))?c.childNodes:[]}Ec(this,b)}function Pb(b){return b.cloneNode(!0)}function rb(b,a){a||sb(b);if(b.querySelectorAll)for(var c=b.querySelectorAll("*"),d=0,e=c.length;d<e;d++)sb(c[d])}function Fc(b,a,c,d){if(z(d))throw Ob("offargs");var e=(d=tb(b))&&d.events,f=d&&d.handle;if(f)if(a)r(a.split(" "),
+function(a){if(z(c)){var d=e[a];Wa(d||[],c);if(d&&0<d.length)return}b.removeEventListener(a,f,!1);delete e[a]});else for(a in e)"$destroy"!==a&&b.removeEventListener(a,f,!1),delete e[a]}function sb(b,a){var c=b.ng339,d=c&&ub[c];d&&(a?delete d.data[a]:(d.handle&&(d.events.$destroy&&d.handle({},"$destroy"),Fc(b)),delete ub[c],b.ng339=u))}function tb(b,a){var c=b.ng339,c=c&&ub[c];a&&!c&&(b.ng339=c=++bf,c=ub[c]={events:{},data:{},handle:u});return c}function Qb(b,a,c){if(Cc(b)){var d=z(c),e=!d&&a&&!G(a),
+f=!a;b=(b=tb(b,!e))&&b.data;if(d)b[a]=c;else{if(f)return b;if(e)return b&&b[a];E(b,a)}}}function Rb(b,a){return b.getAttribute?-1<(" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+a+" "):!1}function Sb(b,a){a&&b.setAttribute&&r(a.split(" "),function(a){b.setAttribute("class",U((" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+U(a)+" "," ")))})}function Tb(b,a){if(a&&b.setAttribute){var c=(" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");
+r(a.split(" "),function(a){a=U(a);-1===c.indexOf(" "+a+" ")&&(c+=a+" ")});b.setAttribute("class",U(c))}}function Ec(b,a){if(a)if(a.nodeType)b[b.length++]=a;else{var c=a.length;if("number"===typeof c&&a.window!==a){if(c)for(var d=0;d<c;d++)b[b.length++]=a[d]}else b[b.length++]=a}}function Gc(b,a){return vb(b,"$"+(a||"ngController")+"Controller")}function vb(b,a,c){9==b.nodeType&&(b=b.documentElement);for(a=B(a)?a:[a];b;){for(var d=0,e=a.length;d<e;d++)if((c=D.data(b,a[d]))!==u)return c;b=b.parentNode||
+11===b.nodeType&&b.host}}function Hc(b){for(rb(b,!0);b.firstChild;)b.removeChild(b.firstChild)}function Ic(b,a){a||rb(b);var c=b.parentNode;c&&c.removeChild(b)}function cf(b,a){a=a||S;if("complete"===a.document.readyState)a.setTimeout(b);else D(a).on("load",b)}function Jc(b,a){var c=wb[a.toLowerCase()];return c&&Kc[pa(b)]&&c}function df(b,a){var c=b.nodeName;return("INPUT"===c||"TEXTAREA"===c)&&Lc[a]}function ef(b,a){var c=function(c,e){c.isDefaultPrevented=function(){return c.defaultPrevented};var f=
+a[e||c.type],g=f?f.length:0;if(g){if(w(c.immediatePropagationStopped)){var k=c.stopImmediatePropagation;c.stopImmediatePropagation=function(){c.immediatePropagationStopped=!0;c.stopPropagation&&c.stopPropagation();k&&k.call(c)}}c.isImmediatePropagationStopped=function(){return!0===c.immediatePropagationStopped};1<g&&(f=qa(f));for(var h=0;h<g;h++)c.isImmediatePropagationStopped()||f[h].call(b,c)}};c.elem=b;return c}function La(b,a){var c=b&&b.$$hashKey;if(c)return"function"===typeof c&&(c=b.$$hashKey()),
+c;c=typeof b;return c="function"==c||"object"==c&&null!==b?b.$$hashKey=c+":"+(a||Ad)():c+":"+b}function bb(b,a){if(a){var c=0;this.nextUid=function(){return++c}}r(b,this.put,this)}function ff(b){return(b=b.toString().replace(Mc,"").match(Nc))?"function("+(b[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function Ub(b,a,c){var d;if("function"===typeof b){if(!(d=b.$inject)){d=[];if(b.length){if(a)throw I(c)&&c||(c=b.name||ff(b)),Ea("strictdi",c);a=b.toString().replace(Mc,"");a=a.match(Nc);r(a[1].split(gf),
+function(a){a.replace(hf,function(a,b,c){d.push(c)})})}b.$inject=d}}else B(b)?(a=b.length-1,nb(b[a],"fn"),d=b.slice(0,a)):nb(b,"fn",!0);return d}function Jb(b,a){function c(a){return function(b,c){if(G(b))r(b,jc(a));else return a(b,c)}}function d(a,b){Ka(a,"service");if(F(b)||B(b))b=p.instantiate(b);if(!b.$get)throw Ea("pget",a);return q[a+"Provider"]=b}function e(a,b){return function(){var c=s.invoke(b,this,u,a);if(w(c))throw Ea("undef",a);return c}}function f(a,b,c){return d(a,{$get:!1!==c?e(a,
+b):b})}function g(a){var b=[],c;r(a,function(a){function d(a){var b,c;b=0;for(c=a.length;b<c;b++){var e=a[b],f=p.get(e[0]);f[e[1]].apply(f,e[2])}}if(!m.get(a)){m.put(a,!0);try{I(a)?(c=$a(a),b=b.concat(g(c.requires)).concat(c._runBlocks),d(c._invokeQueue),d(c._configBlocks)):F(a)?b.push(p.invoke(a)):B(a)?b.push(p.invoke(a)):nb(a,"module")}catch(e){throw B(a)&&(a=a[a.length-1]),e.message&&e.stack&&-1==e.stack.indexOf(e.message)&&(e=e.message+"\n"+e.stack),Ea("modulerr",a,e.stack||e.message||e);}}});
+return b}function k(b,c){function d(a){if(b.hasOwnProperty(a)){if(b[a]===h)throw Ea("cdep",a+" <- "+l.join(" <- "));return b[a]}try{return l.unshift(a),b[a]=h,b[a]=c(a)}catch(e){throw b[a]===h&&delete b[a],e;}finally{l.shift()}}function e(b,c,f,g){"string"===typeof f&&(g=f,f=null);var h=[];g=Ub(b,a,g);var k,l,n;l=0;for(k=g.length;l<k;l++){n=g[l];if("string"!==typeof n)throw Ea("itkn",n);h.push(f&&f.hasOwnProperty(n)?f[n]:d(n))}B(b)&&(b=b[k]);return b.apply(c,h)}return{invoke:e,instantiate:function(a,
+b,c){var d=function(){};d.prototype=(B(a)?a[a.length-1]:a).prototype;d=new d;a=e(a,d,b,c);return G(a)||F(a)?a:d},get:d,annotate:Ub,has:function(a){return q.hasOwnProperty(a+"Provider")||b.hasOwnProperty(a)}}}a=!0===a;var h={},l=[],m=new bb([],!0),q={$provide:{provider:c(d),factory:c(f),service:c(function(a,b){return f(a,["$injector",function(a){return a.instantiate(b)}])}),value:c(function(a,b){return f(a,da(b),!1)}),constant:c(function(a,b){Ka(a,"constant");q[a]=b;n[a]=b}),decorator:function(a,b){var c=
+p.get(a+"Provider"),d=c.$get;c.$get=function(){var a=s.invoke(d,c);return s.invoke(b,null,{$delegate:a})}}}},p=q.$injector=k(q,function(){throw Ea("unpr",l.join(" <- "));}),n={},s=n.$injector=k(n,function(a){var b=p.get(a+"Provider");return s.invoke(b.$get,b,u,a)});r(g(b),function(a){s.invoke(a||A)});return s}function we(){var b=!0;this.disableAutoScrolling=function(){b=!1};this.$get=["$window","$location","$rootScope",function(a,c,d){function e(a){var b=null;Array.prototype.some.call(a,function(a){if("a"===
+pa(a))return b=a,!0});return b}function f(b){if(b){b.scrollIntoView();var c;c=g.yOffset;F(c)?c=c():mc(c)?(c=c[0],c="fixed"!==a.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):W(c)||(c=0);c&&(b=b.getBoundingClientRect().top,a.scrollBy(0,b-c))}else a.scrollTo(0,0)}function g(){var a=c.hash(),b;a?(b=k.getElementById(a))?f(b):(b=e(k.getElementsByName(a)))?f(b):"top"===a&&f(null):f(null)}var k=a.document;b&&d.$watch(function(){return c.hash()},function(a,b){a===b&&""===a||cf(function(){d.$evalAsync(g)})});
+return g}]}function We(){this.$get=["$$rAF","$timeout",function(b,a){return b.supported?function(a){return b(a)}:function(b){return a(b,0,!1)}}]}function jf(b,a,c,d){function e(a){try{a.apply(null,Ya.call(arguments,1))}finally{if(x--,0===x)for(;t.length;)try{t.pop()()}catch(b){c.error(b)}}}function f(a,b){(function xa(){r(T,function(a){a()});C=b(xa,a)})()}function g(){k();h()}function k(){M=b.history.state;M=w(M)?null:M;la(M,V)&&(M=V);V=M}function h(){if(H!==m.url()||P!==M)H=m.url(),P=M,r(O,function(a){a(m.url(),
+M)})}function l(a){try{return decodeURIComponent(a)}catch(b){return a}}var m=this,q=a[0],p=b.location,n=b.history,s=b.setTimeout,J=b.clearTimeout,v={};m.isMock=!1;var x=0,t=[];m.$$completeOutstandingRequest=e;m.$$incOutstandingRequestCount=function(){x++};m.notifyWhenNoOutstandingRequests=function(a){r(T,function(a){a()});0===x?a():t.push(a)};var T=[],C;m.addPollFn=function(a){w(C)&&f(100,s);T.push(a);return a};var M,P,H=p.href,Q=a.find("base"),aa=null;k();P=M;m.url=function(a,c,e){w(e)&&(e=null);
+p!==b.location&&(p=b.location);n!==b.history&&(n=b.history);if(a){var f=P===e;if(H!==a||d.history&&!f){var g=H&&Fa(H)===Fa(a);H=a;P=e;!d.history||g&&f?(g||(aa=a),c?p.replace(a):p.href=a):(n[c?"replaceState":"pushState"](e,"",a),k(),P=M);return m}}else return aa||p.href.replace(/%27/g,"'")};m.state=function(){return M};var O=[],K=!1,V=null;m.onUrlChange=function(a){if(!K){if(d.history)D(b).on("popstate",g);D(b).on("hashchange",g);K=!0}O.push(a);return a};m.$$checkUrlChange=h;m.baseHref=function(){var a=
+Q.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""};var ca={},Ma="",fa=m.baseHref();m.cookies=function(a,b){var d,e,f,g;if(a)b===u?q.cookie=encodeURIComponent(a)+"=;path="+fa+";expires=Thu, 01 Jan 1970 00:00:00 GMT":I(b)&&(d=(q.cookie=encodeURIComponent(a)+"="+encodeURIComponent(b)+";path="+fa).length+1,4096<d&&c.warn("Cookie '"+a+"' possibly not set or overflowed because it was too large ("+d+" > 4096 bytes)!"));else{if(q.cookie!==Ma)for(Ma=q.cookie,d=Ma.split("; "),ca={},f=0;f<d.length;f++)e=
+d[f],g=e.indexOf("="),0<g&&(a=l(e.substring(0,g)),ca[a]===u&&(ca[a]=l(e.substring(g+1))));return ca}};m.defer=function(a,b){var c;x++;c=s(function(){delete v[c];e(a)},b||0);v[c]=!0;return c};m.defer.cancel=function(a){return v[a]?(delete v[a],J(a),e(A),!0):!1}}function ye(){this.$get=["$window","$log","$sniffer","$document",function(b,a,c,d){return new jf(b,d,a,c)}]}function ze(){this.$get=function(){function b(b,d){function e(a){a!=q&&(p?p==a&&(p=a.n):p=a,f(a.n,a.p),f(a,q),q=a,q.n=null)}function f(a,
+b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(b in a)throw y("$cacheFactory")("iid",b);var g=0,k=E({},d,{id:b}),h={},l=d&&d.capacity||Number.MAX_VALUE,m={},q=null,p=null;return a[b]={put:function(a,b){if(l<Number.MAX_VALUE){var c=m[a]||(m[a]={key:a});e(c)}if(!w(b))return a in h||g++,h[a]=b,g>l&&this.remove(p.key),b},get:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;e(b)}return h[a]},remove:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;b==q&&(q=b.p);b==p&&(p=b.n);f(b.n,b.p);delete m[a]}delete h[a];
+g--},removeAll:function(){h={};g=0;m={};q=p=null},destroy:function(){m=k=h=null;delete a[b]},info:function(){return E({},k,{size:g})}}}var a={};b.info=function(){var b={};r(a,function(a,e){b[e]=a.info()});return b};b.get=function(b){return a[b]};return b}}function Qe(){this.$get=["$cacheFactory",function(b){return b("templates")}]}function uc(b,a){function c(a,b){var c=/^\s*([@=&])(\??)\s*(\w*)\s*$/,d={};r(a,function(a,e){var f=a.match(c);if(!f)throw ia("iscp",b,e,a);d[e]={attrName:f[3]||e,mode:f[1],
+optional:"?"===f[2]}});return d}var d={},e=/^\s*directive\:\s*([\d\w_\-]+)\s+(.*)$/,f=/(([\d\w_\-]+)(?:\:([^;]+))?;?)/,g=Bd("ngSrc,ngSrcset,src,srcset"),k=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,h=/^(on[a-z]+|formaction)$/;this.directive=function q(a,e){Ka(a,"directive");I(a)?(Mb(e,"directiveFactory"),d.hasOwnProperty(a)||(d[a]=[],b.factory(a+"Directive",["$injector","$exceptionHandler",function(b,e){var f=[];r(d[a],function(d,g){try{var h=b.invoke(d);F(h)?h={compile:da(h)}:!h.compile&&h.link&&(h.compile=da(h.link));
+h.priority=h.priority||0;h.index=g;h.name=h.name||a;h.require=h.require||h.controller&&h.name;h.restrict=h.restrict||"EA";G(h.scope)&&(h.$$isolateBindings=c(h.scope,h.name));f.push(h)}catch(k){e(k)}});return f}])),d[a].push(e)):r(a,jc(q));return this};this.aHrefSanitizationWhitelist=function(b){return z(b)?(a.aHrefSanitizationWhitelist(b),this):a.aHrefSanitizationWhitelist()};this.imgSrcSanitizationWhitelist=function(b){return z(b)?(a.imgSrcSanitizationWhitelist(b),this):a.imgSrcSanitizationWhitelist()};
+var l=!0;this.debugInfoEnabled=function(a){return z(a)?(l=a,this):l};this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$document","$sce","$animate","$$sanitizeUri",function(a,b,c,s,J,v,x,t,T,C,M){function P(a,b){try{a.addClass(b)}catch(c){}}function H(a,b,c,d,e){a instanceof D||(a=D(a));r(a,function(b,c){b.nodeType==kb&&b.nodeValue.match(/\S+/)&&(a[c]=D(b).wrap("<span></span>").parent()[0])});var f=Q(a,b,a,c,d,e);H.$$addScopeClass(a);
+var g=null;return function(b,c,d,e,h){Mb(b,"scope");g||(g=(h=h&&h[0])?"foreignobject"!==pa(h)&&h.toString().match(/SVG/)?"svg":"html":"html");h="html"!==g?D(S(g,D("<div>").append(a).html())):c?Ja.clone.call(a):a;if(d)for(var k in d)h.data("$"+k+"Controller",d[k].instance);H.$$addScopeInfo(h,b);c&&c(h,b);f&&f(b,h,h,e);return h}}function Q(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,p,n,t,s;if(q)for(s=Array(c.length),p=0;p<h.length;p+=3)f=h[p],s[f]=c[f];else s=c;p=0;for(n=h.length;p<n;)k=s[h[p++]],c=
+h[p++],f=h[p++],c?(c.scope?(l=a.$new(),H.$$addScopeInfo(D(k),l)):l=a,t=c.transcludeOnThisElement?aa(a,c.transclude,e,c.elementTranscludeOnThisElement):!c.templateOnThisElement&&e?e:!e&&b?aa(a,b):null,c(f,l,k,d,t)):f&&f(a,k.childNodes,u,e)}for(var h=[],k,l,p,n,q,t=0;t<a.length;t++){k=new Xb;l=O(a[t],[],k,0===t?d:u,e);(f=l.length?ca(l,a[t],k,b,c,null,[],[],f):null)&&f.scope&&H.$$addScopeClass(k.$$element);k=f&&f.terminal||!(p=a[t].childNodes)||!p.length?null:Q(p,f?(f.transcludeOnThisElement||!f.templateOnThisElement)&&
+f.transclude:b);if(f||k)h.push(t,f,k),n=!0,q=q||f;f=null}return n?g:null}function aa(a,b,c,d){return function(d,e,f,g,h){d||(d=a.$new(!1,h),d.$$transcluded=!0);return b(d,e,f,c,g)}}function O(b,c,g,h,k){var l=g.$attr,p;switch(b.nodeType){case ka:fa(c,ua(pa(b)),"E",h,k);for(var n,t,s,v=b.attributes,J=0,T=v&&v.length;J<T;J++){var M=!1,C=!1;n=v[J];p=n.name;n=U(n.value);t=ua(p);if(s=ya.test(t))p=Kb(t.substr(6),"-");var H=t.replace(/(Start|End)$/,""),P;a:{var O=H;if(d.hasOwnProperty(O)){P=void 0;for(var O=
+a.get(O+"Directive"),r=0,aa=O.length;r<aa;r++)if(P=O[r],P.multiElement){P=!0;break a}}P=!1}P&&t===H+"Start"&&(M=p,C=p.substr(0,p.length-5)+"end",p=p.substr(0,p.length-6));t=ua(p.toLowerCase());l[t]=p;if(s||!g.hasOwnProperty(t))g[t]=n,Jc(b,t)&&(g[t]=!0);R(b,c,n,t,s);fa(c,t,"A",h,k,M,C)}b=b.className;if(I(b)&&""!==b)for(;p=f.exec(b);)t=ua(p[2]),fa(c,t,"C",h,k)&&(g[t]=U(p[3])),b=b.substr(p.index+p[0].length);break;case kb:Y(c,b.nodeValue);break;case 8:try{if(p=e.exec(b.nodeValue))t=ua(p[1]),fa(c,t,"M",
+h,k)&&(g[t]=U(p[2]))}catch(x){}}c.sort(y);return c}function K(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ia("uterdir",b,c);a.nodeType==ka&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--);d.push(a);a=a.nextSibling}while(0<e)}else d.push(a);return D(d)}function V(a,b,c){return function(d,e,f,g,h){e=K(e[0],b,c);return a(d,e,f,g,h)}}function ca(a,d,e,f,g,h,l,q,t){function s(a,b,c,d){if(a){c&&(a=V(a,c,d));a.require=L.require;a.directiveName=ga;if(Q===L||L.$$isolateScope)a=
+Z(a,{isolateScope:!0});l.push(a)}if(b){c&&(b=V(b,c,d));b.require=L.require;b.directiveName=ga;if(Q===L||L.$$isolateScope)b=Z(b,{isolateScope:!0});q.push(b)}}function T(a,b,c,d){var e,f="data",g=!1,h=c,l;if(I(b)){if(l=b.match(k),b=b.substring(l[0].length),l[3]&&(l[1]?l[3]=null:l[1]=l[3]),"^"===l[1]?f="inheritedData":"^^"===l[1]&&(f="inheritedData",h=c.parent()),"?"===l[2]&&(g=!0),e=null,d&&"data"===f&&(e=d[b])&&(e=e.instance),e=e||h[f]("$"+b+"Controller"),!e&&!g)throw ia("ctreq",b,a);}else B(b)&&(e=
+[],r(b,function(b){e.push(T(a,b,c,d))}));return e}function M(a,c,f,g,h){function k(a,b,c){var d;Ua(a)||(c=b,b=a,a=u);E&&(d=P);c||(c=E?O.parent():O);return h(a,b,d,c,Wb)}var n,t,s,C,P,xb,O,K;d===f?(K=e,O=e.$$element):(O=D(f),K=new Xb(O,e));Q&&(C=c.$new(!0));xb=h&&k;aa&&(x={},P={},r(aa,function(a){var b={$scope:a===Q||a.$$isolateScope?C:c,$element:O,$attrs:K,$transclude:xb};s=a.controller;"@"==s&&(s=K[a.name]);b=v(s,b,!0,a.controllerAs);P[a.name]=b;E||O.data("$"+a.name+"Controller",b.instance);x[a.name]=
+b}));if(Q){H.$$addScopeInfo(O,C,!0,!(ca&&(ca===Q||ca===Q.$$originalDirective)));H.$$addScopeClass(O,!0);g=x&&x[Q.name];var V=C;g&&g.identifier&&!0===Q.bindToController&&(V=g.instance);r(C.$$isolateBindings=Q.$$isolateBindings,function(a,d){var e=a.attrName,f=a.optional,g,h,k,l;switch(a.mode){case "@":K.$observe(e,function(a){V[d]=a});K.$$observers[e].$$scope=c;K[e]&&(V[d]=b(K[e])(c));break;case "=":if(f&&!K[e])break;h=J(K[e]);l=h.literal?la:function(a,b){return a===b||a!==a&&b!==b};k=h.assign||function(){g=
+V[d]=h(c);throw ia("nonassign",K[e],Q.name);};g=V[d]=h(c);f=function(a){l(a,V[d])||(l(a,g)?k(c,a=V[d]):V[d]=a);return g=a};f.$stateful=!0;f=c.$watch(J(K[e],f),null,h.literal);C.$on("$destroy",f);break;case "&":h=J(K[e]),V[d]=function(a){return h(c,a)}}})}x&&(r(x,function(a){a()}),x=null);g=0;for(n=l.length;g<n;g++)t=l[g],$(t,t.isolateScope?C:c,O,K,t.require&&T(t.directiveName,t.require,O,P),xb);var Wb=c;Q&&(Q.template||null===Q.templateUrl)&&(Wb=C);a&&a(Wb,f.childNodes,u,h);for(g=q.length-1;0<=g;g--)t=
+q[g],$(t,t.isolateScope?C:c,O,K,t.require&&T(t.directiveName,t.require,O,P),xb)}t=t||{};for(var C=-Number.MAX_VALUE,P,aa=t.controllerDirectives,x,Q=t.newIsolateScopeDirective,ca=t.templateDirective,fa=t.nonTlbTranscludeDirective,Na=!1,A=!1,E=t.hasElementTranscludeDirective,Y=e.$$element=D(d),L,ga,y,Ga=f,N,R=0,ya=a.length;R<ya;R++){L=a[R];var W=L.$$start,Vb=L.$$end;W&&(Y=K(d,W,Vb));y=u;if(C>L.priority)break;if(y=L.scope)L.templateUrl||(G(y)?(xa("new/isolated scope",Q||P,L,Y),Q=L):xa("new/isolated scope",
+Q,L,Y)),P=P||L;ga=L.name;!L.templateUrl&&L.controller&&(y=L.controller,aa=aa||{},xa("'"+ga+"' controller",aa[ga],L,Y),aa[ga]=L);if(y=L.transclude)Na=!0,L.$$tlb||(xa("transclusion",fa,L,Y),fa=L),"element"==y?(E=!0,C=L.priority,y=Y,Y=e.$$element=D(X.createComment(" "+ga+": "+e[ga]+" ")),d=Y[0],yb(g,Ya.call(y,0),d),Ga=H(y,f,C,h&&h.name,{nonTlbTranscludeDirective:fa})):(y=D(Pb(d)).contents(),Y.empty(),Ga=H(y,f));if(L.template)if(A=!0,xa("template",ca,L,Y),ca=L,y=F(L.template)?L.template(Y,e):L.template,
+y=Oc(y),L.replace){h=L;y=Nb.test(y)?Pc(S(L.templateNamespace,U(y))):[];d=y[0];if(1!=y.length||d.nodeType!==ka)throw ia("tplrt",ga,"");yb(g,Y,d);ya={$attr:{}};y=O(d,[],ya);var ba=a.splice(R+1,a.length-(R+1));Q&&Ma(y);a=a.concat(y).concat(ba);z(e,ya);ya=a.length}else Y.html(y);if(L.templateUrl)A=!0,xa("template",ca,L,Y),ca=L,L.replace&&(h=L),M=w(a.splice(R,a.length-R),Y,e,g,Na&&Ga,l,q,{controllerDirectives:aa,newIsolateScopeDirective:Q,templateDirective:ca,nonTlbTranscludeDirective:fa}),ya=a.length;
+else if(L.compile)try{N=L.compile(Y,e,Ga),F(N)?s(null,N,W,Vb):N&&s(N.pre,N.post,W,Vb)}catch(kf){c(kf,sa(Y))}L.terminal&&(M.terminal=!0,C=Math.max(C,L.priority))}M.scope=P&&!0===P.scope;M.transcludeOnThisElement=Na;M.elementTranscludeOnThisElement=E;M.templateOnThisElement=A;M.transclude=Ga;t.hasElementTranscludeDirective=E;return M}function Ma(a){for(var b=0,c=a.length;b<c;b++)a[b]=lc(a[b],{$$isolateScope:!0})}function fa(b,e,f,g,h,k,l){if(e===h)return null;h=null;if(d.hasOwnProperty(e)){var p;e=
+a.get(e+"Directive");for(var t=0,s=e.length;t<s;t++)try{p=e[t],(g===u||g>p.priority)&&-1!=p.restrict.indexOf(f)&&(k&&(p=lc(p,{$$start:k,$$end:l})),b.push(p),h=p)}catch(v){c(v)}}return h}function z(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;r(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});r(b,function(b,f){"class"==f?(P(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+
+";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function w(a,b,c,d,e,f,g,h){var k=[],l,p,n=b[0],t=a.shift(),q=E({},t,{templateUrl:null,transclude:null,replace:null,$$originalDirective:t}),v=F(t.templateUrl)?t.templateUrl(b,c):t.templateUrl,J=t.templateNamespace;b.empty();s(T.getTrustedResourceUrl(v)).then(function(s){var C,T;s=Oc(s);if(t.replace){s=Nb.test(s)?Pc(S(J,U(s))):[];C=s[0];if(1!=s.length||C.nodeType!==ka)throw ia("tplrt",t.name,v);s={$attr:{}};yb(d,b,C);var M=O(C,
+[],s);G(t.scope)&&Ma(M);a=M.concat(a);z(c,s)}else C=n,b.html(s);a.unshift(q);l=ca(a,C,c,e,b,t,f,g,h);r(d,function(a,c){a==C&&(d[c]=b[0])});for(p=Q(b[0].childNodes,e);k.length;){s=k.shift();T=k.shift();var H=k.shift(),K=k.shift(),M=b[0];if(!s.$$destroyed){if(T!==n){var x=T.className;h.hasElementTranscludeDirective&&t.replace||(M=Pb(C));yb(H,D(T),M);P(D(M),x)}T=l.transcludeOnThisElement?aa(s,l.transclude,K):K;l(p,s,M,d,T)}}k=null});return function(a,b,c,d,e){a=e;b.$$destroyed||(k?(k.push(b),k.push(c),
+k.push(d),k.push(a)):(l.transcludeOnThisElement&&(a=aa(b,l.transclude,e)),l(p,b,c,d,a)))}}function y(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.name<b.name?-1:1:a.index-b.index}function xa(a,b,c,d){if(b)throw ia("multidir",b.name,c.name,a,sa(d));}function Y(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:function(a){a=a.parent();var b=!!a.length;b&&H.$$addBindingClass(a);return function(a,c){var e=c.parent();b||H.$$addBindingClass(e);H.$$addBindingInfo(e,d.expressions);a.$watch(d,
+function(a){c[0].nodeValue=a})}}})}function S(a,b){a=N(a||"html");switch(a){case "svg":case "math":var c=X.createElement("div");c.innerHTML="<"+a+">"+b+"</"+a+">";return c.childNodes[0].childNodes;default:return b}}function Ga(a,b){if("srcdoc"==b)return T.HTML;var c=pa(a);if("xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b))return T.RESOURCE_URL}function R(a,c,d,e,f){var k=b(d,!0);if(k){if("multiple"===e&&"select"===pa(a))throw ia("selmulti",sa(a));c.push({priority:100,compile:function(){return{pre:function(c,
+d,l){d=l.$$observers||(l.$$observers={});if(h.test(e))throw ia("nodomevents");l[e]&&(k=b(l[e],!0,Ga(a,e),g[e]||f))&&(l[e]=k(c),(d[e]||(d[e]=[])).$$inter=!0,(l.$$observers&&l.$$observers[e].$$scope||c).$watch(k,function(a,b){"class"===e&&a!=b?l.$updateClass(a,b):l.$set(e,a)}))}}}})}}function yb(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g<h;g++)if(a[g]==d){a[g++]=c;h=g+e-1;for(var k=a.length;g<k;g++,h++)h<k?a[g]=a[h]:delete a[g];a.length-=e-1;a.context===d&&(a.context=
+c);break}f&&f.replaceChild(c,d);a=X.createDocumentFragment();a.appendChild(d);D(c).data(D(d).data());ma?(Lb=!0,ma.cleanData([d])):delete D.cache[d[D.expando]];d=1;for(e=b.length;d<e;d++)f=b[d],D(f).remove(),a.appendChild(f),delete b[d];b[0]=c;b.length=1}function Z(a,b){return E(function(){return a.apply(null,arguments)},a,b)}function $(a,b,d,e,f,g){try{a(b,d,e,f,g)}catch(h){c(h,sa(d))}}var Xb=function(a,b){if(b){var c=Object.keys(b),d,e,f;d=0;for(e=c.length;d<e;d++)f=c[d],this[f]=b[f]}else this.$attr=
+{};this.$$element=a};Xb.prototype={$normalize:ua,$addClass:function(a){a&&0<a.length&&C.addClass(this.$$element,a)},$removeClass:function(a){a&&0<a.length&&C.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=Qc(a,b);c&&c.length&&C.addClass(this.$$element,c);(c=Qc(b,a))&&c.length&&C.removeClass(this.$$element,c)},$set:function(a,b,d,e){var f=this.$$element[0],g=Jc(f,a),h=df(f,a),f=a;g?(this.$$element.prop(a,b),e=g):h&&(this[h]=b,f=h);this[a]=b;e?this.$attr[a]=e:(e=this.$attr[a])||(this.$attr[a]=
+e=Kb(a,"-"));g=pa(this.$$element);if("a"===g&&"href"===a||"img"===g&&"src"===a)this[a]=b=M(b,"src"===a);else if("img"===g&&"srcset"===a){for(var g="",h=U(b),k=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,k=/\s/.test(h)?k:/(,)/,h=h.split(k),k=Math.floor(h.length/2),l=0;l<k;l++)var p=2*l,g=g+M(U(h[p]),!0),g=g+(" "+U(h[p+1]));h=U(h[2*l]).split(/\s/);g+=M(U(h[0]),!0);2===h.length&&(g+=" "+U(h[1]));this[a]=b=g}!1!==d&&(null===b||b===u?this.$$element.removeAttr(e):this.$$element.attr(e,b));(a=this.$$observers)&&
+r(a[f],function(a){try{a(b)}catch(d){c(d)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers=wa()),e=d[a]||(d[a]=[]);e.push(b);x.$evalAsync(function(){e.$$inter||b(c[a])});return function(){Wa(e,b)}}};var ga=b.startSymbol(),Na=b.endSymbol(),Oc="{{"==ga||"}}"==Na?Ta:function(a){return a.replace(/\{\{/g,ga).replace(/}}/g,Na)},ya=/^ngAttr[A-Z]/;H.$$addBindingInfo=l?function(a,b){var c=a.data("$binding")||[];B(b)?c=c.concat(b):c.push(b);a.data("$binding",c)}:A;H.$$addBindingClass=l?
+function(a){P(a,"ng-binding")}:A;H.$$addScopeInfo=l?function(a,b,c,d){a.data(c?d?"$isolateScopeNoTemplate":"$isolateScope":"$scope",b)}:A;H.$$addScopeClass=l?function(a,b){P(a,b?"ng-isolate-scope":"ng-scope")}:A;return H}]}function ua(b){return ab(b.replace(lf,""))}function Qc(b,a){var c="",d=b.split(/\s+/),e=a.split(/\s+/),f=0;a:for(;f<d.length;f++){for(var g=d[f],k=0;k<e.length;k++)if(g==e[k])continue a;c+=(0<c.length?" ":"")+g}return c}function Pc(b){b=D(b);var a=b.length;if(1>=a)return b;for(;a--;)8===
+b[a].nodeType&&mf.call(b,a,1);return b}function Ae(){var b={},a=!1,c=/^(\S+)(\s+as\s+(\w+))?$/;this.register=function(a,c){Ka(a,"controller");G(a)?E(b,a):b[a]=c};this.allowGlobals=function(){a=!0};this.$get=["$injector","$window",function(d,e){function f(a,b,c,d){if(!a||!G(a.$scope))throw y("$controller")("noscp",d,b);a.$scope[b]=c}return function(g,k,h,l){var m,q,p;h=!0===h;l&&I(l)&&(p=l);I(g)&&(l=g.match(c),q=l[1],p=p||l[3],g=b.hasOwnProperty(q)?b[q]:tc(k.$scope,q,!0)||(a?tc(e,q,!0):u),nb(g,q,!0));
+if(h)return h=function(){},h.prototype=(B(g)?g[g.length-1]:g).prototype,m=new h,p&&f(k,p,m,q||g.name),E(function(){d.invoke(g,m,k,q);return m},{instance:m,identifier:p});m=d.instantiate(g,k,q);p&&f(k,p,m,q||g.name);return m}}]}function Be(){this.$get=["$window",function(b){return D(b.document)}]}function Ce(){this.$get=["$log",function(b){return function(a,c){b.error.apply(b,arguments)}}]}function Rc(b){var a={},c,d,e;if(!b)return a;r(b.split("\n"),function(b){e=b.indexOf(":");c=N(U(b.substr(0,e)));
+d=U(b.substr(e+1));c&&(a[c]=a[c]?a[c]+", "+d:d)});return a}function Sc(b){var a=G(b)?b:u;return function(c){a||(a=Rc(b));return c?a[N(c)]||null:a}}function Tc(b,a,c){if(F(c))return c(b,a);r(c,function(c){b=c(b,a)});return b}function Fe(){var b=/^\s*(\[|\{[^\{])/,a=/[\}\]]\s*$/,c=/^\)\]\}',?\n/,d={"Content-Type":"application/json;charset=utf-8"},e=this.defaults={transformResponse:[function(d,e){if(I(d)){d=d.replace(c,"");var f=e("Content-Type");if(f&&0===f.indexOf("application/json")||b.test(d)&&a.test(d))d=
+oc(d)}return d}],transformRequest:[function(a){return G(a)&&"[object File]"!==Ia.call(a)&&"[object Blob]"!==Ia.call(a)?ra(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:qa(d),put:qa(d),patch:qa(d)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN"},f=!1;this.useApplyAsync=function(a){return z(a)?(f=!!a,this):f};var g=this.interceptors=[];this.$get=["$httpBackend","$browser","$cacheFactory","$rootScope","$q","$injector",function(a,b,c,d,q,p){function n(a){function b(a){var d=
+E({},a);d.data=a.data?Tc(a.data,a.headers,c.transformResponse):a.data;a=a.status;return 200<=a&&300>a?d:q.reject(d)}var c={method:"get",transformRequest:e.transformRequest,transformResponse:e.transformResponse},d=function(a){var b=e.headers,c=E({},a.headers),d,f,b=E({},b.common,b[N(a.method)]);a:for(d in b){a=N(d);for(f in c)if(N(f)===a)continue a;c[d]=b[d]}(function(a){var b;r(a,function(c,d){F(c)&&(b=c(),null!=b?a[d]=b:delete a[d])})})(c);return c}(a);E(c,a);c.headers=d;c.method=pb(c.method);var f=
+[function(a){d=a.headers;var c=Tc(a.data,Sc(d),a.transformRequest);w(c)&&r(d,function(a,b){"content-type"===N(b)&&delete d[b]});w(a.withCredentials)&&!w(e.withCredentials)&&(a.withCredentials=e.withCredentials);return s(a,c,d).then(b,b)},u],g=q.when(c);for(r(x,function(a){(a.request||a.requestError)&&f.unshift(a.request,a.requestError);(a.response||a.responseError)&&f.push(a.response,a.responseError)});f.length;){a=f.shift();var h=f.shift(),g=g.then(a,h)}g.success=function(a){g.then(function(b){a(b.data,
+b.status,b.headers,c)});return g};g.error=function(a){g.then(null,function(b){a(b.data,b.status,b.headers,c)});return g};return g}function s(c,g,l){function p(a,b,c,e){function g(){s(b,a,c,e)}O&&(200<=a&&300>a?O.put(V,[a,b,Rc(c),e]):O.remove(V));f?d.$applyAsync(g):(g(),d.$$phase||d.$apply())}function s(a,b,d,e){b=Math.max(b,0);(200<=b&&300>b?x.resolve:x.reject)({data:a,status:b,headers:Sc(d),config:c,statusText:e})}function H(){var a=n.pendingRequests.indexOf(c);-1!==a&&n.pendingRequests.splice(a,
+1)}var x=q.defer(),r=x.promise,O,K,V=J(c.url,c.params);n.pendingRequests.push(c);r.then(H,H);!c.cache&&!e.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(O=G(c.cache)?c.cache:G(e.cache)?e.cache:v);if(O)if(K=O.get(V),z(K)){if(K&&F(K.then))return K.then(H,H),K;B(K)?s(K[1],K[0],qa(K[2]),K[3]):s(K,200,{},"OK")}else O.put(V,r);w(K)&&((K=Uc(c.url)?b.cookies()[c.xsrfCookieName||e.xsrfCookieName]:u)&&(l[c.xsrfHeaderName||e.xsrfHeaderName]=K),a(c.method,V,g,p,l,c.timeout,c.withCredentials,c.responseType));
+return r}function J(a,b){if(!b)return a;var c=[];zd(b,function(a,b){null===a||w(a)||(B(a)||(a=[a]),r(a,function(a){G(a)&&(a=ea(a)?a.toISOString():ra(a));c.push(Da(b)+"="+Da(a))}))});0<c.length&&(a+=(-1==a.indexOf("?")?"?":"&")+c.join("&"));return a}var v=c("$http"),x=[];r(g,function(a){x.unshift(I(a)?p.get(a):p.invoke(a))});n.pendingRequests=[];(function(a){r(arguments,function(a){n[a]=function(b,c){return n(E(c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){r(arguments,function(a){n[a]=
+function(b,c,d){return n(E(d||{},{method:a,url:b,data:c}))}})})("post","put","patch");n.defaults=e;return n}]}function nf(){return new S.XMLHttpRequest}function Ge(){this.$get=["$browser","$window","$document",function(b,a,c){return of(b,nf,b.defer,a.angular.callbacks,c[0])}]}function of(b,a,c,d,e){function f(a,b,c){var f=e.createElement("script"),m=null;f.type="text/javascript";f.src=a;f.async=!0;m=function(a){f.removeEventListener("load",m,!1);f.removeEventListener("error",m,!1);e.body.removeChild(f);
+f=null;var g=-1,n="unknown";a&&("load"!==a.type||d[b].called||(a={type:"error"}),n=a.type,g="error"===a.type?404:200);c&&c(g,n)};f.addEventListener("load",m,!1);f.addEventListener("error",m,!1);e.body.appendChild(f);return m}return function(e,k,h,l,m,q,p,n){function s(){x&&x();t&&t.abort()}function J(a,d,e,f,g){C&&c.cancel(C);x=t=null;a(d,e,f,g);b.$$completeOutstandingRequest(A)}b.$$incOutstandingRequestCount();k=k||b.url();if("jsonp"==N(e)){var v="_"+(d.counter++).toString(36);d[v]=function(a){d[v].data=
+a;d[v].called=!0};var x=f(k.replace("JSON_CALLBACK","angular.callbacks."+v),v,function(a,b){J(l,a,d[v].data,"",b);d[v]=A})}else{var t=a();t.open(e,k,!0);r(m,function(a,b){z(a)&&t.setRequestHeader(b,a)});t.onload=function(){var a=t.statusText||"",b="response"in t?t.response:t.responseText,c=1223===t.status?204:t.status;0===c&&(c=b?200:"file"==za(k).protocol?404:0);J(l,c,b,t.getAllResponseHeaders(),a)};e=function(){J(l,-1,null,null,"")};t.onerror=e;t.onabort=e;p&&(t.withCredentials=!0);if(n)try{t.responseType=
+n}catch(T){if("json"!==n)throw T;}t.send(h||null)}if(0<q)var C=c(s,q);else q&&F(q.then)&&q.then(s)}}function De(){var b="{{",a="}}";this.startSymbol=function(a){return a?(b=a,this):b};this.endSymbol=function(b){return b?(a=b,this):a};this.$get=["$parse","$exceptionHandler","$sce",function(c,d,e){function f(a){return"\\\\\\"+a}function g(f,g,n,s){function J(c){return c.replace(l,b).replace(m,a)}function v(a){try{var b;var c=n?e.getTrusted(n,a):e.valueOf(a);if(null==c)b="";else{switch(typeof c){case "string":break;
+case "number":c=""+c;break;default:c=ra(c)}b=c}return b}catch(g){a=Yb("interr",f,g.toString()),d(a)}}s=!!s;for(var x,t,T=0,C=[],M=[],P=f.length,H=[],r=[];T<P;)if(-1!=(x=f.indexOf(b,T))&&-1!=(t=f.indexOf(a,x+k)))T!==x&&H.push(J(f.substring(T,x))),T=f.substring(x+k,t),C.push(T),M.push(c(T,v)),T=t+h,r.push(H.length),H.push("");else{T!==P&&H.push(J(f.substring(T)));break}if(n&&1<H.length)throw Yb("noconcat",f);if(!g||C.length){var u=function(a){for(var b=0,c=C.length;b<c;b++){if(s&&w(a[b]))return;H[r[b]]=
+a[b]}return H.join("")};return E(function(a){var b=0,c=C.length,e=Array(c);try{for(;b<c;b++)e[b]=M[b](a);return u(e)}catch(g){a=Yb("interr",f,g.toString()),d(a)}},{exp:f,expressions:C,$$watchDelegate:function(a,b,c){var d;return a.$watchGroup(M,function(c,e){var f=u(c);F(b)&&b.call(this,f,c!==e?d:f,a);d=f},c)}})}}var k=b.length,h=a.length,l=new RegExp(b.replace(/./g,f),"g"),m=new RegExp(a.replace(/./g,f),"g");g.startSymbol=function(){return b};g.endSymbol=function(){return a};return g}]}function Ee(){this.$get=
+["$rootScope","$window","$q","$$q",function(b,a,c,d){function e(e,k,h,l){var m=a.setInterval,q=a.clearInterval,p=0,n=z(l)&&!l,s=(n?d:c).defer(),J=s.promise;h=z(h)?h:0;J.then(null,null,e);J.$$intervalId=m(function(){s.notify(p++);0<h&&p>=h&&(s.resolve(p),q(J.$$intervalId),delete f[J.$$intervalId]);n||b.$apply()},k);f[J.$$intervalId]=s;return J}var f={};e.cancel=function(b){return b&&b.$$intervalId in f?(f[b.$$intervalId].reject("canceled"),a.clearInterval(b.$$intervalId),delete f[b.$$intervalId],!0):
+!1};return e}]}function Md(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"\u00a4",posSuf:"",negPre:"(\u00a4",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January February March April May June July August September October November December".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),
+DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a",short:"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return 1===b?"one":"other"}}}}function Zb(b){b=b.split("/");for(var a=b.length;a--;)b[a]=lb(b[a]);return b.join("/")}function Vc(b,a,c){b=za(b,c);a.$$protocol=
+b.protocol;a.$$host=b.hostname;a.$$port=ba(b.port)||pf[b.protocol]||null}function Wc(b,a,c){var d="/"!==b.charAt(0);d&&(b="/"+b);b=za(b,c);a.$$path=decodeURIComponent(d&&"/"===b.pathname.charAt(0)?b.pathname.substring(1):b.pathname);a.$$search=qc(b.search);a.$$hash=decodeURIComponent(b.hash);a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function va(b,a){if(0===a.indexOf(b))return a.substr(b.length)}function Fa(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function $b(b){return b.substr(0,
+Fa(b).lastIndexOf("/")+1)}function ac(b,a){this.$$html5=!0;a=a||"";var c=$b(b);Vc(b,this,b);this.$$parse=function(a){var e=va(c,a);if(!I(e))throw cb("ipthprfx",a,c);Wc(e,this,b);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Ib(this.$$search),b=this.$$hash?"#"+lb(this.$$hash):"";this.$$url=Zb(this.$$path)+(a?"?"+a:"")+b;this.$$absUrl=c+this.$$url.substr(1)};this.$$parseLinkUrl=function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;(f=va(b,d))!==u?
+(g=f,g=(f=va(a,f))!==u?c+(va("/",f)||f):b+g):(f=va(c,d))!==u?g=c+f:c==d+"/"&&(g=c);g&&this.$$parse(g);return!!g}}function bc(b,a){var c=$b(b);Vc(b,this,b);this.$$parse=function(d){var e=va(b,d)||va(c,d),e="#"==e.charAt(0)?va(a,e):this.$$html5?e:"";if(!I(e))throw cb("ihshprfx",d,a);Wc(e,this,b);d=this.$$path;var f=/^\/[A-Z]:(\/.*)/;0===e.indexOf(b)&&(e=e.replace(b,""));f.exec(e)||(d=(e=f.exec(d))?e[1]:d);this.$$path=d;this.$$compose()};this.$$compose=function(){var c=Ib(this.$$search),e=this.$$hash?
+"#"+lb(this.$$hash):"";this.$$url=Zb(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+(this.$$url?a+this.$$url:"")};this.$$parseLinkUrl=function(a,c){return Fa(b)==Fa(a)?(this.$$parse(a),!0):!1}}function Xc(b,a){this.$$html5=!0;bc.apply(this,arguments);var c=$b(b);this.$$parseLinkUrl=function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;b==Fa(d)?f=d:(g=va(c,d))?f=b+a+g:c===d+"/"&&(f=c);f&&this.$$parse(f);return!!f};this.$$compose=function(){var c=Ib(this.$$search),e=this.$$hash?"#"+lb(this.$$hash):
+"";this.$$url=Zb(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+a+this.$$url}}function zb(b){return function(){return this[b]}}function Yc(b,a){return function(c){if(w(c))return this[b];this[b]=a(c);this.$$compose();return this}}function He(){var b="",a={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(a){return z(a)?(b=a,this):b};this.html5Mode=function(b){return Va(b)?(a.enabled=b,this):G(b)?(Va(b.enabled)&&(a.enabled=b.enabled),Va(b.requireBase)&&(a.requireBase=b.requireBase),Va(b.rewriteLinks)&&
+(a.rewriteLinks=b.rewriteLinks),this):a};this.$get=["$rootScope","$browser","$sniffer","$rootElement",function(c,d,e,f){function g(a,b,c){var e=h.url(),f=h.$$state;try{d.url(a,b,c),h.$$state=d.state()}catch(g){throw h.url(e),h.$$state=f,g;}}function k(a,b){c.$broadcast("$locationChangeSuccess",h.absUrl(),a,h.$$state,b)}var h,l;l=d.baseHref();var m=d.url(),q;if(a.enabled){if(!l&&a.requireBase)throw cb("nobase");q=m.substring(0,m.indexOf("/",m.indexOf("//")+2))+(l||"/");l=e.history?ac:Xc}else q=Fa(m),
+l=bc;h=new l(q,"#"+b);h.$$parseLinkUrl(m,m);h.$$state=d.state();var p=/^\s*(javascript|mailto):/i;f.on("click",function(b){if(a.rewriteLinks&&!b.ctrlKey&&!b.metaKey&&2!=b.which){for(var e=D(b.target);"a"!==pa(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var g=e.prop("href"),k=e.attr("href")||e.attr("xlink:href");G(g)&&"[object SVGAnimatedString]"===g.toString()&&(g=za(g.animVal).href);p.test(g)||!g||e.attr("target")||b.isDefaultPrevented()||!h.$$parseLinkUrl(g,k)||(b.preventDefault(),h.absUrl()!=
+d.url()&&(c.$apply(),S.angular["ff-684208-preventDefault"]=!0))}});h.absUrl()!=m&&d.url(h.absUrl(),!0);var n=!0;d.onUrlChange(function(a,b){c.$evalAsync(function(){var d=h.absUrl(),e=h.$$state;h.$$parse(a);h.$$state=b;c.$broadcast("$locationChangeStart",a,d,b,e).defaultPrevented?(h.$$parse(d),h.$$state=e,g(d,!1,e)):(n=!1,k(d,e))});c.$$phase||c.$digest()});c.$watch(function(){var a=d.url(),b=d.state(),f=h.$$replace,l=a!==h.absUrl()||h.$$html5&&e.history&&b!==h.$$state;if(n||l)n=!1,c.$evalAsync(function(){c.$broadcast("$locationChangeStart",
+h.absUrl(),a,h.$$state,b).defaultPrevented?(h.$$parse(a),h.$$state=b):(l&&g(h.absUrl(),f,b===h.$$state?null:h.$$state),k(a,b))});h.$$replace=!1});return h}]}function Ie(){var b=!0,a=this;this.debugEnabled=function(a){return z(a)?(b=a,this):b};this.$get=["$window",function(c){function d(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=c.console||
+{},e=b[a]||b.log||A;a=!1;try{a=!!e.apply}catch(h){}return a?function(){var a=[];r(arguments,function(b){a.push(d(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function na(b,a){if("__defineGetter__"===b||"__defineSetter__"===b||"__lookupGetter__"===b||"__lookupSetter__"===b||"__proto__"===b)throw oa("isecfld",a);return b}function Aa(b,a){if(b){if(b.constructor===
+b)throw oa("isecfn",a);if(b.window===b)throw oa("isecwindow",a);if(b.children&&(b.nodeName||b.prop&&b.attr&&b.find))throw oa("isecdom",a);if(b===Object)throw oa("isecobj",a);}return b}function cc(b){return b.constant}function Oa(b,a,c,d){Aa(b,d);a=a.split(".");for(var e,f=0;1<a.length;f++){e=na(a.shift(),d);var g=Aa(b[e],d);g||(g={},b[e]=g);b=g}e=na(a.shift(),d);Aa(b[e],d);return b[e]=c}function Zc(b,a,c,d,e,f){na(b,f);na(a,f);na(c,f);na(d,f);na(e,f);return function(f,k){var h=k&&k.hasOwnProperty(b)?
+k:f;if(null==h)return h;h=h[b];if(!a)return h;if(null==h)return u;h=h[a];if(!c)return h;if(null==h)return u;h=h[c];if(!d)return h;if(null==h)return u;h=h[d];return e?null==h?u:h=h[e]:h}}function $c(b,a,c){var d=ad[b];if(d)return d;var e=b.split("."),f=e.length;if(a.csp)d=6>f?Zc(e[0],e[1],e[2],e[3],e[4],c):function(a,b){var d=0,g;do g=Zc(e[d++],e[d++],e[d++],e[d++],e[d++],c)(a,b),b=u,a=g;while(d<f);return g};else{var g="";r(e,function(a,b){na(a,c);g+="if(s == null) return undefined;\ns="+(b?"s":'((l&&l.hasOwnProperty("'+
+a+'"))?l:s)')+"."+a+";\n"});g+="return s;";a=new Function("s","l",g);a.toString=da(g);d=a}d.sharedGetter=!0;d.assign=function(a,c){return Oa(a,b,c,b)};return ad[b]=d}function Je(){var b=wa(),a={csp:!1};this.$get=["$filter","$sniffer",function(c,d){function e(a){var b=a;a.sharedGetter&&(b=function(b,c){return a(b,c)},b.literal=a.literal,b.constant=a.constant,b.assign=a.assign);return b}function f(a,b){for(var c=0,d=a.length;c<d;c++){var e=a[c];e.constant||(e.inputs?f(e.inputs,b):-1===b.indexOf(e)&&
+b.push(e))}return b}function g(a,b){return null==a||null==b?a===b:"object"===typeof a&&(a=a.valueOf(),"object"===typeof a)?!1:a===b||a!==a&&b!==b}function k(a,b,c,d){var e=d.$$inputs||(d.$$inputs=f(d.inputs,[])),h;if(1===e.length){var k=g,e=e[0];return a.$watch(function(a){var b=e(a);g(b,k)||(h=d(a),k=b&&b.valueOf());return h},b,c)}for(var l=[],m=0,q=e.length;m<q;m++)l[m]=g;return a.$watch(function(a){for(var b=!1,c=0,f=e.length;c<f;c++){var k=e[c](a);if(b||(b=!g(k,l[c])))l[c]=k&&k.valueOf()}b&&(h=
+d(a));return h},b,c)}function h(a,b,c,d){var e,f;return e=a.$watch(function(a){return d(a)},function(a,c,d){f=a;F(b)&&b.apply(this,arguments);z(a)&&d.$$postDigest(function(){z(f)&&e()})},c)}function l(a,b,c,d){function e(a){var b=!0;r(a,function(a){z(a)||(b=!1)});return b}var f,g;return f=a.$watch(function(a){return d(a)},function(a,c,d){g=a;F(b)&&b.call(this,a,c,d);e(a)&&d.$$postDigest(function(){e(g)&&f()})},c)}function m(a,b,c,d){var e;return e=a.$watch(function(a){return d(a)},function(a,c,d){F(b)&&
+b.apply(this,arguments);e()},c)}function q(a,b){if(!b)return a;var c=function(c,d){var e=a(c,d),f=b(e,c,d);return z(e)?f:e};a.$$watchDelegate&&a.$$watchDelegate!==k?c.$$watchDelegate=a.$$watchDelegate:b.$stateful||(c.$$watchDelegate=k,c.inputs=[a]);return c}a.csp=d.csp;return function(d,f){var g,J,v;switch(typeof d){case "string":return v=d=d.trim(),g=b[v],g||(":"===d.charAt(0)&&":"===d.charAt(1)&&(J=!0,d=d.substring(2)),g=new dc(a),g=(new db(g,c,a)).parse(d),g.constant?g.$$watchDelegate=m:J?(g=e(g),
+g.$$watchDelegate=g.literal?l:h):g.inputs&&(g.$$watchDelegate=k),b[v]=g),q(g,f);case "function":return q(d,f);default:return q(A,f)}}}]}function Le(){this.$get=["$rootScope","$exceptionHandler",function(b,a){return bd(function(a){b.$evalAsync(a)},a)}]}function Me(){this.$get=["$browser","$exceptionHandler",function(b,a){return bd(function(a){b.defer(a)},a)}]}function bd(b,a){function c(a,b,c){function d(b){return function(c){e||(e=!0,b.call(a,c))}}var e=!1;return[d(b),d(c)]}function d(){this.$$state=
+{status:0}}function e(a,b){return function(c){b.call(a,c)}}function f(c){!c.processScheduled&&c.pending&&(c.processScheduled=!0,b(function(){var b,d,e;e=c.pending;c.processScheduled=!1;c.pending=u;for(var f=0,g=e.length;f<g;++f){d=e[f][0];b=e[f][c.status];try{F(b)?d.resolve(b(c.value)):1===c.status?d.resolve(c.value):d.reject(c.value)}catch(h){d.reject(h),a(h)}}}))}function g(){this.promise=new d;this.resolve=e(this,this.resolve);this.reject=e(this,this.reject);this.notify=e(this,this.notify)}var k=
+y("$q",TypeError);d.prototype={then:function(a,b,c){var d=new g;this.$$state.pending=this.$$state.pending||[];this.$$state.pending.push([d,a,b,c]);0<this.$$state.status&&f(this.$$state);return d.promise},"catch":function(a){return this.then(null,a)},"finally":function(a,b){return this.then(function(b){return l(b,!0,a)},function(b){return l(b,!1,a)},b)}};g.prototype={resolve:function(a){this.promise.$$state.status||(a===this.promise?this.$$reject(k("qcycle",a)):this.$$resolve(a))},$$resolve:function(b){var d,
+e;e=c(this,this.$$resolve,this.$$reject);try{if(G(b)||F(b))d=b&&b.then;F(d)?(this.promise.$$state.status=-1,d.call(b,e[0],e[1],this.notify)):(this.promise.$$state.value=b,this.promise.$$state.status=1,f(this.promise.$$state))}catch(g){e[1](g),a(g)}},reject:function(a){this.promise.$$state.status||this.$$reject(a)},$$reject:function(a){this.promise.$$state.value=a;this.promise.$$state.status=2;f(this.promise.$$state)},notify:function(c){var d=this.promise.$$state.pending;0>=this.promise.$$state.status&&
+d&&d.length&&b(function(){for(var b,e,f=0,g=d.length;f<g;f++){e=d[f][0];b=d[f][3];try{e.notify(F(b)?b(c):c)}catch(h){a(h)}}})}};var h=function(a,b){var c=new g;b?c.resolve(a):c.reject(a);return c.promise},l=function(a,b,c){var d=null;try{F(c)&&(d=c())}catch(e){return h(e,!1)}return d&&F(d.then)?d.then(function(){return h(a,b)},function(a){return h(a,!1)}):h(a,b)},m=function(a,b,c,d){var e=new g;e.resolve(a);return e.promise.then(b,c,d)},q=function n(a){if(!F(a))throw k("norslvr",a);if(!(this instanceof
+n))return new n(a);var b=new g;a(function(a){b.resolve(a)},function(a){b.reject(a)});return b.promise};q.defer=function(){return new g};q.reject=function(a){var b=new g;b.reject(a);return b.promise};q.when=m;q.all=function(a){var b=new g,c=0,d=B(a)?[]:{};r(a,function(a,e){c++;m(a).then(function(a){d.hasOwnProperty(e)||(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||b.reject(a)})});0===c&&b.resolve(d);return b.promise};return q}function Ve(){this.$get=["$window","$timeout",function(b,
+a){var c=b.requestAnimationFrame||b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame,d=b.cancelAnimationFrame||b.webkitCancelAnimationFrame||b.mozCancelAnimationFrame||b.webkitCancelRequestAnimationFrame,e=!!c,f=e?function(a){var b=c(a);return function(){d(b)}}:function(b){var c=a(b,16.66,!1);return function(){a.cancel(c)}};f.supported=e;return f}]}function Ke(){var b=10,a=y("$rootScope"),c=null,d=null;this.digestTtl=function(a){arguments.length&&(b=a);return b};this.$get=["$injector","$exceptionHandler",
+"$parse","$browser",function(e,f,g,k){function h(){this.$id=++hb;this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null;this.$root=this;this.$$destroyed=!1;this.$$listeners={};this.$$listenerCount={};this.$$isolateBindings=null}function l(b){if(s.$$phase)throw a("inprog",s.$$phase);s.$$phase=b}function m(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function q(){}function p(){for(;x.length;)try{x.shift()()}catch(a){f(a)}d=
+null}function n(){null===d&&(d=k.defer(function(){s.$apply(p)}))}h.prototype={constructor:h,$new:function(a,b){function c(){d.$$destroyed=!0}var d;b=b||this;a?(d=new h,d.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=function(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null;this.$$listeners={};this.$$listenerCount={};this.$id=++hb;this.$$ChildScope=null},this.$$ChildScope.prototype=this),d=new this.$$ChildScope);d.$parent=b;d.$$prevSibling=b.$$childTail;b.$$childHead?
+(b.$$childTail.$$nextSibling=d,b.$$childTail=d):b.$$childHead=b.$$childTail=d;(a||b!=this)&&d.$on("$destroy",c);return d},$watch:function(a,b,d){var e=g(a);if(e.$$watchDelegate)return e.$$watchDelegate(this,b,d,e);var f=this.$$watchers,h={fn:b,last:q,get:e,exp:a,eq:!!d};c=null;F(b)||(h.fn=A);f||(f=this.$$watchers=[]);f.unshift(h);return function(){Wa(f,h);c=null}},$watchGroup:function(a,b){function c(){h=!1;k?(k=!1,b(e,e,g)):b(e,d,g)}var d=Array(a.length),e=Array(a.length),f=[],g=this,h=!1,k=!0;if(!a.length){var l=
+!0;g.$evalAsync(function(){l&&b(e,e,g)});return function(){l=!1}}if(1===a.length)return this.$watch(a[0],function(a,c,f){e[0]=a;d[0]=c;b(e,a===c?e:d,f)});r(a,function(a,b){var k=g.$watch(a,function(a,f){e[b]=a;d[b]=f;h||(h=!0,g.$evalAsync(c))});f.push(k)});return function(){for(;f.length;)f.shift()()}},$watchCollection:function(a,b){function c(a){e=a;var b,d,g,h;if(G(e))if(Ra(e))for(f!==p&&(f=p,s=f.length=0,l++),a=e.length,s!==a&&(l++,f.length=s=a),b=0;b<a;b++)h=f[b],g=e[b],d=h!==h&&g!==g,d||h===
+g||(l++,f[b]=g);else{f!==n&&(f=n={},s=0,l++);a=0;for(b in e)e.hasOwnProperty(b)&&(a++,g=e[b],h=f[b],b in f?(d=h!==h&&g!==g,d||h===g||(l++,f[b]=g)):(s++,f[b]=g,l++));if(s>a)for(b in l++,f)e.hasOwnProperty(b)||(s--,delete f[b])}else f!==e&&(f=e,l++);return l}c.$stateful=!0;var d=this,e,f,h,k=1<b.length,l=0,m=g(a,c),p=[],n={},q=!0,s=0;return this.$watch(m,function(){q?(q=!1,b(e,e,d)):b(e,h,d);if(k)if(G(e))if(Ra(e)){h=Array(e.length);for(var a=0;a<e.length;a++)h[a]=e[a]}else for(a in h={},e)Hb.call(e,
+a)&&(h[a]=e[a]);else h=e})},$digest:function(){var e,g,h,m,n,r,Q=b,x,O=[],K,u,z;l("$digest");k.$$checkUrlChange();this===s&&null!==d&&(k.defer.cancel(d),p());c=null;do{r=!1;for(x=this;J.length;){try{z=J.shift(),z.scope.$eval(z.expression)}catch(y){f(y)}c=null}a:do{if(m=x.$$watchers)for(n=m.length;n--;)try{if(e=m[n])if((g=e.get(x))!==(h=e.last)&&!(e.eq?la(g,h):"number"===typeof g&&"number"===typeof h&&isNaN(g)&&isNaN(h)))r=!0,c=e,e.last=e.eq?Ca(g,null):g,e.fn(g,h===q?g:h,x),5>Q&&(K=4-Q,O[K]||(O[K]=
+[]),u=F(e.exp)?"fn: "+(e.exp.name||e.exp.toString()):e.exp,u+="; newVal: "+ra(g)+"; oldVal: "+ra(h),O[K].push(u));else if(e===c){r=!1;break a}}catch(D){f(D)}if(!(m=x.$$childHead||x!==this&&x.$$nextSibling))for(;x!==this&&!(m=x.$$nextSibling);)x=x.$parent}while(x=m);if((r||J.length)&&!Q--)throw s.$$phase=null,a("infdig",b,ra(O));}while(r||J.length);for(s.$$phase=null;v.length;)try{v.shift()()}catch(A){f(A)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=
+!0;if(this!==s){for(var b in this.$$listenerCount)m(this,this.$$listenerCount[b],b);a.$$childHead==this&&(a.$$childHead=this.$$nextSibling);a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=A;this.$on=this.$watch=this.$watchGroup=function(){return A};this.$$listeners={};this.$parent=
+this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=this.$$watchers=null}}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a){s.$$phase||J.length||k.defer(function(){J.length&&s.$digest()});J.push({scope:this,expression:a})},$$postDigest:function(a){v.push(a)},$apply:function(a){try{return l("$apply"),this.$eval(a)}catch(b){f(b)}finally{s.$$phase=null;try{s.$digest()}catch(c){throw f(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&
+x.push(b);n()},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){c[c.indexOf(b)]=null;m(e,1,a)}},$emit:function(a,b){var c=[],d,e=this,g=!1,h={name:a,targetScope:e,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=jb([h],arguments,1),l,m;do{d=e.$$listeners[a]||c;h.currentScope=e;
+l=0;for(m=d.length;l<m;l++)if(d[l])try{d[l].apply(null,k)}catch(p){f(p)}else d.splice(l,1),l--,m--;if(g)return h.currentScope=null,h;e=e.$parent}while(e);h.currentScope=null;return h},$broadcast:function(a,b){var c=this,d=this,e={name:a,targetScope:this,preventDefault:function(){e.defaultPrevented=!0},defaultPrevented:!1};if(!this.$$listenerCount[a])return e;for(var g=jb([e],arguments,1),h,k;c=d;){e.currentScope=c;d=c.$$listeners[a]||[];h=0;for(k=d.length;h<k;h++)if(d[h])try{d[h].apply(null,g)}catch(l){f(l)}else d.splice(h,
+1),h--,k--;if(!(d=c.$$listenerCount[a]&&c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}e.currentScope=null;return e}};var s=new h,J=s.$$asyncQueue=[],v=s.$$postDigestQueue=[],x=s.$$applyAsyncQueue=[];return s}]}function Nd(){var b=/^\s*(https?|ftp|mailto|tel|file):/,a=/^\s*((https?|ftp|file|blob):|data:image\/)/;this.aHrefSanitizationWhitelist=function(a){return z(a)?(b=a,this):b};this.imgSrcSanitizationWhitelist=function(b){return z(b)?(a=b,this):a};this.$get=
+function(){return function(c,d){var e=d?a:b,f;f=za(c).href;return""===f||f.match(e)?c:"unsafe:"+f}}}function qf(b){if("self"===b)return b;if(I(b)){if(-1<b.indexOf("***"))throw Ba("iwcard",b);b=b.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08").replace("\\*\\*",".*").replace("\\*","[^:/.?&;]*");return new RegExp("^"+b+"$")}if(ib(b))return new RegExp("^"+b.source+"$");throw Ba("imatcher");}function cd(b){var a=[];z(b)&&r(b,function(b){a.push(qf(b))});return a}function Oe(){this.SCE_CONTEXTS=
+ja;var b=["self"],a=[];this.resourceUrlWhitelist=function(a){arguments.length&&(b=cd(a));return b};this.resourceUrlBlacklist=function(b){arguments.length&&(a=cd(b));return a};this.$get=["$injector",function(c){function d(a,b){return"self"===a?Uc(b):!!a.exec(b.href)}function e(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};a&&(b.prototype=new a);b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()};b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()};
+return b}var f=function(a){throw Ba("unsafe");};c.has("$sanitize")&&(f=c.get("$sanitize"));var g=e(),k={};k[ja.HTML]=e(g);k[ja.CSS]=e(g);k[ja.URL]=e(g);k[ja.JS]=e(g);k[ja.RESOURCE_URL]=e(k[ja.URL]);return{trustAs:function(a,b){var c=k.hasOwnProperty(a)?k[a]:null;if(!c)throw Ba("icontext",a,b);if(null===b||b===u||""===b)return b;if("string"!==typeof b)throw Ba("itype",a);return new c(b)},getTrusted:function(c,e){if(null===e||e===u||""===e)return e;var g=k.hasOwnProperty(c)?k[c]:null;if(g&&e instanceof
+g)return e.$$unwrapTrustedValue();if(c===ja.RESOURCE_URL){var g=za(e.toString()),q,p,n=!1;q=0;for(p=b.length;q<p;q++)if(d(b[q],g)){n=!0;break}if(n)for(q=0,p=a.length;q<p;q++)if(d(a[q],g)){n=!1;break}if(n)return e;throw Ba("insecurl",e.toString());}if(c===ja.HTML)return f(e);throw Ba("unsafe");},valueOf:function(a){return a instanceof g?a.$$unwrapTrustedValue():a}}}]}function Ne(){var b=!0;this.enabled=function(a){arguments.length&&(b=!!a);return b};this.$get=["$document","$parse","$sceDelegate",function(a,
+c,d){if(b&&8>a[0].documentMode)throw Ba("iequirks");var e=qa(ja);e.isEnabled=function(){return b};e.trustAs=d.trustAs;e.getTrusted=d.getTrusted;e.valueOf=d.valueOf;b||(e.trustAs=e.getTrusted=function(a,b){return b},e.valueOf=Ta);e.parseAs=function(a,b){var d=c(b);return d.literal&&d.constant?d:c(b,function(b){return e.getTrusted(a,b)})};var f=e.parseAs,g=e.getTrusted,k=e.trustAs;r(ja,function(a,b){var c=N(b);e[ab("parse_as_"+c)]=function(b){return f(a,b)};e[ab("get_trusted_"+c)]=function(b){return g(a,
+b)};e[ab("trust_as_"+c)]=function(b){return k(a,b)}});return e}]}function Pe(){this.$get=["$window","$document",function(b,a){var c={},d=ba((/android (\d+)/.exec(N((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),f=a[0]||{},g,k=/^(Moz|webkit|O|ms)(?=[A-Z])/,h=f.body&&f.body.style,l=!1,m=!1;if(h){for(var q in h)if(l=k.exec(q)){g=l[0];g=g.substr(0,1).toUpperCase()+g.substr(1);break}g||(g="WebkitOpacity"in h&&"webkit");l=!!("transition"in h||g+"Transition"in h);m=!!("animation"in
+h||g+"Animation"in h);!d||l&&m||(l=I(f.body.style.webkitTransition),m=I(f.body.style.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hasEvent:function(a){if("input"==a&&9==Pa)return!1;if(w(c[a])){var b=f.createElement("div");c[a]="on"+a in b}return c[a]},csp:Za(),vendorPrefix:g,transitions:l,animations:m,android:d}}]}function Re(){this.$get=["$templateCache","$http","$q",function(b,a,c){function d(e,f){function g(){k.totalPendingRequests--;if(!f)throw ia("tpload",e);return c.reject()}
+var k=d;k.totalPendingRequests++;return a.get(e,{cache:b}).then(function(a){a=a.data;if(!a||0===a.length)return g();k.totalPendingRequests--;b.put(e,a);return a},g)}d.totalPendingRequests=0;return d}]}function Se(){this.$get=["$rootScope","$browser","$location",function(b,a,c){return{findBindings:function(a,b,c){a=a.getElementsByClassName("ng-binding");var g=[];r(a,function(a){var d=ta.element(a).data("$binding");d&&r(d,function(d){c?(new RegExp("(^|\\s)"+b+"(\\s|\\||$)")).test(d)&&g.push(a):-1!=
+d.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,c){for(var g=["ng-","data-ng-","ng\\:"],k=0;k<g.length;++k){var h=a.querySelectorAll("["+g[k]+"model"+(c?"=":"*=")+'"'+b+'"]');if(h.length)return h}},getLocation:function(){return c.url()},setLocation:function(a){a!==c.url()&&(c.url(a),b.$digest())},whenStable:function(b){a.notifyWhenNoOutstandingRequests(b)}}}]}function Te(){this.$get=["$rootScope","$browser","$q","$$q","$exceptionHandler",function(b,a,c,d,e){function f(f,h,l){var m=z(l)&&
+!l,q=(m?d:c).defer(),p=q.promise;h=a.defer(function(){try{q.resolve(f())}catch(a){q.reject(a),e(a)}finally{delete g[p.$$timeoutId]}m||b.$apply()},h);p.$$timeoutId=h;g[h]=q;return p}var g={};f.cancel=function(b){return b&&b.$$timeoutId in g?(g[b.$$timeoutId].reject("canceled"),delete g[b.$$timeoutId],a.defer.cancel(b.$$timeoutId)):!1};return f}]}function za(b,a){var c=b;Pa&&(Z.setAttribute("href",c),c=Z.href);Z.setAttribute("href",c);return{href:Z.href,protocol:Z.protocol?Z.protocol.replace(/:$/,""):
+"",host:Z.host,search:Z.search?Z.search.replace(/^\?/,""):"",hash:Z.hash?Z.hash.replace(/^#/,""):"",hostname:Z.hostname,port:Z.port,pathname:"/"===Z.pathname.charAt(0)?Z.pathname:"/"+Z.pathname}}function Uc(b){b=I(b)?za(b):b;return b.protocol===dd.protocol&&b.host===dd.host}function Ue(){this.$get=da(S)}function Bc(b){function a(c,d){if(G(c)){var e={};r(c,function(b,c){e[c]=a(c,b)});return e}return b.factory(c+"Filter",d)}this.register=a;this.$get=["$injector",function(a){return function(b){return a.get(b+
+"Filter")}}];a("currency",ed);a("date",fd);a("filter",rf);a("json",sf);a("limitTo",tf);a("lowercase",uf);a("number",gd);a("orderBy",hd);a("uppercase",vf)}function rf(){return function(b,a,c){if(!B(b))return b;var d=typeof c,e=[];e.check=function(a,b){for(var c=0;c<e.length;c++)if(!e[c](a,b))return!1;return!0};"function"!==d&&(c="boolean"===d&&c?function(a,b){return ta.equals(a,b)}:function(a,b){if(a&&b&&"object"===typeof a&&"object"===typeof b){for(var d in a)if("$"!==d.charAt(0)&&Hb.call(a,d)&&c(a[d],
+b[d]))return!0;return!1}b=(""+b).toLowerCase();return-1<(""+a).toLowerCase().indexOf(b)});var f=function(a,b){if("string"===typeof b&&"!"===b.charAt(0))return!f(a,b.substr(1));switch(typeof a){case "boolean":case "number":case "string":return c(a,b);case "object":switch(typeof b){case "object":return c(a,b);default:for(var d in a)if("$"!==d.charAt(0)&&f(a[d],b))return!0}return!1;case "array":for(d=0;d<a.length;d++)if(f(a[d],b))return!0;return!1;default:return!1}};switch(typeof a){case "boolean":case "number":case "string":a=
+{$:a};case "object":for(var g in a)(function(b){"undefined"!==typeof a[b]&&e.push(function(c){return f("$"==b?c:c&&c[b],a[b])})})(g);break;case "function":e.push(a);break;default:return b}d=[];for(g=0;g<b.length;g++){var k=b[g];e.check(k,g)&&d.push(k)}return d}}function ed(b){var a=b.NUMBER_FORMATS;return function(b,d,e){w(d)&&(d=a.CURRENCY_SYM);w(e)&&(e=2);return null==b?b:id(b,a.PATTERNS[1],a.GROUP_SEP,a.DECIMAL_SEP,e).replace(/\u00A4/g,d)}}function gd(b){var a=b.NUMBER_FORMATS;return function(b,
+d){return null==b?b:id(b,a.PATTERNS[0],a.GROUP_SEP,a.DECIMAL_SEP,d)}}function id(b,a,c,d,e){if(!isFinite(b)||G(b))return"";var f=0>b;b=Math.abs(b);var g=b+"",k="",h=[],l=!1;if(-1!==g.indexOf("e")){var m=g.match(/([\d\.]+)e(-?)(\d+)/);m&&"-"==m[2]&&m[3]>e+1?(g="0",b=0):(k=g,l=!0)}if(l)0<e&&-1<b&&1>b&&(k=b.toFixed(e));else{g=(g.split(jd)[1]||"").length;w(e)&&(e=Math.min(Math.max(a.minFrac,g),a.maxFrac));b=+(Math.round(+(b.toString()+"e"+e)).toString()+"e"+-e);0===b&&(f=!1);b=(""+b).split(jd);g=b[0];
+b=b[1]||"";var m=0,q=a.lgSize,p=a.gSize;if(g.length>=q+p)for(m=g.length-q,l=0;l<m;l++)0===(m-l)%p&&0!==l&&(k+=c),k+=g.charAt(l);for(l=m;l<g.length;l++)0===(g.length-l)%q&&0!==l&&(k+=c),k+=g.charAt(l);for(;b.length<e;)b+="0";e&&"0"!==e&&(k+=d+b.substr(0,e))}h.push(f?a.negPre:a.posPre);h.push(k);h.push(f?a.negSuf:a.posSuf);return h.join("")}function Ab(b,a,c){var d="";0>b&&(d="-",b=-b);for(b=""+b;b.length<a;)b="0"+b;c&&(b=b.substr(b.length-a));return d+b}function $(b,a,c,d){c=c||0;return function(e){e=
+e["get"+b]();if(0<c||e>-c)e+=c;0===e&&-12==c&&(e=12);return Ab(e,a,d)}}function Bb(b,a){return function(c,d){var e=c["get"+b](),f=pb(a?"SHORT"+b:b);return d[f][e]}}function kd(b){var a=(new Date(b,0,1)).getDay();return new Date(b,0,(4>=a?5:12)-a)}function ld(b){return function(a){var c=kd(a.getFullYear());a=+new Date(a.getFullYear(),a.getMonth(),a.getDate()+(4-a.getDay()))-+c;a=1+Math.round(a/6048E5);return Ab(a,b)}}function fd(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var f=0,g=0,k=b[8]?
+a.setUTCFullYear:a.setFullYear,h=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=ba(b[9]+b[10]),g=ba(b[9]+b[11]));k.call(a,ba(b[1]),ba(b[2])-1,ba(b[3]));f=ba(b[4]||0)-f;g=ba(b[5]||0)-g;k=ba(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));h.call(a,f,g,k,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e,f){var g="",k=[],h,l;e=e||"mediumDate";e=b.DATETIME_FORMATS[e]||e;I(c)&&(c=wf.test(c)?ba(c):a(c));W(c)&&(c=new Date(c));
+if(!ea(c))return c;for(;e;)(l=xf.exec(e))?(k=jb(k,l,1),e=k.pop()):(k.push(e),e=null);f&&"UTC"===f&&(c=new Date(c.getTime()),c.setMinutes(c.getMinutes()+c.getTimezoneOffset()));r(k,function(a){h=yf[a];g+=h?h(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function sf(){return function(b){return ra(b,!0)}}function tf(){return function(b,a){W(b)&&(b=b.toString());if(!B(b)&&!I(b))return b;a=Infinity===Math.abs(Number(a))?Number(a):ba(a);if(I(b))return a?0<=a?b.slice(0,a):
+b.slice(a,b.length):"";var c=[],d,e;a>b.length?a=b.length:a<-b.length&&(a=-b.length);0<a?(d=0,e=a):(d=b.length+a,e=b.length);for(;d<e;d++)c.push(b[d]);return c}}function hd(b){return function(a,c,d){function e(a,b){return b?function(b,c){return a(c,b)}:a}function f(a,b){var c=typeof a,d=typeof b;return c==d?(ea(a)&&ea(b)&&(a=a.valueOf(),b=b.valueOf()),"string"==c&&(a=a.toLowerCase(),b=b.toLowerCase()),a===b?0:a<b?-1:1):c<d?-1:1}if(!Ra(a))return a;c=B(c)?c:[c];0===c.length&&(c=["+"]);c=c.map(function(a){var c=
+!1,d=a||Ta;if(I(a)){if("+"==a.charAt(0)||"-"==a.charAt(0))c="-"==a.charAt(0),a=a.substring(1);if(""===a)return e(function(a,b){return f(a,b)},c);d=b(a);if(d.constant){var g=d();return e(function(a,b){return f(a[g],b[g])},c)}}return e(function(a,b){return f(d(a),d(b))},c)});for(var g=[],k=0;k<a.length;k++)g.push(a[k]);return g.sort(e(function(a,b){for(var d=0;d<c.length;d++){var e=c[d](a,b);if(0!==e)return e}return 0},d))}}function Ha(b){F(b)&&(b={link:b});b.restrict=b.restrict||"AC";return da(b)}
+function md(b,a,c,d,e){var f=this,g=[],k=f.$$parentForm=b.parent().controller("form")||Cb;f.$error={};f.$$success={};f.$pending=u;f.$name=e(a.name||a.ngForm||"")(c);f.$dirty=!1;f.$pristine=!0;f.$valid=!0;f.$invalid=!1;f.$submitted=!1;k.$addControl(f);f.$rollbackViewValue=function(){r(g,function(a){a.$rollbackViewValue()})};f.$commitViewValue=function(){r(g,function(a){a.$commitViewValue()})};f.$addControl=function(a){Ka(a.$name,"input");g.push(a);a.$name&&(f[a.$name]=a)};f.$$renameControl=function(a,
+b){var c=a.$name;f[c]===a&&delete f[c];f[b]=a;a.$name=b};f.$removeControl=function(a){a.$name&&f[a.$name]===a&&delete f[a.$name];r(f.$pending,function(b,c){f.$setValidity(c,null,a)});r(f.$error,function(b,c){f.$setValidity(c,null,a)});Wa(g,a)};nd({ctrl:this,$element:b,set:function(a,b,c){var d=a[b];d?-1===d.indexOf(c)&&d.push(c):a[b]=[c]},unset:function(a,b,c){var d=a[b];d&&(Wa(d,c),0===d.length&&delete a[b])},parentForm:k,$animate:d});f.$setDirty=function(){d.removeClass(b,Qa);d.addClass(b,Db);f.$dirty=
+!0;f.$pristine=!1;k.$setDirty()};f.$setPristine=function(){d.setClass(b,Qa,Db+" ng-submitted");f.$dirty=!1;f.$pristine=!0;f.$submitted=!1;r(g,function(a){a.$setPristine()})};f.$setUntouched=function(){r(g,function(a){a.$setUntouched()})};f.$setSubmitted=function(){d.addClass(b,"ng-submitted");f.$submitted=!0;k.$setSubmitted()}}function ec(b){b.$formatters.push(function(a){return b.$isEmpty(a)?a:a.toString()})}function eb(b,a,c,d,e,f){a.prop("validity");var g=a[0].placeholder,k={},h=N(a[0].type);if(!e.android){var l=
+!1;a.on("compositionstart",function(a){l=!0});a.on("compositionend",function(){l=!1;m()})}var m=function(b){if(!l){var e=a.val(),f=b&&b.type;Pa&&"input"===(b||k).type&&a[0].placeholder!==g?g=a[0].placeholder:("password"===h||c.ngTrim&&"false"===c.ngTrim||(e=U(e)),(d.$viewValue!==e||""===e&&d.$$hasNativeValidators)&&d.$setViewValue(e,f))}};if(e.hasEvent("input"))a.on("input",m);else{var q,p=function(a){q||(q=f.defer(function(){m(a);q=null}))};a.on("keydown",function(a){var b=a.keyCode;91===b||15<b&&
+19>b||37<=b&&40>=b||p(a)});if(e.hasEvent("paste"))a.on("paste cut",p)}a.on("change",m);d.$render=function(){a.val(d.$isEmpty(d.$modelValue)?"":d.$viewValue)}}function Eb(b,a){return function(c,d){var e,f;if(ea(c))return c;if(I(c)){'"'==c.charAt(0)&&'"'==c.charAt(c.length-1)&&(c=c.substring(1,c.length-1));if(zf.test(c))return new Date(c);b.lastIndex=0;if(e=b.exec(c))return e.shift(),f=d?{yyyy:d.getFullYear(),MM:d.getMonth()+1,dd:d.getDate(),HH:d.getHours(),mm:d.getMinutes(),ss:d.getSeconds(),sss:d.getMilliseconds()/
+1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},r(e,function(b,c){c<a.length&&(f[a[c]]=+b)}),new Date(f.yyyy,f.MM-1,f.dd,f.HH,f.mm,f.ss||0,1E3*f.sss||0)}return NaN}}function fb(b,a,c,d){return function(e,f,g,k,h,l,m){function q(a){return z(a)?ea(a)?a:c(a):u}od(e,f,g,k);eb(e,f,g,k,h,l);var p=k&&k.$options&&k.$options.timezone,n;k.$$parserName=b;k.$parsers.push(function(b){return k.$isEmpty(b)?null:a.test(b)?(b=c(b,n),"UTC"===p&&b.setMinutes(b.getMinutes()-b.getTimezoneOffset()),b):u});k.$formatters.push(function(a){if(k.$isEmpty(a))n=
+null;else{if(!ea(a))throw Fb("datefmt",a);if((n=a)&&"UTC"===p){var b=6E4*n.getTimezoneOffset();n=new Date(n.getTime()+b)}return m("date")(a,d,p)}return""});if(z(g.min)||g.ngMin){var s;k.$validators.min=function(a){return k.$isEmpty(a)||w(s)||c(a)>=s};g.$observe("min",function(a){s=q(a);k.$validate()})}if(z(g.max)||g.ngMax){var r;k.$validators.max=function(a){return k.$isEmpty(a)||w(r)||c(a)<=r};g.$observe("max",function(a){r=q(a);k.$validate()})}k.$isEmpty=function(a){return!a||a.getTime&&a.getTime()!==
+a.getTime()}}}function od(b,a,c,d){(d.$$hasNativeValidators=G(a[0].validity))&&d.$parsers.push(function(b){var c=a.prop("validity")||{};return c.badInput&&!c.typeMismatch?u:b})}function pd(b,a,c,d,e){if(z(d)){b=b(d);if(!b.constant)throw y("ngModel")("constexpr",c,d);return b(a)}return e}function nd(b){function a(a,b){b&&!f[a]?(l.addClass(e,a),f[a]=!0):!b&&f[a]&&(l.removeClass(e,a),f[a]=!1)}function c(b,c){b=b?"-"+Kb(b,"-"):"";a(gb+b,!0===c);a(qd+b,!1===c)}var d=b.ctrl,e=b.$element,f={},g=b.set,k=
+b.unset,h=b.parentForm,l=b.$animate;f[qd]=!(f[gb]=e.hasClass(gb));d.$setValidity=function(b,e,f){e===u?(d.$pending||(d.$pending={}),g(d.$pending,b,f)):(d.$pending&&k(d.$pending,b,f),rd(d.$pending)&&(d.$pending=u));Va(e)?e?(k(d.$error,b,f),g(d.$$success,b,f)):(g(d.$error,b,f),k(d.$$success,b,f)):(k(d.$error,b,f),k(d.$$success,b,f));d.$pending?(a(sd,!0),d.$valid=d.$invalid=u,c("",null)):(a(sd,!1),d.$valid=rd(d.$error),d.$invalid=!d.$valid,c("",d.$valid));e=d.$pending&&d.$pending[b]?u:d.$error[b]?!1:
+d.$$success[b]?!0:null;c(b,e);h.$setValidity(b,e,d)}}function rd(b){if(b)for(var a in b)return!1;return!0}function fc(b,a){b="ngClass"+b;return["$animate",function(c){function d(a,b){var c=[],d=0;a:for(;d<a.length;d++){for(var e=a[d],m=0;m<b.length;m++)if(e==b[m])continue a;c.push(e)}return c}function e(a){if(!B(a)){if(I(a))return a.split(" ");if(G(a)){var b=[];r(a,function(a,c){a&&(b=b.concat(c.split(" ")))});return b}}return a}return{restrict:"AC",link:function(f,g,k){function h(a,b){var c=g.data("$classCounts")||
+{},d=[];r(a,function(a){if(0<b||c[a])c[a]=(c[a]||0)+b,c[a]===+(0<b)&&d.push(a)});g.data("$classCounts",c);return d.join(" ")}function l(b){if(!0===a||f.$index%2===a){var l=e(b||[]);if(!m){var n=h(l,1);k.$addClass(n)}else if(!la(b,m)){var s=e(m),n=d(l,s),l=d(s,l),n=h(n,1),l=h(l,-1);n&&n.length&&c.addClass(g,n);l&&l.length&&c.removeClass(g,l)}}m=qa(b)}var m;f.$watch(k[b],l,!0);k.$observe("class",function(a){l(f.$eval(k[b]))});"ngClass"!==b&&f.$watch("$index",function(c,d){var g=c&1;if(g!==(d&1)){var l=
+e(f.$eval(k[b]));g===a?(g=h(l,1),k.$addClass(g)):(g=h(l,-1),k.$removeClass(g))}})}}}]}var Af=/^\/(.+)\/([a-z]*)$/,N=function(b){return I(b)?b.toLowerCase():b},Hb=Object.prototype.hasOwnProperty,pb=function(b){return I(b)?b.toUpperCase():b},Pa,D,ma,Ya=[].slice,mf=[].splice,Bf=[].push,Ia=Object.prototype.toString,Xa=y("ng"),ta=S.angular||(S.angular={}),$a,hb=0;Pa=X.documentMode;A.$inject=[];Ta.$inject=[];var B=Array.isArray,U=function(b){return I(b)?b.trim():b},Za=function(){if(z(Za.isActive_))return Za.isActive_;
+var b=!(!X.querySelector("[ng-csp]")&&!X.querySelector("[data-ng-csp]"));if(!b)try{new Function("")}catch(a){b=!0}return Za.isActive_=b},mb=["ng-","data-ng-","ng:","x-ng-"],Hd=/[A-Z]/g,sc=!1,Lb,ka=1,kb=3,Ld={full:"1.3.0",major:1,minor:3,dot:0,codeName:"superluminal-nudge"};R.expando="ng339";var ub=R.cache={},bf=1;R._data=function(b){return this.cache[b[this.expando]]||{}};var Xe=/([\:\-\_]+(.))/g,Ye=/^moz([A-Z])/,Cf={mouseleave:"mouseout",mouseenter:"mouseover"},Ob=y("jqLite"),af=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+Nb=/<|&#?\w+;/,Ze=/<([\w:]+)/,$e=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ha={option:[1,'<select multiple="multiple">',"</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ha.optgroup=ha.option;ha.tbody=ha.tfoot=ha.colgroup=ha.caption=ha.thead;ha.th=ha.td;var Ja=R.prototype={ready:function(b){function a(){c||(c=
+!0,b())}var c=!1;"complete"===X.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),R(S).on("load",a),this.on("DOMContentLoaded",a))},toString:function(){var b=[];r(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return 0<=b?D(this[b]):D(this[this.length+b])},length:0,push:Bf,sort:[].sort,splice:[].splice},wb={};r("multiple selected checked disabled readOnly required open".split(" "),function(b){wb[N(b)]=b});var Kc={};r("input select option textarea button form details".split(" "),
+function(b){Kc[b]=!0});var Lc={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"};r({data:Qb,removeData:sb},function(b,a){R[a]=b});r({data:Qb,inheritedData:vb,scope:function(b){return D.data(b,"$scope")||vb(b.parentNode||b,["$isolateScope","$scope"])},isolateScope:function(b){return D.data(b,"$isolateScope")||D.data(b,"$isolateScopeNoTemplate")},controller:Gc,injector:function(b){return vb(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Rb,
+css:function(b,a,c){a=ab(a);if(z(c))b.style[a]=c;else return b.style[a]},attr:function(b,a,c){var d=N(a);if(wb[d])if(z(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||A).specified?d:u;else if(z(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?u:b},prop:function(b,a,c){if(z(c))b[a]=c;else return b[a]},text:function(){function b(a,b){if(w(b)){var d=a.nodeType;return d===ka||d===kb?a.textContent:""}a.textContent=
+b}b.$dv="";return b}(),val:function(b,a){if(w(a)){if(b.multiple&&"select"===pa(b)){var c=[];r(b.options,function(a){a.selected&&c.push(a.value||a.text)});return 0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(w(a))return b.innerHTML;rb(b,!0);b.innerHTML=a},empty:Hc},function(b,a){R.prototype[a]=function(a,d){var e,f,g=this.length;if(b!==Hc&&(2==b.length&&b!==Rb&&b!==Gc?a:d)===u){if(G(a)){for(e=0;e<g;e++)if(b===Qb)b(this[e],a);else for(f in a)b(this[e],f,a[f]);return this}e=b.$dv;
+g=e===u?Math.min(g,1):g;for(f=0;f<g;f++){var k=b(this[f],a,d);e=e?e+k:k}return e}for(e=0;e<g;e++)b(this[e],a,d);return this}});r({removeData:sb,on:function a(c,d,e,f){if(z(f))throw Ob("onargs");if(Cc(c)){var g=tb(c,!0);f=g.events;var k=g.handle;k||(k=g.handle=ef(c,f));for(var g=0<=d.indexOf(" ")?d.split(" "):[d],h=g.length;h--;){d=g[h];var l=f[d];l||(f[d]=[],"mouseenter"===d||"mouseleave"===d?a(c,Cf[d],function(a){var c=a.relatedTarget;c&&(c===this||this.contains(c))||k(a,d)}):"$destroy"!==d&&c.addEventListener(d,
+k,!1),l=f[d]);l.push(e)}}},off:Fc,one:function(a,c,d){a=D(a);a.on(c,function f(){a.off(c,d);a.off(c,f)});a.on(c,d)},replaceWith:function(a,c){var d,e=a.parentNode;rb(a);r(new R(c),function(c){d?e.insertBefore(c,d.nextSibling):e.replaceChild(c,a);d=c})},children:function(a){var c=[];r(a.childNodes,function(a){a.nodeType===ka&&c.push(a)});return c},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,c){var d=a.nodeType;if(d===ka||11===d){c=new R(c);for(var d=0,e=c.length;d<
+e;d++)a.appendChild(c[d])}},prepend:function(a,c){if(a.nodeType===ka){var d=a.firstChild;r(new R(c),function(c){a.insertBefore(c,d)})}},wrap:function(a,c){c=D(c).eq(0).clone()[0];var d=a.parentNode;d&&d.replaceChild(c,a);c.appendChild(a)},remove:Ic,detach:function(a){Ic(a,!0)},after:function(a,c){var d=a,e=a.parentNode;c=new R(c);for(var f=0,g=c.length;f<g;f++){var k=c[f];e.insertBefore(k,d.nextSibling);d=k}},addClass:Tb,removeClass:Sb,toggleClass:function(a,c,d){c&&r(c.split(" "),function(c){var f=
+d;w(f)&&(f=!Rb(a,c));(f?Tb:Sb)(a,c)})},parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},next:function(a){return a.nextElementSibling},find:function(a,c){return a.getElementsByTagName?a.getElementsByTagName(c):[]},clone:Pb,triggerHandler:function(a,c,d){var e,f,g=c.type||c,k=tb(a);if(k=(k=k&&k.events)&&k[g])e={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return!0===this.defaultPrevented},stopImmediatePropagation:function(){this.immediatePropagationStopped=
+!0},isImmediatePropagationStopped:function(){return!0===this.immediatePropagationStopped},stopPropagation:A,type:g,target:a},c.type&&(e=E(e,c)),c=qa(k),f=d?[e].concat(d):[e],r(c,function(c){e.isImmediatePropagationStopped()||c.apply(a,f)})}},function(a,c){R.prototype[c]=function(c,e,f){for(var g,k=0,h=this.length;k<h;k++)w(g)?(g=a(this[k],c,e,f),z(g)&&(g=D(g))):Ec(g,a(this[k],c,e,f));return z(g)?g:this};R.prototype.bind=R.prototype.on;R.prototype.unbind=R.prototype.off});bb.prototype={put:function(a,
+c){this[La(a,this.nextUid)]=c},get:function(a){return this[La(a,this.nextUid)]},remove:function(a){var c=this[a=La(a,this.nextUid)];delete this[a];return c}};var Nc=/^function\s*[^\(]*\(\s*([^\)]*)\)/m,gf=/,/,hf=/^\s*(_?)(\S+?)\1\s*$/,Mc=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ea=y("$injector");Jb.$$annotate=Ub;var Df=y("$animate"),xe=["$provide",function(a){this.$$selectors={};this.register=function(c,d){var e=c+"-animation";if(c&&"."!=c.charAt(0))throw Df("notcsel",c);this.$$selectors[c.substr(1)]=e;
+a.factory(e,d)};this.classNameFilter=function(a){1===arguments.length&&(this.$$classNameFilter=a instanceof RegExp?a:null);return this.$$classNameFilter};this.$get=["$$q","$$asyncCallback","$rootScope",function(a,d,e){function f(d){var f,g=a.defer();g.promise.$$cancelFn=function(){f&&f()};e.$$postDigest(function(){f=d(function(){g.resolve()})});return g.promise}function g(a,c){var d=[],e=[],f=wa();r((a.attr("class")||"").split(/\s+/),function(a){f[a]=!0});r(c,function(a,c){var g=f[c];!1===a&&g?e.push(c):
+!0!==a||g||d.push(c)});return 0<d.length+e.length&&[d.length?d:null,e.length?e:null]}function k(a,c,d){for(var e=0,f=c.length;e<f;++e)a[c[e]]=d}function h(){m||(m=a.defer(),d(function(){m.resolve();m=null}));return m.promise}function l(a,c){if(ta.isObject(c)){var d=E(c.from||{},c.to||{});a.css(d)}}var m;return{animate:function(a,c,d){l(a,{from:c,to:d});return h()},enter:function(a,c,d,e){l(a,e);d?d.after(a):c.prepend(a);return h()},leave:function(a,c){a.remove();return h()},move:function(a,c,d,e){return this.enter(a,
+c,d,e)},addClass:function(a,c,d){return this.setClass(a,c,[],d)},$$addClassImmediately:function(a,c,d){a=D(a);c=I(c)?c:B(c)?c.join(" "):"";r(a,function(a){Tb(a,c)});l(a,d);return h()},removeClass:function(a,c,d){return this.setClass(a,[],c,d)},$$removeClassImmediately:function(a,c,d){a=D(a);c=I(c)?c:B(c)?c.join(" "):"";r(a,function(a){Sb(a,c)});l(a,d);return h()},setClass:function(a,c,d,e){var h=this,l=!1;a=D(a);var m=a.data("$$animateClasses");m?e&&m.options&&(m.options=ta.extend(m.options||{},e)):
+(m={classes:{},options:e},l=!0);e=m.classes;c=B(c)?c:c.split(" ");d=B(d)?d:d.split(" ");k(e,c,!0);k(e,d,!1);l&&(m.promise=f(function(c){var d=a.data("$$animateClasses");a.removeData("$$animateClasses");if(d){var e=g(a,d.classes);e&&h.$$setClassImmediately(a,e[0],e[1],d.options)}c()}),a.data("$$animateClasses",m));return m.promise},$$setClassImmediately:function(a,c,d,e){c&&this.$$addClassImmediately(a,c);d&&this.$$removeClassImmediately(a,d);l(a,e);return h()},enabled:A,cancel:A}}]}],ia=y("$compile");
+uc.$inject=["$provide","$$sanitizeUriProvider"];var lf=/^(x[\:\-_]|data[\:\-_])/i,Yb=y("$interpolate"),Ef=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,pf={http:80,https:443,ftp:21},cb=y("$location"),Ff={$$html5:!1,$$replace:!1,absUrl:zb("$$absUrl"),url:function(a){if(w(a))return this.$$url;a=Ef.exec(a);a[1]&&this.path(decodeURIComponent(a[1]));(a[2]||a[1])&&this.search(a[3]||"");this.hash(a[5]||"");return this},protocol:zb("$$protocol"),host:zb("$$host"),port:zb("$$port"),path:Yc("$$path",function(a){a=null!==
+a?a.toString():"";return"/"==a.charAt(0)?a:"/"+a}),search:function(a,c){switch(arguments.length){case 0:return this.$$search;case 1:if(I(a)||W(a))a=a.toString(),this.$$search=qc(a);else if(G(a))a=Ca(a,{}),r(a,function(c,e){null==c&&delete a[e]}),this.$$search=a;else throw cb("isrcharg");break;default:w(c)||null===c?delete this.$$search[a]:this.$$search[a]=c}this.$$compose();return this},hash:Yc("$$hash",function(a){return null!==a?a.toString():""}),replace:function(){this.$$replace=!0;return this}};
+r([Xc,bc,ac],function(a){a.prototype=Object.create(Ff);a.prototype.state=function(c){if(!arguments.length)return this.$$state;if(a!==ac||!this.$$html5)throw cb("nostate");this.$$state=w(c)?null:c;return this}});var oa=y("$parse"),Gf=Function.prototype.call,Hf=Function.prototype.apply,If=Function.prototype.bind,Gb=wa();r({"null":function(){return null},"true":function(){return!0},"false":function(){return!1},undefined:function(){}},function(a,c){a.constant=a.literal=a.sharedGetter=!0;Gb[c]=a});Gb["this"]=
+function(a){return a};Gb["this"].sharedGetter=!0;var gc=E(wa(),{"+":function(a,c,d,e){d=d(a,c);e=e(a,c);return z(d)?z(e)?d+e:d:z(e)?e:u},"-":function(a,c,d,e){d=d(a,c);e=e(a,c);return(z(d)?d:0)-(z(e)?e:0)},"*":function(a,c,d,e){return d(a,c)*e(a,c)},"/":function(a,c,d,e){return d(a,c)/e(a,c)},"%":function(a,c,d,e){return d(a,c)%e(a,c)},"===":function(a,c,d,e){return d(a,c)===e(a,c)},"!==":function(a,c,d,e){return d(a,c)!==e(a,c)},"==":function(a,c,d,e){return d(a,c)==e(a,c)},"!=":function(a,c,d,e){return d(a,
+c)!=e(a,c)},"<":function(a,c,d,e){return d(a,c)<e(a,c)},">":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"!":function(a,c,d){return!d(a,c)},"=":!0,"|":!0}),Jf={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},dc=function(a){this.options=a};dc.prototype={constructor:dc,lex:function(a){this.text=a;this.index=0;this.ch=u;
+for(this.tokens=[];this.index<this.text.length;)if(this.ch=this.text.charAt(this.index),this.is("\"'"))this.readString(this.ch);else if(this.isNumber(this.ch)||this.is(".")&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdent(this.ch))this.readIdent();else if(this.is("(){}[].,;:?"))this.tokens.push({index:this.index,text:this.ch}),this.index++;else if(this.isWhitespace(this.ch))this.index++;else{a=this.ch+this.peek();var c=a+this.peek(2),d=gc[this.ch],e=gc[a],f=gc[c];f?(this.tokens.push({index:this.index,
+text:c,fn:f}),this.index+=3):e?(this.tokens.push({index:this.index,text:a,fn:e}),this.index+=2):d?(this.tokens.push({index:this.index,text:this.ch,fn:d}),this.index+=1):this.throwError("Unexpected next character ",this.index,this.index+1)}return this.tokens},is:function(a){return-1!==a.indexOf(this.ch)},peek:function(a){a=a||1;return this.index+a<this.text.length?this.text.charAt(this.index+a):!1},isNumber:function(a){return"0"<=a&&"9">=a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===
+a||"\n"===a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=z(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d;throw oa("lexerr",a,c,this.text);},readNumber:function(){for(var a="",c=this.index;this.index<this.text.length;){var d=N(this.text.charAt(this.index));if("."==d||this.isNumber(d))a+=d;else{var e=this.peek();if("e"==
+d&&this.isExpOperator(e))a+=d;else if(this.isExpOperator(d)&&e&&this.isNumber(e)&&"e"==a.charAt(a.length-1))a+=d;else if(!this.isExpOperator(d)||e&&this.isNumber(e)||"e"!=a.charAt(a.length-1))break;else this.throwError("Invalid exponent")}this.index++}a*=1;this.tokens.push({index:c,text:a,constant:!0,fn:function(){return a}})},readIdent:function(){for(var a=this.text,c="",d=this.index,e,f,g,k;this.index<this.text.length;){k=this.text.charAt(this.index);if("."===k||this.isIdent(k)||this.isNumber(k))"."===
+k&&(e=this.index),c+=k;else break;this.index++}e&&"."===c[c.length-1]&&(this.index--,c=c.slice(0,-1),e=c.lastIndexOf("."),-1===e&&(e=u));if(e)for(f=this.index;f<this.text.length;){k=this.text.charAt(f);if("("===k){g=c.substr(e-d+1);c=c.substr(0,e-d);this.index=f;break}if(this.isWhitespace(k))f++;else break}this.tokens.push({index:d,text:c,fn:Gb[c]||$c(c,this.options,a)});g&&(this.tokens.push({index:e,text:"."}),this.tokens.push({index:e+1,text:g}))},readString:function(a){var c=this.index;this.index++;
+for(var d="",e=a,f=!1;this.index<this.text.length;){var g=this.text.charAt(this.index),e=e+g;if(f)"u"===g?(f=this.text.substring(this.index+1,this.index+5),f.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+f+"]"),this.index+=4,d+=String.fromCharCode(parseInt(f,16))):d+=Jf[g]||g,f=!1;else if("\\"===g)f=!0;else{if(g===a){this.index++;this.tokens.push({index:c,text:e,string:d,constant:!0,fn:function(){return d}});return}d+=g}this.index++}this.throwError("Unterminated quote",c)}};
+var db=function(a,c,d){this.lexer=a;this.$filter=c;this.options=d};db.ZERO=E(function(){return 0},{sharedGetter:!0,constant:!0});db.prototype={constructor:db,parse:function(a){this.text=a;this.tokens=this.lexer.lex(a);a=this.statements();0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]);a.literal=!!a.literal;a.constant=!!a.constant;return a},primary:function(){var a;if(this.expect("("))a=this.filterChain(),this.consume(")");else if(this.expect("["))a=this.arrayDeclaration();
+else if(this.expect("{"))a=this.object();else{var c=this.expect();(a=c.fn)||this.throwError("not a primary expression",c);c.constant&&(a.constant=!0,a.literal=!0)}for(var d;c=this.expect("(","[",".");)"("===c.text?(a=this.functionCall(a,d),d=null):"["===c.text?(d=a,a=this.objectIndex(a)):"."===c.text?(d=a,a=this.fieldAccess(a)):this.throwError("IMPOSSIBLE");return a},throwError:function(a,c){throw oa("syntax",c.text,a,c.index+1,this.text,this.text.substring(c.index));},peekToken:function(){if(0===
+this.tokens.length)throw oa("ueoe",this.text);return this.tokens[0]},peek:function(a,c,d,e){if(0<this.tokens.length){var f=this.tokens[0],g=f.text;if(g===a||g===c||g===d||g===e||!(a||c||d||e))return f}return!1},expect:function(a,c,d,e){return(a=this.peek(a,c,d,e))?(this.tokens.shift(),a):!1},consume:function(a){this.expect(a)||this.throwError("is unexpected, expecting ["+a+"]",this.peek())},unaryFn:function(a,c){return E(function(d,e){return a(d,e,c)},{constant:c.constant,inputs:[c]})},binaryFn:function(a,
+c,d,e){return E(function(e,g){return c(e,g,a,d)},{constant:a.constant&&d.constant,inputs:!e&&[a,d]})},statements:function(){for(var a=[];;)if(0<this.tokens.length&&!this.peek("}",")",";","]")&&a.push(this.filterChain()),!this.expect(";"))return 1===a.length?a[0]:function(c,d){for(var e,f=0,g=a.length;f<g;f++)e=a[f](c,d);return e}},filterChain:function(){for(var a=this.expression();this.expect("|");)a=this.filter(a);return a},filter:function(a){var c=this.expect(),d=this.$filter(c.text),e,f;if(this.peek(":"))for(e=
+[],f=[];this.expect(":");)e.push(this.expression());c=[a].concat(e||[]);return E(function(c,k){var h=a(c,k);if(f){f[0]=h;for(h=e.length;h--;)f[h+1]=e[h](c,k);return d.apply(u,f)}return d(h)},{constant:!d.$stateful&&c.every(cc),inputs:!d.$stateful&&c})},expression:function(){return this.assignment()},assignment:function(){var a=this.ternary(),c,d;return(d=this.expect("="))?(a.assign||this.throwError("implies assignment but ["+this.text.substring(0,d.index)+"] can not be assigned to",d),c=this.ternary(),
+E(function(d,f){return a.assign(d,c(d,f),f)},{inputs:[a,c]})):a},ternary:function(){var a=this.logicalOR(),c,d;if(d=this.expect("?")){c=this.assignment();if(d=this.expect(":")){var e=this.assignment();return E(function(d,g){return a(d,g)?c(d,g):e(d,g)},{constant:a.constant&&c.constant&&e.constant})}this.throwError("expected :",d)}return a},logicalOR:function(){for(var a=this.logicalAND(),c;c=this.expect("||");)a=this.binaryFn(a,c.fn,this.logicalAND(),!0);return a},logicalAND:function(){var a=this.equality(),
+c;if(c=this.expect("&&"))a=this.binaryFn(a,c.fn,this.logicalAND(),!0);return a},equality:function(){var a=this.relational(),c;if(c=this.expect("==","!=","===","!=="))a=this.binaryFn(a,c.fn,this.equality());return a},relational:function(){var a=this.additive(),c;if(c=this.expect("<",">","<=",">="))a=this.binaryFn(a,c.fn,this.relational());return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect("+","-");)a=this.binaryFn(a,c.fn,this.multiplicative());return a},multiplicative:function(){for(var a=
+this.unary(),c;c=this.expect("*","/","%");)a=this.binaryFn(a,c.fn,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(db.ZERO,a.fn,this.unary()):(a=this.expect("!"))?this.unaryFn(a.fn,this.unary()):this.primary()},fieldAccess:function(a){var c=this.text,d=this.expect().text,e=$c(d,this.options,c);return E(function(c,d,k){return e(k||a(c,d))},{assign:function(e,g,k){(k=a(e,k))||a.assign(e,k={});return Oa(k,d,g,c)}})},objectIndex:function(a){var c=
+this.text,d=this.expression();this.consume("]");return E(function(e,f){var g=a(e,f),k=d(e,f);na(k,c);return g?Aa(g[k],c):u},{assign:function(e,f,g){var k=na(d(e,g),c);(g=Aa(a(e,g),c))||a.assign(e,g={});return g[k]=f}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text){do d.push(this.expression());while(this.expect(","))}this.consume(")");var e=this.text,f=d.length?[]:null;return function(g,k){var h=c?c(g,k):g,l=a(g,k,h)||A;if(f)for(var m=d.length;m--;)f[m]=Aa(d[m](g,k),e);Aa(h,
+e);if(l){if(l.constructor===l)throw oa("isecfn",e);if(l===Gf||l===Hf||l===If)throw oa("isecff",e);}h=l.apply?l.apply(h,f):l(f[0],f[1],f[2],f[3],f[4]);return Aa(h,e)}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;var c=this.expression();a.push(c)}while(this.expect(","))}this.consume("]");return E(function(c,e){for(var f=[],g=0,k=a.length;g<k;g++)f.push(a[g](c,e));return f},{literal:!0,constant:a.every(cc),inputs:a})},object:function(){var a=[],c=[];
+if("}"!==this.peekToken().text){do{if(this.peek("}"))break;var d=this.expect();a.push(d.string||d.text);this.consume(":");d=this.expression();c.push(d)}while(this.expect(","))}this.consume("}");return E(function(d,f){for(var g={},k=0,h=c.length;k<h;k++)g[a[k]]=c[k](d,f);return g},{literal:!0,constant:c.every(cc),inputs:c})}};var ad=wa(),Ba=y("$sce"),ja={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},ia=y("$compile"),Z=X.createElement("a"),dd=za(S.location.href,!0);Bc.$inject=
+["$provide"];ed.$inject=["$locale"];gd.$inject=["$locale"];var jd=".",yf={yyyy:$("FullYear",4),yy:$("FullYear",2,0,!0),y:$("FullYear",1),MMMM:Bb("Month"),MMM:Bb("Month",!0),MM:$("Month",2,1),M:$("Month",1,1),dd:$("Date",2),d:$("Date",1),HH:$("Hours",2),H:$("Hours",1),hh:$("Hours",2,-12),h:$("Hours",1,-12),mm:$("Minutes",2),m:$("Minutes",1),ss:$("Seconds",2),s:$("Seconds",1),sss:$("Milliseconds",3),EEEE:Bb("Day"),EEE:Bb("Day",!0),a:function(a,c){return 12>a.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){a=
+-1*a.getTimezoneOffset();return a=(0<=a?"+":"")+(Ab(Math[0<a?"floor":"ceil"](a/60),2)+Ab(Math.abs(a%60),2))},ww:ld(2),w:ld(1)},xf=/((?:[^yMdHhmsaZEw']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|w+))(.*)/,wf=/^\-?\d+$/;fd.$inject=["$locale"];var uf=da(N),vf=da(pb);hd.$inject=["$parse"];var Od=da({restrict:"E",compile:function(a,c){if(!c.href&&!c.xlinkHref&&!c.name)return function(a,c){var f="[object SVGAnimatedString]"===Ia.call(c.prop("href"))?"xlink:href":"href";c.on("click",function(a){c.attr(f)||
+a.preventDefault()})}}}),qb={};r(wb,function(a,c){if("multiple"!=a){var d=ua("ng-"+c);qb[d]=function(){return{restrict:"A",priority:100,link:function(a,f,g){a.$watch(g[d],function(a){g.$set(c,!!a)})}}}}});r(Lc,function(a,c){qb[c]=function(){return{priority:100,link:function(a,e,f){if("ngPattern"===c&&"/"==f.ngPattern.charAt(0)&&(e=f.ngPattern.match(Af))){f.$set("ngPattern",new RegExp(e[1],e[2]));return}a.$watch(f[c],function(a){f.$set(c,a)})}}}});r(["src","srcset","href"],function(a){var c=ua("ng-"+
+a);qb[c]=function(){return{priority:99,link:function(d,e,f){var g=a,k=a;"href"===a&&"[object SVGAnimatedString]"===Ia.call(e.prop("href"))&&(k="xlinkHref",f.$attr[k]="xlink:href",g=null);f.$observe(c,function(c){c?(f.$set(k,c),Pa&&g&&e.prop(g,f[k])):"href"===a&&f.$set(k,null)})}}}});var Cb={$addControl:A,$$renameControl:function(a,c){a.$name=c},$removeControl:A,$setValidity:A,$setDirty:A,$setPristine:A,$setSubmitted:A};md.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var td=function(a){return["$timeout",
+function(c){return{name:"form",restrict:a?"EAC":"E",controller:md,compile:function(a){a.addClass(Qa).addClass(gb);return{pre:function(a,d,g,k){if(!("action"in g)){var h=function(c){a.$apply(function(){k.$commitViewValue();k.$setSubmitted()});c.preventDefault?c.preventDefault():c.returnValue=!1};d[0].addEventListener("submit",h,!1);d.on("$destroy",function(){c(function(){d[0].removeEventListener("submit",h,!1)},0,!1)})}var l=k.$$parentForm,m=k.$name;m&&(Oa(a,m,k,m),g.$observe(g.name?"name":"ngForm",
+function(c){m!==c&&(Oa(a,m,u,m),m=c,Oa(a,m,k,m),l.$$renameControl(k,m))}));d.on("$destroy",function(){l.$removeControl(k);m&&Oa(a,m,u,m);E(k,Cb)})}}}}}]},Pd=td(),be=td(!0),zf=/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/,Kf=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,Lf=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,Mf=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,ud=/^(\d{4})-(\d{2})-(\d{2})$/,
+vd=/^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,hc=/^(\d{4})-W(\d\d)$/,wd=/^(\d{4})-(\d\d)$/,xd=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Nf=/(\s+|^)default(\s+|$)/,Fb=new y("ngModel"),yd={text:function(a,c,d,e,f,g){eb(a,c,d,e,f,g);ec(e)},date:fb("date",ud,Eb(ud,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":fb("datetimelocal",vd,Eb(vd,"yyyy MM dd HH mm ss sss".split(" ")),"yyyy-MM-ddTHH:mm:ss.sss"),time:fb("time",xd,Eb(xd,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:fb("week",
+hc,function(a,c){if(ea(a))return a;if(I(a)){hc.lastIndex=0;var d=hc.exec(a);if(d){var e=+d[1],f=+d[2],g=d=0,k=0,h=0,l=kd(e),f=7*(f-1);c&&(d=c.getHours(),g=c.getMinutes(),k=c.getSeconds(),h=c.getMilliseconds());return new Date(e,0,l.getDate()+f,d,g,k,h)}}return NaN},"yyyy-Www"),month:fb("month",wd,Eb(wd,["yyyy","MM"]),"yyyy-MM"),number:function(a,c,d,e,f,g){od(a,c,d,e);eb(a,c,d,e,f,g);e.$$parserName="number";e.$parsers.push(function(a){return e.$isEmpty(a)?null:Mf.test(a)?parseFloat(a):u});e.$formatters.push(function(a){if(!e.$isEmpty(a)){if(!W(a))throw Fb("numfmt",
+a);a=a.toString()}return a});if(d.min||d.ngMin){var k;e.$validators.min=function(a){return e.$isEmpty(a)||w(k)||a>=k};d.$observe("min",function(a){z(a)&&!W(a)&&(a=parseFloat(a,10));k=W(a)&&!isNaN(a)?a:u;e.$validate()})}if(d.max||d.ngMax){var h;e.$validators.max=function(a){return e.$isEmpty(a)||w(h)||a<=h};d.$observe("max",function(a){z(a)&&!W(a)&&(a=parseFloat(a,10));h=W(a)&&!isNaN(a)?a:u;e.$validate()})}},url:function(a,c,d,e,f,g){eb(a,c,d,e,f,g);ec(e);e.$$parserName="url";e.$validators.url=function(a){return e.$isEmpty(a)||
+Kf.test(a)}},email:function(a,c,d,e,f,g){eb(a,c,d,e,f,g);ec(e);e.$$parserName="email";e.$validators.email=function(a){return e.$isEmpty(a)||Lf.test(a)}},radio:function(a,c,d,e){w(d.name)&&c.attr("name",++hb);c.on("click",function(a){c[0].checked&&e.$setViewValue(d.value,a&&a.type)});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e,f,g,k,h){var l=pd(h,a,"ngTrueValue",d.ngTrueValue,!0),m=pd(h,a,"ngFalseValue",d.ngFalseValue,!1);c.on("click",
+function(a){e.$setViewValue(c[0].checked,a&&a.type)});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return a!==l};e.$formatters.push(function(a){return la(a,l)});e.$parsers.push(function(a){return a?l:m})},hidden:A,button:A,submit:A,reset:A,file:A},vc=["$browser","$sniffer","$filter","$parse",function(a,c,d,e){return{restrict:"E",require:["?ngModel"],link:{pre:function(f,g,k,h){h[0]&&(yd[N(k.type)]||yd.text)(f,g,k,h[0],c,a,d,e)}}}}],gb="ng-valid",qd="ng-invalid",Qa="ng-pristine",
+Db="ng-dirty",sd="ng-pending",Of=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,c,d,e,f,g,k,h,l,m){this.$modelValue=this.$viewValue=Number.NaN;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending=u;this.$name=m(d.name||
+"",!1)(a);var q=f(d.ngModel),p=null,n=this,s=function(){var c=q(a);n.$options&&n.$options.getterSetter&&F(c)&&(c=c());return c},J=function(c){var d;n.$options&&n.$options.getterSetter&&F(d=q(a))?d(n.$modelValue):q.assign(a,n.$modelValue)};this.$$setOptions=function(a){n.$options=a;if(!(q.assign||a&&a.getterSetter))throw Fb("nonassign",d.ngModel,sa(e));};this.$render=A;this.$isEmpty=function(a){return w(a)||""===a||null===a||a!==a};var v=e.inheritedData("$formController")||Cb,x=0;nd({ctrl:this,$element:e,
+set:function(a,c){a[c]=!0},unset:function(a,c){delete a[c]},parentForm:v,$animate:g});this.$setPristine=function(){n.$dirty=!1;n.$pristine=!0;g.removeClass(e,Db);g.addClass(e,Qa)};this.$setUntouched=function(){n.$touched=!1;n.$untouched=!0;g.setClass(e,"ng-untouched","ng-touched")};this.$setTouched=function(){n.$touched=!0;n.$untouched=!1;g.setClass(e,"ng-touched","ng-untouched")};this.$rollbackViewValue=function(){k.cancel(p);n.$viewValue=n.$$lastCommittedViewValue;n.$render()};this.$validate=function(){W(n.$modelValue)&&
+isNaN(n.$modelValue)||this.$$parseAndValidate()};this.$$runValidators=function(a,c,d,e){function f(){var a=!0;r(n.$validators,function(e,f){var g=e(c,d);a=a&&g;h(f,g)});return a?!0:(r(n.$asyncValidators,function(a,c){h(c,null)}),!1)}function g(){var a=[],e=!0;r(n.$asyncValidators,function(f,g){var k=f(c,d);if(!k||!F(k.then))throw Fb("$asyncValidators",k);h(g,u);a.push(k.then(function(){h(g,!0)},function(a){e=!1;h(g,!1)}))});a.length?l.all(a).then(function(){k(e)},A):k(!0)}function h(a,c){m===x&&n.$setValidity(a,
+c)}function k(a){m===x&&e(a)}x++;var m=x;(function(a){var c=n.$$parserName||"parse";if(a===u)h(c,null);else if(h(c,a),!a)return r(n.$validators,function(a,c){h(c,null)}),r(n.$asyncValidators,function(a,c){h(c,null)}),!1;return!0})(a)?f()?g():k(!1):k(!1)};this.$commitViewValue=function(){var a=n.$viewValue;k.cancel(p);if(n.$$lastCommittedViewValue!==a||""===a&&n.$$hasNativeValidators)n.$$lastCommittedViewValue=a,n.$pristine&&(n.$dirty=!0,n.$pristine=!1,g.removeClass(e,Qa),g.addClass(e,Db),v.$setDirty()),
+this.$$parseAndValidate()};this.$$parseAndValidate=function(){var a=n.$$lastCommittedViewValue,c=a,d=w(c)?u:!0;if(d)for(var e=0;e<n.$parsers.length;e++)if(c=n.$parsers[e](c),w(c)){d=!1;break}W(n.$modelValue)&&isNaN(n.$modelValue)&&(n.$modelValue=s());var f=n.$modelValue,g=n.$options&&n.$options.allowInvalid;g&&(n.$modelValue=c,n.$modelValue!==f&&n.$$writeModelToScope());n.$$runValidators(d,c,a,function(a){g||(n.$modelValue=a?c:u,n.$modelValue!==f&&n.$$writeModelToScope())})};this.$$writeModelToScope=
+function(){J(n.$modelValue);r(n.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}})};this.$setViewValue=function(a,c){n.$viewValue=a;n.$options&&!n.$options.updateOnDefault||n.$$debounceViewValueCommit(c)};this.$$debounceViewValueCommit=function(c){var d=0,e=n.$options;e&&z(e.debounce)&&(e=e.debounce,W(e)?d=e:W(e[c])?d=e[c]:W(e["default"])&&(d=e["default"]));k.cancel(p);d?p=k(function(){n.$commitViewValue()},d):h.$$phase?n.$commitViewValue():a.$apply(function(){n.$commitViewValue()})};a.$watch(function(){var a=
+s();if(a!==n.$modelValue){n.$modelValue=a;for(var c=n.$formatters,d=c.length,e=a;d--;)e=c[d](e);n.$viewValue!==e&&(n.$viewValue=n.$$lastCommittedViewValue=e,n.$render(),n.$$runValidators(u,a,e,A))}return a})}],qe=function(){return{restrict:"A",require:["ngModel","^?form","^?ngModelOptions"],controller:Of,priority:1,compile:function(a){a.addClass(Qa).addClass("ng-untouched").addClass(gb);return{pre:function(a,d,e,f){var g=f[0],k=f[1]||Cb;g.$$setOptions(f[2]&&f[2].$options);k.$addControl(g);e.$observe("name",
+function(a){g.$name!==a&&k.$$renameControl(g,a)});a.$on("$destroy",function(){k.$removeControl(g)})},post:function(a,d,e,f){var g=f[0];if(g.$options&&g.$options.updateOn)d.on(g.$options.updateOn,function(a){g.$$debounceViewValueCommit(a&&a.type)});d.on("blur",function(d){g.$touched||a.$apply(function(){g.$setTouched()})})}}}}},se=da({restrict:"A",require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),xc=function(){return{restrict:"A",require:"?ngModel",
+link:function(a,c,d,e){e&&(d.required=!0,e.$validators.required=function(a){return!d.required||!e.$isEmpty(a)},d.$observe("required",function(){e.$validate()}))}}},wc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f,g=d.ngPattern||d.pattern;d.$observe("pattern",function(a){I(a)&&0<a.length&&(a=new RegExp(a));if(a&&!a.test)throw y("ngPattern")("noregexp",g,a,sa(c));f=a||u;e.$validate()});e.$validators.pattern=function(a){return e.$isEmpty(a)||w(f)||f.test(a)}}}}},
+zc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f=0;d.$observe("maxlength",function(a){f=ba(a)||0;e.$validate()});e.$validators.maxlength=function(a,c){return e.$isEmpty(a)||c.length<=f}}}}},yc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f=0;d.$observe("minlength",function(a){f=ba(a)||0;e.$validate()});e.$validators.minlength=function(a,c){return e.$isEmpty(a)||c.length>=f}}}}},re=function(){return{restrict:"A",priority:100,
+require:"ngModel",link:function(a,c,d,e){var f=c.attr(d.$attr.ngList)||", ",g="false"!==d.ngTrim,k=g?U(f):f;e.$parsers.push(function(a){if(!w(a)){var c=[];a&&r(a.split(k),function(a){a&&c.push(g?U(a):a)});return c}});e.$formatters.push(function(a){return B(a)?a.join(f):u});e.$isEmpty=function(a){return!a||!a.length}}}},Pf=/^(true|false|\d+)$/,te=function(){return{restrict:"A",priority:100,compile:function(a,c){return Pf.test(c.ngValue)?function(a,c,f){f.$set("value",a.$eval(f.ngValue))}:function(a,
+c,f){a.$watch(f.ngValue,function(a){f.$set("value",a)})}}}},ue=function(){return{restrict:"A",controller:["$scope","$attrs",function(a,c){var d=this;this.$options=a.$eval(c.ngModelOptions);this.$options.updateOn!==u?(this.$options.updateOnDefault=!1,this.$options.updateOn=U(this.$options.updateOn.replace(Nf,function(){d.$options.updateOnDefault=!0;return" "}))):this.$options.updateOnDefault=!0}]}},Ud=["$compile",function(a){return{restrict:"AC",compile:function(c){a.$$addBindingClass(c);return function(c,
+e,f){a.$$addBindingInfo(e,f.ngBind);e=e[0];c.$watch(f.ngBind,function(a){e.textContent=a===u?"":a})}}}}],Wd=["$interpolate","$compile",function(a,c){return{compile:function(d){c.$$addBindingClass(d);return function(d,f,g){d=a(f.attr(g.$attr.ngBindTemplate));c.$$addBindingInfo(f,d.expressions);f=f[0];g.$observe("ngBindTemplate",function(a){f.textContent=a===u?"":a})}}}}],Vd=["$sce","$parse","$compile",function(a,c,d){return{restrict:"A",compile:function(e,f){var g=c(f.ngBindHtml),k=c(f.ngBindHtml,
+function(a){return(a||"").toString()});d.$$addBindingClass(e);return function(c,e,f){d.$$addBindingInfo(e,f.ngBindHtml);c.$watch(k,function(){e.html(a.getTrustedHtml(g(c))||"")})}}}}],Xd=fc("",!0),Zd=fc("Odd",0),Yd=fc("Even",1),$d=Ha({compile:function(a,c){c.$set("ngCloak",u);a.removeClass("ng-cloak")}}),ae=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],Ac={},Qf={blur:!0,focus:!0};r("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),
+function(a){var c=ua("ng-"+a);Ac[c]=["$parse","$rootScope",function(d,e){return{restrict:"A",compile:function(f,g){var k=d(g[c]);return function(c,d){d.on(a,function(d){var f=function(){k(c,{$event:d})};Qf[a]&&e.$$phase?c.$evalAsync(f):c.$apply(f)})}}}}]});var de=["$animate",function(a){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,f,g){var k,h,l;c.$watch(e.ngIf,function(c){c?h||g(function(c,f){h=f;c[c.length++]=X.createComment(" end ngIf: "+
+e.ngIf+" ");k={clone:c};a.enter(c,d.parent(),d)}):(l&&(l.remove(),l=null),h&&(h.$destroy(),h=null),k&&(l=ob(k.clone),a.leave(l).then(function(){l=null}),k=null))})}}}],ee=["$templateRequest","$anchorScroll","$animate","$sce",function(a,c,d,e){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:ta.noop,compile:function(f,g){var k=g.ngInclude||g.src,h=g.onload||"",l=g.autoscroll;return function(f,g,p,n,r){var u=0,v,x,t,y=function(){x&&(x.remove(),x=null);v&&(v.$destroy(),
+v=null);t&&(d.leave(t).then(function(){x=null}),x=t,t=null)};f.$watch(e.parseAsResourceUrl(k),function(e){var k=function(){!z(l)||l&&!f.$eval(l)||c()},p=++u;e?(a(e,!0).then(function(a){if(p===u){var c=f.$new();n.template=a;a=r(c,function(a){y();d.enter(a,null,g).then(k)});v=c;t=a;v.$emit("$includeContentLoaded",e);f.$eval(h)}},function(){p===u&&(y(),f.$emit("$includeContentError",e))}),f.$emit("$includeContentRequested",e)):(y(),n.template=null)})}}}}],ve=["$compile",function(a){return{restrict:"ECA",
+priority:-400,require:"ngInclude",link:function(c,d,e,f){/SVG/.test(d[0].toString())?(d.empty(),a(Dc(f.template,X).childNodes)(c,function(a){d.append(a)},u,u,d)):(d.html(f.template),a(d.contents())(c))}}}],fe=Ha({priority:450,compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),ge=Ha({terminal:!0,priority:1E3}),he=["$locale","$interpolate",function(a,c){var d=/{}/g;return{restrict:"EA",link:function(e,f,g){var k=g.count,h=g.$attr.when&&f.attr(g.$attr.when),l=g.offset||0,m=e.$eval(h)||
+{},q={},p=c.startSymbol(),n=c.endSymbol(),s=/^when(Minus)?(.+)$/;r(g,function(a,c){s.test(c)&&(m[N(c.replace("when","").replace("Minus","-"))]=f.attr(g.$attr[c]))});r(m,function(a,e){q[e]=c(a.replace(d,p+k+"-"+l+n))});e.$watch(function(){var c=parseFloat(e.$eval(k));if(isNaN(c))return"";c in m||(c=a.pluralCat(c-l));return q[c](e)},function(a){f.text(a)})}}}],ie=["$parse","$animate",function(a,c){var d=y("ngRepeat"),e=function(a,c,d,e,l,m,q){a[d]=e;l&&(a[l]=m);a.$index=c;a.$first=0===c;a.$last=c===
+q-1;a.$middle=!(a.$first||a.$last);a.$odd=!(a.$even=0===(c&1))};return{restrict:"A",multiElement:!0,transclude:"element",priority:1E3,terminal:!0,$$tlb:!0,compile:function(f,g){var k=g.ngRepeat,h=X.createComment(" end ngRepeat: "+k+" "),l=k.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);if(!l)throw d("iexp",k);var m=l[1],q=l[2],p=l[3],n=l[4],l=m.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);if(!l)throw d("iidexp",m);var s=l[3]||l[1],J=
+l[2];if(p&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(p)||/^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent)$/.test(p)))throw d("badident",p);var v,x,t,y,z={$id:La};n?v=a(n):(t=function(a,c){return La(c)},y=function(a){return a});return function(a,f,g,l,n){v&&(x=function(c,d,e){J&&(z[J]=c);z[s]=d;z.$index=e;return v(a,z)});var m=wa();a.$watchCollection(q,function(g){var l,q,z=f[0],H,v=wa(),C,Q,A,E,w,B,F;p&&(a[p]=g);if(Ra(g))w=g,q=x||t;else{q=x||y;w=[];for(F in g)g.hasOwnProperty(F)&&
+"$"!=F.charAt(0)&&w.push(F);w.sort()}C=w.length;F=Array(C);for(l=0;l<C;l++)if(Q=g===w?l:w[l],A=g[Q],E=q(Q,A,l),m[E])B=m[E],delete m[E],v[E]=B,F[l]=B;else{if(v[E])throw r(F,function(a){a&&a.scope&&(m[a.id]=a)}),d("dupes",k,E,ra(A));F[l]={id:E,scope:u,clone:u};v[E]=!0}for(H in m){B=m[H];E=ob(B.clone);c.leave(E);if(E[0].parentNode)for(l=0,q=E.length;l<q;l++)E[l].$$NG_REMOVED=!0;B.scope.$destroy()}for(l=0;l<C;l++)if(Q=g===w?l:w[l],A=g[Q],B=F[l],B.scope){H=z;do H=H.nextSibling;while(H&&H.$$NG_REMOVED);
+B.clone[0]!=H&&c.move(ob(B.clone),null,D(z));z=B.clone[B.clone.length-1];e(B.scope,l,s,A,J,Q,C)}else n(function(a,d){B.scope=d;var f=h.cloneNode(!1);a[a.length++]=f;c.enter(a,null,D(z));z=f;B.clone=a;v[B.id]=B;e(B.scope,l,s,A,J,Q,C)});m=v})}}}}],je=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(c,d,e){c.$watch(e.ngShow,function(c){a[c?"removeClass":"addClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],ce=["$animate",function(a){return{restrict:"A",multiElement:!0,
+link:function(c,d,e){c.$watch(e.ngHide,function(c){a[c?"addClass":"removeClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],ke=Ha(function(a,c,d){a.$watch(d.ngStyle,function(a,d){d&&a!==d&&r(d,function(a,d){c.css(d,"")});a&&c.css(a)},!0)}),le=["$animate",function(a){return{restrict:"EA",require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(c,d,e,f){var g=[],k=[],h=[],l=[],m=function(a,c){return function(){a.splice(c,1)}};c.$watch(e.ngSwitch||e.on,function(c){var d,
+e;d=0;for(e=h.length;d<e;++d)a.cancel(h[d]);d=h.length=0;for(e=l.length;d<e;++d){var s=ob(k[d].clone);l[d].$destroy();(h[d]=a.leave(s)).then(m(h,d))}k.length=0;l.length=0;(g=f.cases["!"+c]||f.cases["?"])&&r(g,function(c){c.transclude(function(d,e){l.push(e);var f=c.element;d[d.length++]=X.createComment(" end ngSwitchWhen: ");k.push({clone:d});a.enter(d,f.parent(),f)})})})}}}],me=Ha({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,c,d,e,f){e.cases["!"+d.ngSwitchWhen]=
+e.cases["!"+d.ngSwitchWhen]||[];e.cases["!"+d.ngSwitchWhen].push({transclude:f,element:c})}}),ne=Ha({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,c,d,e,f){e.cases["?"]=e.cases["?"]||[];e.cases["?"].push({transclude:f,element:c})}}),pe=Ha({restrict:"EAC",link:function(a,c,d,e,f){if(!f)throw y("ngTransclude")("orphan",sa(c));f(function(a){c.empty();c.append(a)})}}),Qd=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(c,d){"text/ng-template"==
+d.type&&a.put(d.id,c[0].text)}}}],Rf=y("ngOptions"),oe=da({restrict:"A",terminal:!0}),Rd=["$compile","$parse",function(a,c){var d=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,e={$setViewValue:A};return{restrict:"E",require:["select","?ngModel"],controller:["$element","$scope","$attrs",function(a,c,d){var h=this,l={},m=e,q;h.databound=d.ngModel;
+h.init=function(a,c,d){m=a;q=d};h.addOption=function(c,d){Ka(c,'"option value"');l[c]=!0;m.$viewValue==c&&(a.val(c),q.parent()&&q.remove());d&&d[0].hasAttribute("selected")&&(d[0].selected=!0)};h.removeOption=function(a){this.hasOption(a)&&(delete l[a],m.$viewValue==a&&this.renderUnknownOption(a))};h.renderUnknownOption=function(c){c="? "+La(c)+" ?";q.val(c);a.prepend(q);a.val(c);q.prop("selected",!0)};h.hasOption=function(a){return l.hasOwnProperty(a)};c.$on("$destroy",function(){h.renderUnknownOption=
+A})}],link:function(e,g,k,h){function l(a,c,d,e){d.$render=function(){var a=d.$viewValue;e.hasOption(a)?(C.parent()&&C.remove(),c.val(a),""===a&&v.prop("selected",!0)):w(a)&&v?c.val(""):e.renderUnknownOption(a)};c.on("change",function(){a.$apply(function(){C.parent()&&C.remove();d.$setViewValue(c.val())})})}function m(a,c,d){var e;d.$render=function(){var a=new bb(d.$viewValue);r(c.find("option"),function(c){c.selected=z(a.get(c.value))})};a.$watch(function(){la(e,d.$viewValue)||(e=qa(d.$viewValue),
+d.$render())});c.on("change",function(){a.$apply(function(){var a=[];r(c.find("option"),function(c){c.selected&&a.push(c.value)});d.$setViewValue(a)})})}function q(e,f,g){function h(a,c,d){N[A]=d;F&&(N[F]=c);return a(e,N)}function k(a){var c;if(n)if(G&&B(a)){c=new bb([]);for(var d=0;d<a.length;d++)c.put(h(G,null,a[d]),!0)}else c=new bb(a);else G&&(a=h(G,null,a));return function(d,e){var f;f=G?G:w?w:I;return n?z(c.remove(h(f,d,e))):a==h(f,d,e)}}function l(){x||(e.$$postDigest(q),x=!0)}function m(a,
+c,d){a[c]=a[c]||0;a[c]+=d?1:-1}function q(){x=!1;var a={"":[]},c=[""],d,l,s,u,v;s=g.$viewValue;u=P(e)||[];var A=F?ic(u):u,w,B,D,I,G,N={};I=k(s);v=!1;var S;for(G=0;D=A.length,G<D;G++){w=G;if(F&&(w=A[G],"$"===w.charAt(0)))continue;B=u[w];d=h(M,w,B)||"";(l=a[d])||(l=a[d]=[],c.push(d));d=I(w,B);v=v||d;w=h(C,w,B);w=z(w)?w:"";l.push({id:F?A[G]:G,label:w,selected:d})}n||(y||null===s?a[""].unshift({id:"",label:"",selected:!v}):v||a[""].unshift({id:"?",label:"",selected:!0}));I=0;for(A=c.length;I<A;I++){d=
+c[I];l=a[d];R.length<=I?(s={element:E.clone().attr("label",d),label:l.label},u=[s],R.push(u),f.append(s.element)):(u=R[I],s=u[0],s.label!=d&&s.element.attr("label",s.label=d));w=null;G=0;for(D=l.length;G<D;G++)d=l[G],(v=u[G+1])?(w=v.element,v.label!==d.label&&(m(N,v.label,!1),m(N,d.label,!0),w.text(v.label=d.label)),v.id!==d.id&&w.val(v.id=d.id),w[0].selected!==d.selected&&(w.prop("selected",v.selected=d.selected),Pa&&w.prop("selected",v.selected))):(""===d.id&&y?S=y:(S=t.clone()).val(d.id).prop("selected",
+d.selected).attr("selected",d.selected).text(d.label),u.push(v={element:S,label:d.label,id:d.id,selected:d.selected}),m(N,d.label,!0),w?w.after(S):s.element.append(S),w=S);for(G++;u.length>G;)d=u.pop(),m(N,d.label,!1),d.element.remove();r(N,function(a,c){0<a?p.addOption(c):0>a&&p.removeOption(c)})}for(;R.length>I;)R.pop()[0].element.remove()}var v;if(!(v=s.match(d)))throw Rf("iexp",s,sa(f));var C=c(v[2]||v[1]),A=v[4]||v[6],D=/ as /.test(v[0])&&v[1],w=D?c(D):null,F=v[5],M=c(v[3]||""),I=c(v[2]?v[1]:
+A),P=c(v[7]),G=v[8]?c(v[8]):null,R=[[{element:f,label:""}]],N={};y&&(a(y)(e),y.removeClass("ng-scope"),y.remove());f.empty();f.on("change",function(){e.$apply(function(){var a=P(e)||[],c;if(n)c=[],r(f.val(),function(d){c.push("?"===d?u:""===d?null:h(w?w:I,d,a[d]))});else{var d=f.val();c="?"===d?u:""===d?null:h(w?w:I,d,a[d])}g.$setViewValue(c);q()})});g.$render=q;e.$watchCollection(P,l);e.$watchCollection(function(){var a=P(e),c;if(a&&B(a)){c=Array(a.length);for(var d=0,f=a.length;d<f;d++)c[d]=h(C,
+d,a[d])}else if(a)for(d in c={},a)a.hasOwnProperty(d)&&(c[d]=h(C,d,a[d]));return c},l);n&&e.$watchCollection(function(){return g.$modelValue},l)}if(h[1]){var p=h[0];h=h[1];var n=k.multiple,s=k.ngOptions,y=!1,v,x=!1,t=D(X.createElement("option")),E=D(X.createElement("optgroup")),C=t.clone();k=0;for(var A=g.children(),F=A.length;k<F;k++)if(""===A[k].value){v=y=A.eq(k);break}p.init(h,y,C);n&&(h.$isEmpty=function(a){return!a||0===a.length});s?q(e,g,h):n?m(e,g,h):l(e,g,h,p)}}}}],Td=["$interpolate",function(a){var c=
+{addOption:A,removeOption:A};return{restrict:"E",priority:100,compile:function(d,e){if(w(e.value)){var f=a(d.text(),!0);f||e.$set("value",d.text())}return function(a,d,e){var l=d.parent(),m=l.data("$selectController")||l.parent().data("$selectController");m&&m.databound||(m=c);f?a.$watch(f,function(a,c){e.$set("value",a);c!==a&&m.removeOption(c);m.addOption(a,d)}):m.addOption(e.value,d);d.on("$destroy",function(){m.removeOption(e.value)})}}}}],Sd=da({restrict:"E",terminal:!1});S.angular.bootstrap?
+console.log("WARNING: Tried to load angular more than once."):(Id(),Kd(ta),D(X).ready(function(){Ed(X,rc)}))})(window,document);!window.angular.$$csp()&&window.angular.element(document).find("head").prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}</style>');
+//# sourceMappingURL=angular.min.js.map
diff --git a/third-party/angular-1.3.0/angular.min.js.map b/third-party/angular-1.3.0/angular.min.js.map
new file mode 100644 (file)
index 0000000..178bdf4
--- /dev/null
@@ -0,0 +1,8 @@
+{
+"version":3,
+"file":"angular.min.js",
+"lineCount":246,
+"mappings":"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",
+"sources":["angular.js"],
+"names":["window","document","undefined","minErr","isArrayLike","obj","isWindow","length","nodeType","NODE_TYPE_ELEMENT","isString","isArray","forEach","iterator","context","key","isFunction","hasOwnProperty","call","isPrimitive","sortedKeys","keys","push","sort","forEachSorted","i","reverseParams","iteratorFn","value","nextUid","uid","setHashKey","h","$$hashKey","extend","dst","ii","arguments","Object","j","jj","int","str","parseInt","inherit","parent","extra","prototype","noop","identity","$","valueFn","isUndefined","isDefined","isObject","isNumber","isDate","toString","isRegExp","isScope","$evalAsync","$watch","isBoolean","isElement","node","nodeName","prop","attr","find","makeMap","items","split","nodeName_","element","lowercase","arrayRemove","array","index","indexOf","splice","copy","source","destination","stackSource","stackDest","ngMinErr","result","Date","getTime","RegExp","match","lastIndex","emptyObject","create","getPrototypeOf","shallowCopy","src","charAt","equals","o1","o2","t1","t2","keySet","concat","array1","array2","slice","bind","self","fn","curryArgs","startIndex","apply","toJsonReplacer","val","toJson","pretty","JSON","stringify","fromJson","json","parse","startingTag","jqLite","clone","empty","e","elemHtml","append","html","NODE_TYPE_TEXT","replace","tryDecodeURIComponent","decodeURIComponent","parseKeyValue","keyValue","key_value","toKeyValue","parts","arrayValue","encodeUriQuery","join","encodeUriSegment","pctEncodeSpaces","encodeURIComponent","getNgAttribute","ngAttr","ngAttrPrefixes","angularInit","bootstrap","appElement","module","config","prefix","name","hasAttribute","getAttribute","candidate","querySelector","strictDi","modules","defaultConfig","doBootstrap","injector","tag","unshift","$provide","debugInfoEnabled","$compileProvider","createInjector","invoke","bootstrapApply","scope","compile","$apply","data","NG_ENABLE_DEBUG_INFO","NG_DEFER_BOOTSTRAP","test","angular","resumeBootstrap","angular.resumeBootstrap","extraModules","reloadWithDebugInfo","location","reload","getTestability","rootElement","get","snake_case","separator","SNAKE_CASE_REGEXP","letter","pos","toLowerCase","bindJQuery","originalCleanData","bindJQueryFired","jQuery","on","JQLitePrototype","isolateScope","controller","inheritedData","cleanData","jQuery.cleanData","elems","events","skipDestroyOnNextJQueryCleanData","elem","_data","$destroy","triggerHandler","JQLite","assertArg","arg","reason","assertArgFn","acceptArrayAnnotation","constructor","assertNotHasOwnProperty","getter","path","bindFnToScope","lastInstance","len","getBlockNodes","nodes","endNode","blockNodes","nextSibling","createMap","setupModuleLoader","ensure","factory","$injectorMinErr","$$minErr","requires","configFn","invokeLater","provider","method","insertMethod","queue","invokeQueue","moduleInstance","configBlocks","runBlocks","_invokeQueue","_configBlocks","_runBlocks","service","constant","animation","filter","directive","run","block","publishExternalAPI","version","uppercase","counter","csp","angularModule","$LocaleProvider","ngModule","$$sanitizeUri","$$SanitizeUriProvider","$CompileProvider","a","htmlAnchorDirective","input","inputDirective","textarea","form","formDirective","script","scriptDirective","select","selectDirective","style","styleDirective","option","optionDirective","ngBind","ngBindDirective","ngBindHtml","ngBindHtmlDirective","ngBindTemplate","ngBindTemplateDirective","ngClass","ngClassDirective","ngClassEven","ngClassEvenDirective","ngClassOdd","ngClassOddDirective","ngCloak","ngCloakDirective","ngController","ngControllerDirective","ngForm","ngFormDirective","ngHide","ngHideDirective","ngIf","ngIfDirective","ngInclude","ngIncludeDirective","ngInit","ngInitDirective","ngNonBindable","ngNonBindableDirective","ngPluralize","ngPluralizeDirective","ngRepeat","ngRepeatDirective","ngShow","ngShowDirective","ngStyle","ngStyleDirective","ngSwitch","ngSwitchDirective","ngSwitchWhen","ngSwitchWhenDirective","ngSwitchDefault","ngSwitchDefaultDirective","ngOptions","ngOptionsDirective","ngTransclude","ngTranscludeDirective","ngModel","ngModelDirective","ngList","ngListDirective","ngChange","ngChangeDirective","pattern","patternDirective","ngPattern","required","requiredDirective","ngRequired","minlength","minlengthDirective","ngMinlength","maxlength","maxlengthDirective","ngMaxlength","ngValue","ngValueDirective","ngModelOptions","ngModelOptionsDirective","ngIncludeFillContentDirective","ngAttributeAliasDirectives","ngEventDirectives","$anchorScroll","$AnchorScrollProvider","$animate","$AnimateProvider","$browser","$BrowserProvider","$cacheFactory","$CacheFactoryProvider","$controller","$ControllerProvider","$document","$DocumentProvider","$exceptionHandler","$ExceptionHandlerProvider","$filter","$FilterProvider","$interpolate","$InterpolateProvider","$interval","$IntervalProvider","$http","$HttpProvider","$httpBackend","$HttpBackendProvider","$location","$LocationProvider","$log","$LogProvider","$parse","$ParseProvider","$rootScope","$RootScopeProvider","$q","$QProvider","$$q","$$QProvider","$sce","$SceProvider","$sceDelegate","$SceDelegateProvider","$sniffer","$SnifferProvider","$templateCache","$TemplateCacheProvider","$templateRequest","$TemplateRequestProvider","$$testability","$$TestabilityProvider","$timeout","$TimeoutProvider","$window","$WindowProvider","$$rAF","$$RAFProvider","$$asyncCallback","$$AsyncCallbackProvider","camelCase","SPECIAL_CHARS_REGEXP","_","offset","toUpperCase","MOZ_HACK_REGEXP","jqLiteAcceptsData","NODE_TYPE_DOCUMENT","jqLiteBuildFragment","tmp","fragment","createDocumentFragment","HTML_REGEXP","appendChild","createElement","TAG_NAME_REGEXP","exec","wrap","wrapMap","_default","innerHTML","XHTML_TAG_REGEXP","lastChild","childNodes","firstChild","textContent","createTextNode","argIsString","trim","jqLiteMinErr","parsed","SINGLE_TAG_REGEXP","jqLiteAddNodes","jqLiteClone","cloneNode","jqLiteDealoc","onlyDescendants","jqLiteRemoveData","querySelectorAll","descendants","l","jqLiteOff","type","unsupported","expandoStore","jqLiteExpandoStore","handle","listenerFns","removeEventListener","expandoId","ng339","jqCache","createIfNecessary","jqId","jqLiteData","isSimpleSetter","isSimpleGetter","massGetter","jqLiteHasClass","selector","jqLiteRemoveClass","cssClasses","setAttribute","cssClass","jqLiteAddClass","existingClasses","root","elements","jqLiteController","jqLiteInheritedData","documentElement","names","parentNode","NODE_TYPE_DOCUMENT_FRAGMENT","host","jqLiteEmpty","removeChild","jqLiteRemove","keepData","jqLiteDocumentLoaded","action","win","readyState","setTimeout","getBooleanAttrName","booleanAttr","BOOLEAN_ATTR","BOOLEAN_ELEMENTS","getAliasedAttrName","ALIASED_ATTR","createEventHandler","eventHandler","event","isDefaultPrevented","event.isDefaultPrevented","defaultPrevented","eventFns","eventFnsLength","immediatePropagationStopped","originalStopImmediatePropagation","stopImmediatePropagation","event.stopImmediatePropagation","stopPropagation","isImmediatePropagationStopped","event.isImmediatePropagationStopped","hashKey","nextUidFn","objType","HashMap","isolatedUid","this.nextUid","put","anonFn","args","fnText","STRIP_COMMENTS","FN_ARGS","annotate","$inject","argDecl","FN_ARG_SPLIT","FN_ARG","all","underscore","last","modulesToLoad","supportObject","delegate","provider_","providerInjector","instantiate","$get","providerCache","providerSuffix","enforceReturnValue","enforcedReturnValue","instanceInjector","factoryFn","enforce","loadModules","moduleFn","runInvokeQueue","invokeArgs","loadedModules","message","stack","createInternalInjector","cache","getService","serviceName","INSTANTIATING","err","shift","locals","Type","Constructor","instance","returnedValue","has","$injector","instanceCache","decorator","decorFn","origProvider","orig$get","origProvider.$get","origInstance","$delegate","servicename","autoScrollingEnabled","disableAutoScrolling","this.disableAutoScrolling","getFirstAnchor","list","Array","some","scrollTo","scrollIntoView","scroll","yOffset","getComputedStyle","position","getBoundingClientRect","bottom","elemTop","top","scrollBy","hash","elm","getElementById","getElementsByName","autoScrollWatch","autoScrollWatchAction","newVal","oldVal","supported","Browser","completeOutstandingRequest","outstandingRequestCount","outstandingRequestCallbacks","pop","error","startPoller","interval","check","pollFns","pollFn","pollTimeout","cacheStateAndFireUrlChange","cacheState","fireUrlChange","cachedState","history","state","lastCachedState","lastBrowserUrl","url","lastHistoryState","urlChangeListeners","listener","safeDecodeURIComponent","rawDocument","clearTimeout","pendingDeferIds","isMock","$$completeOutstandingRequest","$$incOutstandingRequestCount","self.$$incOutstandingRequestCount","notifyWhenNoOutstandingRequests","self.notifyWhenNoOutstandingRequests","callback","addPollFn","self.addPollFn","href","baseElement","reloadLocation","self.url","sameState","sameBase","stripHash","self.state","urlChangeInit","onUrlChange","self.onUrlChange","$$checkUrlChange","baseHref","self.baseHref","lastCookies","lastCookieString","cookiePath","cookies","self.cookies","cookieLength","cookie","warn","cookieArray","substring","defer","self.defer","delay","timeoutId","cancel","self.defer.cancel","deferId","this.$get","cacheFactory","cacheId","options","refresh","entry","freshEnd","staleEnd","n","link","p","nextEntry","prevEntry","caches","size","stats","id","capacity","Number","MAX_VALUE","lruHash","lruEntry","remove","removeAll","destroy","info","cacheFactory.info","cacheFactory.get","$$sanitizeUriProvider","parseIsolateBindings","directiveName","LOCAL_REGEXP","bindings","definition","scopeName","$compileMinErr","attrName","mode","optional","hasDirectives","COMMENT_DIRECTIVE_REGEXP","CLASS_DIRECTIVE_REGEXP","ALL_OR_NOTHING_ATTRS","REQUIRE_PREFIX_REGEXP","EVENT_HANDLER_ATTR_REGEXP","this.directive","registerDirective","directiveFactory","Suffix","directives","priority","require","restrict","$$isolateBindings","aHrefSanitizationWhitelist","this.aHrefSanitizationWhitelist","regexp","imgSrcSanitizationWhitelist","this.imgSrcSanitizationWhitelist","this.debugInfoEnabled","enabled","safeAddClass","$element","className","addClass","$compileNodes","transcludeFn","maxPriority","ignoreDirective","previousCompileContext","nodeValue","compositeLinkFn","compileNodes","$$addScopeClass","namespace","publicLinkFn","cloneConnectFn","transcludeControllers","parentBoundTranscludeFn","futureParentElement","$linkNode","wrapTemplate","controllerName","$$addScopeInfo","nodeList","$rootElement","childLinkFn","childScope","childBoundTranscludeFn","stableNodeList","nodeLinkFnFound","linkFns","idx","nodeLinkFn","$new","transcludeOnThisElement","createBoundTranscludeFn","transclude","elementTranscludeOnThisElement","templateOnThisElement","attrs","linkFnFound","Attributes","collectDirectives","applyDirectivesToNode","$$element","terminal","previousBoundTranscludeFn","elementTransclusion","boundTranscludeFn","transcludedScope","cloneFn","controllers","containingScope","$$transcluded","attrsMap","$attr","addDirective","directiveNormalize","nName","isNgAttr","nAttrs","attributes","attrStartName","attrEndName","ngAttrName","NG_ATTR_BINDING","substr","directiveNName","multiElement","addAttrInterpolateDirective","addTextInterpolateDirective","NODE_TYPE_COMMENT","byPriority","groupScan","attrStart","attrEnd","depth","groupElementsLinkFnWrapper","linkFn","compileNode","templateAttrs","jqCollection","originalReplaceDirective","preLinkFns","postLinkFns","addLinkFns","pre","post","newIsolateScopeDirective","$$isolateScope","cloneAndAnnotateFn","getControllers","elementControllers","retrievalMethod","$searchElement","linkNode","controllersBoundTransclude","cloneAttachFn","hasElementTranscludeDirective","scopeToChild","controllerDirectives","$scope","$attrs","$transclude","controllerInstance","controllerAs","templateDirective","$$originalDirective","isolateScopeController","isolateBindingContext","identifier","bindToController","lastValue","parentGet","parentSet","compare","$observe","$$observers","$$scope","literal","b","assign","parentValueWatch","parentValue","$stateful","unwatch","$on","invokeLinkFn","template","templateUrl","terminalPriority","newScopeDirective","nonTlbTranscludeDirective","hasTranscludeDirective","hasTemplate","$compileNode","$template","childTranscludeFn","$$start","$$end","directiveValue","assertNoDuplicate","$$tlb","createComment","replaceWith","replaceDirective","contents","denormalizeTemplate","removeComments","templateNamespace","newTemplateAttrs","templateDirectives","unprocessedDirectives","markDirectivesAsIsolate","mergeTemplateAttributes","compileTemplateUrl","Math","max","tDirectives","startAttrName","endAttrName","srcAttr","dstAttr","$set","tAttrs","linkQueue","afterTemplateNodeLinkFn","afterTemplateChildLinkFn","beforeTemplateCompileNode","origAsyncDirective","derivedSyncDirective","getTrustedResourceUrl","then","content","tempTemplateAttrs","beforeTemplateLinkNode","linkRootElement","$$destroyed","oldClasses","delayedNodeLinkFn","ignoreChildLinkFn","diff","what","previousDirective","text","interpolateFn","textInterpolateCompileFn","templateNode","templateNodeParent","hasCompileParent","$$addBindingClass","textInterpolateLinkFn","$$addBindingInfo","expressions","interpolateFnWatchAction","wrapper","getTrustedContext","attrNormalizedName","HTML","RESOURCE_URL","allOrNothing","attrInterpolatePreLinkFn","$$inter","newValue","oldValue","$updateClass","elementsToRemove","newNode","firstElementToRemove","removeCount","j2","replaceChild","expando","k","kk","annotation","attributesToCopy","$normalize","$addClass","classVal","$removeClass","removeClass","newClasses","toAdd","tokenDifference","toRemove","writeAttr","booleanKey","aliasedKey","observer","trimmedSrcset","srcPattern","rawUris","nbrUrisWith2parts","floor","innerIdx","lastTuple","removeAttr","listeners","startSymbol","endSymbol","binding","isolated","noTemplate","dataName","PREFIX_REGEXP","str1","str2","values","tokens1","tokens2","token","jqNodes","globals","CNTRL_REG","register","this.register","allowGlobals","this.allowGlobals","addIdentifier","expression","later","ident","exception","cause","parseHeaders","headers","line","headersGetter","headersObj","transformData","fns","JSON_START","JSON_END","PROTECTION_PREFIX","CONTENT_TYPE_APPLICATION_JSON","defaults","transformResponse","defaultHttpResponseTransform","contentType","APPLICATION_JSON","transformRequest","d","common","patch","xsrfCookieName","xsrfHeaderName","useApplyAsync","this.useApplyAsync","interceptorFactories","interceptors","requestConfig","response","resp","status","reject","mergeHeaders","defHeaders","reqHeaders","defHeaderName","reqHeaderName","lowercaseDefHeaderName","execHeaders","headerContent","headerFn","header","chain","serverRequest","reqData","withCredentials","sendReq","promise","when","reversedInterceptors","interceptor","request","requestError","responseError","thenFn","rejectFn","success","promise.success","promise.error","done","headersString","statusText","resolveHttpPromise","resolvePromise","$applyAsync","$$phase","deferred","resolve","removePendingReq","pendingRequests","cachedResp","buildUrl","params","defaultCache","xsrfValue","urlIsSameOrigin","timeout","responseType","v","toISOString","interceptorFactory","createShortMethods","createShortMethodsWithData","createXhr","XMLHttpRequest","createHttpBackend","callbacks","$browserDefer","jsonpReq","callbackId","async","body","called","addEventListener","timeoutRequest","jsonpDone","xhr","abort","completeRequest","open","setRequestHeader","onload","xhr.onload","responseText","urlResolve","protocol","getAllResponseHeaders","onerror","onabort","send","this.startSymbol","this.endSymbol","escape","ch","mustHaveExpression","trustedContext","unescapeText","escapedStartRegexp","escapedEndRegexp","parseStringifyInterceptor","getTrusted","valueOf","newErr","$interpolateMinErr","endIndex","parseFns","textLength","expressionPositions","startSymbolLength","exp","endSymbolLength","compute","interpolationFn","$$watchDelegate","objectEquality","$watchGroup","interpolateFnWatcher","oldValues","currValue","$interpolate.startSymbol","$interpolate.endSymbol","count","invokeApply","setInterval","clearInterval","iteration","skipApply","$$intervalId","tick","notify","intervals","interval.cancel","NUMBER_FORMATS","DECIMAL_SEP","GROUP_SEP","PATTERNS","minInt","minFrac","maxFrac","posPre","posSuf","negPre","negSuf","gSize","lgSize","CURRENCY_SYM","DATETIME_FORMATS","MONTH","SHORTMONTH","DAY","SHORTDAY","AMPMS","medium","short","fullDate","longDate","mediumDate","shortDate","mediumTime","shortTime","pluralCat","num","encodePath","segments","parseAbsoluteUrl","absoluteUrl","locationObj","appBase","parsedUrl","$$protocol","$$host","hostname","$$port","port","DEFAULT_PORTS","parseAppUrl","relativeUrl","prefixed","$$path","pathname","$$search","search","$$hash","beginsWith","begin","whole","stripFile","lastIndexOf","LocationHtml5Url","basePrefix","$$html5","appBaseNoFile","$$parse","this.$$parse","pathUrl","$locationMinErr","$$compose","this.$$compose","$$url","$$absUrl","$$parseLinkUrl","this.$$parseLinkUrl","relHref","appUrl","prevAppUrl","rewrittenUrl","LocationHashbangUrl","hashPrefix","withoutBaseUrl","withoutHashUrl","windowsFilePathExp","firstPathSegmentMatch","LocationHashbangInHtml5Url","locationGetter","property","locationGetterSetter","preprocess","html5Mode","requireBase","rewriteLinks","this.hashPrefix","this.html5Mode","setBrowserUrlWithFallback","oldUrl","oldState","$$state","afterLocationChange","$broadcast","absUrl","LocationMode","initialUrl","IGNORE_URI_REGEXP","ctrlKey","metaKey","which","target","absHref","animVal","preventDefault","initializing","newUrl","newState","$digest","$locationWatch","currentReplace","$$replace","urlOrStateChanged","debug","debugEnabled","this.debugEnabled","flag","formatError","Error","sourceURL","consoleLog","console","logFn","log","hasApply","arg1","arg2","ensureSafeMemberName","fullExpression","$parseMinErr","ensureSafeObject","children","isConstant","setter","setValue","fullExp","propertyObj","cspSafeGetterFn","key0","key1","key2","key3","key4","cspSafeGetter","pathVal","getterFn","getterFnCache","pathKeys","pathKeysLength","code","evaledFnGetter","Function","sharedGetter","fn.assign","$parseOptions","wrapSharedExpression","wrapped","collectExpressionInputs","inputs","expressionInputDirtyCheck","oldValueOfValue","inputsWatchDelegate","parsedExpression","inputExpressions","$$inputs","lastResult","oldInputValue","expressionInputWatch","newInputValue","oldInputValueOfValues","expressionInputsWatch","changed","oneTimeWatchDelegate","oneTimeWatch","oneTimeListener","old","$$postDigest","oneTimeLiteralWatchDelegate","isAllDefined","allDefined","constantWatchDelegate","constantWatch","constantListener","addInterceptor","interceptorFn","oneTime","cacheKey","lexer","Lexer","parser","Parser","qFactory","nextTick","exceptionHandler","callOnce","resolveFn","Promise","simpleBind","scheduleProcessQueue","processScheduled","pending","Deferred","$qMinErr","TypeError","onFulfilled","onRejected","progressBack","catch","finally","handleCallback","$$reject","$$resolve","progress","makePromise","resolved","isResolved","callbackOutput","errback","$Q","Q","resolver","promises","results","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","cancelAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","webkitCancelRequestAnimationFrame","rafSupported","raf","timer","TTL","$rootScopeMinErr","lastDirtyWatch","applyAsyncId","digestTtl","this.digestTtl","Scope","$id","$parent","$$watchers","$$nextSibling","$$prevSibling","$$childHead","$$childTail","$root","$$listeners","$$listenerCount","beginPhase","phase","decrementListenerCount","current","initWatchVal","flushApplyAsync","applyAsyncQueue","scheduleApplyAsync","isolate","destroyChild","child","$$ChildScope","this.$$ChildScope","watchExp","watcher","eq","deregisterWatch","watchExpressions","watchGroupAction","changeReactionScheduled","firstRun","newValues","deregisterFns","shouldCall","deregisterWatchGroup","expr","unwatchFn","watchGroupSubAction","$watchCollection","$watchCollectionInterceptor","_value","bothNaN","newItem","oldItem","internalArray","oldLength","changeDetected","newLength","internalObject","veryOldValue","trackVeryOldValue","changeDetector","initRun","$watchCollectionAction","watch","watchers","dirty","ttl","watchLog","logIdx","logMsg","asyncTask","asyncQueue","$eval","isNaN","next","postDigestQueue","eventName","this.$watchGroup","$applyAsyncExpression","namedListeners","$emit","targetScope","listenerArgs","currentScope","$$asyncQueue","$$postDigestQueue","$$applyAsyncQueue","sanitizeUri","uri","isImage","regex","normalizedVal","adjustMatcher","matcher","$sceMinErr","adjustMatchers","matchers","adjustedMatchers","SCE_CONTEXTS","resourceUrlWhitelist","resourceUrlBlacklist","this.resourceUrlWhitelist","this.resourceUrlBlacklist","matchUrl","generateHolderType","Base","holderType","trustedValue","$$unwrapTrustedValue","this.$$unwrapTrustedValue","holderType.prototype.valueOf","holderType.prototype.toString","htmlSanitizer","trustedValueHolderBase","byType","CSS","URL","JS","trustAs","maybeTrusted","allowed","this.enabled","documentMode","sce","isEnabled","sce.isEnabled","sce.getTrusted","parseAs","sce.parseAs","enumValue","lName","eventSupport","android","userAgent","navigator","boxee","vendorPrefix","vendorRegex","bodyStyle","transitions","animations","webkitTransition","webkitAnimation","pushState","hasEvent","msie","divElm","handleRequestFn","tpl","ignoreRequestError","handleError","totalPendingRequests","testability","testability.findBindings","opt_exactMatch","getElementsByClassName","matches","dataBinding","bindingName","testability.findModels","prefixes","attributeEquals","testability.getLocation","testability.setLocation","testability.whenStable","deferreds","$$timeoutId","timeout.cancel","base","urlParsingNode","requestUrl","originUrl","filters","suffix","currencyFilter","dateFilter","filterFilter","jsonFilter","limitToFilter","lowercaseFilter","numberFilter","orderByFilter","uppercaseFilter","comparator","comparatorType","predicates","predicates.check","objKey","filtered","$locale","formats","amount","currencySymbol","fractionSize","formatNumber","number","groupSep","decimalSep","isFinite","isNegative","abs","numStr","formatedText","hasExponent","toFixed","fractionLen","min","round","fraction","lgroup","group","padNumber","digits","neg","dateGetter","date","dateStrGetter","shortForm","getFirstThursdayOfYear","year","dayOfWeekOnFirst","getDay","weekGetter","firstThurs","getFullYear","thisThurs","getMonth","getDate","jsonStringToDate","string","R_ISO8601_STR","tzHour","tzMin","dateSetter","setUTCFullYear","setFullYear","timeSetter","setUTCHours","setHours","m","s","ms","parseFloat","format","timezone","NUMBER_STRING","DATE_FORMATS_SPLIT","setMinutes","getMinutes","getTimezoneOffset","DATE_FORMATS","object","limit","Infinity","out","sortPredicate","reverseOrder","reverseComparator","comp","descending","v1","v2","map","predicate","arrayCopy","ngDirective","FormController","controls","parentForm","$$parentForm","nullFormCtrl","$error","$$success","$pending","$name","$dirty","$pristine","$valid","$invalid","$submitted","$addControl","$rollbackViewValue","form.$rollbackViewValue","control","$commitViewValue","form.$commitViewValue","form.$addControl","$$renameControl","form.$$renameControl","newName","oldName","$removeControl","form.$removeControl","$setValidity","addSetValidityMethod","ctrl","set","unset","$setDirty","form.$setDirty","PRISTINE_CLASS","DIRTY_CLASS","$setPristine","form.$setPristine","setClass","SUBMITTED_CLASS","$setUntouched","form.$setUntouched","$setSubmitted","form.$setSubmitted","stringBasedInputType","$formatters","$isEmpty","baseInputType","VALIDITY_STATE_PROPERTY","placeholder","noevent","composing","ev","ngTrim","$viewValue","$$hasNativeValidators","$setViewValue","deferListener","keyCode","$render","ctrl.$render","$modelValue","createDateParser","mapping","iso","ISO_DATE_REGEXP","yyyy","MM","dd","HH","getHours","mm","ss","getSeconds","sss","getMilliseconds","part","NaN","createDateInputType","parseDate","dynamicDateInputType","parseObservedDateValue","badInputChecker","$options","previousDate","$$parserName","$parsers","parsedDate","$ngModelMinErr","timezoneOffset","ngMin","minVal","$validators","ctrl.$validators.min","$validate","ngMax","maxVal","ctrl.$validators.max","ctrl.$isEmpty","validity","badInput","typeMismatch","parseConstantExpr","fallback","parseFn","cachedToggleClass","switchValue","classCache","toggleValidationCss","validationErrorKey","isValid","VALID_CLASS","INVALID_CLASS","hasClass","setValidity","isObjectEmpty","PENDING_CLASS","combinedState","classDirective","arrayDifference","arrayClasses","classes","digestClassCounts","classCounts","classesToUpdate","ngClassWatchAction","$index","old$index","mod","REGEX_STRING_REGEXP","isActive_","active","full","major","minor","dot","codeName","JQLite._data","MOUSE_EVENT_MAP","mouseleave","mouseenter","optgroup","tbody","tfoot","colgroup","caption","thead","th","td","ready","trigger","fired","removeData","removeAttribute","css","lowercasedName","specified","getNamedItem","ret","getText","$dv","multiple","selected","nodeCount","jqLiteOn","types","related","relatedTarget","contains","off","one","onFn","replaceNode","insertBefore","contentDocument","prepend","wrapNode","detach","after","newElement","toggleClass","condition","classCondition","nextElementSibling","getElementsByTagName","extraParameters","dummyEvent","handlerArgs","eventFnsCopy","arg3","unbind","$$annotate","$animateMinErr","$$selectors","classNameFilter","this.classNameFilter","$$classNameFilter","runAnimationPostDigest","cancelFn","$$cancelFn","defer.promise.$$cancelFn","ngAnimatePostDigest","ngAnimateNotifyComplete","resolveElementClasses","hasClasses","cachedClassManipulation","op","asyncPromise","currentDefer","applyStyles","styles","from","to","animate","enter","leave","move","$$addClassImmediately","$$removeClassImmediately","add","createdCache","STORAGE_KEY","$$setClassImmediately","PATH_MATCH","locationPrototype","paramValue","Location","Location.prototype.state","CALL","APPLY","BIND","CONSTANTS","null","true","false","constantGetter","OPERATORS","+","-","*","/","%","===","!==","==","!=","<",">","<=",">=","&&","||","!","ESCAPE","lex","tokens","is","readString","peek","readNumber","isIdent","readIdent","isWhitespace","ch2","ch3","fn2","fn3","throwError","chars","isExpOperator","start","end","colStr","peekCh","lastDot","peekIndex","methodName","quote","rawString","hex","String","fromCharCode","rep","ZERO","statements","primary","expect","filterChain","consume","arrayDeclaration","functionCall","objectIndex","fieldAccess","msg","peekToken","e1","e2","e3","e4","t","unaryFn","right","$parseUnaryFn","binaryFn","left","isBranching","$parseBinaryFn","$parseStatements","inputFn","argsFn","$parseFilter","every","assignment","ternary","$parseAssignment","logicalOR","middle","$parseTernary","logicalAND","equality","relational","additive","multiplicative","unary","field","$parseFieldAccess","o","indexFn","$parseObjectIndex","fnGetter","contextGetter","expressionText","$parseFunctionCall","elementFns","elementFn","$parseArrayLiteral","valueFns","$parseObjectLiteral","yy","y","MMMM","MMM","M","H","hh","EEEE","EEE","ampmGetter","Z","timeZoneGetter","zone","paddedZone","ww","w","xlinkHref","propName","normalized","ngBooleanAttrWatchAction","htmlAttr","ngAttrAliasWatchAction","nullFormRenameControl","formDirectiveFactory","isNgForm","ngFormCompile","formElement","ngFormPreLink","handleFormSubmission","returnValue","parentFormCtrl","alias","URL_REGEXP","EMAIL_REGEXP","NUMBER_REGEXP","DATE_REGEXP","DATETIMELOCAL_REGEXP","WEEK_REGEXP","MONTH_REGEXP","TIME_REGEXP","DEFAULT_REGEXP","inputType","textInputType","weekParser","isoWeek","existingDate","week","minutes","hours","seconds","milliseconds","addDays","numberInputType","urlInputType","ctrl.$validators.url","emailInputType","email","ctrl.$validators.email","radioInputType","checked","checkboxInputType","trueValue","ngTrueValue","falseValue","ngFalseValue","ctrls","NgModelController","$asyncValidators","$viewChangeListeners","$untouched","$touched","parsedNgModel","pendingDebounce","ngModelGet","modelValue","getterSetter","ngModelSet","$$setOptions","this.$$setOptions","this.$isEmpty","currentValidationRunId","this.$setPristine","this.$setUntouched","UNTOUCHED_CLASS","TOUCHED_CLASS","$setTouched","this.$setTouched","this.$rollbackViewValue","$$lastCommittedViewValue","this.$validate","$$parseAndValidate","$$runValidators","this.$$runValidators","parseValid","viewValue","doneCallback","processSyncValidators","syncValidatorsValid","validator","processAsyncValidators","validatorPromises","allValid","validationDone","localValidationRunId","processParseErrors","errorKey","this.$commitViewValue","this.$$parseAndValidate","parserValid","prevModelValue","allowInvalid","$$writeModelToScope","this.$$writeModelToScope","this.$setViewValue","updateOnDefault","$$debounceViewValueCommit","this.$$debounceViewValueCommit","debounceDelay","debounce","ngModelWatch","formatters","ngModelCompile","ngModelPreLink","modelCtrl","formCtrl","ngModelPostLink","updateOn","ctrl.$validators.required","patternExp","ctrl.$validators.pattern","ctrl.$validators.maxlength","ctrl.$validators.minlength","trimValues","CONSTANT_VALUE_REGEXP","tplAttr","ngValueConstantLink","ngValueLink","valueWatchAction","that","$compile","ngBindCompile","templateElement","ngBindLink","ngBindWatchAction","ngBindTemplateCompile","ngBindTemplateLink","ngBindHtmlCompile","tElement","ngBindHtmlGetter","ngBindHtmlWatch","getStringValue","ngBindHtmlLink","ngBindHtmlWatchAction","getTrustedHtml","forceAsyncEvents","ngEventHandler","$event","previousElements","ngIfWatchAction","newScope","srcExp","onloadExp","autoScrollExp","autoscroll","changeCounter","previousElement","currentElement","cleanupLastIncludeContent","parseAsResourceUrl","ngIncludeWatchAction","afterAnimation","thisChangeId","namespaceAdaptedClone","BRACE","numberExp","whenExp","whens","whensExpFns","isWhen","attributeName","ngPluralizeWatch","ngPluralizeWatchAction","ngRepeatMinErr","updateScope","valueIdentifier","keyIdentifier","arrayLength","$first","$last","$middle","$odd","$even","ngRepeatCompile","ngRepeatEndComment","lhs","rhs","aliasAs","trackByExp","trackByExpGetter","trackByIdExpFn","trackByIdArrayFn","trackByIdObjFn","hashFnLocals","ngRepeatLink","lastBlockMap","ngRepeatAction","collection","previousNode","nextNode","nextBlockMap","collectionLength","trackById","collectionKeys","nextBlockOrder","trackByIdFn","itemKey","blockKey","ngRepeatTransclude","ngShowWatchAction","NG_HIDE_CLASS","tempClasses","NG_HIDE_IN_PROGRESS_CLASS","ngHideWatchAction","ngStyleWatchAction","newStyles","oldStyles","ngSwitchController","cases","selectedTranscludes","selectedElements","previousLeaveAnimations","selectedScopes","spliceFactory","ngSwitchWatchAction","selectedTransclude","caseElement","selectedScope","anchor","ngOptionsMinErr","NG_OPTIONS_REGEXP","nullModelCtrl","optionsMap","ngModelCtrl","unknownOption","databound","init","self.init","ngModelCtrl_","nullOption_","unknownOption_","addOption","self.addOption","removeOption","self.removeOption","hasOption","renderUnknownOption","self.renderUnknownOption","unknownVal","self.hasOption","setupAsSingle","selectElement","selectCtrl","ngModelCtrl.$render","emptyOption","setupAsMultiple","lastView","selectMultipleWatch","setupAsOptions","callExpression","exprFn","valueName","keyName","createIsSelectedFn","selectedSet","trackFn","trackIndex","isSelected","compareValueFn","selectAsFn","scheduleRendering","renderScheduled","render","updateLabelMap","labelMap","label","added","optionGroups","optionGroupNames","optionGroupName","optionGroup","existingParent","existingOptions","existingOption","valuesFn","groupIndex","anySelected","groupByFn","displayFn","nullOption","groupLength","optionGroupsCache","optGroupTemplate","lastElement","optionTemplate","optionsExp","selectAs","track","selectionChanged","selectedKey","viewValueFn","getLabels","toDisplay","ngModelCtrl.$isEmpty","nullSelectCtrl","selectCtrlName","interpolateWatchAction","$$csp"]
+}
diff --git a/third-party/angular-1.3.0/angular.url b/third-party/angular-1.3.0/angular.url
new file mode 100644 (file)
index 0000000..284c0bc
--- /dev/null
@@ -0,0 +1 @@
+https://github.com/angular/code.angularjs.org/tree/master/1.3.0
index cb49b67..8203dc2 120000 (symlink)
@@ -1 +1 @@
-bootstrap-slider-1
\ No newline at end of file
+bootstrap-slider-1/
\ No newline at end of file
deleted file mode 120000 (symlink)
index 71518cc16640fefbdf8ac77452ef906b6a51cc3f..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1 +0,0 @@
-dataTables-1.9.4.js
\ No newline at end of file
new file mode 100644 (file)
index 0000000000000000000000000000000000000000..1d8a220ba8077aa314a28b90331c7cba9b4811c8
--- /dev/null
+/**
+ * @summary     DataTables
+ * @description Paginate, search and sort HTML tables
+ * @version     1.9.4
+ * @file        jquery.dataTables.js
+ * @author      Allan Jardine (www.sprymedia.co.uk)
+ * @contact     www.sprymedia.co.uk/contact
+ *
+ * @copyright Copyright 2008-2012 Allan Jardine, all rights reserved.
+ *
+ * This source file is free software, under either the GPL v2 license or a
+ * BSD style license, available at:
+ *   http://datatables.net/license_gpl2
+ *   http://datatables.net/license_bsd
+ * 
+ * This source file is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
+ * 
+ * For details please refer to: http://www.datatables.net
+ */
+
+/*jslint evil: true, undef: true, browser: true */
+/*globals $, jQuery,define,_fnExternApiFunc,_fnInitialise,_fnInitComplete,_fnLanguageCompat,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnCreateTr,_fnGatherData,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnServerParams,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAdjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnBuildSearchRow,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnDetectHeader,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap,_fnGetRowData,_fnGetCellData,_fnSetCellData,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnApplyColumnDefs,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnJsonString,_fnRender,_fnNodeToColumnIndex,_fnInfoMacros,_fnBrowserDetect,_fnGetColumns*/
+
+(/** @lends <global> */function( window, document, undefined ) {
+
+(function( factory ) {
+       "use strict";
+
+       // Define as an AMD module if possible
+       if ( typeof define === 'function' && define.amd )
+       {
+               define( ['jquery'], factory );
+       }
+       /* Define using browser globals otherwise
+        * Prevent multiple instantiations if the script is loaded twice
+        */
+       else if ( jQuery && !jQuery.fn.dataTable )
+       {
+               factory( jQuery );
+       }
+}
+(/** @lends <global> */function( $ ) {
+       "use strict";
+       /** 
+        * DataTables is a plug-in for the jQuery Javascript library. It is a 
+        * highly flexible tool, based upon the foundations of progressive 
+        * enhancement, which will add advanced interaction controls to any 
+        * HTML table. For a full list of features please refer to
+        * <a href="http://datatables.net">DataTables.net</a>.
+        *
+        * Note that the <i>DataTable</i> object is not a global variable but is
+        * aliased to <i>jQuery.fn.DataTable</i> and <i>jQuery.fn.dataTable</i> through which 
+        * it may be  accessed.
+        *
+        *  @class
+        *  @param {object} [oInit={}] Configuration object for DataTables. Options
+        *    are defined by {@link DataTable.defaults}
+        *  @requires jQuery 1.3+
+        * 
+        *  @example
+        *    // Basic initialisation
+        *    $(document).ready( function {
+        *      $('#example').dataTable();
+        *    } );
+        *  
+        *  @example
+        *    // Initialisation with configuration options - in this case, disable
+        *    // pagination and sorting.
+        *    $(document).ready( function {
+        *      $('#example').dataTable( {
+        *        "bPaginate": false,
+        *        "bSort": false 
+        *      } );
+        *    } );
+        */
+       var DataTable = function( oInit )
+       {
+               
+               
+               /**
+                * Add a column to the list used for the table with default values
+                *  @param {object} oSettings dataTables settings object
+                *  @param {node} nTh The th element for this column
+                *  @memberof DataTable#oApi
+                */
+               function _fnAddColumn( oSettings, nTh )
+               {
+                       var oDefaults = DataTable.defaults.columns;
+                       var iCol = oSettings.aoColumns.length;
+                       var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {
+                               "sSortingClass": oSettings.oClasses.sSortable,
+                               "sSortingClassJUI": oSettings.oClasses.sSortJUI,
+                               "nTh": nTh ? nTh : document.createElement('th'),
+                               "sTitle":    oDefaults.sTitle    ? oDefaults.sTitle    : nTh ? nTh.innerHTML : '',
+                               "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],
+                               "mData": oDefaults.mData ? oDefaults.oDefaults : iCol
+                       } );
+                       oSettings.aoColumns.push( oCol );
+                       
+                       /* Add a column specific filter */
+                       if ( oSettings.aoPreSearchCols[ iCol ] === undefined || oSettings.aoPreSearchCols[ iCol ] === null )
+                       {
+                               oSettings.aoPreSearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch );
+                       }
+                       else
+                       {
+                               var oPre = oSettings.aoPreSearchCols[ iCol ];
+                               
+                               /* Don't require that the user must specify bRegex, bSmart or bCaseInsensitive */
+                               if ( oPre.bRegex === undefined )
+                               {
+                                       oPre.bRegex = true;
+                               }
+                               
+                               if ( oPre.bSmart === undefined )
+                               {
+                                       oPre.bSmart = true;
+                               }
+                               
+                               if ( oPre.bCaseInsensitive === undefined )
+                               {
+                                       oPre.bCaseInsensitive = true;
+                               }
+                       }
+                       
+                       /* Use the column options function to initialise classes etc */
+                       _fnColumnOptions( oSettings, iCol, null );
+               }
+               
+               
+               /**
+                * Apply options for a column
+                *  @param {object} oSettings dataTables settings object
+                *  @param {int} iCol column index to consider
+                *  @param {object} oOptions object with sType, bVisible and bSearchable etc
+                *  @memberof DataTable#oApi
+                */
+               function _fnColumnOptions( oSettings, iCol, oOptions )
+               {
+                       var oCol = oSettings.aoColumns[ iCol ];
+                       
+                       /* User specified column options */
+                       if ( oOptions !== undefined && oOptions !== null )
+                       {
+                               /* Backwards compatibility for mDataProp */
+                               if ( oOptions.mDataProp && !oOptions.mData )
+                               {
+                                       oOptions.mData = oOptions.mDataProp;
+                               }
+               
+                               if ( oOptions.sType !== undefined )
+                               {
+                                       oCol.sType = oOptions.sType;
+                                       oCol._bAutoType = false;
+                               }
+                               
+                               $.extend( oCol, oOptions );
+                               _fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
+               
+                               /* iDataSort to be applied (backwards compatibility), but aDataSort will take
+                                * priority if defined
+                                */
+                               if ( oOptions.iDataSort !== undefined )
+                               {
+                                       oCol.aDataSort = [ oOptions.iDataSort ];
+                               }
+                               _fnMap( oCol, oOptions, "aDataSort" );
+                       }
+               
+                       /* Cache the data get and set functions for speed */
+                       var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;
+                       var mData = _fnGetObjectDataFn( oCol.mData );
+               
+                       oCol.fnGetData = function (oData, sSpecific) {
+                               var innerData = mData( oData, sSpecific );
+               
+                               if ( oCol.mRender && (sSpecific && sSpecific !== '') )
+                               {
+                                       return mRender( innerData, sSpecific, oData );
+                               }
+                               return innerData;
+                       };
+                       oCol.fnSetData = _fnSetObjectDataFn( oCol.mData );
+                       
+                       /* Feature sorting overrides column specific when off */
+                       if ( !oSettings.oFeatures.bSort )
+                       {
+                               oCol.bSortable = false;
+                       }
+                       
+                       /* Check that the class assignment is correct for sorting */
+                       if ( !oCol.bSortable ||
+                                ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) )
+                       {
+                               oCol.sSortingClass = oSettings.oClasses.sSortableNone;
+                               oCol.sSortingClassJUI = "";
+                       }
+                       else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1 )
+                       {
+                               oCol.sSortingClass = oSettings.oClasses.sSortable;
+                               oCol.sSortingClassJUI = oSettings.oClasses.sSortJUI;
+                       }
+                       else if ( $.inArray('asc', oCol.asSorting) != -1 && $.inArray('desc', oCol.asSorting) == -1 )
+                       {
+                               oCol.sSortingClass = oSettings.oClasses.sSortableAsc;
+                               oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIAscAllowed;
+                       }
+                       else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) != -1 )
+                       {
+                               oCol.sSortingClass = oSettings.oClasses.sSortableDesc;
+                               oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIDescAllowed;
+                       }
+               }
+               
+               
+               /**
+                * Adjust the table column widths for new data. Note: you would probably want to 
+                * do a redraw after calling this function!
+                *  @param {object} oSettings dataTables settings object
+                *  @memberof DataTable#oApi
+                */
+               function _fnAdjustColumnSizing ( oSettings )
+               {
+                       /* Not interested in doing column width calculation if auto-width is disabled */
+                       if ( oSettings.oFeatures.bAutoWidth === false )
+                       {
+                               return false;
+                       }
+                       
+                       _fnCalculateColumnWidths( oSettings );
+                       for ( var i=0 , iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                       {
+                               oSettings.aoColumns[i].nTh.style.width = oSettings.aoColumns[i].sWidth;
+                       }
+               }
+               
+               
+               /**
+                * Covert the index of a visible column to the index in the data array (take account
+                * of hidden columns)
+                *  @param {object} oSettings dataTables settings object
+                *  @param {int} iMatch Visible column index to lookup
+                *  @returns {int} i the data index
+                *  @memberof DataTable#oApi
+                */
+               function _fnVisibleToColumnIndex( oSettings, iMatch )
+               {
+                       var aiVis = _fnGetColumns( oSettings, 'bVisible' );
+               
+                       return typeof aiVis[iMatch] === 'number' ?
+                               aiVis[iMatch] :
+                               null;
+               }
+               
+               
+               /**
+                * Covert the index of an index in the data array and convert it to the visible
+                *   column index (take account of hidden columns)
+                *  @param {int} iMatch Column index to lookup
+                *  @param {object} oSettings dataTables settings object
+                *  @returns {int} i the data index
+                *  @memberof DataTable#oApi
+                */
+               function _fnColumnIndexToVisible( oSettings, iMatch )
+               {
+                       var aiVis = _fnGetColumns( oSettings, 'bVisible' );
+                       var iPos = $.inArray( iMatch, aiVis );
+               
+                       return iPos !== -1 ? iPos : null;
+               }
+               
+               
+               /**
+                * Get the number of visible columns
+                *  @param {object} oSettings dataTables settings object
+                *  @returns {int} i the number of visible columns
+                *  @memberof DataTable#oApi
+                */
+               function _fnVisbleColumns( oSettings )
+               {
+                       return _fnGetColumns( oSettings, 'bVisible' ).length;
+               }
+               
+               
+               /**
+                * Get an array of column indexes that match a given property
+                *  @param {object} oSettings dataTables settings object
+                *  @param {string} sParam Parameter in aoColumns to look for - typically 
+                *    bVisible or bSearchable
+                *  @returns {array} Array of indexes with matched properties
+                *  @memberof DataTable#oApi
+                */
+               function _fnGetColumns( oSettings, sParam )
+               {
+                       var a = [];
+               
+                       $.map( oSettings.aoColumns, function(val, i) {
+                               if ( val[sParam] ) {
+                                       a.push( i );
+                               }
+                       } );
+               
+                       return a;
+               }
+               
+               
+               /**
+                * Get the sort type based on an input string
+                *  @param {string} sData data we wish to know the type of
+                *  @returns {string} type (defaults to 'string' if no type can be detected)
+                *  @memberof DataTable#oApi
+                */
+               function _fnDetectType( sData )
+               {
+                       var aTypes = DataTable.ext.aTypes;
+                       var iLen = aTypes.length;
+                       
+                       for ( var i=0 ; i<iLen ; i++ )
+                       {
+                               var sType = aTypes[i]( sData );
+                               if ( sType !== null )
+                               {
+                                       return sType;
+                               }
+                       }
+                       
+                       return 'string';
+               }
+               
+               
+               /**
+                * Figure out how to reorder a display list
+                *  @param {object} oSettings dataTables settings object
+                *  @returns array {int} aiReturn index list for reordering
+                *  @memberof DataTable#oApi
+                */
+               function _fnReOrderIndex ( oSettings, sColumns )
+               {
+                       var aColumns = sColumns.split(',');
+                       var aiReturn = [];
+                       
+                       for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                       {
+                               for ( var j=0 ; j<iLen ; j++ )
+                               {
+                                       if ( oSettings.aoColumns[i].sName == aColumns[j] )
+                                       {
+                                               aiReturn.push( j );
+                                               break;
+                                       }
+                               }
+                       }
+                       
+                       return aiReturn;
+               }
+               
+               
+               /**
+                * Get the column ordering that DataTables expects
+                *  @param {object} oSettings dataTables settings object
+                *  @returns {string} comma separated list of names
+                *  @memberof DataTable#oApi
+                */
+               function _fnColumnOrdering ( oSettings )
+               {
+                       var sNames = '';
+                       for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                       {
+                               sNames += oSettings.aoColumns[i].sName+',';
+                       }
+                       if ( sNames.length == iLen )
+                       {
+                               return "";
+                       }
+                       return sNames.slice(0, -1);
+               }
+               
+               
+               /**
+                * Take the column definitions and static columns arrays and calculate how
+                * they relate to column indexes. The callback function will then apply the
+                * definition found for a column to a suitable configuration object.
+                *  @param {object} oSettings dataTables settings object
+                *  @param {array} aoColDefs The aoColumnDefs array that is to be applied
+                *  @param {array} aoCols The aoColumns array that defines columns individually
+                *  @param {function} fn Callback function - takes two parameters, the calculated
+                *    column index and the definition for that column.
+                *  @memberof DataTable#oApi
+                */
+               function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )
+               {
+                       var i, iLen, j, jLen, k, kLen;
+               
+                       // Column definitions with aTargets
+                       if ( aoColDefs )
+                       {
+                               /* Loop over the definitions array - loop in reverse so first instance has priority */
+                               for ( i=aoColDefs.length-1 ; i>=0 ; i-- )
+                               {
+                                       /* Each definition can target multiple columns, as it is an array */
+                                       var aTargets = aoColDefs[i].aTargets;
+                                       if ( !$.isArray( aTargets ) )
+                                       {
+                                               _fnLog( oSettings, 1, 'aTargets must be an array of targets, not a '+(typeof aTargets) );
+                                       }
+               
+                                       for ( j=0, jLen=aTargets.length ; j<jLen ; j++ )
+                                       {
+                                               if ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )
+                                               {
+                                                       /* Add columns that we don't yet know about */
+                                                       while( oSettings.aoColumns.length <= aTargets[j] )
+                                                       {
+                                                               _fnAddColumn( oSettings );
+                                                       }
+               
+                                                       /* Integer, basic index */
+                                                       fn( aTargets[j], aoColDefs[i] );
+                                               }
+                                               else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )
+                                               {
+                                                       /* Negative integer, right to left column counting */
+                                                       fn( oSettings.aoColumns.length+aTargets[j], aoColDefs[i] );
+                                               }
+                                               else if ( typeof aTargets[j] === 'string' )
+                                               {
+                                                       /* Class name matching on TH element */
+                                                       for ( k=0, kLen=oSettings.aoColumns.length ; k<kLen ; k++ )
+                                                       {
+                                                               if ( aTargets[j] == "_all" ||
+                                                                    $(oSettings.aoColumns[k].nTh).hasClass( aTargets[j] ) )
+                                                               {
+                                                                       fn( k, aoColDefs[i] );
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               
+                       // Statically defined columns array
+                       if ( aoCols )
+                       {
+                               for ( i=0, iLen=aoCols.length ; i<iLen ; i++ )
+                               {
+                                       fn( i, aoCols[i] );
+                               }
+                       }
+               }
+               
+               /**
+                * Add a data array to the table, creating DOM node etc. This is the parallel to 
+                * _fnGatherData, but for adding rows from a Javascript source, rather than a
+                * DOM source.
+                *  @param {object} oSettings dataTables settings object
+                *  @param {array} aData data array to be added
+                *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed
+                *  @memberof DataTable#oApi
+                */
+               function _fnAddData ( oSettings, aDataSupplied )
+               {
+                       var oCol;
+                       
+                       /* Take an independent copy of the data source so we can bash it about as we wish */
+                       var aDataIn = ($.isArray(aDataSupplied)) ?
+                               aDataSupplied.slice() :
+                               $.extend( true, {}, aDataSupplied );
+                       
+                       /* Create the object for storing information about this new row */
+                       var iRow = oSettings.aoData.length;
+                       var oData = $.extend( true, {}, DataTable.models.oRow );
+                       oData._aData = aDataIn;
+                       oSettings.aoData.push( oData );
+               
+                       /* Create the cells */
+                       var nTd, sThisType;
+                       for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                       {
+                               oCol = oSettings.aoColumns[i];
+               
+                               /* Use rendered data for filtering / sorting */
+                               if ( typeof oCol.fnRender === 'function' && oCol.bUseRendered && oCol.mData !== null )
+                               {
+                                       _fnSetCellData( oSettings, iRow, i, _fnRender(oSettings, iRow, i) );
+                               }
+                               else
+                               {
+                                       _fnSetCellData( oSettings, iRow, i, _fnGetCellData( oSettings, iRow, i ) );
+                               }
+                               
+                               /* See if we should auto-detect the column type */
+                               if ( oCol._bAutoType && oCol.sType != 'string' )
+                               {
+                                       /* Attempt to auto detect the type - same as _fnGatherData() */
+                                       var sVarType = _fnGetCellData( oSettings, iRow, i, 'type' );
+                                       if ( sVarType !== null && sVarType !== '' )
+                                       {
+                                               sThisType = _fnDetectType( sVarType );
+                                               if ( oCol.sType === null )
+                                               {
+                                                       oCol.sType = sThisType;
+                                               }
+                                               else if ( oCol.sType != sThisType && oCol.sType != "html" )
+                                               {
+                                                       /* String is always the 'fallback' option */
+                                                       oCol.sType = 'string';
+                                               }
+                                       }
+                               }
+                       }
+                       
+                       /* Add to the display array */
+                       oSettings.aiDisplayMaster.push( iRow );
+               
+                       /* Create the DOM information */
+                       if ( !oSettings.oFeatures.bDeferRender )
+                       {
+                               _fnCreateTr( oSettings, iRow );
+                       }
+               
+                       return iRow;
+               }
+               
+               
+               /**
+                * Read in the data from the target table from the DOM
+                *  @param {object} oSettings dataTables settings object
+                *  @memberof DataTable#oApi
+                */
+               function _fnGatherData( oSettings )
+               {
+                       var iLoop, i, iLen, j, jLen, jInner,
+                               nTds, nTrs, nTd, nTr, aLocalData, iThisIndex,
+                               iRow, iRows, iColumn, iColumns, sNodeName,
+                               oCol, oData;
+                       
+                       /*
+                        * Process by row first
+                        * Add the data object for the whole table - storing the tr node. Note - no point in getting
+                        * DOM based data if we are going to go and replace it with Ajax source data.
+                        */
+                       if ( oSettings.bDeferLoading || oSettings.sAjaxSource === null )
+                       {
+                               nTr = oSettings.nTBody.firstChild;
+                               while ( nTr )
+                               {
+                                       if ( nTr.nodeName.toUpperCase() == "TR" )
+                                       {
+                                               iThisIndex = oSettings.aoData.length;
+                                               nTr._DT_RowIndex = iThisIndex;
+                                               oSettings.aoData.push( $.extend( true, {}, DataTable.models.oRow, {
+                                                       "nTr": nTr
+                                               } ) );
+               
+                                               oSettings.aiDisplayMaster.push( iThisIndex );
+                                               nTd = nTr.firstChild;
+                                               jInner = 0;
+                                               while ( nTd )
+                                               {
+                                                       sNodeName = nTd.nodeName.toUpperCase();
+                                                       if ( sNodeName == "TD" || sNodeName == "TH" )
+                                                       {
+                                                               _fnSetCellData( oSettings, iThisIndex, jInner, $.trim(nTd.innerHTML) );
+                                                               jInner++;
+                                                       }
+                                                       nTd = nTd.nextSibling;
+                                               }
+                                       }
+                                       nTr = nTr.nextSibling;
+                               }
+                       }
+                       
+                       /* Gather in the TD elements of the Table - note that this is basically the same as
+                        * fnGetTdNodes, but that function takes account of hidden columns, which we haven't yet
+                        * setup!
+                        */
+                       nTrs = _fnGetTrNodes( oSettings );
+                       nTds = [];
+                       for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
+                       {
+                               nTd = nTrs[i].firstChild;
+                               while ( nTd )
+                               {
+                                       sNodeName = nTd.nodeName.toUpperCase();
+                                       if ( sNodeName == "TD" || sNodeName == "TH" )
+                                       {
+                                               nTds.push( nTd );
+                                       }
+                                       nTd = nTd.nextSibling;
+                               }
+                       }
+                       
+                       /* Now process by column */
+                       for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )
+                       {
+                               oCol = oSettings.aoColumns[iColumn];
+               
+                               /* Get the title of the column - unless there is a user set one */
+                               if ( oCol.sTitle === null )
+                               {
+                                       oCol.sTitle = oCol.nTh.innerHTML;
+                               }
+                               
+                               var
+                                       bAutoType = oCol._bAutoType,
+                                       bRender = typeof oCol.fnRender === 'function',
+                                       bClass = oCol.sClass !== null,
+                                       bVisible = oCol.bVisible,
+                                       nCell, sThisType, sRendered, sValType;
+                               
+                               /* A single loop to rule them all (and be more efficient) */
+                               if ( bAutoType || bRender || bClass || !bVisible )
+                               {
+                                       for ( iRow=0, iRows=oSettings.aoData.length ; iRow<iRows ; iRow++ )
+                                       {
+                                               oData = oSettings.aoData[iRow];
+                                               nCell = nTds[ (iRow*iColumns) + iColumn ];
+                                               
+                                               /* Type detection */
+                                               if ( bAutoType && oCol.sType != 'string' )
+                                               {
+                                                       sValType = _fnGetCellData( oSettings, iRow, iColumn, 'type' );
+                                                       if ( sValType !== '' )
+                                                       {
+                                                               sThisType = _fnDetectType( sValType );
+                                                               if ( oCol.sType === null )
+                                                               {
+                                                                       oCol.sType = sThisType;
+                                                               }
+                                                               else if ( oCol.sType != sThisType && 
+                                                                         oCol.sType != "html" )
+                                                               {
+                                                                       /* String is always the 'fallback' option */
+                                                                       oCol.sType = 'string';
+                                                               }
+                                                       }
+                                               }
+               
+                                               if ( oCol.mRender )
+                                               {
+                                                       // mRender has been defined, so we need to get the value and set it
+                                                       nCell.innerHTML = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
+                                               }
+                                               else if ( oCol.mData !== iColumn )
+                                               {
+                                                       // If mData is not the same as the column number, then we need to
+                                                       // get the dev set value. If it is the column, no point in wasting
+                                                       // time setting the value that is already there!
+                                                       nCell.innerHTML = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
+                                               }
+                                               
+                                               /* Rendering */
+                                               if ( bRender )
+                                               {
+                                                       sRendered = _fnRender( oSettings, iRow, iColumn );
+                                                       nCell.innerHTML = sRendered;
+                                                       if ( oCol.bUseRendered )
+                                                       {
+                                                               /* Use the rendered data for filtering / sorting */
+                                                               _fnSetCellData( oSettings, iRow, iColumn, sRendered );
+                                                       }
+                                               }
+                                               
+                                               /* Classes */
+                                               if ( bClass )
+                                               {
+                                                       nCell.className += ' '+oCol.sClass;
+                                               }
+                                               
+                                               /* Column visibility */
+                                               if ( !bVisible )
+                                               {
+                                                       oData._anHidden[iColumn] = nCell;
+                                                       nCell.parentNode.removeChild( nCell );
+                                               }
+                                               else
+                                               {
+                                                       oData._anHidden[iColumn] = null;
+                                               }
+               
+                                               if ( oCol.fnCreatedCell )
+                                               {
+                                                       oCol.fnCreatedCell.call( oSettings.oInstance,
+                                                               nCell, _fnGetCellData( oSettings, iRow, iColumn, 'display' ), oData._aData, iRow, iColumn
+                                                       );
+                                               }
+                                       }
+                               }
+                       }
+               
+                       /* Row created callbacks */
+                       if ( oSettings.aoRowCreatedCallback.length !== 0 )
+                       {
+                               for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
+                               {
+                                       oData = oSettings.aoData[i];
+                                       _fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [oData.nTr, oData._aData, i] );
+                               }
+                       }
+               }
+               
+               
+               /**
+                * Take a TR element and convert it to an index in aoData
+                *  @param {object} oSettings dataTables settings object
+                *  @param {node} n the TR element to find
+                *  @returns {int} index if the node is found, null if not
+                *  @memberof DataTable#oApi
+                */
+               function _fnNodeToDataIndex( oSettings, n )
+               {
+                       return (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;
+               }
+               
+               
+               /**
+                * Take a TD element and convert it into a column data index (not the visible index)
+                *  @param {object} oSettings dataTables settings object
+                *  @param {int} iRow The row number the TD/TH can be found in
+                *  @param {node} n The TD/TH element to find
+                *  @returns {int} index if the node is found, -1 if not
+                *  @memberof DataTable#oApi
+                */
+               function _fnNodeToColumnIndex( oSettings, iRow, n )
+               {
+                       var anCells = _fnGetTdNodes( oSettings, iRow );
+               
+                       for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                       {
+                               if ( anCells[i] === n )
+                               {
+                                       return i;
+                               }
+                       }
+                       return -1;
+               }
+               
+               
+               /**
+                * Get an array of data for a given row from the internal data cache
+                *  @param {object} oSettings dataTables settings object
+                *  @param {int} iRow aoData row id
+                *  @param {string} sSpecific data get type ('type' 'filter' 'sort')
+                *  @param {array} aiColumns Array of column indexes to get data from
+                *  @returns {array} Data array
+                *  @memberof DataTable#oApi
+                */
+               function _fnGetRowData( oSettings, iRow, sSpecific, aiColumns )
+               {
+                       var out = [];
+                       for ( var i=0, iLen=aiColumns.length ; i<iLen ; i++ )
+                       {
+                               out.push( _fnGetCellData( oSettings, iRow, aiColumns[i], sSpecific ) );
+                       }
+                       return out;
+               }
+               
+               
+               /**
+                * Get the data for a given cell from the internal cache, taking into account data mapping
+                *  @param {object} oSettings dataTables settings object
+                *  @param {int} iRow aoData row id
+                *  @param {int} iCol Column index
+                *  @param {string} sSpecific data get type ('display', 'type' 'filter' 'sort')
+                *  @returns {*} Cell data
+                *  @memberof DataTable#oApi
+                */
+               function _fnGetCellData( oSettings, iRow, iCol, sSpecific )
+               {
+                       var sData;
+                       var oCol = oSettings.aoColumns[iCol];
+                       var oData = oSettings.aoData[iRow]._aData;
+               
+                       if ( (sData=oCol.fnGetData( oData, sSpecific )) === undefined )
+                       {
+                               if ( oSettings.iDrawError != oSettings.iDraw && oCol.sDefaultContent === null )
+                               {
+                                       _fnLog( oSettings, 0, "Requested unknown parameter "+
+                                               (typeof oCol.mData=='function' ? '{mData function}' : "'"+oCol.mData+"'")+
+                                               " from the data source for row "+iRow );
+                                       oSettings.iDrawError = oSettings.iDraw;
+                               }
+                               return oCol.sDefaultContent;
+                       }
+               
+                       /* When the data source is null, we can use default column data */
+                       if ( sData === null && oCol.sDefaultContent !== null )
+                       {
+                               sData = oCol.sDefaultContent;
+                       }
+                       else if ( typeof sData === 'function' )
+                       {
+                               /* If the data source is a function, then we run it and use the return */
+                               return sData();
+                       }
+               
+                       if ( sSpecific == 'display' && sData === null )
+                       {
+                               return '';
+                       }
+                       return sData;
+               }
+               
+               
+               /**
+                * Set the value for a specific cell, into the internal data cache
+                *  @param {object} oSettings dataTables settings object
+                *  @param {int} iRow aoData row id
+                *  @param {int} iCol Column index
+                *  @param {*} val Value to set
+                *  @memberof DataTable#oApi
+                */
+               function _fnSetCellData( oSettings, iRow, iCol, val )
+               {
+                       var oCol = oSettings.aoColumns[iCol];
+                       var oData = oSettings.aoData[iRow]._aData;
+               
+                       oCol.fnSetData( oData, val );
+               }
+               
+               
+               // Private variable that is used to match array syntax in the data property object
+               var __reArray = /\[.*?\]$/;
+               
+               /**
+                * Return a function that can be used to get data from a source object, taking
+                * into account the ability to use nested objects as a source
+                *  @param {string|int|function} mSource The data source for the object
+                *  @returns {function} Data get function
+                *  @memberof DataTable#oApi
+                */
+               function _fnGetObjectDataFn( mSource )
+               {
+                       if ( mSource === null )
+                       {
+                               /* Give an empty string for rendering / sorting etc */
+                               return function (data, type) {
+                                       return null;
+                               };
+                       }
+                       else if ( typeof mSource === 'function' )
+                       {
+                               return function (data, type, extra) {
+                                       return mSource( data, type, extra );
+                               };
+                       }
+                       else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || mSource.indexOf('[') !== -1) )
+                       {
+                               /* If there is a . in the source string then the data source is in a 
+                                * nested object so we loop over the data for each level to get the next
+                                * level down. On each loop we test for undefined, and if found immediately
+                                * return. This allows entire objects to be missing and sDefaultContent to
+                                * be used if defined, rather than throwing an error
+                                */
+                               var fetchData = function (data, type, src) {
+                                       var a = src.split('.');
+                                       var arrayNotation, out, innerSrc;
+               
+                                       if ( src !== "" )
+                                       {
+                                               for ( var i=0, iLen=a.length ; i<iLen ; i++ )
+                                               {
+                                                       // Check if we are dealing with an array notation request
+                                                       arrayNotation = a[i].match(__reArray);
+               
+                                                       if ( arrayNotation ) {
+                                                               a[i] = a[i].replace(__reArray, '');
+               
+                                                               // Condition allows simply [] to be passed in
+                                                               if ( a[i] !== "" ) {
+                                                                       data = data[ a[i] ];
+                                                               }
+                                                               out = [];
+                                                               
+                                                               // Get the remainder of the nested object to get
+                                                               a.splice( 0, i+1 );
+                                                               innerSrc = a.join('.');
+               
+                                                               // Traverse each entry in the array getting the properties requested
+                                                               for ( var j=0, jLen=data.length ; j<jLen ; j++ ) {
+                                                                       out.push( fetchData( data[j], type, innerSrc ) );
+                                                               }
+               
+                                                               // If a string is given in between the array notation indicators, that
+                                                               // is used to join the strings together, otherwise an array is returned
+                                                               var join = arrayNotation[0].substring(1, arrayNotation[0].length-1);
+                                                               data = (join==="") ? out : out.join(join);
+               
+                                                               // The inner call to fetchData has already traversed through the remainder
+                                                               // of the source requested, so we exit from the loop
+                                                               break;
+                                                       }
+               
+                                                       if ( data === null || data[ a[i] ] === undefined )
+                                                       {
+                                                               return undefined;
+                                                       }
+                                                       data = data[ a[i] ];
+                                               }
+                                       }
+               
+                                       return data;
+                               };
+               
+                               return function (data, type) {
+                                       return fetchData( data, type, mSource );
+                               };
+                       }
+                       else
+                       {
+                               /* Array or flat object mapping */
+                               return function (data, type) {
+                                       return data[mSource];   
+                               };
+                       }
+               }
+               
+               
+               /**
+                * Return a function that can be used to set data from a source object, taking
+                * into account the ability to use nested objects as a source
+                *  @param {string|int|function} mSource The data source for the object
+                *  @returns {function} Data set function
+                *  @memberof DataTable#oApi
+                */
+               function _fnSetObjectDataFn( mSource )
+               {
+                       if ( mSource === null )
+                       {
+                               /* Nothing to do when the data source is null */
+                               return function (data, val) {};
+                       }
+                       else if ( typeof mSource === 'function' )
+                       {
+                               return function (data, val) {
+                                       mSource( data, 'set', val );
+                               };
+                       }
+                       else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || mSource.indexOf('[') !== -1) )
+                       {
+                               /* Like the get, we need to get data from a nested object */
+                               var setData = function (data, val, src) {
+                                       var a = src.split('.'), b;
+                                       var arrayNotation, o, innerSrc;
+               
+                                       for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )
+                                       {
+                                               // Check if we are dealing with an array notation request
+                                               arrayNotation = a[i].match(__reArray);
+               
+                                               if ( arrayNotation )
+                                               {
+                                                       a[i] = a[i].replace(__reArray, '');
+                                                       data[ a[i] ] = [];
+                                                       
+                                                       // Get the remainder of the nested object to set so we can recurse
+                                                       b = a.slice();
+                                                       b.splice( 0, i+1 );
+                                                       innerSrc = b.join('.');
+               
+                                                       // Traverse each entry in the array setting the properties requested
+                                                       for ( var j=0, jLen=val.length ; j<jLen ; j++ )
+                                                       {
+                                                               o = {};
+                                                               setData( o, val[j], innerSrc );
+                                                               data[ a[i] ].push( o );
+                                                       }
+               
+                                                       // The inner call to setData has already traversed through the remainder
+                                                       // of the source and has set the data, thus we can exit here
+                                                       return;
+                                               }
+               
+                                               // If the nested object doesn't currently exist - since we are
+                                               // trying to set the value - create it
+                                               if ( data[ a[i] ] === null || data[ a[i] ] === undefined )
+                                               {
+                                                       data[ a[i] ] = {};
+                                               }
+                                               data = data[ a[i] ];
+                                       }
+               
+                                       // If array notation is used, we just want to strip it and use the property name
+                                       // and assign the value. If it isn't used, then we get the result we want anyway
+                                       data[ a[a.length-1].replace(__reArray, '') ] = val;
+                               };
+               
+                               return function (data, val) {
+                                       return setData( data, val, mSource );
+                               };
+                       }
+                       else
+                       {
+                               /* Array or flat object mapping */
+                               return function (data, val) {
+                                       data[mSource] = val;    
+                               };
+                       }
+               }
+               
+               
+               /**
+                * Return an array with the full table data
+                *  @param {object} oSettings dataTables settings object
+                *  @returns array {array} aData Master data array
+                *  @memberof DataTable#oApi
+                */
+               function _fnGetDataMaster ( oSettings )
+               {
+                       var aData = [];
+                       var iLen = oSettings.aoData.length;
+                       for ( var i=0 ; i<iLen; i++ )
+                       {
+                               aData.push( oSettings.aoData[i]._aData );
+                       }
+                       return aData;
+               }
+               
+               
+               /**
+                * Nuke the table
+                *  @param {object} oSettings dataTables settings object
+                *  @memberof DataTable#oApi
+                */
+               function _fnClearTable( oSettings )
+               {
+                       oSettings.aoData.splice( 0, oSettings.aoData.length );
+                       oSettings.aiDisplayMaster.splice( 0, oSettings.aiDisplayMaster.length );
+                       oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length );
+                       _fnCalculateEnd( oSettings );
+               }
+               
+               
+                /**
+                * Take an array of integers (index array) and remove a target integer (value - not 
+                * the key!)
+                *  @param {array} a Index array to target
+                *  @param {int} iTarget value to find
+                *  @memberof DataTable#oApi
+                */
+               function _fnDeleteIndex( a, iTarget )
+               {
+                       var iTargetIndex = -1;
+                       
+                       for ( var i=0, iLen=a.length ; i<iLen ; i++ )
+                       {
+                               if ( a[i] == iTarget )
+                               {
+                                       iTargetIndex = i;
+                               }
+                               else if ( a[i] > iTarget )
+                               {
+                                       a[i]--;
+                               }
+                       }
+                       
+                       if ( iTargetIndex != -1 )
+                       {
+                               a.splice( iTargetIndex, 1 );
+                       }
+               }
+               
+               
+                /**
+                * Call the developer defined fnRender function for a given cell (row/column) with
+                * the required parameters and return the result.
+                *  @param {object} oSettings dataTables settings object
+                *  @param {int} iRow aoData index for the row
+                *  @param {int} iCol aoColumns index for the column
+                *  @returns {*} Return of the developer's fnRender function
+                *  @memberof DataTable#oApi
+                */
+               function _fnRender( oSettings, iRow, iCol )
+               {
+                       var oCol = oSettings.aoColumns[iCol];
+               
+                       return oCol.fnRender( {
+                               "iDataRow":    iRow,
+                               "iDataColumn": iCol,
+                               "oSettings":   oSettings,
+                               "aData":       oSettings.aoData[iRow]._aData,
+                               "mDataProp":   oCol.mData
+                       }, _fnGetCellData(oSettings, iRow, iCol, 'display') );
+               }
+               /**
+                * Create a new TR element (and it's TD children) for a row
+                *  @param {object} oSettings dataTables settings object
+                *  @param {int} iRow Row to consider
+                *  @memberof DataTable#oApi
+                */
+               function _fnCreateTr ( oSettings, iRow )
+               {
+                       var oData = oSettings.aoData[iRow];
+                       var nTd;
+               
+                       if ( oData.nTr === null )
+                       {
+                               oData.nTr = document.createElement('tr');
+               
+                               /* Use a private property on the node to allow reserve mapping from the node
+                                * to the aoData array for fast look up
+                                */
+                               oData.nTr._DT_RowIndex = iRow;
+               
+                               /* Special parameters can be given by the data source to be used on the row */
+                               if ( oData._aData.DT_RowId )
+                               {
+                                       oData.nTr.id = oData._aData.DT_RowId;
+                               }
+               
+                               if ( oData._aData.DT_RowClass )
+                               {
+                                       oData.nTr.className = oData._aData.DT_RowClass;
+                               }
+               
+                               /* Process each column */
+                               for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                               {
+                                       var oCol = oSettings.aoColumns[i];
+                                       nTd = document.createElement( oCol.sCellType );
+               
+                                       /* Render if needed - if bUseRendered is true then we already have the rendered
+                                        * value in the data source - so can just use that
+                                        */
+                                       nTd.innerHTML = (typeof oCol.fnRender === 'function' && (!oCol.bUseRendered || oCol.mData === null)) ?
+                                               _fnRender( oSettings, iRow, i ) :
+                                               _fnGetCellData( oSettings, iRow, i, 'display' );
+                               
+                                       /* Add user defined class */
+                                       if ( oCol.sClass !== null )
+                                       {
+                                               nTd.className = oCol.sClass;
+                                       }
+                                       
+                                       if ( oCol.bVisible )
+                                       {
+                                               oData.nTr.appendChild( nTd );
+                                               oData._anHidden[i] = null;
+                                       }
+                                       else
+                                       {
+                                               oData._anHidden[i] = nTd;
+                                       }
+               
+                                       if ( oCol.fnCreatedCell )
+                                       {
+                                               oCol.fnCreatedCell.call( oSettings.oInstance,
+                                                       nTd, _fnGetCellData( oSettings, iRow, i, 'display' ), oData._aData, iRow, i
+                                               );
+                                       }
+                               }
+               
+                               _fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [oData.nTr, oData._aData, iRow] );
+                       }
+               }
+               
+               
+               /**
+                * Create the HTML header for the table
+                *  @param {object} oSettings dataTables settings object
+                *  @memberof DataTable#oApi
+                */
+               function _fnBuildHead( oSettings )
+               {
+                       var i, nTh, iLen, j, jLen;
+                       var iThs = $('th, td', oSettings.nTHead).length;
+                       var iCorrector = 0;
+                       var jqChildren;
+                       
+                       /* If there is a header in place - then use it - otherwise it's going to get nuked... */
+                       if ( iThs !== 0 )
+                       {
+                               /* We've got a thead from the DOM, so remove hidden columns and apply width to vis cols */
+                               for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                               {
+                                       nTh = oSettings.aoColumns[i].nTh;
+                                       nTh.setAttribute('role', 'columnheader');
+                                       if ( oSettings.aoColumns[i].bSortable )
+                                       {
+                                               nTh.setAttribute('tabindex', oSettings.iTabIndex);
+                                               nTh.setAttribute('aria-controls', oSettings.sTableId);
+                                       }
+               
+                                       if ( oSettings.aoColumns[i].sClass !== null )
+                                       {
+                                               $(nTh).addClass( oSettings.aoColumns[i].sClass );
+                                       }
+                                       
+                                       /* Set the title of the column if it is user defined (not what was auto detected) */
+                                       if ( oSettings.aoColumns[i].sTitle != nTh.innerHTML )
+                                       {
+                                               nTh.innerHTML = oSettings.aoColumns[i].sTitle;
+                                       }
+                               }
+                       }
+                       else
+                       {
+                               /* We don't have a header in the DOM - so we are going to have to create one */
+                               var nTr = document.createElement( "tr" );
+                               
+                               for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                               {
+                                       nTh = oSettings.aoColumns[i].nTh;
+                                       nTh.innerHTML = oSettings.aoColumns[i].sTitle;
+                                       nTh.setAttribute('tabindex', '0');
+                                       
+                                       if ( oSettings.aoColumns[i].sClass !== null )
+                                       {
+                                               $(nTh).addClass( oSettings.aoColumns[i].sClass );
+                                       }
+                                       
+                                       nTr.appendChild( nTh );
+                               }
+                               $(oSettings.nTHead).html( '' )[0].appendChild( nTr );
+                               _fnDetectHeader( oSettings.aoHeader, oSettings.nTHead );
+                       }
+                       
+                       /* ARIA role for the rows */    
+                       $(oSettings.nTHead).children('tr').attr('role', 'row');
+                       
+                       /* Add the extra markup needed by jQuery UI's themes */
+                       if ( oSettings.bJUI )
+                       {
+                               for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                               {
+                                       nTh = oSettings.aoColumns[i].nTh;
+                                       
+                                       var nDiv = document.createElement('div');
+                                       nDiv.className = oSettings.oClasses.sSortJUIWrapper;
+                                       $(nTh).contents().appendTo(nDiv);
+                                       
+                                       var nSpan = document.createElement('span');
+                                       nSpan.className = oSettings.oClasses.sSortIcon;
+                                       nDiv.appendChild( nSpan );
+                                       nTh.appendChild( nDiv );
+                               }
+                       }
+                       
+                       if ( oSettings.oFeatures.bSort )
+                       {
+                               for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+                               {
+                                       if ( oSettings.aoColumns[i].bSortable !== false )
+                                       {
+                                               _fnSortAttachListener( oSettings, oSettings.aoColumns[i].nTh, i );
+                                       }
+                                       else
+                                       {
+                                               $(oSettings.aoColumns[i].nTh).addClass( oSettings.oClasses.sSortableNone );
+                                       }
+                               }
+                       }
+                       
+                       /* Deal with the footer - add classes if required */
+                       if ( oSettings.oClasses.sFooterTH !== "" )
+                       {
+                               $(oSettings.nTFoot).children('tr').children('th').addClass( oSettings.oClasses.sFooterTH );
+                       }
+                       
+                       /* Cache the footer elements */
+                       if ( oSettings.nTFoot !== null )
+                       {
+                               var anCells = _fnGetUniqueThs( oSettings, null, oSettings.aoFooter );
+                               for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                               {
+                                       if ( anCells[i] )
+                                       {
+                                               oSettings.aoColumns[i].nTf = anCells[i];
+                                               if ( oSettings.aoColumns[i].sClass )
+                                               {
+                                                       $(anCells[i]).addClass( oSettings.aoColumns[i].sClass );
+                                               }
+                                       }
+                               }
+                       }
+               }
+               
+               
+               /**
+                * Draw the header (or footer) element based on the column visibility states. The
+                * methodology here is to use the layout array from _fnDetectHeader, modified for
+                * the instantaneous column visibility, to construct the new layout. The grid is
+                * traversed over cell at a time in a rows x columns grid fashion, although each 
+                * cell insert can cover multiple elements in the grid - which is tracks using the
+                * aApplied array. Cell inserts in the grid will only occur where there isn't
+                * already a cell in that position.
+                *  @param {object} oSettings dataTables settings object
+                *  @param array {objects} aoSource Layout array from _fnDetectHeader
+                *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc, 
+                *  @memberof DataTable#oApi
+                */
+               function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
+               {
+                       var i, iLen, j, jLen, k, kLen, n, nLocalTr;
+                       var aoLocal = [];
+                       var aApplied = [];
+                       var iColumns = oSettings.aoColumns.length;
+                       var iRowspan, iColspan;
+               
+                       if (  bIncludeHidden === undefined )
+                       {
+                               bIncludeHidden = false;
+                       }
+               
+                       /* Make a copy of the master layout array, but without the visible columns in it */
+                       for ( i=0, iLen=aoSource.length ; i<iLen ; i++ )
+                       {
+                               aoLocal[i] = aoSource[i].slice();
+                               aoLocal[i].nTr = aoSource[i].nTr;
+               
+                               /* Remove any columns which are currently hidden */
+                               for ( j=iColumns-1 ; j>=0 ; j-- )
+                               {
+                                       if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )
+                                       {
+                                               aoLocal[i].splice( j, 1 );
+                                       }
+                               }
+               
+                               /* Prep the applied array - it needs an element for each row */
+                               aApplied.push( [] );
+                       }
+               
+                       for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )
+                       {
+                               nLocalTr = aoLocal[i].nTr;
+                               
+                               /* All cells are going to be replaced, so empty out the row */
+                               if ( nLocalTr )
+                               {
+                                       while( (n = nLocalTr.firstChild) )
+                                       {
+                                               nLocalTr.removeChild( n );
+                                       }
+                               }
+               
+                               for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )
+                               {
+                                       iRowspan = 1;
+                                       iColspan = 1;
+               
+                                       /* Check to see if there is already a cell (row/colspan) covering our target
+                                        * insert point. If there is, then there is nothing to do.
+                                        */
+                                       if ( aApplied[i][j] === undefined )
+                                       {
+                                               nLocalTr.appendChild( aoLocal[i][j].cell );
+                                               aApplied[i][j] = 1;
+               
+                                               /* Expand the cell to cover as many rows as needed */
+                                               while ( aoLocal[i+iRowspan] !== undefined &&
+                                                       aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )
+                                               {
+                                                       aApplied[i+iRowspan][j] = 1;
+                                                       iRowspan++;
+                                               }
+               
+                                               /* Expand the cell to cover as many columns as needed */
+                                               while ( aoLocal[i][j+iColspan] !== undefined &&
+                                                       aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )
+                                               {
+                                                       /* Must update the applied array over the rows for the columns */
+                                                       for ( k=0 ; k<iRowspan ; k++ )
+                                                       {
+                                                               aApplied[i+k][j+iColspan] = 1;
+                                                       }
+                                                       iColspan++;
+                                               }
+               
+                                               /* Do the actual expansion in the DOM */
+                                               aoLocal[i][j].cell.rowSpan = iRowspan;
+                                               aoLocal[i][j].cell.colSpan = iColspan;
+                                       }
+                               }
+                       }
+               }
+               
+               
+               /**
+                * Insert the required TR nodes into the table for display
+                *  @param {object} oSettings dataTables settings object
+                *  @memberof DataTable#oApi
+                */
+               function _fnDraw( oSettings )
+               {
+                       /* Provide a pre-callback function which can be used to cancel the draw is false is returned */
+                       var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );
+                       if ( $.inArray( false, aPreDraw ) !== -1 )
+                       {
+                               _fnProcessingDisplay( oSettings, false );
+                               return;
+                       }
+                       
+                       var i, iLen, n;
+                       var anRows = [];
+                       var iRowCount = 0;
+                       var iStripes = oSettings.asStripeClasses.length;
+                       var iOpenRows = oSettings.aoOpenRows.length;
+                       
+                       oSettings.bDrawing = true;
+                       
+                       /* Check and see if we have an initial draw position from state saving */
+                       if ( oSettings.iInitDisplayStart !== undefined && oSettings.iInitDisplayStart != -1 )
+                       {
+                               if ( oSettings.oFeatures.bServerSide )
+                               {
+                                       oSettings._iDisplayStart = oSettings.iInitDisplayStart;
+                               }
+                               else
+                               {
+                                       oSettings._iDisplayStart = (oSettings.iInitDisplayStart >= oSettings.fnRecordsDisplay()) ?
+                                               0 : oSettings.iInitDisplayStart;
+                               }
+                               oSettings.iInitDisplayStart = -1;
+                               _fnCalculateEnd( oSettings );
+                       }
+                       
+                       /* Server-side processing draw intercept */
+                       if ( oSettings.bDeferLoading )
+                       {
+                               oSettings.bDeferLoading = false;
+                               oSettings.iDraw++;
+                       }
+                       else if ( !oSettings.oFeatures.bServerSide )
+                       {
+                               oSettings.iDraw++;
+                       }
+                       else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )
+                       {
+                               return;
+                       }
+                       
+                       if ( oSettings.aiDisplay.length !== 0 )
+                       {
+                               var iStart = oSettings._iDisplayStart;
+                               var iEnd = oSettings._iDisplayEnd;
+                               
+                               if ( oSettings.oFeatures.bServerSide )
+                               {
+                                       iStart = 0;
+                                       iEnd = oSettings.aoData.length;
+                               }
+                               
+                               for ( var j=iStart ; j<iEnd ; j++ )
+                               {
+                                       var aoData = oSettings.aoData[ oSettings.aiDisplay[j] ];
+                                       if ( aoData.nTr === null )
+                                       {
+                                               _fnCreateTr( oSettings, oSettings.aiDisplay[j] );
+                                       }
+               
+                                       var nRow = aoData.nTr;
+                                       
+                                       /* Remove the old striping classes and then add the new one */
+                                       if ( iStripes !== 0 )
+                                       {
+                                               var sStripe = oSettings.asStripeClasses[ iRowCount % iStripes ];
+                                               if ( aoData._sRowStripe != sStripe )
+                                               {
+                                                       $(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );
+                                                       aoData._sRowStripe = sStripe;
+                                               }
+                                       }
+                                       
+                                       /* Row callback functions - might want to manipulate the row */
+                                       _fnCallbackFire( oSettings, 'aoRowCallback', null, 
+                                               [nRow, oSettings.aoData[ oSettings.aiDisplay[j] ]._aData, iRowCount, j] );
+                                       
+                                       anRows.push( nRow );
+                                       iRowCount++;
+                                       
+                                       /* If there is an open row - and it is attached to this parent - attach it on redraw */
+                                       if ( iOpenRows !== 0 )
+                                       {
+                                               for ( var k=0 ; k<iOpenRows ; k++ )
+                                               {
+                                                       if ( nRow == oSettings.aoOpenRows[k].nParent )
+                                                       {
+                                                               anRows.push( oSettings.aoOpenRows[k].nTr );
+                                                               break;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+                       else
+                       {
+                               /* Table is empty - create a row with an empty message in it */
+                               anRows[ 0 ] = document.createElement( 'tr' );
+                               
+                               if ( oSettings.asStripeClasses[0] )
+                               {
+                                       anRows[ 0 ].className = oSettings.asStripeClasses[0];
+                               }
+               
+                               var oLang = oSettings.oLanguage;
+                               var sZero = oLang.sZeroRecords;
+                               if ( oSettings.iDraw == 1 && oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide )
+                               {
+                                       sZero = oLang.sLoadingRecords;
+                               }
+                               else if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )
+                               {
+                                       sZero = oLang.sEmptyTable;
+                               }
+               
+                               var nTd = document.createElement( 'td' );
+                               nTd.setAttribute( 'valign', "top" );
+                               nTd.colSpan = _fnVisbleColumns( oSettings );
+                               nTd.className = oSettings.oClasses.sRowEmpty;
+                               nTd.innerHTML = _fnInfoMacros( oSettings, sZero );
+                               
+                               anRows[ iRowCount ].appendChild( nTd );
+                       }
+                       
+                       /* Header and footer callbacks */
+                       _fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0], 
+                               _fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] );
+                       
+                       _fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0], 
+                               _fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] );
+                       
+                       /* 
+                        * Need to remove any old row from the display - note we can't just empty the tbody using
+                        * $().html('') since this will unbind the jQuery event handlers (even although the node 
+                        * still exists!) - equally we can't use innerHTML, since IE throws an exception.
+                        */
+                       var
+                               nAddFrag = document.createDocumentFragment(),
+                               nRemoveFrag = document.createDocumentFragment(),
+                               nBodyPar, nTrs;
+                       
+                       if ( oSettings.nTBody )
+                       {
+                               nBodyPar = oSettings.nTBody.parentNode;
+                               nRemoveFrag.appendChild( oSettings.nTBody );
+                               
+                               /* When doing infinite scrolling, only remove child rows when sorting, filtering or start
+                                * up. When not infinite scroll, always do it.
+                                */
+                               if ( !oSettings.oScroll.bInfinite || !oSettings._bInitComplete ||
+                                       oSettings.bSorted || oSettings.bFiltered )
+                               {
+                                       while( (n = oSettings.nTBody.firstChild) )
+                                       {
+                                               oSettings.nTBody.removeChild( n );
+                                       }
+                               }
+                               
+                               /* Put the draw table into the dom */
+                               for ( i=0, iLen=anRows.length ; i<iLen ; i++ )
+                               {
+                                       nAddFrag.appendChild( anRows[i] );
+                               }
+                               
+                               oSettings.nTBody.appendChild( nAddFrag );
+                               if ( nBodyPar !== null )
+                               {
+                                       nBodyPar.appendChild( oSettings.nTBody );
+                               }
+                       }
+                       
+                       /* Call all required callback functions for the end of a draw */
+                       _fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );
+                       
+                       /* Draw is complete, sorting and filtering must be as well */
+                       oSettings.bSorted = false;
+                       oSettings.bFiltered = false;
+                       oSettings.bDrawing = false;
+                       
+                       if ( oSettings.oFeatures.bServerSide )
+                       {
+                               _fnProcessingDisplay( oSettings, false );
+                               if ( !oSettings._bInitComplete )
+                               {
+                                       _fnInitComplete( oSettings );
+                               }
+                       }
+               }
+               
+               
+               /**
+                * Redraw the table - taking account of the various features which are enabled
+                *  @param {object} oSettings dataTables settings object
+                *  @memberof DataTable#oApi
+                */
+               function _fnReDraw( oSettings )
+               {
+                       if ( oSettings.oFeatures.bSort )
+                       {
+                               /* Sorting will refilter and draw for us */
+                               _fnSort( oSettings, oSettings.oPreviousSearch );
+                       }
+                       else if ( oSettings.oFeatures.bFilter )
+                       {
+                               /* Filtering will redraw for us */
+                               _fnFilterComplete( oSettings, oSettings.oPreviousSearch );
+                       }
+                       else
+                       {
+                               _fnCalculateEnd( oSettings );
+                               _fnDraw( oSettings );
+                       }
+               }
+               
+               
+               /**
+                * Add the options to the page HTML for the table
+                *  @param {object} oSettings dataTables settings object
+                *  @memberof DataTable#oApi
+                */
+               function _fnAddOptionsHtml ( oSettings )
+               {
+                       /*
+                        * Create a temporary, empty, div which we can later on replace with what we have generated
+                        * we do it this way to rendering the 'options' html offline - speed :-)
+                        */
+                       var nHolding = $('<div></div>')[0];
+                       oSettings.nTable.parentNode.insertBefore( nHolding, oSettings.nTable );
+                       
+                       /* 
+                        * All DataTables are wrapped in a div
+                        */
+                       oSettings.nTableWrapper = $('<div id="'+oSettings.sTableId+'_wrapper" class="'+oSettings.oClasses.sWrapper+'" role="grid"></div>')[0];
+                       oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;
+               
+                       /* Track where we want to insert the option */
+                       var nInsertNode = oSettings.nTableWrapper;
+                       
+                       /* Loop over the user set positioning and place the elements as needed */
+                       var aDom = oSettings.sDom.split('');
+                       var nTmp, iPushFeature, cOption, nNewNode, cNext, sAttr, j;
+                       for ( var i=0 ; i<aDom.length ; i++ )
+                       {
+                               iPushFeature = 0;
+                               cOption = aDom[i];
+                               
+                               if ( cOption == '<' )
+                               {
+                                       /* New container div */
+                                       nNewNode = $('<div></div>')[0];
+                                       
+                                       /* Check to see if we should append an id and/or a class name to the container */
+                                       cNext = aDom[i+1];
+                                       if ( cNext == "'" || cNext == '"' )
+                                       {
+                                               sAttr = "";
+                                               j = 2;
+                                               while ( aDom[i+j] != cNext )
+                                               {
+                                                       sAttr += aDom[i+j];
+                                                       j++;
+                                               }
+                                               
+                                               /* Replace jQuery UI constants */
+                                               if ( sAttr == "H" )
+                                               {
+                                                       sAttr = oSettings.oClasses.sJUIHeader;
+                                               }
+                                               else if ( sAttr == "F" )
+                                               {
+                                                       sAttr = oSettings.oClasses.sJUIFooter;
+                                               }
+                                               
+                                               /* The attribute can be in the format of "#id.class", "#id" or "class" This logic
+                                                * breaks the string into parts and applies them as needed
+                                                */
+                                               if ( sAttr.indexOf('.') != -1 )
+                                               {
+                                                       var aSplit = sAttr.split('.');
+                                                       nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);
+                                                       nNewNode.className = aSplit[1];
+                                               }
+                                               else if ( sAttr.charAt(0) == "#" )
+                                               {
+                                                       nNewNode.id = sAttr.substr(1, sAttr.length-1);
+                                               }
+                                               else
+                                               {
+                                                       nNewNode.className = sAttr;
+                                               }
+                                               
+                                               i += j; /* Move along the position array */
+                                       }
+                                       
+                                       nInsertNode.appendChild( nNewNode );
+                                       nInsertNode = nNewNode;
+                               }
+                               else if ( cOption == '>' )
+                               {
+                                       /* End container div */
+                                       nInsertNode = nInsertNode.parentNode;
+                               }
+                               else if ( cOption == 'l' && oSettings.oFeatures.bPaginate && oSettings.oFeatures.bLengthChange )
+                               {
+                                       /* Length */
+                                       nTmp = _fnFeatureHtmlLength( oSettings );
+                                       iPushFeature = 1;
+                               }
+                               else if ( cOption == 'f' && oSettings.oFeatures.bFilter )
+                               {
+                                       /* Filter */
+                                       nTmp = _fnFeatureHtmlFilter( oSettings );
+                                       iPushFeature = 1;
+                               }
+                               else if ( cOption == 'r' && oSettings.oFeatures.bProcessing )
+                               {
+                                       /* pRocessing */
+                                       nTmp = _fnFeatureHtmlProcessing( oSettings );
+                                       iPushFeature = 1;
+                               }
+                               else if ( cOption == 't' )
+                               {
+                                       /* Table */
+                                       nTmp = _fnFeatureHtmlTable( oSettings );
+                                       iPushFeature = 1;
+                               }
+                               else if ( cOption ==  'i' && oSettings.oFeatures.bInfo )
+                               {
+                                       /* Info */
+                                       nTmp = _fnFeatureHtmlInfo( oSettings );
+                                       iPushFeature = 1;
+                               }
+                               else if ( cOption == 'p' && oSettings.oFeatures.bPaginate )
+                               {
+                                       /* Pagination */
+                                       nTmp = _fnFeatureHtmlPaginate( oSettings );
+                                       iPushFeature = 1;
+                               }
+                               else if ( DataTable.ext.aoFeatures.length !== 0 )
+                               {
+                                       /* Plug-in features */
+                                       var aoFeatures = DataTable.ext.aoFeatures;
+                                       for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )
+                                       {
+                                               if ( cOption == aoFeatures[k].cFeature )
+                                               {
+                                                       nTmp = aoFeatures[k].fnInit( oSettings );
+                                                       if ( nTmp )
+                                                       {
+                                                               iPushFeature = 1;
+                                                       }
+                                                       break;
+                                               }
+                                       }
+                               }
+                               
+                               /* Add to the 2D features array */
+                               if ( iPushFeature == 1 && nTmp !== null )
+                               {
+                                       if ( typeof oSettings.aanFeatures[cOption] !== 'object' )
+                                       {
+                                               oSettings.aanFeatures[cOption] = [];
+                                       }
+                                       oSettings.aanFeatures[cOption].push( nTmp );
+                                       nInsertNode.appendChild( nTmp );
+                               }
+                       }
+                       
+                       /* Built our DOM structure - replace the holding div with what we want */
+                       nHolding.parentNode.replaceChild( oSettings.nTableWrapper, nHolding );
+               }
+               
+               
+               /**
+                * Use the DOM source to create up an array of header cells. The idea here is to
+                * create a layout grid (array) of rows x columns, which contains a reference
+                * to the cell that that point in the grid (regardless of col/rowspan), such that
+                * any column / row could be removed and the new grid constructed
+                *  @param array {object} aLayout Array to store the calculated layout in
+                *  @param {node} nThead The header/footer element for the table
+                *  @memberof DataTable#oApi
+                */
+               function _fnDetectHeader ( aLayout, nThead )
+               {
+                       var nTrs = $(nThead).children('tr');
+                       var nTr, nCell;
+                       var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;
+                       var bUnique;
+                       var fnShiftCol = function ( a, i, j ) {
+                               var k = a[i];
+                               while ( k[j] ) {
+                                       j++;
+                               }
+                               return j;
+                       };
+               
+                       aLayout.splice( 0, aLayout.length );
+                       
+                       /* We know how many rows there are in the layout - so prep it */
+                       for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
+                       {
+                               aLayout.push( [] );
+                       }
+                       
+                       /* Calculate a layout array */
+                       for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
+                       {
+                               nTr = nTrs[i];
+                               iColumn = 0;
+                               
+                               /* For every cell in the row... */
+                               nCell = nTr.firstChild;
+                               while ( nCell ) {
+                                       if ( nCell.nodeName.toUpperCase() == "TD" ||
+                                            nCell.nodeName.toUpperCase() == "TH" )
+                                       {
+                                               /* Get the col and rowspan attributes from the DOM and sanitise them */
+                                               iColspan = nCell.getAttribute('colspan') * 1;
+                                               iRowspan = nCell.getAttribute('rowspan') * 1;
+                                               iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;
+                                               iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;
+               
+                                               /* There might be colspan cells already in this row, so shift our target 
+                                                * accordingly
+                                                */
+                                               iColShifted = fnShiftCol( aLayout, i, iColumn );
+                                               
+                                               /* Cache calculation for unique columns */
+                                               bUnique = iColspan === 1 ? true : false;
+                                               
+                                               /* If there is col / rowspan, copy the information into the layout grid */
+                                               for ( l=0 ; l<iColspan ; l++ )
+                                               {
+                                                       for ( k=0 ; k<iRowspan ; k++ )
+                                                       {
+                                                               aLayout[i+k][iColShifted+l] = {
+                                                                       "cell": nCell,
+                                                                       "unique": bUnique
+                                                               };
+                                                               aLayout[i+k].nTr = nTr;
+                                                       }
+                                               }
+                                       }
+                                       nCell = nCell.nextSibling;
+                               }
+                       }
+               }
+               
+               
+               /**
+                * Get an array of unique th elements, one for each column
+                *  @param {object} oSettings dataTables settings object
+                *  @param {node} nHeader automatically detect the layout from this node - optional
+                *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional
+                *  @returns array {node} aReturn list of unique th's
+                *  @memberof DataTable#oApi
+                */
+               function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
+               {
+                       var aReturn = [];
+                       if ( !aLayout )
+                       {
+                               aLayout = oSettings.aoHeader;
+                               if ( nHeader )
+                               {
+                                       aLayout = [];
+                                       _fnDetectHeader( aLayout, nHeader );
+                               }
+                       }
+               
+                       for ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )
+                       {
+                               for ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )
+                               {
+                                       if ( aLayout[i][j].unique && 
+                                                (!aReturn[j] || !oSettings.bSortCellsTop) )
+                                       {
+                                               aReturn[j] = aLayout[i][j].cell;
+                                       }
+                               }
+                       }
+                       
+                       return aReturn;
+               }
+               
+               
+               
+               /**
+                * Update the table using an Ajax call
+                *  @param {object} oSettings dataTables settings object
+                *  @returns {boolean} Block the table drawing or not
+                *  @memberof DataTable#oApi
+                */
+               function _fnAjaxUpdate( oSettings )
+               {
+                       if ( oSettings.bAjaxDataGet )
+                       {
+                               oSettings.iDraw++;
+                               _fnProcessingDisplay( oSettings, true );
+                               var iColumns = oSettings.aoColumns.length;
+                               var aoData = _fnAjaxParameters( oSettings );
+                               _fnServerParams( oSettings, aoData );
+                               
+                               oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData,
+                                       function(json) {
+                                               _fnAjaxUpdateDraw( oSettings, json );
+                                       }, oSettings );
+                               return false;
+                       }
+                       else
+                       {
+                               return true;
+                       }
+               }
+               
+               
+               /**
+                * Build up the parameters in an object needed for a server-side processing request
+                *  @param {object} oSettings dataTables settings object
+                *  @returns {bool} block the table drawing or not
+                *  @memberof DataTable#oApi
+                */
+               function _fnAjaxParameters( oSettings )
+               {
+                       var iColumns = oSettings.aoColumns.length;
+                       var aoData = [], mDataProp, aaSort, aDataSort;
+                       var i, j;
+                       
+                       aoData.push( { "name": "sEcho",          "value": oSettings.iDraw } );
+                       aoData.push( { "name": "iColumns",       "value": iColumns } );
+                       aoData.push( { "name": "sColumns",       "value": _fnColumnOrdering(oSettings) } );
+                       aoData.push( { "name": "iDisplayStart",  "value": oSettings._iDisplayStart } );
+                       aoData.push( { "name": "iDisplayLength", "value": oSettings.oFeatures.bPaginate !== false ?
+                               oSettings._iDisplayLength : -1 } );
+                               
+                       for ( i=0 ; i<iColumns ; i++ )
+                       {
+                         mDataProp = oSettings.aoColumns[i].mData;
+                               aoData.push( { "name": "mDataProp_"+i, "value": typeof(mDataProp)==="function" ? 'function' : mDataProp } );
+                       }
+                       
+                       /* Filtering */
+                       if ( oSettings.oFeatures.bFilter !== false )
+                       {
+                               aoData.push( { "name": "sSearch", "value": oSettings.oPreviousSearch.sSearch } );
+                               aoData.push( { "name": "bRegex",  "value": oSettings.oPreviousSearch.bRegex } );
+                               for ( i=0 ; i<iColumns ; i++ )
+                               {
+                                       aoData.push( { "name": "sSearch_"+i,     "value": oSettings.aoPreSearchCols[i].sSearch } );
+                                       aoData.push( { "name": "bRegex_"+i,      "value": oSettings.aoPreSearchCols[i].bRegex } );
+                                       aoData.push( { "name": "bSearchable_"+i, "value": oSettings.aoColumns[i].bSearchable } );
+                               }
+                       }
+                       
+                       /* Sorting */
+                       if ( oSettings.oFeatures.bSort !== false )
+                       {
+                               var iCounter = 0;
+               
+                               aaSort = ( oSettings.aaSortingFixed !== null ) ?
+                                       oSettings.aaSortingFixed.concat( oSettings.aaSorting ) :
+                                       oSettings.aaSorting.slice();
+                               
+                               for ( i=0 ; i<aaSort.length ; i++ )
+                               {
+                                       aDataSort = oSettings.aoColumns[ aaSort[i][0] ].aDataSort;
+                                       
+                                       for ( j=0 ; j<aDataSort.length ; j++ )
+                                       {
+                                               aoData.push( { "name": "iSortCol_"+iCounter,  "value": aDataSort[j] } );
+                                               aoData.push( { "name": "sSortDir_"+iCounter,  "value": aaSort[i][1] } );
+                                               iCounter++;
+                                       }
+                               }
+                               aoData.push( { "name": "iSortingCols",   "value": iCounter } );
+                               
+                               for ( i=0 ; i<iColumns ; i++ )
+                               {
+                                       aoData.push( { "name": "bSortable_"+i,  "value": oSettings.aoColumns[i].bSortable } );
+                               }
+                       }
+                       
+                       return aoData;
+               }
+               
+               
+               /**
+                * Add Ajax parameters from plug-ins
+                *  @param {object} oSettings dataTables settings object
+                *  @param array {objects} aoData name/value pairs to send to the server
+                *  @memberof DataTable#oApi
+                */
+               function _fnServerParams( oSettings, aoData )
+               {
+                       _fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [aoData] );
+               }
+               
+               
+               /**
+                * Data the data from the server (nuking the old) and redraw the table
+                *  @param {object} oSettings dataTables settings object
+                *  @param {object} json json data return from the server.
+                *  @param {string} json.sEcho Tracking flag for DataTables to match requests
+                *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering
+                *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering
+                *  @param {array} json.aaData The data to display on this page
+                *  @param {string} [json.sColumns] Column ordering (sName, comma separated)
+                *  @memberof DataTable#oApi
+                */
+               function _fnAjaxUpdateDraw ( oSettings, json )
+               {
+                       if ( json.sEcho !== undefined )
+                       {
+                               /* Protect against old returns over-writing a new one. Possible when you get
+                                * very fast interaction, and later queries are completed much faster
+                                */
+                               if ( json.sEcho*1 < oSettings.iDraw )
+                               {
+                                       return;
+                               }
+                               else
+                               {
+                                       oSettings.iDraw = json.sEcho * 1;
+                               }
+                       }
+                       
+                       if ( !oSettings.oScroll.bInfinite ||
+                                  (oSettings.oScroll.bInfinite && (oSettings.bSorted || oSettings.bFiltered)) )
+                       {
+                               _fnClearTable( oSettings );
+                       }
+                       oSettings._iRecordsTotal = parseInt(json.iTotalRecords, 10);
+                       oSettings._iRecordsDisplay = parseInt(json.iTotalDisplayRecords, 10);
+                       
+                       /* Determine if reordering is required */
+                       var sOrdering = _fnColumnOrdering(oSettings);
+                       var bReOrder = (json.sColumns !== undefined && sOrdering !== "" && json.sColumns != sOrdering );
+                       var aiIndex;
+                       if ( bReOrder )
+                       {
+                               aiIndex = _fnReOrderIndex( oSettings, json.sColumns );
+                       }
+                       
+                       var aData = _fnGetObjectDataFn( oSettings.sAjaxDataProp )( json );
+                       for ( var i=0, iLen=aData.length ; i<iLen ; i++ )
+                       {
+                               if ( bReOrder )
+                               {
+                                       /* If we need to re-order, then create a new array with the correct order and add it */
+                                       var aDataSorted = [];
+                                       for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ )
+                                       {
+                                               aDataSorted.push( aData[i][ aiIndex[j] ] );
+                                       }
+                                       _fnAddData( oSettings, aDataSorted );
+                               }
+                               else
+                               {
+                                       /* No re-order required, sever got it "right" - just straight add */
+                                       _fnAddData( oSettings, aData[i] );
+                               }
+                       }
+                       oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+                       
+                       oSettings.bAjaxDataGet = false;
+                       _fnDraw( oSettings );
+                       oSettings.bAjaxDataGet = true;
+                       _fnProcessingDisplay( oSettings, false );
+               }
+               
+               
+               
+               /**
+                * Generate the node required for filtering text
+                *  @returns {node} Filter control element
+                *  @param {object} oSettings dataTables settings object
+                *  @memberof DataTable#oApi
+                */
+               function _fnFeatureHtmlFilter ( oSettings )
+               {
+                       var oPreviousSearch = oSettings.oPreviousSearch;
+                       
+                       var sSearchStr = oSettings.oLanguage.sSearch;
+                       sSearchStr = (sSearchStr.indexOf('_INPUT_') !== -1) ?
+                         sSearchStr.replace('_INPUT_', '<input type="text" />') :
+                         sSearchStr==="" ? '<input type="text" />' : sSearchStr+' <input type="text" />';
+                       
+                       var nFilter = document.createElement( 'div' );
+                       nFilter.className = oSettings.oClasses.sFilter;
+                       nFilter.innerHTML = '<label>'+sSearchStr+'</label>';
+                       if ( !oSettings.aanFeatures.f )
+                       {
+                               nFilter.id = oSettings.sTableId+'_filter';
+                       }
+                       
+                       var jqFilter = $('input[type="text"]', nFilter);
+               
+                       // Store a reference to the input element, so other input elements could be
+                       // added to the filter wrapper if needed (submit button for example)
+                       nFilter._DT_Input = jqFilter[0];
+               
+                       jqFilter.val( oPreviousSearch.sSearch.replace('"','&quot;') );
+                       jqFilter.bind( 'keyup.DT', function(e) {
+                               /* Update all other filter input elements for the new display */
+                               var n = oSettings.aanFeatures.f;
+                               var val = this.value==="" ? "" : this.value; // mental IE8 fix :-(
+               
+                               for ( var i=0, iLen=n.length ; i<iLen ; i++ )
+                               {
+                                       if ( n[i] != $(this).parents('div.dataTables_filter')[0] )
+                                       {
+                                               $(n[i]._DT_Input).val( val );
+                                       }
+                               }
+                               
+                               /* Now do the filter */
+                               if ( val != oPreviousSearch.sSearch )
+                               {
+                                       _fnFilterComplete( oSettings, { 
+                                               "sSearch": val, 
+                                               "bRegex": oPreviousSearch.bRegex,
+                                               "bSmart": oPreviousSearch.bSmart ,
+                                               "bCaseInsensitive": oPreviousSearch.bCaseInsensitive 
+                                       } );
+                               }
+                       } );
+               
+                       jqFilter
+                               .attr('aria-controls', oSettings.sTableId)
+                               .bind( 'keypress.DT', function(e) {
+                                       /* Prevent form submission */
+                                       if ( e.keyCode == 13 )
+                                       {
+                                               return false;
+                                       }
+                               }
+                       );
+                       
+                       return nFilter;
+               }
+               
+               
+               /**
+                * Filter the table using both the global filter and column based filtering
+                *  @param {object} oSettings dataTables settings object
+                *  @param {object} oSearch search information
+                *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)
+                *  @memberof DataTable#oApi
+                */
+               function _fnFilterComplete ( oSettings, oInput, iForce )
+               {
+                       var oPrevSearch = oSettings.oPreviousSearch;
+                       var aoPrevSearch = oSettings.aoPreSearchCols;
+                       var fnSaveFilter = function ( oFilter ) {
+                               /* Save the filtering values */
+                               oPrevSearch.sSearch = oFilter.sSearch;
+                               oPrevSearch.bRegex = oFilter.bRegex;
+                               oPrevSearch.bSmart = oFilter.bSmart;
+                               oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;
+                       };
+               
+                       /* In server-side processing all filtering is done by the server, so no point hanging around here */
+                       if ( !oSettings.oFeatures.bServerSide )
+                       {
+                               /* Global filter */
+                               _fnFilter( oSettings, oInput.sSearch, iForce, oInput.bRegex, oInput.bSmart, oInput.bCaseInsensitive );
+                               fnSaveFilter( oInput );
+               
+                               /* Now do the individual column filter */
+                               for ( var i=0 ; i<oSettings.aoPreSearchCols.length ; i++ )
+                               {
+                                       _fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, aoPrevSearch[i].bRegex, 
+                                               aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );
+                               }
+                               
+                               /* Custom filtering */
+                               _fnFilterCustom( oSettings );
+                       }
+                       else
+                       {
+                               fnSaveFilter( oInput );
+                       }
+                       
+                       /* Tell the draw function we have been filtering */
+                       oSettings.bFiltered = true;
+                       $(oSettings.oInstance).trigger('filter', oSettings);
+                       
+                       /* Redraw the table */
+                       oSettings._iDisplayStart = 0;
+                       _fnCalculateEnd( oSettings );
+                       _fnDraw( oSettings );
+                       
+                       /* Rebuild search array 'offline' */
+                       _fnBuildSearchArray( oSettings, 0 );
+               }
+               
+               
+               /**
+                * Apply custom filtering functions
+                *  @param {object} oSettings dataTables settings object
+                *  @memberof DataTable#oApi
+                */
+               function _fnFilterCustom( oSettings )
+               {
+                       var afnFilters = DataTable.ext.afnFiltering;
+                       var aiFilterColumns = _fnGetColumns( oSettings, 'bSearchable' );
+               
+                       for ( var i=0, iLen=afnFilters.length ; i<iLen ; i++ )
+                       {
+                               var iCorrector = 0;
+                               for ( var j=0, jLen=oSettings.aiDisplay.length ; j<jLen ; j++ )
+                               {
+                                       var iDisIndex = oSettings.aiDisplay[j-iCorrector];
+                                       var bTest = afnFilters[i](
+                                               oSettings,
+                                               _fnGetRowData( oSettings, iDisIndex, 'filter', aiFilterColumns ),
+                                               iDisIndex
+                                       );
+                                       
+                                       /* Check if we should use this row based on the filtering function */
+                                       if ( !bTest )
+                                       {
+                                               oSettings.aiDisplay.splice( j-iCorrector, 1 );
+                                               iCorrector++;
+                                       }
+                               }
+                       }
+               }
+               
+               
+               /**
+                * Filter the table on a per-column basis
+                *  @param {object} oSettings dataTables settings object
+                *  @param {string} sInput string to filter on
+                *  @param {int} iColumn column to filter
+                *  @param {bool} bRegex treat search string as a regular expression or not
+                *  @param {bool} bSmart use smart filtering or not
+                *  @param {bool} bCaseInsensitive Do case insenstive matching or not
+                *  @memberof DataTable#oApi
+                */
+               function _fnFilterColumn ( oSettings, sInput, iColumn, bRegex, bSmart, bCaseInsensitive )
+               {
+                       if ( sInput === "" )
+                       {
+                               return;
+                       }
+                       
+                       var iIndexCorrector = 0;
+                       var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive );
+                       
+                       for ( var i=oSettings.aiDisplay.length-1 ; i>=0 ; i-- )
+                       {
+                               var sData = _fnDataToSearch( _fnGetCellData( oSettings, oSettings.aiDisplay[i], iColumn, 'filter' ),
+                                       oSettings.aoColumns[iColumn].sType );
+                               if ( ! rpSearch.test( sData ) )
+                               {
+                                       oSettings.aiDisplay.splice( i, 1 );
+                                       iIndexCorrector++;
+                               }
+                       }
+               }
+               
+               
+               /**
+                * Filter the data table based on user input and draw the table
+                *  @param {object} oSettings dataTables settings object
+                *  @param {string} sInput string to filter on
+                *  @param {int} iForce optional - force a research of the master array (1) or not (undefined or 0)
+                *  @param {bool} bRegex treat as a regular expression or not
+                *  @param {bool} bSmart perform smart filtering or not
+                *  @param {bool} bCaseInsensitive Do case insenstive matching or not
+                *  @memberof DataTable#oApi
+                */
+               function _fnFilter( oSettings, sInput, iForce, bRegex, bSmart, bCaseInsensitive )
+               {
+                       var i;
+                       var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive );
+                       var oPrevSearch = oSettings.oPreviousSearch;
+                       
+                       /* Check if we are forcing or not - optional parameter */
+                       if ( !iForce )
+                       {
+                               iForce = 0;
+                       }
+                       
+                       /* Need to take account of custom filtering functions - always filter */
+                       if ( DataTable.ext.afnFiltering.length !== 0 )
+                       {
+                               iForce = 1;
+                       }
+                       
+                       /*
+                        * If the input is blank - we want the full data set
+                        */
+                       if ( sInput.length <= 0 )
+                       {
+                               oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length);
+                               oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+                       }
+                       else
+                       {
+                               /*
+                                * We are starting a new search or the new search string is smaller 
+                                * then the old one (i.e. delete). Search from the master array
+                                */
+                               if ( oSettings.aiDisplay.length == oSettings.aiDisplayMaster.length ||
+                                          oPrevSearch.sSearch.length > sInput.length || iForce == 1 ||
+                                          sInput.indexOf(oPrevSearch.sSearch) !== 0 )
+                               {
+                                       /* Nuke the old display array - we are going to rebuild it */
+                                       oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length);
+                                       
+                                       /* Force a rebuild of the search array */
+                                       _fnBuildSearchArray( oSettings, 1 );
+                                       
+                                       /* Search through all records to populate the search array
+                                        * The the oSettings.aiDisplayMaster and asDataSearch arrays have 1 to 1 
+                                        * mapping
+                                        */
+                                       for ( i=0 ; i<oSettings.aiDisplayMaster.length ; i++ )
+                                       {
+                                               if ( rpSearch.test(oSettings.asDataSearch[i]) )
+                                               {
+                                                       oSettings.aiDisplay.push( oSettings.aiDisplayMaster[i] );
+                                               }
+                                       }
+                         }
+                         else
+                               {
+                               /* Using old search array - refine it - do it this way for speed
+                                * Don't have to search the whole master array again
+                                        */
+                               var iIndexCorrector = 0;
+                               
+                               /* Search the current results */
+                               for ( i=0 ; i<oSettings.asDataSearch.length ; i++ )
+                                       {
+                                       if ( ! rpSearch.test(oSettings.asDataSearch[i]) )
+                                               {
+                                               oSettings.aiDisplay.splice( i-iIndexCorrector, 1 );
+                                               iIndexCorrector++;
+                                       }
+                               }
+                         }
+                       }
+               }
+               
+               
+               /**
+                * Create an array which can be quickly search through
+                *  @param {object} oSettings dataTables settings object
+                *  @param {int} iMaster use the master data array - optional
+                *  @memberof DataTable#oApi
+                */
+               function _fnBuildSearchArray ( oSettings, iMaster )
+               {
+                       if ( !oSettings.oFeatures.bServerSide )
+                       {
+                               /* Clear out the old data */
+                               oSettings.asDataSearch = [];
+               
+                               var aiFilterColumns = _fnGetColumns( oSettings, 'bSearchable' );
+                               var aiIndex = (iMaster===1) ?
+                                       oSettings.aiDisplayMaster :
+                                       oSettings.aiDisplay;
+                               
+                               for ( var i=0, iLen=aiIndex.length ; i<iLen ; i++ )
+                               {
+                                       oSettings.asDataSearch[i] = _fnBuildSearchRow(
+                                               oSettings,
+                                               _fnGetRowData( oSettings, aiIndex[i], 'filter', aiFilterColumns )
+                                       );
+                               }
+                       }
+               }
+               
+               
+               /**
+                * Create a searchable string from a single data row
+                *  @param {object} oSettings dataTables settings object
+                *  @param {array} aData Row data array to use for the data to search
+                *  @memberof DataTable#oApi
+                */
+               function _fnBuildSearchRow( oSettings, aData )
+               {
+                       var sSearch = aData.join('  ');
+                       
+                       /* If it looks like there is an HTML entity in the string, attempt to decode it */
+                       if ( sSearch.indexOf('&') !== -1 )
+                       {
+                               sSearch = $('<div>').html(sSearch).text();
+                       }
+                       
+                       // Strip newline characters
+                       return sSearch.replace( /[\n\r]/g, " " );
+               }
+               
+               /**
+                * Build a regular expression object suitable for searching a table
+                *  @param {string} sSearch string to search for
+                *  @param {bool} bRegex treat as a regular expression or not
+                *  @param {bool} bSmart perform smart filtering or not
+                *  @param {bool} bCaseInsensitive Do case insensitive matching or not
+                *  @returns {RegExp} constructed object
+                *  @memberof DataTable#oApi
+                */
+               function _fnFilterCreateSearch( sSearch, bRegex, bSmart, bCaseInsensitive )
+               {
+                       var asSearch, sRegExpString;
+                       
+                       if ( bSmart )
+                       {
+                               /* Generate the regular expression to use. Something along the lines of:
+                                * ^(?=.*?\bone\b)(?=.*?\btwo\b)(?=.*?\bthree\b).*$
+                                */
+                               asSearch = bRegex ? sSearch.split( ' ' ) : _fnEscapeRegex( sSearch ).split( ' ' );
+                               sRegExpString = '^(?=.*?'+asSearch.join( ')(?=.*?' )+').*$';
+                               return new RegExp( sRegExpString, bCaseInsensitive ? "i" : "" );
+                       }
+                       else
+                       {
+                               sSearch = bRegex ? sSearch : _fnEscapeRegex( sSearch );
+                               return new RegExp( sSearch, bCaseInsensitive ? "i" : "" );
+                       }
+               }
+               
+               
+               /**
+                * Convert raw data into something that the user can search on
+                *  @param {string} sData data to be modified
+                *  @param {string} sType data type
+                *  @returns {string} search string
+                *  @memberof DataTable#oApi
+                */
+               function _fnDataToSearch ( sData, sType )
+               {
+                       if ( typeof DataTable.ext.ofnSearch[sType] === "function" )
+                       {
+                               return DataTable.ext.ofnSearch[sType]( sData );
+                       }
+                       else if ( sData === null )
+                       {
+                               return '';
+                       }
+                       else if ( sType == "html" )
+                       {
+                               return sData.replace(/[\r\n]/g," ").replace( /<.*?>/g, "" );
+                       }
+                       else if ( typeof sData === "string" )
+                       {
+                               return sData.replace(/[\r\n]/g," ");
+                       }
+                       return sData;
+               }
+               
+               
+               /**
+                * scape a string such that it can be used in a regular expression
+                *  @param {string} sVal string to escape
+                *  @returns {string} escaped string
+                *  @memberof DataTable#oApi
+                */
+               function _fnEscapeRegex ( sVal )
+               {
+                       var acEscape = [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ];
+                       var reReplace = new RegExp( '(\\' + acEscape.join('|\\') + ')', 'g' );
+                       return sVal.replace(reReplace, '\\$1');
+               }
+               
+               
+               /**
+                * Generate the node required for the info display
+                *  @param {object} oSettings dataTables settings object
+                *  @returns {node} Information element
+                *  @memberof DataTable#oApi
+                */
+               function _fnFeatureHtmlInfo ( oSettings )
+               {
+                       var nInfo = document.createElement( 'div' );
+                       nInfo.className = oSettings.oClasses.sInfo;
+                       
+                       /* Actions that are to be taken once only for this feature */
+                       if ( !oSettings.aanFeatures.i )
+                       {
+                               /* Add draw callback */
+                               oSettings.aoDrawCallback.push( {
+                                       "fn": _fnUpdateInfo,
+                                       "sName": "information"
+                               } );
+                               
+                               /* Add id */
+                               nInfo.id = oSettings.sTableId+'_info';
+                       }
+                       oSettings.nTable.setAttribute( 'aria-describedby', oSettings.sTableId+'_info' );
+                       
+                       return nInfo;
+               }
+               
+               
+               /**
+                * Update the information elements in the display
+                *  @param {object} oSettings dataTables settings object
+                *  @memberof DataTable#oApi
+                */
+               function _fnUpdateInfo ( oSettings )
+               {
+                       /* Show information about the table */
+                       if ( !oSettings.oFeatures.bInfo || oSettings.aanFeatures.i.length === 0 )
+                       {
+                               return;
+                       }
+                       
+                       var
+                               oLang = oSettings.oLanguage,
+                               iStart = oSettings._iDisplayStart+1,
+                               iEnd = oSettings.fnDisplayEnd(),
+                               iMax = oSettings.fnRecordsTotal(),
+                               iTotal = oSettings.fnRecordsDisplay(),
+                               sOut;
+                       
+                       if ( iTotal === 0 )
+                       {
+                               /* Empty record set */
+                               sOut = oLang.sInfoEmpty;
+                       }
+                       else {
+                               /* Normal record set */
+                               sOut = oLang.sInfo;
+                       }
+               
+                       if ( iTotal != iMax )
+                       {
+                               /* Record set after filtering */
+                               sOut += ' ' + oLang.sInfoFiltered;
+                       }
+               
+                       // Convert the macros
+                       sOut += oLang.sInfoPostFix;
+                       sOut = _fnInfoMacros( oSettings, sOut );
+                       
+                       if ( oLang.fnInfoCallback !== null )
+                       {
+                               sOut = oLang.fnInfoCallback.call( oSettings.oInstance, 
+                                       oSettings, iStart, iEnd, iMax, iTotal, sOut );
+                       }
+                       
+                       var n = oSettings.aanFeatures.i;
+                       for ( var i=0, iLen=n.length ; i<iLen ; i++ )
+                       {
+                               $(n[i]).html( sOut );
+                       }
+               }
+               
+               
+               function _fnInfoMacros ( oSettings, str )
+               {
+                       var
+                               iStart = oSettings._iDisplayStart+1,
+                               sStart = oSettings.fnFormatNumber( iStart ),
+                               iEnd = oSettings.fnDisplayEnd(),
+                               sEnd = oSettings.fnFormatNumber( iEnd ),
+                               iTotal = oSettings.fnRecordsDisplay(),
+                               sTotal = oSettings.fnFormatNumber( iTotal ),
+                               iMax = oSettings.fnRecordsTotal(),
+                               sMax = oSettings.fnFormatNumber( iMax );
+               
+                       // When infinite scrolling, we are always starting at 1. _iDisplayStart is used only
+                       // internally
+                       if ( oSettings.oScroll.bInfinite )
+                       {
+                               sStart = oSettings.fnFormatNumber( 1 );
+                       }
+               
+                       return str.
+                               replace(/_START_/g, sStart).
+                               replace(/_END_/g,   sEnd).
+                               replace(/_TOTAL_/g, sTotal).
+                               replace(/_MAX_/g,   sMax);
+               }
+               
+               
+               
+               /**
+                * Draw the table for the first time, adding all required features
+                *  @param {object} oSettings dataTables settings object
+                *  @memberof DataTable#oApi
+                */
+               function _fnInitialise ( oSettings )
+               {
+                       var i, iLen, iAjaxStart=oSettings.iInitDisplayStart;
+                       
+                       /* Ensure that the table data is fully initialised */
+                       if ( oSettings.bInitialised === false )
+                       {
+                               setTimeout( function(){ _fnInitialise( oSettings ); }, 200 );
+                               return;
+                       }
+                       
+                       /* Show the display HTML options */
+                       _fnAddOptionsHtml( oSettings );
+                       
+                       /* Build and draw the header / footer for the table */
+                       _fnBuildHead( oSettings );
+                       _fnDrawHead( oSettings, oSettings.aoHeader );
+                       if ( oSettings.nTFoot )
+                       {
+                               _fnDrawHead( oSettings, oSettings.aoFooter );
+                       }
+               
+                       /* Okay to show that something is going on now */
+                       _fnProcessingDisplay( oSettings, true );
+                       
+                       /* Calculate sizes for columns */
+                       if ( oSettings.oFeatures.bAutoWidth )
+                       {
+                               _fnCalculateColumnWidths( oSettings );
+                       }
+                       
+                       for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                       {
+                               if ( oSettings.aoColumns[i].sWidth !== null )
+                               {
+                                       oSettings.aoColumns[i].nTh.style.width = _fnStringToCss( oSettings.aoColumns[i].sWidth );
+                               }
+                       }
+                       
+                       /* If there is default sorting required - let's do it. The sort function will do the
+                        * drawing for us. Otherwise we draw the table regardless of the Ajax source - this allows
+                        * the table to look initialised for Ajax sourcing data (show 'loading' message possibly)
+                        */
+                       if ( oSettings.oFeatures.bSort )
+                       {
+                               _fnSort( oSettings );
+                       }
+                       else if ( oSettings.oFeatures.bFilter )
+                       {
+                               _fnFilterComplete( oSettings, oSettings.oPreviousSearch );
+                       }
+                       else
+                       {
+                               oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+                               _fnCalculateEnd( oSettings );
+                               _fnDraw( oSettings );
+                       }
+                       
+                       /* if there is an ajax source load the data */
+                       if ( oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide )
+                       {
+                               var aoData = [];
+                               _fnServerParams( oSettings, aoData );
+                               oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData, function(json) {
+                                       var aData = (oSettings.sAjaxDataProp !== "") ?
+                                               _fnGetObjectDataFn( oSettings.sAjaxDataProp )(json) : json;
+               
+                                       /* Got the data - add it to the table */
+                                       for ( i=0 ; i<aData.length ; i++ )
+                                       {
+                                               _fnAddData( oSettings, aData[i] );
+                                       }
+                                       
+                                       /* Reset the init display for cookie saving. We've already done a filter, and
+                                        * therefore cleared it before. So we need to make it appear 'fresh'
+                                        */
+                                       oSettings.iInitDisplayStart = iAjaxStart;
+                                       
+                                       if ( oSettings.oFeatures.bSort )
+                                       {
+                                               _fnSort( oSettings );
+                                       }
+                                       else
+                                       {
+                                               oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+                                               _fnCalculateEnd( oSettings );
+                                               _fnDraw( oSettings );
+                                       }
+                                       
+                                       _fnProcessingDisplay( oSettings, false );
+                                       _fnInitComplete( oSettings, json );
+                               }, oSettings );
+                               return;
+                       }
+                       
+                       /* Server-side processing initialisation complete is done at the end of _fnDraw */
+                       if ( !oSettings.oFeatures.bServerSide )
+                       {
+                               _fnProcessingDisplay( oSettings, false );
+                               _fnInitComplete( oSettings );
+                       }
+               }
+               
+               
+               /**
+                * Draw the table for the first time, adding all required features
+                *  @param {object} oSettings dataTables settings object
+                *  @param {object} [json] JSON from the server that completed the table, if using Ajax source
+                *    with client-side processing (optional)
+                *  @memberof DataTable#oApi
+                */
+               function _fnInitComplete ( oSettings, json )
+               {
+                       oSettings._bInitComplete = true;
+                       _fnCallbackFire( oSettings, 'aoInitComplete', 'init', [oSettings, json] );
+               }
+               
+               
+               /**
+                * Language compatibility - when certain options are given, and others aren't, we
+                * need to duplicate the values over, in order to provide backwards compatibility
+                * with older language files.
+                *  @param {object} oSettings dataTables settings object
+                *  @memberof DataTable#oApi
+                */
+               function _fnLanguageCompat( oLanguage )
+               {
+                       var oDefaults = DataTable.defaults.oLanguage;
+               
+                       /* Backwards compatibility - if there is no sEmptyTable given, then use the same as
+                        * sZeroRecords - assuming that is given.
+                        */
+                       if ( !oLanguage.sEmptyTable && oLanguage.sZeroRecords &&
+                               oDefaults.sEmptyTable === "No data available in table" )
+                       {
+                               _fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sEmptyTable' );
+                       }
+               
+                       /* Likewise with loading records */
+                       if ( !oLanguage.sLoadingRecords && oLanguage.sZeroRecords &&
+                               oDefaults.sLoadingRecords === "Loading..." )
+                       {
+                               _fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sLoadingRecords' );
+                       }
+               }
+               
+               
+               
+               /**
+                * Generate the node required for user display length changing
+                *  @param {object} oSettings dataTables settings object
+                *  @returns {node} Display length feature node
+                *  @memberof DataTable#oApi
+                */
+               function _fnFeatureHtmlLength ( oSettings )
+               {
+                       if ( oSettings.oScroll.bInfinite )
+                       {
+                               return null;
+                       }
+                       
+                       /* This can be overruled by not using the _MENU_ var/macro in the language variable */
+                       var sName = 'name="'+oSettings.sTableId+'_length"';
+                       var sStdMenu = '<select size="1" '+sName+'>';
+                       var i, iLen;
+                       var aLengthMenu = oSettings.aLengthMenu;
+                       
+                       if ( aLengthMenu.length == 2 && typeof aLengthMenu[0] === 'object' && 
+                                       typeof aLengthMenu[1] === 'object' )
+                       {
+                               for ( i=0, iLen=aLengthMenu[0].length ; i<iLen ; i++ )
+                               {
+                                       sStdMenu += '<option value="'+aLengthMenu[0][i]+'">'+aLengthMenu[1][i]+'</option>';
+                               }
+                       }
+                       else
+                       {
+                               for ( i=0, iLen=aLengthMenu.length ; i<iLen ; i++ )
+                               {
+                                       sStdMenu += '<option value="'+aLengthMenu[i]+'">'+aLengthMenu[i]+'</option>';
+                               }
+                       }
+                       sStdMenu += '</select>';
+                       
+                       var nLength = document.createElement( 'div' );
+                       if ( !oSettings.aanFeatures.l )
+                       {
+                               nLength.id = oSettings.sTableId+'_length';
+                       }
+                       nLength.className = oSettings.oClasses.sLength;
+                       nLength.innerHTML = '<label>'+oSettings.oLanguage.sLengthMenu.replace( '_MENU_', sStdMenu )+'</label>';
+                       
+                       /*
+                        * Set the length to the current display length - thanks to Andrea Pavlovic for this fix,
+                        * and Stefan Skopnik for fixing the fix!
+                        */
+                       $('select option[value="'+oSettings._iDisplayLength+'"]', nLength).attr("selected", true);
+                       
+                       $('select', nLength).bind( 'change.DT', function(e) {
+                               var iVal = $(this).val();
+                               
+                               /* Update all other length options for the new display */
+                               var n = oSettings.aanFeatures.l;
+                               for ( i=0, iLen=n.length ; i<iLen ; i++ )
+                               {
+                                       if ( n[i] != this.parentNode )
+                                       {
+                                               $('select', n[i]).val( iVal );
+                                       }
+                               }
+                               
+                               /* Redraw the table */
+                               oSettings._iDisplayLength = parseInt(iVal, 10);
+                               _fnCalculateEnd( oSettings );
+                               
+                               /* If we have space to show extra rows (backing up from the end point - then do so */
+                               if ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() )
+                               {
+                                       oSettings._iDisplayStart = oSettings.fnDisplayEnd() - oSettings._iDisplayLength;
+                                       if ( oSettings._iDisplayStart < 0 )
+                                       {
+                                               oSettings._iDisplayStart = 0;
+                                       }
+                               }
+                               
+                               if ( oSettings._iDisplayLength == -1 )
+                               {
+                                       oSettings._iDisplayStart = 0;
+                               }
+                               
+                               _fnDraw( oSettings );
+                       } );
+               
+               
+                       $('select', nLength).attr('aria-controls', oSettings.sTableId);
+                       
+                       return nLength;
+               }
+               
+               
+               /**
+                * Recalculate the end point based on the start point
+                *  @param {object} oSettings dataTables settings object
+                *  @memberof DataTable#oApi
+                */
+               function _fnCalculateEnd( oSettings )
+               {
+                       if ( oSettings.oFeatures.bPaginate === false )
+                       {
+                               oSettings._iDisplayEnd = oSettings.aiDisplay.length;
+                       }
+                       else
+                       {
+                               /* Set the end point of the display - based on how many elements there are
+                                * still to display
+                                */
+                               if ( oSettings._iDisplayStart + oSettings._iDisplayLength > oSettings.aiDisplay.length ||
+                                          oSettings._iDisplayLength == -1 )
+                               {
+                                       oSettings._iDisplayEnd = oSettings.aiDisplay.length;
+                               }
+                               else
+                               {
+                                       oSettings._iDisplayEnd = oSettings._iDisplayStart + oSettings._iDisplayLength;
+                               }
+                       }
+               }
+               
+               
+               
+               /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+                * Note that most of the paging logic is done in 
+                * DataTable.ext.oPagination
+                */
+               
+               /**
+                * Generate the node required for default pagination
+                *  @param {object} oSettings dataTables settings object
+                *  @returns {node} Pagination feature node
+                *  @memberof DataTable#oApi
+                */
+               function _fnFeatureHtmlPaginate ( oSettings )
+               {
+                       if ( oSettings.oScroll.bInfinite )
+                       {
+                               return null;
+                       }
+                       
+                       var nPaginate = document.createElement( 'div' );
+                       nPaginate.className = oSettings.oClasses.sPaging+oSettings.sPaginationType;
+                       
+                       DataTable.ext.oPagination[ oSettings.sPaginationType ].fnInit( oSettings, nPaginate, 
+                               function( oSettings ) {
+                                       _fnCalculateEnd( oSettings );
+                                       _fnDraw( oSettings );
+                               }
+                       );
+                       
+                       /* Add a draw callback for the pagination on first instance, to update the paging display */
+                       if ( !oSettings.aanFeatures.p )
+                       {
+                               oSettings.aoDrawCallback.push( {
+                                       "fn": function( oSettings ) {
+                                               DataTable.ext.oPagination[ oSettings.sPaginationType ].fnUpdate( oSettings, function( oSettings ) {
+                                                       _fnCalculateEnd( oSettings );
+                                                       _fnDraw( oSettings );
+                                               } );
+                                       },
+                                       "sName": "pagination"
+                               } );
+                       }
+                       return nPaginate;
+               }
+               
+               
+               /**
+                * Alter the display settings to change the page
+                *  @param {object} oSettings dataTables settings object
+                *  @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
+                *    or page number to jump to (integer)
+                *  @returns {bool} true page has changed, false - no change (no effect) eg 'first' on page 1
+                *  @memberof DataTable#oApi
+                */
+               function _fnPageChange ( oSettings, mAction )
+               {
+                       var iOldStart = oSettings._iDisplayStart;
+                       
+                       if ( typeof mAction === "number" )
+                       {
+                               oSettings._iDisplayStart = mAction * oSettings._iDisplayLength;
+                               if ( oSettings._iDisplayStart > oSettings.fnRecordsDisplay() )
+                               {
+                                       oSettings._iDisplayStart = 0;
+                               }
+                       }
+                       else if ( mAction == "first" )
+                       {
+                               oSettings._iDisplayStart = 0;
+                       }
+                       else if ( mAction == "previous" )
+                       {
+                               oSettings._iDisplayStart = oSettings._iDisplayLength>=0 ?
+                                       oSettings._iDisplayStart - oSettings._iDisplayLength :
+                                       0;
+                               
+                               /* Correct for under-run */
+                               if ( oSettings._iDisplayStart < 0 )
+                               {
+                                 oSettings._iDisplayStart = 0;
+                               }
+                       }
+                       else if ( mAction == "next" )
+                       {
+                               if ( oSettings._iDisplayLength >= 0 )
+                               {
+                                       /* Make sure we are not over running the display array */
+                                       if ( oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay() )
+                                       {
+                                               oSettings._iDisplayStart += oSettings._iDisplayLength;
+                                       }
+                               }
+                               else
+                               {
+                                       oSettings._iDisplayStart = 0;
+                               }
+                       }
+                       else if ( mAction == "last" )
+                       {
+                               if ( oSettings._iDisplayLength >= 0 )
+                               {
+                                       var iPages = parseInt( (oSettings.fnRecordsDisplay()-1) / oSettings._iDisplayLength, 10 ) + 1;
+                                       oSettings._iDisplayStart = (iPages-1) * oSettings._iDisplayLength;
+                               }
+                               else
+                               {
+                                       oSettings._iDisplayStart = 0;
+                               }
+                       }
+                       else
+                       {
+                               _fnLog( oSettings, 0, "Unknown paging action: "+mAction );
+                       }
+                       $(oSettings.oInstance).trigger('page', oSettings);
+                       
+                       return iOldStart != oSettings._iDisplayStart;
+               }
+               
+               
+               
+               /**
+                * Generate the node required for the processing node
+                *  @param {object} oSettings dataTables settings object
+                *  @returns {node} Processing element
+                *  @memberof DataTable#oApi
+                */
+               function _fnFeatureHtmlProcessing ( oSettings )
+               {
+                       var nProcessing = document.createElement( 'div' );
+                       
+                       if ( !oSettings.aanFeatures.r )
+                       {
+                               nProcessing.id = oSettings.sTableId+'_processing';
+                       }
+                       nProcessing.innerHTML = oSettings.oLanguage.sProcessing;
+                       nProcessing.className = oSettings.oClasses.sProcessing;
+                       oSettings.nTable.parentNode.insertBefore( nProcessing, oSettings.nTable );
+                       
+                       return nProcessing;
+               }
+               
+               
+               /**
+                * Display or hide the processing indicator
+                *  @param {object} oSettings dataTables settings object
+                *  @param {bool} bShow Show the processing indicator (true) or not (false)
+                *  @memberof DataTable#oApi
+                */
+               function _fnProcessingDisplay ( oSettings, bShow )
+               {
+                       if ( oSettings.oFeatures.bProcessing )
+                       {
+                               var an = oSettings.aanFeatures.r;
+                               for ( var i=0, iLen=an.length ; i<iLen ; i++ )
+                               {
+                                       an[i].style.visibility = bShow ? "visible" : "hidden";
+                               }
+                       }
+               
+                       $(oSettings.oInstance).trigger('processing', [oSettings, bShow]);
+               }
+               
+               /**
+                * Add any control elements for the table - specifically scrolling
+                *  @param {object} oSettings dataTables settings object
+                *  @returns {node} Node to add to the DOM
+                *  @memberof DataTable#oApi
+                */
+               function _fnFeatureHtmlTable ( oSettings )
+               {
+                       /* Check if scrolling is enabled or not - if not then leave the DOM unaltered */
+                       if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" )
+                       {
+                               return oSettings.nTable;
+                       }
+                       
+                       /*
+                        * The HTML structure that we want to generate in this function is:
+                        *  div - nScroller
+                        *    div - nScrollHead
+                        *      div - nScrollHeadInner
+                        *        table - nScrollHeadTable
+                        *          thead - nThead
+                        *    div - nScrollBody
+                        *      table - oSettings.nTable
+                        *        thead - nTheadSize
+                        *        tbody - nTbody
+                        *    div - nScrollFoot
+                        *      div - nScrollFootInner
+                        *        table - nScrollFootTable
+                        *          tfoot - nTfoot
+                        */
+                       var
+                               nScroller = document.createElement('div'),
+                               nScrollHead = document.createElement('div'),
+                               nScrollHeadInner = document.createElement('div'),
+                               nScrollBody = document.createElement('div'),
+                               nScrollFoot = document.createElement('div'),
+                               nScrollFootInner = document.createElement('div'),
+                               nScrollHeadTable = oSettings.nTable.cloneNode(false),
+                               nScrollFootTable = oSettings.nTable.cloneNode(false),
+                               nThead = oSettings.nTable.getElementsByTagName('thead')[0],
+                               nTfoot = oSettings.nTable.getElementsByTagName('tfoot').length === 0 ? null : 
+                                       oSettings.nTable.getElementsByTagName('tfoot')[0],
+                               oClasses = oSettings.oClasses;
+                       
+                       nScrollHead.appendChild( nScrollHeadInner );
+                       nScrollFoot.appendChild( nScrollFootInner );
+                       nScrollBody.appendChild( oSettings.nTable );
+                       nScroller.appendChild( nScrollHead );
+                       nScroller.appendChild( nScrollBody );
+                       nScrollHeadInner.appendChild( nScrollHeadTable );
+                       nScrollHeadTable.appendChild( nThead );
+                       if ( nTfoot !== null )
+                       {
+                               nScroller.appendChild( nScrollFoot );
+                               nScrollFootInner.appendChild( nScrollFootTable );
+                               nScrollFootTable.appendChild( nTfoot );
+                       }
+                       
+                       nScroller.className = oClasses.sScrollWrapper;
+                       nScrollHead.className = oClasses.sScrollHead;
+                       nScrollHeadInner.className = oClasses.sScrollHeadInner;
+                       nScrollBody.className = oClasses.sScrollBody;
+                       nScrollFoot.className = oClasses.sScrollFoot;
+                       nScrollFootInner.className = oClasses.sScrollFootInner;
+                       
+                       if ( oSettings.oScroll.bAutoCss )
+                       {
+                               nScrollHead.style.overflow = "hidden";
+                               nScrollHead.style.position = "relative";
+                               nScrollFoot.style.overflow = "hidden";
+                               nScrollBody.style.overflow = "auto";
+                       }
+                       
+                       nScrollHead.style.border = "0";
+                       nScrollHead.style.width = "100%";
+                       nScrollFoot.style.border = "0";
+                       nScrollHeadInner.style.width = oSettings.oScroll.sXInner !== "" ?
+                               oSettings.oScroll.sXInner : "100%"; /* will be overwritten */
+                       
+                       /* Modify attributes to respect the clones */
+                       nScrollHeadTable.removeAttribute('id');
+                       nScrollHeadTable.style.marginLeft = "0";
+                       oSettings.nTable.style.marginLeft = "0";
+                       if ( nTfoot !== null )
+                       {
+                               nScrollFootTable.removeAttribute('id');
+                               nScrollFootTable.style.marginLeft = "0";
+                       }
+                       
+                       /* Move caption elements from the body to the header, footer or leave where it is
+                        * depending on the configuration. Note that the DTD says there can be only one caption */
+                       var nCaption = $(oSettings.nTable).children('caption');
+                       if ( nCaption.length > 0 )
+                       {
+                               nCaption = nCaption[0];
+                               if ( nCaption._captionSide === "top" )
+                               {
+                                       nScrollHeadTable.appendChild( nCaption );
+                               }
+                               else if ( nCaption._captionSide === "bottom" && nTfoot )
+                               {
+                                       nScrollFootTable.appendChild( nCaption );
+                               }
+                       }
+                       
+                       /*
+                        * Sizing
+                        */
+                       /* When x-scrolling add the width and a scroller to move the header with the body */
+                       if ( oSettings.oScroll.sX !== "" )
+                       {
+                               nScrollHead.style.width = _fnStringToCss( oSettings.oScroll.sX );
+                               nScrollBody.style.width = _fnStringToCss( oSettings.oScroll.sX );
+                               
+                               if ( nTfoot !== null )
+                               {
+                                       nScrollFoot.style.width = _fnStringToCss( oSettings.oScroll.sX );       
+                               }
+                               
+                               /* When the body is scrolled, then we also want to scroll the headers */
+                               $(nScrollBody).scroll( function (e) {
+                                       nScrollHead.scrollLeft = this.scrollLeft;
+                                       
+                                       if ( nTfoot !== null )
+                                       {
+                                               nScrollFoot.scrollLeft = this.scrollLeft;
+                                       }
+                               } );
+                       }
+                       
+                       /* When yscrolling, add the height */
+                       if ( oSettings.oScroll.sY !== "" )
+                       {
+                               nScrollBody.style.height = _fnStringToCss( oSettings.oScroll.sY );
+                       }
+                       
+                       /* Redraw - align columns across the tables */
+                       oSettings.aoDrawCallback.push( {
+                               "fn": _fnScrollDraw,
+                               "sName": "scrolling"
+                       } );
+                       
+                       /* Infinite scrolling event handlers */
+                       if ( oSettings.oScroll.bInfinite )
+                       {
+                               $(nScrollBody).scroll( function() {
+                                       /* Use a blocker to stop scrolling from loading more data while other data is still loading */
+                                       if ( !oSettings.bDrawing && $(this).scrollTop() !== 0 )
+                                       {
+                                               /* Check if we should load the next data set */
+                                               if ( $(this).scrollTop() + $(this).height() > 
+                                                       $(oSettings.nTable).height() - oSettings.oScroll.iLoadGap )
+                                               {
+                                                       /* Only do the redraw if we have to - we might be at the end of the data */
+                                                       if ( oSettings.fnDisplayEnd() < oSettings.fnRecordsDisplay() )
+                                                       {
+                                                               _fnPageChange( oSettings, 'next' );
+                                                               _fnCalculateEnd( oSettings );
+                                                               _fnDraw( oSettings );
+                                                       }
+                                               }
+                                       }
+                               } );
+                       }
+                       
+                       oSettings.nScrollHead = nScrollHead;
+                       oSettings.nScrollFoot = nScrollFoot;
+                       
+                       return nScroller;
+               }
+               
+               
+               /**
+                * Update the various tables for resizing. It's a bit of a pig this function, but
+                * basically the idea to:
+                *   1. Re-create the table inside the scrolling div
+                *   2. Take live measurements from the DOM
+                *   3. Apply the measurements
+                *   4. Clean up
+                *  @param {object} o dataTables settings object
+                *  @returns {node} Node to add to the DOM
+                *  @memberof DataTable#oApi
+                */
+               function _fnScrollDraw ( o )
+               {
+                       var
+                               nScrollHeadInner = o.nScrollHead.getElementsByTagName('div')[0],
+                               nScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0],
+                               nScrollBody = o.nTable.parentNode,
+                               i, iLen, j, jLen, anHeadToSize, anHeadSizers, anFootSizers, anFootToSize, oStyle, iVis,
+                               nTheadSize, nTfootSize,
+                               iWidth, aApplied=[], aAppliedFooter=[], iSanityWidth,
+                               nScrollFootInner = (o.nTFoot !== null) ? o.nScrollFoot.getElementsByTagName('div')[0] : null,
+                               nScrollFootTable = (o.nTFoot !== null) ? nScrollFootInner.getElementsByTagName('table')[0] : null,
+                               ie67 = o.oBrowser.bScrollOversize,
+                               zeroOut = function(nSizer) {
+                                       oStyle = nSizer.style;
+                                       oStyle.paddingTop = "0";
+                                       oStyle.paddingBottom = "0";
+                                       oStyle.borderTopWidth = "0";
+                                       oStyle.borderBottomWidth = "0";
+                                       oStyle.height = 0;
+                               };
+                       
+                       /*
+                        * 1. Re-create the table inside the scrolling div
+                        */
+                       
+                       /* Remove the old minimised thead and tfoot elements in the inner table */
+                       $(o.nTable).children('thead, tfoot').remove();
+               
+                       /* Clone the current header and footer elements and then place it into the inner table */
+                       nTheadSize = $(o.nTHead).clone()[0];
+                       o.nTable.insertBefore( nTheadSize, o.nTable.childNodes[0] );
+                       anHeadToSize = o.nTHead.getElementsByTagName('tr');
+                       anHeadSizers = nTheadSize.getElementsByTagName('tr');
+                       
+                       if ( o.nTFoot !== null )
+                       {
+                               nTfootSize = $(o.nTFoot).clone()[0];
+                               o.nTable.insertBefore( nTfootSize, o.nTable.childNodes[1] );
+                               anFootToSize = o.nTFoot.getElementsByTagName('tr');
+                               anFootSizers = nTfootSize.getElementsByTagName('tr');
+                       }
+                       
+                       /*
+                        * 2. Take live measurements from the DOM - do not alter the DOM itself!
+                        */
+                       
+                       /* Remove old sizing and apply the calculated column widths
+                        * Get the unique column headers in the newly created (cloned) header. We want to apply the
+                        * calculated sizes to this header
+                        */
+                       if ( o.oScroll.sX === "" )
+                       {
+                               nScrollBody.style.width = '100%';
+                               nScrollHeadInner.parentNode.style.width = '100%';
+                       }
+                       
+                       var nThs = _fnGetUniqueThs( o, nTheadSize );
+                       for ( i=0, iLen=nThs.length ; i<iLen ; i++ )
+                       {
+                               iVis = _fnVisibleToColumnIndex( o, i );
+                               nThs[i].style.width = o.aoColumns[iVis].sWidth;
+                       }
+                       
+                       if ( o.nTFoot !== null )
+                       {
+                               _fnApplyToChildren( function(n) {
+                                       n.style.width = "";
+                               }, anFootSizers );
+                       }
+               
+                       // If scroll collapse is enabled, when we put the headers back into the body for sizing, we
+                       // will end up forcing the scrollbar to appear, making our measurements wrong for when we
+                       // then hide it (end of this function), so add the header height to the body scroller.
+                       if ( o.oScroll.bCollapse && o.oScroll.sY !== "" )
+                       {
+                               nScrollBody.style.height = (nScrollBody.offsetHeight + o.nTHead.offsetHeight)+"px";
+                       }
+                       
+                       /* Size the table as a whole */
+                       iSanityWidth = $(o.nTable).outerWidth();
+                       if ( o.oScroll.sX === "" )
+                       {
+                               /* No x scrolling */
+                               o.nTable.style.width = "100%";
+                               
+                               /* I know this is rubbish - but IE7 will make the width of the table when 100% include
+                                * the scrollbar - which is shouldn't. When there is a scrollbar we need to take this
+                                * into account.
+                                */
+                               if ( ie67 && ($('tbody', nScrollBody).height() > nScrollBody.offsetHeight || 
+                                       $(nScrollBody).css('overflow-y') == "scroll")  )
+                               {
+                                       o.nTable.style.width = _fnStringToCss( $(o.nTable).outerWidth() - o.oScroll.iBarWidth);
+                               }
+                       }
+                       else
+                       {
+                               if ( o.oScroll.sXInner !== "" )
+                               {
+                                       /* x scroll inner has been given - use it */
+                                       o.nTable.style.width = _fnStringToCss(o.oScroll.sXInner);
+                               }
+                               else if ( iSanityWidth == $(nScrollBody).width() &&
+                                  $(nScrollBody).height() < $(o.nTable).height() )
+                               {
+                                       /* There is y-scrolling - try to take account of the y scroll bar */
+                                       o.nTable.style.width = _fnStringToCss( iSanityWidth-o.oScroll.iBarWidth );
+                                       if ( $(o.nTable).outerWidth() > iSanityWidth-o.oScroll.iBarWidth )
+                                       {
+                                               /* Not possible to take account of it */
+                                               o.nTable.style.width = _fnStringToCss( iSanityWidth );
+                                       }
+                               }
+                               else
+                               {
+                                       /* All else fails */
+                                       o.nTable.style.width = _fnStringToCss( iSanityWidth );
+                               }
+                       }
+                       
+                       /* Recalculate the sanity width - now that we've applied the required width, before it was
+                        * a temporary variable. This is required because the column width calculation is done
+                        * before this table DOM is created.
+                        */
+                       iSanityWidth = $(o.nTable).outerWidth();
+                       
+                       /* We want the hidden header to have zero height, so remove padding and borders. Then
+                        * set the width based on the real headers
+                        */
+                       
+                       // Apply all styles in one pass. Invalidates layout only once because we don't read any 
+                       // DOM properties.
+                       _fnApplyToChildren( zeroOut, anHeadSizers );
+                        
+                       // Read all widths in next pass. Forces layout only once because we do not change 
+                       // any DOM properties.
+                       _fnApplyToChildren( function(nSizer) {
+                               aApplied.push( _fnStringToCss( $(nSizer).width() ) );
+                       }, anHeadSizers );
+                        
+                       // Apply all widths in final pass. Invalidates layout only once because we do not
+                       // read any DOM properties.
+                       _fnApplyToChildren( function(nToSize, i) {
+                               nToSize.style.width = aApplied[i];
+                       }, anHeadToSize );
+               
+                       $(anHeadSizers).height(0);
+                       
+                       /* Same again with the footer if we have one */
+                       if ( o.nTFoot !== null )
+                       {
+                               _fnApplyToChildren( zeroOut, anFootSizers );
+                                
+                               _fnApplyToChildren( function(nSizer) {
+                                       aAppliedFooter.push( _fnStringToCss( $(nSizer).width() ) );
+                               }, anFootSizers );
+                                
+                               _fnApplyToChildren( function(nToSize, i) {
+                                       nToSize.style.width = aAppliedFooter[i];
+                               }, anFootToSize );
+               
+                               $(anFootSizers).height(0);
+                       }
+                       
+                       /*
+                        * 3. Apply the measurements
+                        */
+                       
+                       /* "Hide" the header and footer that we used for the sizing. We want to also fix their width
+                        * to what they currently are
+                        */
+                       _fnApplyToChildren( function(nSizer, i) {
+                               nSizer.innerHTML = "";
+                               nSizer.style.width = aApplied[i];
+                       }, anHeadSizers );
+                       
+                       if ( o.nTFoot !== null )
+                       {
+                               _fnApplyToChildren( function(nSizer, i) {
+                                       nSizer.innerHTML = "";
+                                       nSizer.style.width = aAppliedFooter[i];
+                               }, anFootSizers );
+                       }
+                       
+                       /* Sanity check that the table is of a sensible width. If not then we are going to get
+                        * misalignment - try to prevent this by not allowing the table to shrink below its min width
+                        */
+                       if ( $(o.nTable).outerWidth() < iSanityWidth )
+                       {
+                               /* The min width depends upon if we have a vertical scrollbar visible or not */
+                               var iCorrection = ((nScrollBody.scrollHeight > nScrollBody.offsetHeight || 
+                                       $(nScrollBody).css('overflow-y') == "scroll")) ?
+                                               iSanityWidth+o.oScroll.iBarWidth : iSanityWidth;
+                               
+                               /* IE6/7 are a law unto themselves... */
+                               if ( ie67 && (nScrollBody.scrollHeight > 
+                                       nScrollBody.offsetHeight || $(nScrollBody).css('overflow-y') == "scroll")  )
+                               {
+                                       o.nTable.style.width = _fnStringToCss( iCorrection-o.oScroll.iBarWidth );
+                               }
+                               
+                               /* Apply the calculated minimum width to the table wrappers */
+                               nScrollBody.style.width = _fnStringToCss( iCorrection );
+                               o.nScrollHead.style.width = _fnStringToCss( iCorrection );
+                               
+                               if ( o.nTFoot !== null )
+                               {
+                                       o.nScrollFoot.style.width = _fnStringToCss( iCorrection );
+                               }
+                               
+                               /* And give the user a warning that we've stopped the table getting too small */
+                               if ( o.oScroll.sX === "" )
+                               {
+                                       _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+
+                                               " misalignment. The table has been drawn at its minimum possible width." );
+                               }
+                               else if ( o.oScroll.sXInner !== "" )
+                               {
+                                       _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+
+                                               " misalignment. Increase the sScrollXInner value or remove it to allow automatic"+
+                                               " calculation" );
+                               }
+                       }
+                       else
+                       {
+                               nScrollBody.style.width = _fnStringToCss( '100%' );
+                               o.nScrollHead.style.width = _fnStringToCss( '100%' );
+                               
+                               if ( o.nTFoot !== null )
+                               {
+                                       o.nScrollFoot.style.width = _fnStringToCss( '100%' );
+                               }
+                       }
+                       
+                       
+                       /*
+                        * 4. Clean up
+                        */
+                       if ( o.oScroll.sY === "" )
+                       {
+                               /* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting
+                                * the scrollbar height from the visible display, rather than adding it on. We need to
+                                * set the height in order to sort this. Don't want to do it in any other browsers.
+                                */
+                               if ( ie67 )
+                               {
+                                       nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+o.oScroll.iBarWidth );
+                               }
+                       }
+                       
+                       if ( o.oScroll.sY !== "" && o.oScroll.bCollapse )
+                       {
+                               nScrollBody.style.height = _fnStringToCss( o.oScroll.sY );
+                               
+                               var iExtra = (o.oScroll.sX !== "" && o.nTable.offsetWidth > nScrollBody.offsetWidth) ?
+                                       o.oScroll.iBarWidth : 0;
+                               if ( o.nTable.offsetHeight < nScrollBody.offsetHeight )
+                               {
+                                       nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+iExtra );
+                               }
+                       }
+                       
+                       /* Finally set the width's of the header and footer tables */
+                       var iOuterWidth = $(o.nTable).outerWidth();
+                       nScrollHeadTable.style.width = _fnStringToCss( iOuterWidth );
+                       nScrollHeadInner.style.width = _fnStringToCss( iOuterWidth );
+               
+                       // Figure out if there are scrollbar present - if so then we need a the header and footer to
+                       // provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar)
+                       var bScrolling = $(o.nTable).height() > nScrollBody.clientHeight || $(nScrollBody).css('overflow-y') == "scroll";
+                       nScrollHeadInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px";
+                       
+                       if ( o.nTFoot !== null )
+                       {
+                               nScrollFootTable.style.width = _fnStringToCss( iOuterWidth );
+                               nScrollFootInner.style.width = _fnStringToCss( iOuterWidth );
+                               nScrollFootInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px";
+                       }
+               
+                       /* Adjust the position of the header in case we loose the y-scrollbar */
+                       $(nScrollBody).scroll();
+                       
+                       /* If sorting or filtering has occurred, jump the scrolling back to the top */
+                       if ( o.bSorted || o.bFiltered )
+                       {
+                               nScrollBody.scrollTop = 0;
+                       }
+               }
+               
+               
+               /**
+                * Apply a given function to the display child nodes of an element array (typically
+                * TD children of TR rows
+                *  @param {function} fn Method to apply to the objects
+                *  @param array {nodes} an1 List of elements to look through for display children
+                *  @param array {nodes} an2 Another list (identical structure to the first) - optional
+                *  @memberof DataTable#oApi
+                */
+               function _fnApplyToChildren( fn, an1, an2 )
+               {
+                       var index=0, i=0, iLen=an1.length;
+                       var nNode1, nNode2;
+               
+                       while ( i < iLen )
+                       {
+                               nNode1 = an1[i].firstChild;
+                               nNode2 = an2 ? an2[i].firstChild : null;
+                               while ( nNode1 )
+                               {
+                                       if ( nNode1.nodeType === 1 )
+                                       {
+                                               if ( an2 )
+                                               {
+                                                       fn( nNode1, nNode2, index );
+                                               }
+                                               else
+                                               {
+                                                       fn( nNode1, index );
+                                               }
+                                               index++;
+                                       }
+                                       nNode1 = nNode1.nextSibling;
+                                       nNode2 = an2 ? nNode2.nextSibling : null;
+                               }
+                               i++;
+                       }
+               }
+               
+               /**
+                * Convert a CSS unit width to pixels (e.g. 2em)
+                *  @param {string} sWidth width to be converted
+                *  @param {node} nParent parent to get the with for (required for relative widths) - optional
+                *  @returns {int} iWidth width in pixels
+                *  @memberof DataTable#oApi
+                */
+               function _fnConvertToWidth ( sWidth, nParent )
+               {
+                       if ( !sWidth || sWidth === null || sWidth === '' )
+                       {
+                               return 0;
+                       }
+                       
+                       if ( !nParent )
+                       {
+                               nParent = document.body;
+                       }
+                       
+                       var iWidth;
+                       var nTmp = document.createElement( "div" );
+                       nTmp.style.width = _fnStringToCss( sWidth );
+                       
+                       nParent.appendChild( nTmp );
+                       iWidth = nTmp.offsetWidth;
+                       nParent.removeChild( nTmp );
+                       
+                       return ( iWidth );
+               }
+               
+               
+               /**
+                * Calculate the width of columns for the table
+                *  @param {object} oSettings dataTables settings object
+                *  @memberof DataTable#oApi
+                */
+               function _fnCalculateColumnWidths ( oSettings )
+               {
+                       var iTableWidth = oSettings.nTable.offsetWidth;
+                       var iUserInputs = 0;
+                       var iTmpWidth;
+                       var iVisibleColumns = 0;
+                       var iColums = oSettings.aoColumns.length;
+                       var i, iIndex, iCorrector, iWidth;
+                       var oHeaders = $('th', oSettings.nTHead);
+                       var widthAttr = oSettings.nTable.getAttribute('width');
+                       var nWrapper = oSettings.nTable.parentNode;
+                       
+                       /* Convert any user input sizes into pixel sizes */
+                       for ( i=0 ; i<iColums ; i++ )
+                       {
+                               if ( oSettings.aoColumns[i].bVisible )
+                               {
+                                       iVisibleColumns++;
+                                       
+                                       if ( oSettings.aoColumns[i].sWidth !== null )
+                                       {
+                                               iTmpWidth = _fnConvertToWidth( oSettings.aoColumns[i].sWidthOrig, 
+                                                       nWrapper );
+                                               if ( iTmpWidth !== null )
+                                               {
+                                                       oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );
+                                               }
+                                                       
+                                               iUserInputs++;
+                                       }
+                               }
+                       }
+                       
+                       /* If the number of columns in the DOM equals the number that we have to process in 
+                        * DataTables, then we can use the offsets that are created by the web-browser. No custom 
+                        * sizes can be set in order for this to happen, nor scrolling used
+                        */
+                       if ( iColums == oHeaders.length && iUserInputs === 0 && iVisibleColumns == iColums &&
+                               oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" )
+                       {
+                               for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+                               {
+                                       iTmpWidth = $(oHeaders[i]).width();
+                                       if ( iTmpWidth !== null )
+                                       {
+                                               oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );
+                                       }
+                               }
+                       }
+                       else
+                       {
+                               /* Otherwise we are going to have to do some calculations to get the width of each column.
+                                * Construct a 1 row table with the widest node in the data, and any user defined widths,
+                                * then insert it into the DOM and allow the browser to do all the hard work of
+                                * calculating table widths.
+                                */
+                               var
+                                       nCalcTmp = oSettings.nTable.cloneNode( false ),
+                                       nTheadClone = oSettings.nTHead.cloneNode(true),
+                                       nBody = document.createElement( 'tbody' ),
+                                       nTr = document.createElement( 'tr' ),
+                                       nDivSizing;
+                               
+                               nCalcTmp.removeAttribute( "id" );
+                               nCalcTmp.appendChild( nTheadClone );
+                               if ( oSettings.nTFoot !== null )
+                               {
+                                       nCalcTmp.appendChild( oSettings.nTFoot.cloneNode(true) );
+                                       _fnApplyToChildren( function(n) {
+                                               n.style.width = "";
+                                       }, nCalcTmp.getElementsByTagName('tr') );
+                               }
+                               
+                               nCalcTmp.appendChild( nBody );
+                               nBody.appendChild( nTr );
+                               
+                               /* Remove any sizing that was previously applied by the styles */
+                               var jqColSizing = $('thead th', nCalcTmp);
+                               if ( jqColSizing.length === 0 )
+                               {
+                                       jqColSizing = $('tbody tr:eq(0)>td', nCalcTmp);
+                               }
+               
+                               /* Apply custom sizing to the cloned header */
+                               var nThs = _fnGetUniqueThs( oSettings, nTheadClone );
+                               iCorrector = 0;
+                               for ( i=0 ; i<iColums ; i++ )
+                               {
+                                       var oColumn = oSettings.aoColumns[i];
+                                       if ( oColumn.bVisible && oColumn.sWidthOrig !== null && oColumn.sWidthOrig !== "" )
+                                       {
+                                               nThs[i-iCorrector].style.width = _fnStringToCss( oColumn.sWidthOrig );
+                                       }
+                                       else if ( oColumn.bVisible )
+                                       {
+                                               nThs[i-iCorrector].style.width = "";
+                                       }
+                                       else
+                                       {
+                                               iCorrector++;
+                                       }
+                               }
+               
+                               /* Find the biggest td for each column and put it into the table */
+                               for ( i=0 ; i<iColums ; i++ )
+                               {
+                                       if ( oSettings.aoColumns[i].bVisible )
+                                       {
+                                               var nTd = _fnGetWidestNode( oSettings, i );
+                                               if ( nTd !== null )
+                                               {
+                                                       nTd = nTd.cloneNode(true);
+                                                       if ( oSettings.aoColumns[i].sContentPadding !== "" )
+                                                       {
+                                                               nTd.innerHTML += oSettings.aoColumns[i].sContentPadding;
+                                                       }
+                                                       nTr.appendChild( nTd );
+                                               }
+                                       }
+                               }
+                               
+                               /* Build the table and 'display' it */
+                               nWrapper.appendChild( nCalcTmp );
+                               
+                               /* When scrolling (X or Y) we want to set the width of the table as appropriate. However,
+                                * when not scrolling leave the table width as it is. This results in slightly different,
+                                * but I think correct behaviour
+                                */
+                               if ( oSettings.oScroll.sX !== "" && oSettings.oScroll.sXInner !== "" )
+                               {
+                                       nCalcTmp.style.width = _fnStringToCss(oSettings.oScroll.sXInner);
+                               }
+                               else if ( oSettings.oScroll.sX !== "" )
+                               {
+                                       nCalcTmp.style.width = "";
+                                       if ( $(nCalcTmp).width() < nWrapper.offsetWidth )
+                                       {
+                                               nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth );
+                                       }
+                               }
+                               else if ( oSettings.oScroll.sY !== "" )
+                               {
+                                       nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth );
+                               }
+                               else if ( widthAttr )
+                               {
+                                       nCalcTmp.style.width = _fnStringToCss( widthAttr );
+                               }
+                               nCalcTmp.style.visibility = "hidden";
+                               
+                               /* Scrolling considerations */
+                               _fnScrollingWidthAdjust( oSettings, nCalcTmp );
+                               
+                               /* Read the width's calculated by the browser and store them for use by the caller. We
+                                * first of all try to use the elements in the body, but it is possible that there are
+                                * no elements there, under which circumstances we use the header elements
+                                */
+                               var oNodes = $("tbody tr:eq(0)", nCalcTmp).children();
+                               if ( oNodes.length === 0 )
+                               {
+                                       oNodes = _fnGetUniqueThs( oSettings, $('thead', nCalcTmp)[0] );
+                               }
+               
+                               /* Browsers need a bit of a hand when a width is assigned to any columns when 
+                                * x-scrolling as they tend to collapse the table to the min-width, even if
+                                * we sent the column widths. So we need to keep track of what the table width
+                                * should be by summing the user given values, and the automatic values
+                                */
+                               if ( oSettings.oScroll.sX !== "" )
+                               {
+                                       var iTotal = 0;
+                                       iCorrector = 0;
+                                       for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+                                       {
+                                               if ( oSettings.aoColumns[i].bVisible )
+                                               {
+                                                       if ( oSettings.aoColumns[i].sWidthOrig === null )
+                                                       {
+                                                               iTotal += $(oNodes[iCorrector]).outerWidth();
+                                                       }
+                                                       else
+                                                       {
+                                                               iTotal += parseInt(oSettings.aoColumns[i].sWidth.replace('px',''), 10) +
+                                                                       ($(oNodes[iCorrector]).outerWidth() - $(oNodes[iCorrector]).width());
+                                                       }
+                                                       iCorrector++;
+                                               }
+                                       }
+                                       
+                                       nCalcTmp.style.width = _fnStringToCss( iTotal );
+                                       oSettings.nTable.style.width = _fnStringToCss( iTotal );
+                               }
+               
+                               iCorrector = 0;
+                               for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+                               {
+                                       if ( oSettings.aoColumns[i].bVisible )
+                                       {
+                                               iWidth = $(oNodes[iCorrector]).width();
+                                               if ( iWidth !== null && iWidth > 0 )
+                                               {
+                                                       oSettings.aoColumns[i].sWidth = _fnStringToCss( iWidth );
+                                               }
+                                               iCorrector++;
+                                       }
+                               }
+               
+                               var cssWidth = $(nCalcTmp).css('width');
+                               oSettings.nTable.style.width = (cssWidth.indexOf('%') !== -1) ?
+                                   cssWidth : _fnStringToCss( $(nCalcTmp).outerWidth() );
+                               nCalcTmp.parentNode.removeChild( nCalcTmp );
+                       }
+               
+                       if ( widthAttr )
+                       {
+                               oSettings.nTable.style.width = _fnStringToCss( widthAttr );
+                       }
+               }
+               
+               
+               /**
+                * Adjust a table's width to take account of scrolling
+                *  @param {object} oSettings dataTables settings object
+                *  @param {node} n table node
+                *  @memberof DataTable#oApi
+                */
+               function _fnScrollingWidthAdjust ( oSettings, n )
+               {
+                       if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY !== "" )
+                       {
+                               /* When y-scrolling only, we want to remove the width of the scroll bar so the table
+                                * + scroll bar will fit into the area avaialble.
+                                */
+                               var iOrigWidth = $(n).width();
+                               n.style.width = _fnStringToCss( $(n).outerWidth()-oSettings.oScroll.iBarWidth );
+                       }
+                       else if ( oSettings.oScroll.sX !== "" )
+                       {
+                               /* When x-scrolling both ways, fix the table at it's current size, without adjusting */
+                               n.style.width = _fnStringToCss( $(n).outerWidth() );
+                       }
+               }
+               
+               
+               /**
+                * Get the widest node
+                *  @param {object} oSettings dataTables settings object
+                *  @param {int} iCol column of interest
+                *  @returns {node} widest table node
+                *  @memberof DataTable#oApi
+                */
+               function _fnGetWidestNode( oSettings, iCol )
+               {
+                       var iMaxIndex = _fnGetMaxLenString( oSettings, iCol );
+                       if ( iMaxIndex < 0 )
+                       {
+                               return null;
+                       }
+               
+                       if ( oSettings.aoData[iMaxIndex].nTr === null )
+                       {
+                               var n = document.createElement('td');
+                               n.innerHTML = _fnGetCellData( oSettings, iMaxIndex, iCol, '' );
+                               return n;
+                       }
+                       return _fnGetTdNodes(oSettings, iMaxIndex)[iCol];
+               }
+               
+               
+               /**
+                * Get the maximum strlen for each data column
+                *  @param {object} oSettings dataTables settings object
+                *  @param {int} iCol column of interest
+                *  @returns {string} max string length for each column
+                *  @memberof DataTable#oApi
+                */
+               function _fnGetMaxLenString( oSettings, iCol )
+               {
+                       var iMax = -1;
+                       var iMaxIndex = -1;
+                       
+                       for ( var i=0 ; i<oSettings.aoData.length ; i++ )
+                       {
+                               var s = _fnGetCellData( oSettings, i, iCol, 'display' )+"";
+                               s = s.replace( /<.*?>/g, "" );
+                               if ( s.length > iMax )
+                               {
+                                       iMax = s.length;
+                                       iMaxIndex = i;
+                               }
+                       }
+                       
+                       return iMaxIndex;
+               }
+               
+               
+               /**
+                * Append a CSS unit (only if required) to a string
+                *  @param {array} aArray1 first array
+                *  @param {array} aArray2 second array
+                *  @returns {int} 0 if match, 1 if length is different, 2 if no match
+                *  @memberof DataTable#oApi
+                */
+               function _fnStringToCss( s )
+               {
+                       if ( s === null )
+                       {
+                               return "0px";
+                       }
+                       
+                       if ( typeof s == 'number' )
+                       {
+                               if ( s < 0 )
+                               {
+                                       return "0px";
+                               }
+                               return s+"px";
+                       }
+                       
+                       /* Check if the last character is not 0-9 */
+                       var c = s.charCodeAt( s.length-1 );
+                       if (c < 0x30 || c > 0x39)
+                       {
+                               return s;
+                       }
+                       return s+"px";
+               }
+               
+               
+               /**
+                * Get the width of a scroll bar in this browser being used
+                *  @returns {int} width in pixels
+                *  @memberof DataTable#oApi
+                */
+               function _fnScrollBarWidth ()
+               {  
+                       var inner = document.createElement('p');
+                       var style = inner.style;
+                       style.width = "100%";
+                       style.height = "200px";
+                       style.padding = "0px";
+                       
+                       var outer = document.createElement('div');
+                       style = outer.style;
+                       style.position = "absolute";
+                       style.top = "0px";
+                       style.left = "0px";
+                       style.visibility = "hidden";
+                       style.width = "200px";
+                       style.height = "150px";
+                       style.padding = "0px";
+                       style.overflow = "hidden";
+                       outer.appendChild(inner);
+                       
+                       document.body.appendChild(outer);
+                       var w1 = inner.offsetWidth;
+                       outer.style.overflow = 'scroll';
+                       var w2 = inner.offsetWidth;
+                       if ( w1 == w2 )
+                       {
+                               w2 = outer.clientWidth;
+                       }
+                       
+                       document.body.removeChild(outer);
+                       return (w1 - w2);  
+               }
+               
+               /**
+                * Change the order of the table
+                *  @param {object} oSettings dataTables settings object
+                *  @param {bool} bApplyClasses optional - should we apply classes or not
+                *  @memberof DataTable#oApi
+                */
+               function _fnSort ( oSettings, bApplyClasses )
+               {
+                       var
+                               i, iLen, j, jLen, k, kLen,
+                               sDataType, nTh,
+                               aaSort = [],
+                               aiOrig = [],
+                               oSort = DataTable.ext.oSort,
+                               aoData = oSettings.aoData,
+                               aoColumns = oSettings.aoColumns,
+                               oAria = oSettings.oLanguage.oAria;
+                       
+                       /* No sorting required if server-side or no sorting array */
+                       if ( !oSettings.oFeatures.bServerSide && 
+                               (oSettings.aaSorting.length !== 0 || oSettings.aaSortingFixed !== null) )
+                       {
+                               aaSort = ( oSettings.aaSortingFixed !== null ) ?
+                                       oSettings.aaSortingFixed.concat( oSettings.aaSorting ) :
+                                       oSettings.aaSorting.slice();
+                               
+                               /* If there is a sorting data type, and a function belonging to it, then we need to
+                                * get the data from the developer's function and apply it for this column
+                                */
+                               for ( i=0 ; i<aaSort.length ; i++ )
+                               {
+                                       var iColumn = aaSort[i][0];
+                                       var iVisColumn = _fnColumnIndexToVisible( oSettings, iColumn );
+                                       sDataType = oSettings.aoColumns[ iColumn ].sSortDataType;
+                                       if ( DataTable.ext.afnSortData[sDataType] )
+                                       {
+                                               var aData = DataTable.ext.afnSortData[sDataType].call( 
+                                                       oSettings.oInstance, oSettings, iColumn, iVisColumn
+                                               );
+                                               if ( aData.length === aoData.length )
+                                               {
+                                                       for ( j=0, jLen=aoData.length ; j<jLen ; j++ )
+                                                       {
+                                                               _fnSetCellData( oSettings, j, iColumn, aData[j] );
+                                                       }
+                                               }
+                                               else
+                                               {
+                                                       _fnLog( oSettings, 0, "Returned data sort array (col "+iColumn+") is the wrong length" );
+                                               }
+                                       }
+                               }
+                               
+                               /* Create a value - key array of the current row positions such that we can use their
+                                * current position during the sort, if values match, in order to perform stable sorting
+                                */
+                               for ( i=0, iLen=oSettings.aiDisplayMaster.length ; i<iLen ; i++ )
+                               {
+                                       aiOrig[ oSettings.aiDisplayMaster[i] ] = i;
+                               }
+               
+                               /* Build an internal data array which is specific to the sort, so we can get and prep
+                                * the data to be sorted only once, rather than needing to do it every time the sorting
+                                * function runs. This make the sorting function a very simple comparison
+                                */
+                               var iSortLen = aaSort.length;
+                               var fnSortFormat, aDataSort;
+                               for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
+                               {
+                                       for ( j=0 ; j<iSortLen ; j++ )
+                                       {
+                                               aDataSort = aoColumns[ aaSort[j][0] ].aDataSort;
+               
+                                               for ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )
+                                               {
+                                                       sDataType = aoColumns[ aDataSort[k] ].sType;
+                                                       fnSortFormat = oSort[ (sDataType ? sDataType : 'string')+"-pre" ];
+                                                       
+                                                       aoData[i]._aSortData[ aDataSort[k] ] = fnSortFormat ?
+                                                               fnSortFormat( _fnGetCellData( oSettings, i, aDataSort[k], 'sort' ) ) :
+                                                               _fnGetCellData( oSettings, i, aDataSort[k], 'sort' );
+                                               }
+                                       }
+                               }
+                               
+                               /* Do the sort - here we want multi-column sorting based on a given data source (column)
+                                * and sorting function (from oSort) in a certain direction. It's reasonably complex to
+                                * follow on it's own, but this is what we want (example two column sorting):
+                                *  fnLocalSorting = function(a,b){
+                                *      var iTest;
+                                *      iTest = oSort['string-asc']('data11', 'data12');
+                                *      if (iTest !== 0)
+                                *              return iTest;
+                                *    iTest = oSort['numeric-desc']('data21', 'data22');
+                                *    if (iTest !== 0)
+                                *              return iTest;
+                                *      return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
+                                *  }
+                                * Basically we have a test for each sorting column, if the data in that column is equal,
+                                * test the next column. If all columns match, then we use a numeric sort on the row 
+                                * positions in the original data array to provide a stable sort.
+                                */
+                               oSettings.aiDisplayMaster.sort( function ( a, b ) {
+                                       var k, l, lLen, iTest, aDataSort, sDataType;
+                                       for ( k=0 ; k<iSortLen ; k++ )
+                                       {
+                                               aDataSort = aoColumns[ aaSort[k][0] ].aDataSort;
+               
+                                               for ( l=0, lLen=aDataSort.length ; l<lLen ; l++ )
+                                               {
+                                                       sDataType = aoColumns[ aDataSort[l] ].sType;
+                                                       
+                                                       iTest = oSort[ (sDataType ? sDataType : 'string')+"-"+aaSort[k][1] ](
+                                                               aoData[a]._aSortData[ aDataSort[l] ],
+                                                               aoData[b]._aSortData[ aDataSort[l] ]
+                                                       );
+                                               
+                                                       if ( iTest !== 0 )
+                                                       {
+                                                               return iTest;
+                                                       }
+                                               }
+                                       }
+                                       
+                                       return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
+                               } );
+                       }
+                       
+                       /* Alter the sorting classes to take account of the changes */
+                       if ( (bApplyClasses === undefined || bApplyClasses) && !oSettings.oFeatures.bDeferRender )
+                       {
+                               _fnSortingClasses( oSettings );
+                       }
+               
+                       for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                       {
+                               var sTitle = aoColumns[i].sTitle.replace( /<.*?>/g, "" );
+                               nTh = aoColumns[i].nTh;
+                               nTh.removeAttribute('aria-sort');
+                               nTh.removeAttribute('aria-label');
+                               
+                               /* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */
+                               if ( aoColumns[i].bSortable )
+                               {
+                                       if ( aaSort.length > 0 && aaSort[0][0] == i )
+                                       {
+                                               nTh.setAttribute('aria-sort', aaSort[0][1]=="asc" ? "ascending" : "descending" );
+                                               
+                                               var nextSort = (aoColumns[i].asSorting[ aaSort[0][2]+1 ]) ? 
+                                                       aoColumns[i].asSorting[ aaSort[0][2]+1 ] : aoColumns[i].asSorting[0];
+                                               nTh.setAttribute('aria-label', sTitle+
+                                                       (nextSort=="asc" ? oAria.sSortAscending : oAria.sSortDescending) );
+                                       }
+                                       else
+                                       {
+                                               nTh.setAttribute('aria-label', sTitle+
+                                                       (aoColumns[i].asSorting[0]=="asc" ? oAria.sSortAscending : oAria.sSortDescending) );
+                                       }
+                               }
+                               else
+                               {
+                                       nTh.setAttribute('aria-label', sTitle);
+                               }
+                       }
+                       
+                       /* Tell the draw function that we have sorted the data */
+                       oSettings.bSorted = true;
+                       $(oSettings.oInstance).trigger('sort', oSettings);
+                       
+                       /* Copy the master data into the draw array and re-draw */
+                       if ( oSettings.oFeatures.bFilter )
+                       {
+                               /* _fnFilter() will redraw the table for us */
+                               _fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 );
+                       }
+                       else
+                       {
+                               oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+                               oSettings._iDisplayStart = 0; /* reset display back to page 0 */
+                               _fnCalculateEnd( oSettings );
+                               _fnDraw( oSettings );
+                       }
+               }
+               
+               
+               /**
+                * Attach a sort handler (click) to a node
+                *  @param {object} oSettings dataTables settings object
+                *  @param {node} nNode node to attach the handler to
+                *  @param {int} iDataIndex column sorting index
+                *  @param {function} [fnCallback] callback function
+                *  @memberof DataTable#oApi
+                */
+               function _fnSortAttachListener ( oSettings, nNode, iDataIndex, fnCallback )
+               {
+                       _fnBindAction( nNode, {}, function (e) {
+                               /* If the column is not sortable - don't to anything */
+                               if ( oSettings.aoColumns[iDataIndex].bSortable === false )
+                               {
+                                       return;
+                               }
+                               
+                               /*
+                                * This is a little bit odd I admit... I declare a temporary function inside the scope of
+                                * _fnBuildHead and the click handler in order that the code presented here can be used 
+                                * twice - once for when bProcessing is enabled, and another time for when it is 
+                                * disabled, as we need to perform slightly different actions.
+                                *   Basically the issue here is that the Javascript engine in modern browsers don't 
+                                * appear to allow the rendering engine to update the display while it is still executing
+                                * it's thread (well - it does but only after long intervals). This means that the 
+                                * 'processing' display doesn't appear for a table sort. To break the js thread up a bit
+                                * I force an execution break by using setTimeout - but this breaks the expected 
+                                * thread continuation for the end-developer's point of view (their code would execute
+                                * too early), so we only do it when we absolutely have to.
+                                */
+                               var fnInnerSorting = function () {
+                                       var iColumn, iNextSort;
+                                       
+                                       /* If the shift key is pressed then we are multiple column sorting */
+                                       if ( e.shiftKey )
+                                       {
+                                               /* Are we already doing some kind of sort on this column? */
+                                               var bFound = false;
+                                               for ( var i=0 ; i<oSettings.aaSorting.length ; i++ )
+                                               {
+                                                       if ( oSettings.aaSorting[i][0] == iDataIndex )
+                                                       {
+                                                               bFound = true;
+                                                               iColumn = oSettings.aaSorting[i][0];
+                                                               iNextSort = oSettings.aaSorting[i][2]+1;
+                                                               
+                                                               if ( !oSettings.aoColumns[iColumn].asSorting[iNextSort] )
+                                                               {
+                                                                       /* Reached the end of the sorting options, remove from multi-col sort */
+                                                                       oSettings.aaSorting.splice( i, 1 );
+                                                               }
+                                                               else
+                                                               {
+                                                                       /* Move onto next sorting direction */
+                                                                       oSettings.aaSorting[i][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort];
+                                                                       oSettings.aaSorting[i][2] = iNextSort;
+                                                               }
+                                                               break;
+                                                       }
+                                               }
+                                               
+                                               /* No sort yet - add it in */
+                                               if ( bFound === false )
+                                               {
+                                                       oSettings.aaSorting.push( [ iDataIndex, 
+                                                               oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] );
+                                               }
+                                       }
+                                       else
+                                       {
+                                               /* If no shift key then single column sort */
+                                               if ( oSettings.aaSorting.length == 1 && oSettings.aaSorting[0][0] == iDataIndex )
+                                               {
+                                                       iColumn = oSettings.aaSorting[0][0];
+                                                       iNextSort = oSettings.aaSorting[0][2]+1;
+                                                       if ( !oSettings.aoColumns[iColumn].asSorting[iNextSort] )
+                                                       {
+                                                               iNextSort = 0;
+                                                       }
+                                                       oSettings.aaSorting[0][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort];
+                                                       oSettings.aaSorting[0][2] = iNextSort;
+                                               }
+                                               else
+                                               {
+                                                       oSettings.aaSorting.splice( 0, oSettings.aaSorting.length );
+                                                       oSettings.aaSorting.push( [ iDataIndex, 
+                                                               oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] );
+                                               }
+                                       }
+                                       
+                                       /* Run the sort */
+                                       _fnSort( oSettings );
+                               }; /* /fnInnerSorting */
+                               
+                               if ( !oSettings.oFeatures.bProcessing )
+                               {
+                                       fnInnerSorting();
+                               }
+                               else
+                               {
+                                       _fnProcessingDisplay( oSettings, true );
+                                       setTimeout( function() {
+                                               fnInnerSorting();
+                                               if ( !oSettings.oFeatures.bServerSide )
+                                               {
+                                                       _fnProcessingDisplay( oSettings, false );
+                                               }
+                                       }, 0 );
+                               }
+                               
+                               /* Call the user specified callback function - used for async user interaction */
+                               if ( typeof fnCallback == 'function' )
+                               {
+                                       fnCallback( oSettings );
+                               }
+                       } );
+               }
+               
+               
+               /**
+                * Set the sorting classes on the header, Note: it is safe to call this function 
+                * when bSort and bSortClasses are false
+                *  @param {object} oSettings dataTables settings object
+                *  @memberof DataTable#oApi
+                */
+               function _fnSortingClasses( oSettings )
+               {
+                       var i, iLen, j, jLen, iFound;
+                       var aaSort, sClass;
+                       var iColumns = oSettings.aoColumns.length;
+                       var oClasses = oSettings.oClasses;
+                       
+                       for ( i=0 ; i<iColumns ; i++ )
+                       {
+                               if ( oSettings.aoColumns[i].bSortable )
+                               {
+                                       $(oSettings.aoColumns[i].nTh).removeClass( oClasses.sSortAsc +" "+ oClasses.sSortDesc +
+                                               " "+ oSettings.aoColumns[i].sSortingClass );
+                               }
+                       }
+                       
+                       if ( oSettings.aaSortingFixed !== null )
+                       {
+                               aaSort = oSettings.aaSortingFixed.concat( oSettings.aaSorting );
+                       }
+                       else
+                       {
+                               aaSort = oSettings.aaSorting.slice();
+                       }
+                       
+                       /* Apply the required classes to the header */
+                       for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+                       {
+                               if ( oSettings.aoColumns[i].bSortable )
+                               {
+                                       sClass = oSettings.aoColumns[i].sSortingClass;
+                                       iFound = -1;
+                                       for ( j=0 ; j<aaSort.length ; j++ )
+                                       {
+                                               if ( aaSort[j][0] == i )
+                                               {
+                                                       sClass = ( aaSort[j][1] == "asc" ) ?
+                                                               oClasses.sSortAsc : oClasses.sSortDesc;
+                                                       iFound = j;
+                                                       break;
+                                               }
+                                       }
+                                       $(oSettings.aoColumns[i].nTh).addClass( sClass );
+                                       
+                                       if ( oSettings.bJUI )
+                                       {
+                                               /* jQuery UI uses extra markup */
+                                               var jqSpan = $("span."+oClasses.sSortIcon,  oSettings.aoColumns[i].nTh);
+                                               jqSpan.removeClass(oClasses.sSortJUIAsc +" "+ oClasses.sSortJUIDesc +" "+ 
+                                                       oClasses.sSortJUI +" "+ oClasses.sSortJUIAscAllowed +" "+ oClasses.sSortJUIDescAllowed );
+                                               
+                                               var sSpanClass;
+                                               if ( iFound == -1 )
+                                               {
+                                                       sSpanClass = oSettings.aoColumns[i].sSortingClassJUI;
+                                               }
+                                               else if ( aaSort[iFound][1] == "asc" )
+                                               {
+                                                       sSpanClass = oClasses.sSortJUIAsc;
+                                               }
+                                               else
+                                               {
+                                                       sSpanClass = oClasses.sSortJUIDesc;
+                                               }
+                                               
+                                               jqSpan.addClass( sSpanClass );
+                                       }
+                               }
+                               else
+                               {
+                                       /* No sorting on this column, so add the base class. This will have been assigned by
+                                        * _fnAddColumn
+                                        */
+                                       $(oSettings.aoColumns[i].nTh).addClass( oSettings.aoColumns[i].sSortingClass );
+                               }
+                       }
+                       
+                       /* 
+                        * Apply the required classes to the table body
+                        * Note that this is given as a feature switch since it can significantly slow down a sort
+                        * on large data sets (adding and removing of classes is always slow at the best of times..)
+                        * Further to this, note that this code is admittedly fairly ugly. It could be made a lot 
+                        * simpler using jQuery selectors and add/removeClass, but that is significantly slower
+                        * (on the order of 5 times slower) - hence the direct DOM manipulation here.
+                        * Note that for deferred drawing we do use jQuery - the reason being that taking the first
+                        * row found to see if the whole column needs processed can miss classes since the first
+                        * column might be new.
+                        */
+                       sClass = oClasses.sSortColumn;
+                       
+                       if ( oSettings.oFeatures.bSort && oSettings.oFeatures.bSortClasses )
+                       {
+                               var nTds = _fnGetTdNodes( oSettings );
+                               
+                               /* Determine what the sorting class for each column should be */
+                               var iClass, iTargetCol;
+                               var asClasses = [];
+                               for (i = 0; i < iColumns; i++)
+                               {
+                                       asClasses.push("");
+                               }
+                               for (i = 0, iClass = 1; i < aaSort.length; i++)
+                               {
+                                       iTargetCol = parseInt( aaSort[i][0], 10 );
+                                       asClasses[iTargetCol] = sClass + iClass;
+                                       
+                                       if ( iClass < 3 )
+                                       {
+                                               iClass++;
+                                       }
+                               }
+                               
+                               /* Make changes to the classes for each cell as needed */
+                               var reClass = new RegExp(sClass + "[123]");
+                               var sTmpClass, sCurrentClass, sNewClass;
+                               for ( i=0, iLen=nTds.length; i<iLen; i++ )
+                               {
+                                       /* Determine which column we're looking at */
+                                       iTargetCol = i % iColumns;
+                                       
+                                       /* What is the full list of classes now */
+                                       sCurrentClass = nTds[i].className;
+                                       /* What sorting class should be applied? */
+                                       sNewClass = asClasses[iTargetCol];
+                                       /* What would the new full list be if we did a replacement? */
+                                       sTmpClass = sCurrentClass.replace(reClass, sNewClass);
+                                       
+                                       if ( sTmpClass != sCurrentClass )
+                                       {
+                                               /* We changed something */
+                                               nTds[i].className = $.trim( sTmpClass );
+                                       }
+                                       else if ( sNewClass.length > 0 && sCurrentClass.indexOf(sNewClass) == -1 )
+                                       {
+                                               /* We need to add a class */
+                                               nTds[i].className = sCurrentClass + " " + sNewClass;
+                                       }
+                               }
+                       }
+               }
+               
+               
+               
+               /**
+                * Save the state of a table in a cookie such that the page can be reloaded
+                *  @param {object} oSettings dataTables settings object
+                *  @memberof DataTable#oApi
+                */
+               function _fnSaveState ( oSettings )
+               {
+                       if ( !oSettings.oFeatures.bStateSave || oSettings.bDestroying )
+                       {
+                               return;
+                       }
+               
+                       /* Store the interesting variables */
+                       var i, iLen, bInfinite=oSettings.oScroll.bInfinite;
+                       var oState = {
+                               "iCreate":      new Date().getTime(),
+                               "iStart":       (bInfinite ? 0 : oSettings._iDisplayStart),
+                               "iEnd":         (bInfinite ? oSettings._iDisplayLength : oSettings._iDisplayEnd),
+                               "iLength":      oSettings._iDisplayLength,
+                               "aaSorting":    $.extend( true, [], oSettings.aaSorting ),
+                               "oSearch":      $.extend( true, {}, oSettings.oPreviousSearch ),
+                               "aoSearchCols": $.extend( true, [], oSettings.aoPreSearchCols ),
+                               "abVisCols":    []
+                       };
+               
+                       for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                       {
+                               oState.abVisCols.push( oSettings.aoColumns[i].bVisible );
+                       }
+               
+                       _fnCallbackFire( oSettings, "aoStateSaveParams", 'stateSaveParams', [oSettings, oState] );
+                       
+                       oSettings.fnStateSave.call( oSettings.oInstance, oSettings, oState );
+               }
+               
+               
+               /**
+                * Attempt to load a saved table state from a cookie
+                *  @param {object} oSettings dataTables settings object
+                *  @param {object} oInit DataTables init object so we can override settings
+                *  @memberof DataTable#oApi
+                */
+               function _fnLoadState ( oSettings, oInit )
+               {
+                       if ( !oSettings.oFeatures.bStateSave )
+                       {
+                               return;
+                       }
+               
+                       var oData = oSettings.fnStateLoad.call( oSettings.oInstance, oSettings );
+                       if ( !oData )
+                       {
+                               return;
+                       }
+                       
+                       /* Allow custom and plug-in manipulation functions to alter the saved data set and
+                        * cancelling of loading by returning false
+                        */
+                       var abStateLoad = _fnCallbackFire( oSettings, 'aoStateLoadParams', 'stateLoadParams', [oSettings, oData] );
+                       if ( $.inArray( false, abStateLoad ) !== -1 )
+                       {
+                               return;
+                       }
+                       
+                       /* Store the saved state so it might be accessed at any time */
+                       oSettings.oLoadedState = $.extend( true, {}, oData );
+                       
+                       /* Restore key features */
+                       oSettings._iDisplayStart    = oData.iStart;
+                       oSettings.iInitDisplayStart = oData.iStart;
+                       oSettings._iDisplayEnd      = oData.iEnd;
+                       oSettings._iDisplayLength   = oData.iLength;
+                       oSettings.aaSorting         = oData.aaSorting.slice();
+                       oSettings.saved_aaSorting   = oData.aaSorting.slice();
+                       
+                       /* Search filtering  */
+                       $.extend( oSettings.oPreviousSearch, oData.oSearch );
+                       $.extend( true, oSettings.aoPreSearchCols, oData.aoSearchCols );
+                       
+                       /* Column visibility state
+                        * Pass back visibility settings to the init handler, but to do not here override
+                        * the init object that the user might have passed in
+                        */
+                       oInit.saved_aoColumns = [];
+                       for ( var i=0 ; i<oData.abVisCols.length ; i++ )
+                       {
+                               oInit.saved_aoColumns[i] = {};
+                               oInit.saved_aoColumns[i].bVisible = oData.abVisCols[i];
+                       }
+               
+                       _fnCallbackFire( oSettings, 'aoStateLoaded', 'stateLoaded', [oSettings, oData] );
+               }
+               
+               
+               /**
+                * Create a new cookie with a value to store the state of a table
+                *  @param {string} sName name of the cookie to create
+                *  @param {string} sValue the value the cookie should take
+                *  @param {int} iSecs duration of the cookie
+                *  @param {string} sBaseName sName is made up of the base + file name - this is the base
+                *  @param {function} fnCallback User definable function to modify the cookie
+                *  @memberof DataTable#oApi
+                */
+               function _fnCreateCookie ( sName, sValue, iSecs, sBaseName, fnCallback )
+               {
+                       var date = new Date();
+                       date.setTime( date.getTime()+(iSecs*1000) );
+                       
+                       /* 
+                        * Shocking but true - it would appear IE has major issues with having the path not having
+                        * a trailing slash on it. We need the cookie to be available based on the path, so we
+                        * have to append the file name to the cookie name. Appalling. Thanks to vex for adding the
+                        * patch to use at least some of the path
+                        */
+                       var aParts = window.location.pathname.split('/');
+                       var sNameFile = sName + '_' + aParts.pop().replace(/[\/:]/g,"").toLowerCase();
+                       var sFullCookie, oData;
+                       
+                       if ( fnCallback !== null )
+                       {
+                               oData = (typeof $.parseJSON === 'function') ? 
+                                       $.parseJSON( sValue ) : eval( '('+sValue+')' );
+                               sFullCookie = fnCallback( sNameFile, oData, date.toGMTString(),
+                                       aParts.join('/')+"/" );
+                       }
+                       else
+                       {
+                               sFullCookie = sNameFile + "=" + encodeURIComponent(sValue) +
+                                       "; expires=" + date.toGMTString() +"; path=" + aParts.join('/')+"/";
+                       }
+                       
+                       /* Are we going to go over the cookie limit of 4KiB? If so, try to delete a cookies
+                        * belonging to DataTables.
+                        */
+                       var
+                               aCookies =document.cookie.split(';'),
+                               iNewCookieLen = sFullCookie.split(';')[0].length,
+                               aOldCookies = [];
+                       
+                       if ( iNewCookieLen+document.cookie.length+10 > 4096 ) /* Magic 10 for padding */
+                       {
+                               for ( var i=0, iLen=aCookies.length ; i<iLen ; i++ )
+                               {
+                                       if ( aCookies[i].indexOf( sBaseName ) != -1 )
+                                       {
+                                               /* It's a DataTables cookie, so eval it and check the time stamp */
+                                               var aSplitCookie = aCookies[i].split('=');
+                                               try {
+                                                       oData = eval( '('+decodeURIComponent(aSplitCookie[1])+')' );
+               
+                                                       if ( oData && oData.iCreate )
+                                                       {
+                                                               aOldCookies.push( {
+                                                                       "name": aSplitCookie[0],
+                                                                       "time": oData.iCreate
+                                                               } );
+                                                       }
+                                               }
+                                               catch( e ) {}
+                                       }
+                               }
+               
+                               // Make sure we delete the oldest ones first
+                               aOldCookies.sort( function (a, b) {
+                                       return b.time - a.time;
+                               } );
+               
+                               // Eliminate as many old DataTables cookies as we need to
+                               while ( iNewCookieLen + document.cookie.length + 10 > 4096 ) {
+                                       if ( aOldCookies.length === 0 ) {
+                                               // Deleted all DT cookies and still not enough space. Can't state save
+                                               return;
+                                       }
+                                       
+                                       var old = aOldCookies.pop();
+                                       document.cookie = old.name+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+
+                                               aParts.join('/') + "/";
+                               }
+                       }
+                       
+                       document.cookie = sFullCookie;
+               }
+               
+               
+               /**
+                * Read an old cookie to get a cookie with an old table state
+                *  @param {string} sName name of the cookie to read
+                *  @returns {string} contents of the cookie - or null if no cookie with that name found
+                *  @memberof DataTable#oApi
+                */
+               function _fnReadCookie ( sName )
+               {
+                       var
+                               aParts = window.location.pathname.split('/'),
+                               sNameEQ = sName + '_' + aParts[aParts.length-1].replace(/[\/:]/g,"").toLowerCase() + '=',
+                               sCookieContents = document.cookie.split(';');
+                       
+                       for( var i=0 ; i<sCookieContents.length ; i++ )
+                       {
+                               var c = sCookieContents[i];
+                               
+                               while (c.charAt(0)==' ')
+                               {
+                                       c = c.substring(1,c.length);
+                               }
+                               
+                               if (c.indexOf(sNameEQ) === 0)
+                               {
+                                       return decodeURIComponent( c.substring(sNameEQ.length,c.length) );
+                               }
+                       }
+                       return null;
+               }
+               
+               
+               /**
+                * Return the settings object for a particular table
+                *  @param {node} nTable table we are using as a dataTable
+                *  @returns {object} Settings object - or null if not found
+                *  @memberof DataTable#oApi
+                */
+               function _fnSettingsFromNode ( nTable )
+               {
+                       for ( var i=0 ; i<DataTable.settings.length ; i++ )
+                       {
+                               if ( DataTable.settings[i].nTable === nTable )
+                               {
+                                       return DataTable.settings[i];
+                               }
+                       }
+                       
+                       return null;
+               }
+               
+               
+               /**
+                * Return an array with the TR nodes for the table
+                *  @param {object} oSettings dataTables settings object
+                *  @returns {array} TR array
+                *  @memberof DataTable#oApi
+                */
+               function _fnGetTrNodes ( oSettings )
+               {
+                       var aNodes = [];
+                       var aoData = oSettings.aoData;
+                       for ( var i=0, iLen=aoData.length ; i<iLen ; i++ )
+                       {
+                               if ( aoData[i].nTr !== null )
+                               {
+                                       aNodes.push( aoData[i].nTr );
+                               }
+                       }
+                       return aNodes;
+               }
+               
+               
+               /**
+                * Return an flat array with all TD nodes for the table, or row
+                *  @param {object} oSettings dataTables settings object
+                *  @param {int} [iIndividualRow] aoData index to get the nodes for - optional 
+                *    if not given then the return array will contain all nodes for the table
+                *  @returns {array} TD array
+                *  @memberof DataTable#oApi
+                */
+               function _fnGetTdNodes ( oSettings, iIndividualRow )
+               {
+                       var anReturn = [];
+                       var iCorrector;
+                       var anTds, nTd;
+                       var iRow, iRows=oSettings.aoData.length,
+                               iColumn, iColumns, oData, sNodeName, iStart=0, iEnd=iRows;
+                       
+                       /* Allow the collection to be limited to just one row */
+                       if ( iIndividualRow !== undefined )
+                       {
+                               iStart = iIndividualRow;
+                               iEnd = iIndividualRow+1;
+                       }
+               
+                       for ( iRow=iStart ; iRow<iEnd ; iRow++ )
+                       {
+                               oData = oSettings.aoData[iRow];
+                               if ( oData.nTr !== null )
+                               {
+                                       /* get the TD child nodes - taking into account text etc nodes */
+                                       anTds = [];
+                                       nTd = oData.nTr.firstChild;
+                                       while ( nTd )
+                                       {
+                                               sNodeName = nTd.nodeName.toLowerCase();
+                                               if ( sNodeName == 'td' || sNodeName == 'th' )
+                                               {
+                                                       anTds.push( nTd );
+                                               }
+                                               nTd = nTd.nextSibling;
+                                       }
+               
+                                       iCorrector = 0;
+                                       for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )
+                                       {
+                                               if ( oSettings.aoColumns[iColumn].bVisible )
+                                               {
+                                                       anReturn.push( anTds[iColumn-iCorrector] );
+                                               }
+                                               else
+                                               {
+                                                       anReturn.push( oData._anHidden[iColumn] );
+                                                       iCorrector++;
+                                               }
+                                       }
+                               }
+                       }
+               
+                       return anReturn;
+               }
+               
+               
+               /**
+                * Log an error message
+                *  @param {object} oSettings dataTables settings object
+                *  @param {int} iLevel log error messages, or display them to the user
+                *  @param {string} sMesg error message
+                *  @memberof DataTable#oApi
+                */
+               function _fnLog( oSettings, iLevel, sMesg )
+               {
+                       var sAlert = (oSettings===null) ?
+                               "DataTables warning: "+sMesg :
+                               "DataTables warning (table id = '"+oSettings.sTableId+"'): "+sMesg;
+                       
+                       if ( iLevel === 0 )
+                       {
+                               if ( DataTable.ext.sErrMode == 'alert' )
+                               {
+                                       alert( sAlert );
+                               }
+                               else
+                               {
+                                       throw new Error(sAlert);
+                               }
+                               return;
+                       }
+                       else if ( window.console && console.log )
+                       {
+                               console.log( sAlert );
+                       }
+               }
+               
+               
+               /**
+                * See if a property is defined on one object, if so assign it to the other object
+                *  @param {object} oRet target object
+                *  @param {object} oSrc source object
+                *  @param {string} sName property
+                *  @param {string} [sMappedName] name to map too - optional, sName used if not given
+                *  @memberof DataTable#oApi
+                */
+               function _fnMap( oRet, oSrc, sName, sMappedName )
+               {
+                       if ( sMappedName === undefined )
+                       {
+                               sMappedName = sName;
+                       }
+                       if ( oSrc[sName] !== undefined )
+                       {
+                               oRet[sMappedName] = oSrc[sName];
+                       }
+               }
+               
+               
+               /**
+                * Extend objects - very similar to jQuery.extend, but deep copy objects, and shallow
+                * copy arrays. The reason we need to do this, is that we don't want to deep copy array
+                * init values (such as aaSorting) since the dev wouldn't be able to override them, but
+                * we do want to deep copy arrays.
+                *  @param {object} oOut Object to extend
+                *  @param {object} oExtender Object from which the properties will be applied to oOut
+                *  @returns {object} oOut Reference, just for convenience - oOut === the return.
+                *  @memberof DataTable#oApi
+                *  @todo This doesn't take account of arrays inside the deep copied objects.
+                */
+               function _fnExtend( oOut, oExtender )
+               {
+                       var val;
+                       
+                       for ( var prop in oExtender )
+                       {
+                               if ( oExtender.hasOwnProperty(prop) )
+                               {
+                                       val = oExtender[prop];
+               
+                                       if ( typeof oInit[prop] === 'object' && val !== null && $.isArray(val) === false )
+                                       {
+                                               $.extend( true, oOut[prop], val );
+                                       }
+                                       else
+                                       {
+                                               oOut[prop] = val;
+                                       }
+                               }
+                       }
+               
+                       return oOut;
+               }
+               
+               
+               /**
+                * Bind an event handers to allow a click or return key to activate the callback.
+                * This is good for accessibility since a return on the keyboard will have the
+                * same effect as a click, if the element has focus.
+                *  @param {element} n Element to bind the action to
+                *  @param {object} oData Data object to pass to the triggered function
+                *  @param {function} fn Callback function for when the event is triggered
+                *  @memberof DataTable#oApi
+                */
+               function _fnBindAction( n, oData, fn )
+               {
+                       $(n)
+                               .bind( 'click.DT', oData, function (e) {
+                                               n.blur(); // Remove focus outline for mouse users
+                                               fn(e);
+                                       } )
+                               .bind( 'keypress.DT', oData, function (e){
+                                       if ( e.which === 13 ) {
+                                               fn(e);
+                                       } } )
+                               .bind( 'selectstart.DT', function () {
+                                       /* Take the brutal approach to cancelling text selection */
+                                       return false;
+                                       } );
+               }
+               
+               
+               /**
+                * Register a callback function. Easily allows a callback function to be added to
+                * an array store of callback functions that can then all be called together.
+                *  @param {object} oSettings dataTables settings object
+                *  @param {string} sStore Name of the array storage for the callbacks in oSettings
+                *  @param {function} fn Function to be called back
+                *  @param {string} sName Identifying name for the callback (i.e. a label)
+                *  @memberof DataTable#oApi
+                */
+               function _fnCallbackReg( oSettings, sStore, fn, sName )
+               {
+                       if ( fn )
+                       {
+                               oSettings[sStore].push( {
+                                       "fn": fn,
+                                       "sName": sName
+                               } );
+                       }
+               }
+               
+               
+               /**
+                * Fire callback functions and trigger events. Note that the loop over the callback
+                * array store is done backwards! Further note that you do not want to fire off triggers
+                * in time sensitive applications (for example cell creation) as its slow.
+                *  @param {object} oSettings dataTables settings object
+                *  @param {string} sStore Name of the array storage for the callbacks in oSettings
+                *  @param {string} sTrigger Name of the jQuery custom event to trigger. If null no trigger
+                *    is fired
+                *  @param {array} aArgs Array of arguments to pass to the callback function / trigger
+                *  @memberof DataTable#oApi
+                */
+               function _fnCallbackFire( oSettings, sStore, sTrigger, aArgs )
+               {
+                       var aoStore = oSettings[sStore];
+                       var aRet =[];
+               
+                       for ( var i=aoStore.length-1 ; i>=0 ; i-- )
+                       {
+                               aRet.push( aoStore[i].fn.apply( oSettings.oInstance, aArgs ) );
+                       }
+               
+                       if ( sTrigger !== null )
+                       {
+                               $(oSettings.oInstance).trigger(sTrigger, aArgs);
+                       }
+               
+                       return aRet;
+               }
+               
+               
+               /**
+                * JSON stringify. If JSON.stringify it provided by the browser, json2.js or any other
+                * library, then we use that as it is fast, safe and accurate. If the function isn't 
+                * available then we need to built it ourselves - the inspiration for this function comes
+                * from Craig Buckler ( http://www.sitepoint.com/javascript-json-serialization/ ). It is
+                * not perfect and absolutely should not be used as a replacement to json2.js - but it does
+                * do what we need, without requiring a dependency for DataTables.
+                *  @param {object} o JSON object to be converted
+                *  @returns {string} JSON string
+                *  @memberof DataTable#oApi
+                */
+               var _fnJsonString = (window.JSON) ? JSON.stringify : function( o )
+               {
+                       /* Not an object or array */
+                       var sType = typeof o;
+                       if (sType !== "object" || o === null)
+                       {
+                               // simple data type
+                               if (sType === "string")
+                               {
+                                       o = '"'+o+'"';
+                               }
+                               return o+"";
+                       }
+               
+                       /* If object or array, need to recurse over it */
+                       var
+                               sProp, mValue,
+                               json = [],
+                               bArr = $.isArray(o);
+                       
+                       for (sProp in o)
+                       {
+                               mValue = o[sProp];
+                               sType = typeof mValue;
+               
+                               if (sType === "string")
+                               {
+                                       mValue = '"'+mValue+'"';
+                               }
+                               else if (sType === "object" && mValue !== null)
+                               {
+                                       mValue = _fnJsonString(mValue);
+                               }
+               
+                               json.push((bArr ? "" : '"'+sProp+'":') + mValue);
+                       }
+               
+                       return (bArr ? "[" : "{") + json + (bArr ? "]" : "}");
+               };
+               
+               
+               /**
+                * From some browsers (specifically IE6/7) we need special handling to work around browser
+                * bugs - this function is used to detect when these workarounds are needed.
+                *  @param {object} oSettings dataTables settings object
+                *  @memberof DataTable#oApi
+                */
+               function _fnBrowserDetect( oSettings )
+               {
+                       /* IE6/7 will oversize a width 100% element inside a scrolling element, to include the
+                        * width of the scrollbar, while other browsers ensure the inner element is contained
+                        * without forcing scrolling
+                        */
+                       var n = $(
+                               '<div style="position:absolute; top:0; left:0; height:1px; width:1px; overflow:hidden">'+
+                                       '<div style="position:absolute; top:1px; left:1px; width:100px; overflow:scroll;">'+
+                                               '<div id="DT_BrowserTest" style="width:100%; height:10px;"></div>'+
+                                       '</div>'+
+                               '</div>')[0];
+               
+                       document.body.appendChild( n );
+                       oSettings.oBrowser.bScrollOversize = $('#DT_BrowserTest', n)[0].offsetWidth === 100 ? true : false;
+                       document.body.removeChild( n );
+               }
+               
+
+               /**
+                * Perform a jQuery selector action on the table's TR elements (from the tbody) and
+                * return the resulting jQuery object.
+                *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
+                *  @param {object} [oOpts] Optional parameters for modifying the rows to be included
+                *  @param {string} [oOpts.filter=none] Select TR elements that meet the current filter
+                *    criterion ("applied") or all TR elements (i.e. no filter).
+                *  @param {string} [oOpts.order=current] Order of the TR elements in the processed array.
+                *    Can be either 'current', whereby the current sorting of the table is used, or
+                *    'original' whereby the original order the data was read into the table is used.
+                *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
+                *    ("current") or not ("all"). If 'current' is given, then order is assumed to be 
+                *    'current' and filter is 'applied', regardless of what they might be given as.
+                *  @returns {object} jQuery object, filtered by the given selector.
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable = $('#example').dataTable();
+                *
+                *      // Highlight every second row
+                *      oTable.$('tr:odd').css('backgroundColor', 'blue');
+                *    } );
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable = $('#example').dataTable();
+                *
+                *      // Filter to rows with 'Webkit' in them, add a background colour and then
+                *      // remove the filter, thus highlighting the 'Webkit' rows only.
+                *      oTable.fnFilter('Webkit');
+                *      oTable.$('tr', {"filter": "applied"}).css('backgroundColor', 'blue');
+                *      oTable.fnFilter('');
+                *    } );
+                */
+               this.$ = function ( sSelector, oOpts )
+               {
+                       var i, iLen, a = [], tr;
+                       var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+                       var aoData = oSettings.aoData;
+                       var aiDisplay = oSettings.aiDisplay;
+                       var aiDisplayMaster = oSettings.aiDisplayMaster;
+               
+                       if ( !oOpts )
+                       {
+                               oOpts = {};
+                       }
+               
+                       oOpts = $.extend( {}, {
+                               "filter": "none", // applied
+                               "order": "current", // "original"
+                               "page": "all" // current
+                       }, oOpts );
+               
+                       // Current page implies that order=current and fitler=applied, since it is fairly
+                       // senseless otherwise
+                       if ( oOpts.page == 'current' )
+                       {
+                               for ( i=oSettings._iDisplayStart, iLen=oSettings.fnDisplayEnd() ; i<iLen ; i++ )
+                               {
+                                       tr = aoData[ aiDisplay[i] ].nTr;
+                                       if ( tr )
+                                       {
+                                               a.push( tr );
+                                       }
+                               }
+                       }
+                       else if ( oOpts.order == "current" && oOpts.filter == "none" )
+                       {
+                               for ( i=0, iLen=aiDisplayMaster.length ; i<iLen ; i++ )
+                               {
+                                       tr = aoData[ aiDisplayMaster[i] ].nTr;
+                                       if ( tr )
+                                       {
+                                               a.push( tr );
+                                       }
+                               }
+                       }
+                       else if ( oOpts.order == "current" && oOpts.filter == "applied" )
+                       {
+                               for ( i=0, iLen=aiDisplay.length ; i<iLen ; i++ )
+                               {
+                                       tr = aoData[ aiDisplay[i] ].nTr;
+                                       if ( tr )
+                                       {
+                                               a.push( tr );
+                                       }
+                               }
+                       }
+                       else if ( oOpts.order == "original" && oOpts.filter == "none" )
+                       {
+                               for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
+                               {
+                                       tr = aoData[ i ].nTr ;
+                                       if ( tr )
+                                       {
+                                               a.push( tr );
+                                       }
+                               }
+                       }
+                       else if ( oOpts.order == "original" && oOpts.filter == "applied" )
+                       {
+                               for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
+                               {
+                                       tr = aoData[ i ].nTr;
+                                       if ( $.inArray( i, aiDisplay ) !== -1 && tr )
+                                       {
+                                               a.push( tr );
+                                       }
+                               }
+                       }
+                       else
+                       {
+                               _fnLog( oSettings, 1, "Unknown selection options" );
+                       }
+               
+                       /* We need to filter on the TR elements and also 'find' in their descendants
+                        * to make the selector act like it would in a full table - so we need
+                        * to build both results and then combine them together
+                        */
+                       var jqA = $(a);
+                       var jqTRs = jqA.filter( sSelector );
+                       var jqDescendants = jqA.find( sSelector );
+               
+                       return $( [].concat($.makeArray(jqTRs), $.makeArray(jqDescendants)) );
+               };
+               
+               
+               /**
+                * Almost identical to $ in operation, but in this case returns the data for the matched
+                * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes
+                * rather than any descendants, so the data can be obtained for the row/cell. If matching
+                * rows are found, the data returned is the original data array/object that was used to  
+                * create the row (or a generated array if from a DOM source).
+                *
+                * This method is often useful in-combination with $ where both functions are given the
+                * same parameters and the array indexes will match identically.
+                *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
+                *  @param {object} [oOpts] Optional parameters for modifying the rows to be included
+                *  @param {string} [oOpts.filter=none] Select elements that meet the current filter
+                *    criterion ("applied") or all elements (i.e. no filter).
+                *  @param {string} [oOpts.order=current] Order of the data in the processed array.
+                *    Can be either 'current', whereby the current sorting of the table is used, or
+                *    'original' whereby the original order the data was read into the table is used.
+                *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
+                *    ("current") or not ("all"). If 'current' is given, then order is assumed to be 
+                *    'current' and filter is 'applied', regardless of what they might be given as.
+                *  @returns {array} Data for the matched elements. If any elements, as a result of the
+                *    selector, were not TR, TD or TH elements in the DataTable, they will have a null 
+                *    entry in the array.
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable = $('#example').dataTable();
+                *
+                *      // Get the data from the first row in the table
+                *      var data = oTable._('tr:first');
+                *
+                *      // Do something useful with the data
+                *      alert( "First cell is: "+data[0] );
+                *    } );
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable = $('#example').dataTable();
+                *
+                *      // Filter to 'Webkit' and get all data for 
+                *      oTable.fnFilter('Webkit');
+                *      var data = oTable._('tr', {"filter": "applied"});
+                *      
+                *      // Do something with the data
+                *      alert( data.length+" rows matched the filter" );
+                *    } );
+                */
+               this._ = function ( sSelector, oOpts )
+               {
+                       var aOut = [];
+                       var i, iLen, iIndex;
+                       var aTrs = this.$( sSelector, oOpts );
+               
+                       for ( i=0, iLen=aTrs.length ; i<iLen ; i++ )
+                       {
+                               aOut.push( this.fnGetData(aTrs[i]) );
+                       }
+               
+                       return aOut;
+               };
+               
+               
+               /**
+                * Add a single new row or multiple rows of data to the table. Please note
+                * that this is suitable for client-side processing only - if you are using 
+                * server-side processing (i.e. "bServerSide": true), then to add data, you
+                * must add it to the data source, i.e. the server-side, through an Ajax call.
+                *  @param {array|object} mData The data to be added to the table. This can be:
+                *    <ul>
+                *      <li>1D array of data - add a single row with the data provided</li>
+                *      <li>2D array of arrays - add multiple rows in a single call</li>
+                *      <li>object - data object when using <i>mData</i></li>
+                *      <li>array of objects - multiple data objects when using <i>mData</i></li>
+                *    </ul>
+                *  @param {bool} [bRedraw=true] redraw the table or not
+                *  @returns {array} An array of integers, representing the list of indexes in 
+                *    <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to 
+                *    the table.
+                *  @dtopt API
+                *
+                *  @example
+                *    // Global var for counter
+                *    var giCount = 2;
+                *    
+                *    $(document).ready(function() {
+                *      $('#example').dataTable();
+                *    } );
+                *    
+                *    function fnClickAddRow() {
+                *      $('#example').dataTable().fnAddData( [
+                *        giCount+".1",
+                *        giCount+".2",
+                *        giCount+".3",
+                *        giCount+".4" ]
+                *      );
+                *        
+                *      giCount++;
+                *    }
+                */
+               this.fnAddData = function( mData, bRedraw )
+               {
+                       if ( mData.length === 0 )
+                       {
+                               return [];
+                       }
+                       
+                       var aiReturn = [];
+                       var iTest;
+                       
+                       /* Find settings from table node */
+                       var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+                       
+                       /* Check if we want to add multiple rows or not */
+                       if ( typeof mData[0] === "object" && mData[0] !== null )
+                       {
+                               for ( var i=0 ; i<mData.length ; i++ )
+                               {
+                                       iTest = _fnAddData( oSettings, mData[i] );
+                                       if ( iTest == -1 )
+                                       {
+                                               return aiReturn;
+                                       }
+                                       aiReturn.push( iTest );
+                               }
+                       }
+                       else
+                       {
+                               iTest = _fnAddData( oSettings, mData );
+                               if ( iTest == -1 )
+                               {
+                                       return aiReturn;
+                               }
+                               aiReturn.push( iTest );
+                       }
+                       
+                       oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+                       
+                       if ( bRedraw === undefined || bRedraw )
+                       {
+                               _fnReDraw( oSettings );
+                       }
+                       return aiReturn;
+               };
+               
+               
+               /**
+                * This function will make DataTables recalculate the column sizes, based on the data 
+                * contained in the table and the sizes applied to the columns (in the DOM, CSS or 
+                * through the sWidth parameter). This can be useful when the width of the table's 
+                * parent element changes (for example a window resize).
+                *  @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable = $('#example').dataTable( {
+                *        "sScrollY": "200px",
+                *        "bPaginate": false
+                *      } );
+                *      
+                *      $(window).bind('resize', function () {
+                *        oTable.fnAdjustColumnSizing();
+                *      } );
+                *    } );
+                */
+               this.fnAdjustColumnSizing = function ( bRedraw )
+               {
+                       var oSettings = _fnSettingsFromNode(this[DataTable.ext.iApiIndex]);
+                       _fnAdjustColumnSizing( oSettings );
+                       
+                       if ( bRedraw === undefined || bRedraw )
+                       {
+                               this.fnDraw( false );
+                       }
+                       else if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" )
+                       {
+                               /* If not redrawing, but scrolling, we want to apply the new column sizes anyway */
+                               this.oApi._fnScrollDraw(oSettings);
+                       }
+               };
+               
+               
+               /**
+                * Quickly and simply clear a table
+                *  @param {bool} [bRedraw=true] redraw the table or not
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable = $('#example').dataTable();
+                *      
+                *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)
+                *      oTable.fnClearTable();
+                *    } );
+                */
+               this.fnClearTable = function( bRedraw )
+               {
+                       /* Find settings from table node */
+                       var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+                       _fnClearTable( oSettings );
+                       
+                       if ( bRedraw === undefined || bRedraw )
+                       {
+                               _fnDraw( oSettings );
+                       }
+               };
+               
+               
+               /**
+                * The exact opposite of 'opening' a row, this function will close any rows which 
+                * are currently 'open'.
+                *  @param {node} nTr the table row to 'close'
+                *  @returns {int} 0 on success, or 1 if failed (can't find the row)
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable;
+                *      
+                *      // 'open' an information row when a row is clicked on
+                *      $('#example tbody tr').click( function () {
+                *        if ( oTable.fnIsOpen(this) ) {
+                *          oTable.fnClose( this );
+                *        } else {
+                *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
+                *        }
+                *      } );
+                *      
+                *      oTable = $('#example').dataTable();
+                *    } );
+                */
+               this.fnClose = function( nTr )
+               {
+                       /* Find settings from table node */
+                       var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+                       
+                       for ( var i=0 ; i<oSettings.aoOpenRows.length ; i++ )
+                       {
+                               if ( oSettings.aoOpenRows[i].nParent == nTr )
+                               {
+                                       var nTrParent = oSettings.aoOpenRows[i].nTr.parentNode;
+                                       if ( nTrParent )
+                                       {
+                                               /* Remove it if it is currently on display */
+                                               nTrParent.removeChild( oSettings.aoOpenRows[i].nTr );
+                                       }
+                                       oSettings.aoOpenRows.splice( i, 1 );
+                                       return 0;
+                               }
+                       }
+                       return 1;
+               };
+               
+               
+               /**
+                * Remove a row for the table
+                *  @param {mixed} mTarget The index of the row from aoData to be deleted, or
+                *    the TR element you want to delete
+                *  @param {function|null} [fnCallBack] Callback function
+                *  @param {bool} [bRedraw=true] Redraw the table or not
+                *  @returns {array} The row that was deleted
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable = $('#example').dataTable();
+                *      
+                *      // Immediately remove the first row
+                *      oTable.fnDeleteRow( 0 );
+                *    } );
+                */
+               this.fnDeleteRow = function( mTarget, fnCallBack, bRedraw )
+               {
+                       /* Find settings from table node */
+                       var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+                       var i, iLen, iAODataIndex;
+                       
+                       iAODataIndex = (typeof mTarget === 'object') ? 
+                               _fnNodeToDataIndex(oSettings, mTarget) : mTarget;
+                       
+                       /* Return the data array from this row */
+                       var oData = oSettings.aoData.splice( iAODataIndex, 1 );
+               
+                       /* Update the _DT_RowIndex parameter */
+                       for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
+                       {
+                               if ( oSettings.aoData[i].nTr !== null )
+                               {
+                                       oSettings.aoData[i].nTr._DT_RowIndex = i;
+                               }
+                       }
+                       
+                       /* Remove the target row from the search array */
+                       var iDisplayIndex = $.inArray( iAODataIndex, oSettings.aiDisplay );
+                       oSettings.asDataSearch.splice( iDisplayIndex, 1 );
+                       
+                       /* Delete from the display arrays */
+                       _fnDeleteIndex( oSettings.aiDisplayMaster, iAODataIndex );
+                       _fnDeleteIndex( oSettings.aiDisplay, iAODataIndex );
+                       
+                       /* If there is a user callback function - call it */
+                       if ( typeof fnCallBack === "function" )
+                       {
+                               fnCallBack.call( this, oSettings, oData );
+                       }
+                       
+                       /* Check for an 'overflow' they case for displaying the table */
+                       if ( oSettings._iDisplayStart >= oSettings.fnRecordsDisplay() )
+                       {
+                               oSettings._iDisplayStart -= oSettings._iDisplayLength;
+                               if ( oSettings._iDisplayStart < 0 )
+                               {
+                                       oSettings._iDisplayStart = 0;
+                               }
+                       }
+                       
+                       if ( bRedraw === undefined || bRedraw )
+                       {
+                               _fnCalculateEnd( oSettings );
+                               _fnDraw( oSettings );
+                       }
+                       
+                       return oData;
+               };
+               
+               
+               /**
+                * Restore the table to it's original state in the DOM by removing all of DataTables 
+                * enhancements, alterations to the DOM structure of the table and event listeners.
+                *  @param {boolean} [bRemove=false] Completely remove the table from the DOM
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      // This example is fairly pointless in reality, but shows how fnDestroy can be used
+                *      var oTable = $('#example').dataTable();
+                *      oTable.fnDestroy();
+                *    } );
+                */
+               this.fnDestroy = function ( bRemove )
+               {
+                       var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+                       var nOrig = oSettings.nTableWrapper.parentNode;
+                       var nBody = oSettings.nTBody;
+                       var i, iLen;
+               
+                       bRemove = (bRemove===undefined) ? false : bRemove;
+                       
+                       /* Flag to note that the table is currently being destroyed - no action should be taken */
+                       oSettings.bDestroying = true;
+                       
+                       /* Fire off the destroy callbacks for plug-ins etc */
+                       _fnCallbackFire( oSettings, "aoDestroyCallback", "destroy", [oSettings] );
+               
+                       /* If the table is not being removed, restore the hidden columns */
+                       if ( !bRemove )
+                       {
+                               for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                               {
+                                       if ( oSettings.aoColumns[i].bVisible === false )
+                                       {
+                                               this.fnSetColumnVis( i, true );
+                                       }
+                               }
+                       }
+                       
+                       /* Blitz all DT events */
+                       $(oSettings.nTableWrapper).find('*').andSelf().unbind('.DT');
+                       
+                       /* If there is an 'empty' indicator row, remove it */
+                       $('tbody>tr>td.'+oSettings.oClasses.sRowEmpty, oSettings.nTable).parent().remove();
+                       
+                       /* When scrolling we had to break the table up - restore it */
+                       if ( oSettings.nTable != oSettings.nTHead.parentNode )
+                       {
+                               $(oSettings.nTable).children('thead').remove();
+                               oSettings.nTable.appendChild( oSettings.nTHead );
+                       }
+                       
+                       if ( oSettings.nTFoot && oSettings.nTable != oSettings.nTFoot.parentNode )
+                       {
+                               $(oSettings.nTable).children('tfoot').remove();
+                               oSettings.nTable.appendChild( oSettings.nTFoot );
+                       }
+                       
+                       /* Remove the DataTables generated nodes, events and classes */
+                       oSettings.nTable.parentNode.removeChild( oSettings.nTable );
+                       $(oSettings.nTableWrapper).remove();
+                       
+                       oSettings.aaSorting = [];
+                       oSettings.aaSortingFixed = [];
+                       _fnSortingClasses( oSettings );
+                       
+                       $(_fnGetTrNodes( oSettings )).removeClass( oSettings.asStripeClasses.join(' ') );
+                       
+                       $('th, td', oSettings.nTHead).removeClass( [
+                               oSettings.oClasses.sSortable,
+                               oSettings.oClasses.sSortableAsc,
+                               oSettings.oClasses.sSortableDesc,
+                               oSettings.oClasses.sSortableNone ].join(' ')
+                       );
+                       if ( oSettings.bJUI )
+                       {
+                               $('th span.'+oSettings.oClasses.sSortIcon
+                                       + ', td span.'+oSettings.oClasses.sSortIcon, oSettings.nTHead).remove();
+               
+                               $('th, td', oSettings.nTHead).each( function () {
+                                       var jqWrapper = $('div.'+oSettings.oClasses.sSortJUIWrapper, this);
+                                       var kids = jqWrapper.contents();
+                                       $(this).append( kids );
+                                       jqWrapper.remove();
+                               } );
+                       }
+                       
+                       /* Add the TR elements back into the table in their original order */
+                       if ( !bRemove && oSettings.nTableReinsertBefore )
+                       {
+                               nOrig.insertBefore( oSettings.nTable, oSettings.nTableReinsertBefore );
+                       }
+                       else if ( !bRemove )
+                       {
+                               nOrig.appendChild( oSettings.nTable );
+                       }
+               
+                       for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
+                       {
+                               if ( oSettings.aoData[i].nTr !== null )
+                               {
+                                       nBody.appendChild( oSettings.aoData[i].nTr );
+                               }
+                       }
+                       
+                       /* Restore the width of the original table */
+                       if ( oSettings.oFeatures.bAutoWidth === true )
+                       {
+                         oSettings.nTable.style.width = _fnStringToCss(oSettings.sDestroyWidth);
+                       }
+                       
+                       /* If the were originally stripe classes - then we add them back here. Note
+                        * this is not fool proof (for example if not all rows had stripe classes - but
+                        * it's a good effort without getting carried away
+                        */
+                       iLen = oSettings.asDestroyStripes.length;
+                       if (iLen)
+                       {
+                               var anRows = $(nBody).children('tr');
+                               for ( i=0 ; i<iLen ; i++ )
+                               {
+                                       anRows.filter(':nth-child(' + iLen + 'n + ' + i + ')').addClass( oSettings.asDestroyStripes[i] );
+                               }
+                       }
+                       
+                       /* Remove the settings object from the settings array */
+                       for ( i=0, iLen=DataTable.settings.length ; i<iLen ; i++ )
+                       {
+                               if ( DataTable.settings[i] == oSettings )
+                               {
+                                       DataTable.settings.splice( i, 1 );
+                               }
+                       }
+                       
+                       /* End it all */
+                       oSettings = null;
+                       oInit = null;
+               };
+               
+               
+               /**
+                * Redraw the table
+                *  @param {bool} [bComplete=true] Re-filter and resort (if enabled) the table before the draw.
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable = $('#example').dataTable();
+                *      
+                *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)
+                *      oTable.fnDraw();
+                *    } );
+                */
+               this.fnDraw = function( bComplete )
+               {
+                       var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+                       if ( bComplete === false )
+                       {
+                               _fnCalculateEnd( oSettings );
+                               _fnDraw( oSettings );
+                       }
+                       else
+                       {
+                               _fnReDraw( oSettings );
+                       }
+               };
+               
+               
+               /**
+                * Filter the input based on data
+                *  @param {string} sInput String to filter the table on
+                *  @param {int|null} [iColumn] Column to limit filtering to
+                *  @param {bool} [bRegex=false] Treat as regular expression or not
+                *  @param {bool} [bSmart=true] Perform smart filtering or not
+                *  @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)
+                *  @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable = $('#example').dataTable();
+                *      
+                *      // Sometime later - filter...
+                *      oTable.fnFilter( 'test string' );
+                *    } );
+                */
+               this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )
+               {
+                       var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+                       
+                       if ( !oSettings.oFeatures.bFilter )
+                       {
+                               return;
+                       }
+                       
+                       if ( bRegex === undefined || bRegex === null )
+                       {
+                               bRegex = false;
+                       }
+                       
+                       if ( bSmart === undefined || bSmart === null )
+                       {
+                               bSmart = true;
+                       }
+                       
+                       if ( bShowGlobal === undefined || bShowGlobal === null )
+                       {
+                               bShowGlobal = true;
+                       }
+                       
+                       if ( bCaseInsensitive === undefined || bCaseInsensitive === null )
+                       {
+                               bCaseInsensitive = true;
+                       }
+                       
+                       if ( iColumn === undefined || iColumn === null )
+                       {
+                               /* Global filter */
+                               _fnFilterComplete( oSettings, {
+                                       "sSearch":sInput+"",
+                                       "bRegex": bRegex,
+                                       "bSmart": bSmart,
+                                       "bCaseInsensitive": bCaseInsensitive
+                               }, 1 );
+                               
+                               if ( bShowGlobal && oSettings.aanFeatures.f )
+                               {
+                                       var n = oSettings.aanFeatures.f;
+                                       for ( var i=0, iLen=n.length ; i<iLen ; i++ )
+                                       {
+                                               // IE9 throws an 'unknown error' if document.activeElement is used
+                                               // inside an iframe or frame...
+                                               try {
+                                                       if ( n[i]._DT_Input != document.activeElement )
+                                                       {
+                                                               $(n[i]._DT_Input).val( sInput );
+                                                       }
+                                               }
+                                               catch ( e ) {
+                                                       $(n[i]._DT_Input).val( sInput );
+                                               }
+                                       }
+                               }
+                       }
+                       else
+                       {
+                               /* Single column filter */
+                               $.extend( oSettings.aoPreSearchCols[ iColumn ], {
+                                       "sSearch": sInput+"",
+                                       "bRegex": bRegex,
+                                       "bSmart": bSmart,
+                                       "bCaseInsensitive": bCaseInsensitive
+                               } );
+                               _fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 );
+                       }
+               };
+               
+               
+               /**
+                * Get the data for the whole table, an individual row or an individual cell based on the 
+                * provided parameters.
+                *  @param {int|node} [mRow] A TR row node, TD/TH cell node or an integer. If given as
+                *    a TR node then the data source for the whole row will be returned. If given as a
+                *    TD/TH cell node then iCol will be automatically calculated and the data for the
+                *    cell returned. If given as an integer, then this is treated as the aoData internal
+                *    data index for the row (see fnGetPosition) and the data for that row used.
+                *  @param {int} [iCol] Optional column index that you want the data of.
+                *  @returns {array|object|string} If mRow is undefined, then the data for all rows is
+                *    returned. If mRow is defined, just data for that row, and is iCol is
+                *    defined, only data for the designated cell is returned.
+                *  @dtopt API
+                *
+                *  @example
+                *    // Row data
+                *    $(document).ready(function() {
+                *      oTable = $('#example').dataTable();
+                *
+                *      oTable.$('tr').click( function () {
+                *        var data = oTable.fnGetData( this );
+                *        // ... do something with the array / object of data for the row
+                *      } );
+                *    } );
+                *
+                *  @example
+                *    // Individual cell data
+                *    $(document).ready(function() {
+                *      oTable = $('#example').dataTable();
+                *
+                *      oTable.$('td').click( function () {
+                *        var sData = oTable.fnGetData( this );
+                *        alert( 'The cell clicked on had the value of '+sData );
+                *      } );
+                *    } );
+                */
+               this.fnGetData = function( mRow, iCol )
+               {
+                       var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+                       
+                       if ( mRow !== undefined )
+                       {
+                               var iRow = mRow;
+                               if ( typeof mRow === 'object' )
+                               {
+                                       var sNode = mRow.nodeName.toLowerCase();
+                                       if (sNode === "tr" )
+                                       {
+                                               iRow = _fnNodeToDataIndex(oSettings, mRow);
+                                       }
+                                       else if ( sNode === "td" )
+                                       {
+                                               iRow = _fnNodeToDataIndex(oSettings, mRow.parentNode);
+                                               iCol = _fnNodeToColumnIndex( oSettings, iRow, mRow );
+                                       }
+                               }
+               
+                               if ( iCol !== undefined )
+                               {
+                                       return _fnGetCellData( oSettings, iRow, iCol, '' );
+                               }
+                               return (oSettings.aoData[iRow]!==undefined) ?
+                                       oSettings.aoData[iRow]._aData : null;
+                       }
+                       return _fnGetDataMaster( oSettings );
+               };
+               
+               
+               /**
+                * Get an array of the TR nodes that are used in the table's body. Note that you will 
+                * typically want to use the '$' API method in preference to this as it is more 
+                * flexible.
+                *  @param {int} [iRow] Optional row index for the TR element you want
+                *  @returns {array|node} If iRow is undefined, returns an array of all TR elements
+                *    in the table's body, or iRow is defined, just the TR element requested.
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable = $('#example').dataTable();
+                *      
+                *      // Get the nodes from the table
+                *      var nNodes = oTable.fnGetNodes( );
+                *    } );
+                */
+               this.fnGetNodes = function( iRow )
+               {
+                       var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+                       
+                       if ( iRow !== undefined ) {
+                               return (oSettings.aoData[iRow]!==undefined) ?
+                                       oSettings.aoData[iRow].nTr : null;
+                       }
+                       return _fnGetTrNodes( oSettings );
+               };
+               
+               
+               /**
+                * Get the array indexes of a particular cell from it's DOM element
+                * and column index including hidden columns
+                *  @param {node} nNode this can either be a TR, TD or TH in the table's body
+                *  @returns {int} If nNode is given as a TR, then a single index is returned, or
+                *    if given as a cell, an array of [row index, column index (visible), 
+                *    column index (all)] is given.
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      $('#example tbody td').click( function () {
+                *        // Get the position of the current data from the node
+                *        var aPos = oTable.fnGetPosition( this );
+                *        
+                *        // Get the data array for this row
+                *        var aData = oTable.fnGetData( aPos[0] );
+                *        
+                *        // Update the data array and return the value
+                *        aData[ aPos[1] ] = 'clicked';
+                *        this.innerHTML = 'clicked';
+                *      } );
+                *      
+                *      // Init DataTables
+                *      oTable = $('#example').dataTable();
+                *    } );
+                */
+               this.fnGetPosition = function( nNode )
+               {
+                       var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+                       var sNodeName = nNode.nodeName.toUpperCase();
+                       
+                       if ( sNodeName == "TR" )
+                       {
+                               return _fnNodeToDataIndex(oSettings, nNode);
+                       }
+                       else if ( sNodeName == "TD" || sNodeName == "TH" )
+                       {
+                               var iDataIndex = _fnNodeToDataIndex( oSettings, nNode.parentNode );
+                               var iColumnIndex = _fnNodeToColumnIndex( oSettings, iDataIndex, nNode );
+                               return [ iDataIndex, _fnColumnIndexToVisible(oSettings, iColumnIndex ), iColumnIndex ];
+                       }
+                       return null;
+               };
+               
+               
+               /**
+                * Check to see if a row is 'open' or not.
+                *  @param {node} nTr the table row to check
+                *  @returns {boolean} true if the row is currently open, false otherwise
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable;
+                *      
+                *      // 'open' an information row when a row is clicked on
+                *      $('#example tbody tr').click( function () {
+                *        if ( oTable.fnIsOpen(this) ) {
+                *          oTable.fnClose( this );
+                *        } else {
+                *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
+                *        }
+                *      } );
+                *      
+                *      oTable = $('#example').dataTable();
+                *    } );
+                */
+               this.fnIsOpen = function( nTr )
+               {
+                       var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+                       var aoOpenRows = oSettings.aoOpenRows;
+                       
+                       for ( var i=0 ; i<oSettings.aoOpenRows.length ; i++ )
+                       {
+                               if ( oSettings.aoOpenRows[i].nParent == nTr )
+                               {
+                                       return true;
+                               }
+                       }
+                       return false;
+               };
+               
+               
+               /**
+                * This function will place a new row directly after a row which is currently 
+                * on display on the page, with the HTML contents that is passed into the 
+                * function. This can be used, for example, to ask for confirmation that a 
+                * particular record should be deleted.
+                *  @param {node} nTr The table row to 'open'
+                *  @param {string|node|jQuery} mHtml The HTML to put into the row
+                *  @param {string} sClass Class to give the new TD cell
+                *  @returns {node} The row opened. Note that if the table row passed in as the
+                *    first parameter, is not found in the table, this method will silently
+                *    return.
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable;
+                *      
+                *      // 'open' an information row when a row is clicked on
+                *      $('#example tbody tr').click( function () {
+                *        if ( oTable.fnIsOpen(this) ) {
+                *          oTable.fnClose( this );
+                *        } else {
+                *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
+                *        }
+                *      } );
+                *      
+                *      oTable = $('#example').dataTable();
+                *    } );
+                */
+               this.fnOpen = function( nTr, mHtml, sClass )
+               {
+                       /* Find settings from table node */
+                       var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+               
+                       /* Check that the row given is in the table */
+                       var nTableRows = _fnGetTrNodes( oSettings );
+                       if ( $.inArray(nTr, nTableRows) === -1 )
+                       {
+                               return;
+                       }
+                       
+                       /* the old open one if there is one */
+                       this.fnClose( nTr );
+                       
+                       var nNewRow = document.createElement("tr");
+                       var nNewCell = document.createElement("td");
+                       nNewRow.appendChild( nNewCell );
+                       nNewCell.className = sClass;
+                       nNewCell.colSpan = _fnVisbleColumns( oSettings );
+               
+                       if (typeof mHtml === "string")
+                       {
+                               nNewCell.innerHTML = mHtml;
+                       }
+                       else
+                       {
+                               $(nNewCell).html( mHtml );
+                       }
+               
+                       /* If the nTr isn't on the page at the moment - then we don't insert at the moment */
+                       var nTrs = $('tr', oSettings.nTBody);
+                       if ( $.inArray(nTr, nTrs) != -1  )
+                       {
+                               $(nNewRow).insertAfter(nTr);
+                       }
+                       
+                       oSettings.aoOpenRows.push( {
+                               "nTr": nNewRow,
+                               "nParent": nTr
+                       } );
+                       
+                       return nNewRow;
+               };
+               
+               
+               /**
+                * Change the pagination - provides the internal logic for pagination in a simple API 
+                * function. With this function you can have a DataTables table go to the next, 
+                * previous, first or last pages.
+                *  @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
+                *    or page number to jump to (integer), note that page 0 is the first page.
+                *  @param {bool} [bRedraw=true] Redraw the table or not
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable = $('#example').dataTable();
+                *      oTable.fnPageChange( 'next' );
+                *    } );
+                */
+               this.fnPageChange = function ( mAction, bRedraw )
+               {
+                       var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+                       _fnPageChange( oSettings, mAction );
+                       _fnCalculateEnd( oSettings );
+                       
+                       if ( bRedraw === undefined || bRedraw )
+                       {
+                               _fnDraw( oSettings );
+                       }
+               };
+               
+               
+               /**
+                * Show a particular column
+                *  @param {int} iCol The column whose display should be changed
+                *  @param {bool} bShow Show (true) or hide (false) the column
+                *  @param {bool} [bRedraw=true] Redraw the table or not
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable = $('#example').dataTable();
+                *      
+                *      // Hide the second column after initialisation
+                *      oTable.fnSetColumnVis( 1, false );
+                *    } );
+                */
+               this.fnSetColumnVis = function ( iCol, bShow, bRedraw )
+               {
+                       var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+                       var i, iLen;
+                       var aoColumns = oSettings.aoColumns;
+                       var aoData = oSettings.aoData;
+                       var nTd, bAppend, iBefore;
+                       
+                       /* No point in doing anything if we are requesting what is already true */
+                       if ( aoColumns[iCol].bVisible == bShow )
+                       {
+                               return;
+                       }
+                       
+                       /* Show the column */
+                       if ( bShow )
+                       {
+                               var iInsert = 0;
+                               for ( i=0 ; i<iCol ; i++ )
+                               {
+                                       if ( aoColumns[i].bVisible )
+                                       {
+                                               iInsert++;
+                                       }
+                               }
+                               
+                               /* Need to decide if we should use appendChild or insertBefore */
+                               bAppend = (iInsert >= _fnVisbleColumns( oSettings ));
+               
+                               /* Which coloumn should we be inserting before? */
+                               if ( !bAppend )
+                               {
+                                       for ( i=iCol ; i<aoColumns.length ; i++ )
+                                       {
+                                               if ( aoColumns[i].bVisible )
+                                               {
+                                                       iBefore = i;
+                                                       break;
+                                               }
+                                       }
+                               }
+               
+                               for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
+                               {
+                                       if ( aoData[i].nTr !== null )
+                                       {
+                                               if ( bAppend )
+                                               {
+                                                       aoData[i].nTr.appendChild( 
+                                                               aoData[i]._anHidden[iCol]
+                                                       );
+                                               }
+                                               else
+                                               {
+                                                       aoData[i].nTr.insertBefore(
+                                                               aoData[i]._anHidden[iCol], 
+                                                               _fnGetTdNodes( oSettings, i )[iBefore] );
+                                               }
+                                       }
+                               }
+                       }
+                       else
+                       {
+                               /* Remove a column from display */
+                               for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
+                               {
+                                       if ( aoData[i].nTr !== null )
+                                       {
+                                               nTd = _fnGetTdNodes( oSettings, i )[iCol];
+                                               aoData[i]._anHidden[iCol] = nTd;
+                                               nTd.parentNode.removeChild( nTd );
+                                       }
+                               }
+                       }
+               
+                       /* Clear to set the visible flag */
+                       aoColumns[iCol].bVisible = bShow;
+               
+                       /* Redraw the header and footer based on the new column visibility */
+                       _fnDrawHead( oSettings, oSettings.aoHeader );
+                       if ( oSettings.nTFoot )
+                       {
+                               _fnDrawHead( oSettings, oSettings.aoFooter );
+                       }
+                       
+                       /* If there are any 'open' rows, then we need to alter the colspan for this col change */
+                       for ( i=0, iLen=oSettings.aoOpenRows.length ; i<iLen ; i++ )
+                       {
+                               oSettings.aoOpenRows[i].nTr.colSpan = _fnVisbleColumns( oSettings );
+                       }
+                       
+                       /* Do a redraw incase anything depending on the table columns needs it 
+                        * (built-in: scrolling) 
+                        */
+                       if ( bRedraw === undefined || bRedraw )
+                       {
+                               _fnAdjustColumnSizing( oSettings );
+                               _fnDraw( oSettings );
+                       }
+                       
+                       _fnSaveState( oSettings );
+               };
+               
+               
+               /**
+                * Get the settings for a particular table for external manipulation
+                *  @returns {object} DataTables settings object. See 
+                *    {@link DataTable.models.oSettings}
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable = $('#example').dataTable();
+                *      var oSettings = oTable.fnSettings();
+                *      
+                *      // Show an example parameter from the settings
+                *      alert( oSettings._iDisplayStart );
+                *    } );
+                */
+               this.fnSettings = function()
+               {
+                       return _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+               };
+               
+               
+               /**
+                * Sort the table by a particular column
+                *  @param {int} iCol the data index to sort on. Note that this will not match the 
+                *    'display index' if you have hidden data entries
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable = $('#example').dataTable();
+                *      
+                *      // Sort immediately with columns 0 and 1
+                *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );
+                *    } );
+                */
+               this.fnSort = function( aaSort )
+               {
+                       var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+                       oSettings.aaSorting = aaSort;
+                       _fnSort( oSettings );
+               };
+               
+               
+               /**
+                * Attach a sort listener to an element for a given column
+                *  @param {node} nNode the element to attach the sort listener to
+                *  @param {int} iColumn the column that a click on this node will sort on
+                *  @param {function} [fnCallback] callback function when sort is run
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable = $('#example').dataTable();
+                *      
+                *      // Sort on column 1, when 'sorter' is clicked on
+                *      oTable.fnSortListener( document.getElementById('sorter'), 1 );
+                *    } );
+                */
+               this.fnSortListener = function( nNode, iColumn, fnCallback )
+               {
+                       _fnSortAttachListener( _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ), nNode, iColumn,
+                               fnCallback );
+               };
+               
+               
+               /**
+                * Update a table cell or row - this method will accept either a single value to
+                * update the cell with, an array of values with one element for each column or
+                * an object in the same format as the original data source. The function is
+                * self-referencing in order to make the multi column updates easier.
+                *  @param {object|array|string} mData Data to update the cell/row with
+                *  @param {node|int} mRow TR element you want to update or the aoData index
+                *  @param {int} [iColumn] The column to update (not used of mData is an array or object)
+                *  @param {bool} [bRedraw=true] Redraw the table or not
+                *  @param {bool} [bAction=true] Perform pre-draw actions or not
+                *  @returns {int} 0 on success, 1 on error
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable = $('#example').dataTable();
+                *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell
+                *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], 1, 0 ); // Row
+                *    } );
+                */
+               this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )
+               {
+                       var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+                       var i, iLen, sDisplay;
+                       var iRow = (typeof mRow === 'object') ? 
+                               _fnNodeToDataIndex(oSettings, mRow) : mRow;
+                       
+                       if ( $.isArray(mData) && iColumn === undefined )
+                       {
+                               /* Array update - update the whole row */
+                               oSettings.aoData[iRow]._aData = mData.slice();
+                               
+                               /* Flag to the function that we are recursing */
+                               for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+                               {
+                                       this.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false );
+                               }
+                       }
+                       else if ( $.isPlainObject(mData) && iColumn === undefined )
+                       {
+                               /* Object update - update the whole row - assume the developer gets the object right */
+                               oSettings.aoData[iRow]._aData = $.extend( true, {}, mData );
+               
+                               for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+                               {
+                                       this.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false );
+                               }
+                       }
+                       else
+                       {
+                               /* Individual cell update */
+                               _fnSetCellData( oSettings, iRow, iColumn, mData );
+                               sDisplay = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
+                               
+                               var oCol = oSettings.aoColumns[iColumn];
+                               if ( oCol.fnRender !== null )
+                               {
+                                       sDisplay = _fnRender( oSettings, iRow, iColumn );
+                                       if ( oCol.bUseRendered )
+                                       {
+                                               _fnSetCellData( oSettings, iRow, iColumn, sDisplay );
+                                       }
+                               }
+                               
+                               if ( oSettings.aoData[iRow].nTr !== null )
+                               {
+                                       /* Do the actual HTML update */
+                                       _fnGetTdNodes( oSettings, iRow )[iColumn].innerHTML = sDisplay;
+                               }
+                       }
+                       
+                       /* Modify the search index for this row (strictly this is likely not needed, since fnReDraw
+                        * will rebuild the search array - however, the redraw might be disabled by the user)
+                        */
+                       var iDisplayIndex = $.inArray( iRow, oSettings.aiDisplay );
+                       oSettings.asDataSearch[iDisplayIndex] = _fnBuildSearchRow(
+                               oSettings, 
+                               _fnGetRowData( oSettings, iRow, 'filter', _fnGetColumns( oSettings, 'bSearchable' ) )
+                       );
+                       
+                       /* Perform pre-draw actions */
+                       if ( bAction === undefined || bAction )
+                       {
+                               _fnAdjustColumnSizing( oSettings );
+                       }
+                       
+                       /* Redraw the table */
+                       if ( bRedraw === undefined || bRedraw )
+                       {
+                               _fnReDraw( oSettings );
+                       }
+                       return 0;
+               };
+               
+               
+               /**
+                * Provide a common method for plug-ins to check the version of DataTables being used, in order
+                * to ensure compatibility.
+                *  @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
+                *    formats "X" and "X.Y" are also acceptable.
+                *  @returns {boolean} true if this version of DataTables is greater or equal to the required
+                *    version, or false if this version of DataTales is not suitable
+                *  @method
+                *  @dtopt API
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable = $('#example').dataTable();
+                *      alert( oTable.fnVersionCheck( '1.9.0' ) );
+                *    } );
+                */
+               this.fnVersionCheck = DataTable.ext.fnVersionCheck;
+               
+               
+               /*
+                * This is really a good bit rubbish this method of exposing the internal methods
+                * publicly... - To be fixed in 2.0 using methods on the prototype
+                */
+               
+               
+               /**
+                * Create a wrapper function for exporting an internal functions to an external API.
+                *  @param {string} sFunc API function name
+                *  @returns {function} wrapped function
+                *  @memberof DataTable#oApi
+                */
+               function _fnExternApiFunc (sFunc)
+               {
+                       return function() {
+                               var aArgs = [_fnSettingsFromNode(this[DataTable.ext.iApiIndex])].concat( 
+                                       Array.prototype.slice.call(arguments) );
+                               return DataTable.ext.oApi[sFunc].apply( this, aArgs );
+                       };
+               }
+               
+               
+               /**
+                * Reference to internal functions for use by plug-in developers. Note that these
+                * methods are references to internal functions and are considered to be private.
+                * If you use these methods, be aware that they are liable to change between versions
+                * (check the upgrade notes).
+                *  @namespace
+                */
+               this.oApi = {
+                       "_fnExternApiFunc": _fnExternApiFunc,
+                       "_fnInitialise": _fnInitialise,
+                       "_fnInitComplete": _fnInitComplete,
+                       "_fnLanguageCompat": _fnLanguageCompat,
+                       "_fnAddColumn": _fnAddColumn,
+                       "_fnColumnOptions": _fnColumnOptions,
+                       "_fnAddData": _fnAddData,
+                       "_fnCreateTr": _fnCreateTr,
+                       "_fnGatherData": _fnGatherData,
+                       "_fnBuildHead": _fnBuildHead,
+                       "_fnDrawHead": _fnDrawHead,
+                       "_fnDraw": _fnDraw,
+                       "_fnReDraw": _fnReDraw,
+                       "_fnAjaxUpdate": _fnAjaxUpdate,
+                       "_fnAjaxParameters": _fnAjaxParameters,
+                       "_fnAjaxUpdateDraw": _fnAjaxUpdateDraw,
+                       "_fnServerParams": _fnServerParams,
+                       "_fnAddOptionsHtml": _fnAddOptionsHtml,
+                       "_fnFeatureHtmlTable": _fnFeatureHtmlTable,
+                       "_fnScrollDraw": _fnScrollDraw,
+                       "_fnAdjustColumnSizing": _fnAdjustColumnSizing,
+                       "_fnFeatureHtmlFilter": _fnFeatureHtmlFilter,
+                       "_fnFilterComplete": _fnFilterComplete,
+                       "_fnFilterCustom": _fnFilterCustom,
+                       "_fnFilterColumn": _fnFilterColumn,
+                       "_fnFilter": _fnFilter,
+                       "_fnBuildSearchArray": _fnBuildSearchArray,
+                       "_fnBuildSearchRow": _fnBuildSearchRow,
+                       "_fnFilterCreateSearch": _fnFilterCreateSearch,
+                       "_fnDataToSearch": _fnDataToSearch,
+                       "_fnSort": _fnSort,
+                       "_fnSortAttachListener": _fnSortAttachListener,
+                       "_fnSortingClasses": _fnSortingClasses,
+                       "_fnFeatureHtmlPaginate": _fnFeatureHtmlPaginate,
+                       "_fnPageChange": _fnPageChange,
+                       "_fnFeatureHtmlInfo": _fnFeatureHtmlInfo,
+                       "_fnUpdateInfo": _fnUpdateInfo,
+                       "_fnFeatureHtmlLength": _fnFeatureHtmlLength,
+                       "_fnFeatureHtmlProcessing": _fnFeatureHtmlProcessing,
+                       "_fnProcessingDisplay": _fnProcessingDisplay,
+                       "_fnVisibleToColumnIndex": _fnVisibleToColumnIndex,
+                       "_fnColumnIndexToVisible": _fnColumnIndexToVisible,
+                       "_fnNodeToDataIndex": _fnNodeToDataIndex,
+                       "_fnVisbleColumns": _fnVisbleColumns,
+                       "_fnCalculateEnd": _fnCalculateEnd,
+                       "_fnConvertToWidth": _fnConvertToWidth,
+                       "_fnCalculateColumnWidths": _fnCalculateColumnWidths,
+                       "_fnScrollingWidthAdjust": _fnScrollingWidthAdjust,
+                       "_fnGetWidestNode": _fnGetWidestNode,
+                       "_fnGetMaxLenString": _fnGetMaxLenString,
+                       "_fnStringToCss": _fnStringToCss,
+                       "_fnDetectType": _fnDetectType,
+                       "_fnSettingsFromNode": _fnSettingsFromNode,
+                       "_fnGetDataMaster": _fnGetDataMaster,
+                       "_fnGetTrNodes": _fnGetTrNodes,
+                       "_fnGetTdNodes": _fnGetTdNodes,
+                       "_fnEscapeRegex": _fnEscapeRegex,
+                       "_fnDeleteIndex": _fnDeleteIndex,
+                       "_fnReOrderIndex": _fnReOrderIndex,
+                       "_fnColumnOrdering": _fnColumnOrdering,
+                       "_fnLog": _fnLog,
+                       "_fnClearTable": _fnClearTable,
+                       "_fnSaveState": _fnSaveState,
+                       "_fnLoadState": _fnLoadState,
+                       "_fnCreateCookie": _fnCreateCookie,
+                       "_fnReadCookie": _fnReadCookie,
+                       "_fnDetectHeader": _fnDetectHeader,
+                       "_fnGetUniqueThs": _fnGetUniqueThs,
+                       "_fnScrollBarWidth": _fnScrollBarWidth,
+                       "_fnApplyToChildren": _fnApplyToChildren,
+                       "_fnMap": _fnMap,
+                       "_fnGetRowData": _fnGetRowData,
+                       "_fnGetCellData": _fnGetCellData,
+                       "_fnSetCellData": _fnSetCellData,
+                       "_fnGetObjectDataFn": _fnGetObjectDataFn,
+                       "_fnSetObjectDataFn": _fnSetObjectDataFn,
+                       "_fnApplyColumnDefs": _fnApplyColumnDefs,
+                       "_fnBindAction": _fnBindAction,
+                       "_fnExtend": _fnExtend,
+                       "_fnCallbackReg": _fnCallbackReg,
+                       "_fnCallbackFire": _fnCallbackFire,
+                       "_fnJsonString": _fnJsonString,
+                       "_fnRender": _fnRender,
+                       "_fnNodeToColumnIndex": _fnNodeToColumnIndex,
+                       "_fnInfoMacros": _fnInfoMacros,
+                       "_fnBrowserDetect": _fnBrowserDetect,
+                       "_fnGetColumns": _fnGetColumns
+               };
+               
+               $.extend( DataTable.ext.oApi, this.oApi );
+               
+               for ( var sFunc in DataTable.ext.oApi )
+               {
+                       if ( sFunc )
+                       {
+                               this[sFunc] = _fnExternApiFunc(sFunc);
+                       }
+               }
+               
+               
+               var _that = this;
+               this.each(function() {
+                       var i=0, iLen, j, jLen, k, kLen;
+                       var sId = this.getAttribute( 'id' );
+                       var bInitHandedOff = false;
+                       var bUsePassedData = false;
+                       
+                       
+                       /* Sanity check */
+                       if ( this.nodeName.toLowerCase() != 'table' )
+                       {
+                               _fnLog( null, 0, "Attempted to initialise DataTables on a node which is not a "+
+                                       "table: "+this.nodeName );
+                               return;
+                       }
+                       
+                       /* Check to see if we are re-initialising a table */
+                       for ( i=0, iLen=DataTable.settings.length ; i<iLen ; i++ )
+                       {
+                               /* Base check on table node */
+                               if ( DataTable.settings[i].nTable == this )
+                               {
+                                       if ( oInit === undefined || oInit.bRetrieve )
+                                       {
+                                               return DataTable.settings[i].oInstance;
+                                       }
+                                       else if ( oInit.bDestroy )
+                                       {
+                                               DataTable.settings[i].oInstance.fnDestroy();
+                                               break;
+                                       }
+                                       else
+                                       {
+                                               _fnLog( DataTable.settings[i], 0, "Cannot reinitialise DataTable.\n\n"+
+                                                       "To retrieve the DataTables object for this table, pass no arguments or see "+
+                                                       "the docs for bRetrieve and bDestroy" );
+                                               return;
+                                       }
+                               }
+                               
+                               /* If the element we are initialising has the same ID as a table which was previously
+                                * initialised, but the table nodes don't match (from before) then we destroy the old
+                                * instance by simply deleting it. This is under the assumption that the table has been
+                                * destroyed by other methods. Anyone using non-id selectors will need to do this manually
+                                */
+                               if ( DataTable.settings[i].sTableId == this.id )
+                               {
+                                       DataTable.settings.splice( i, 1 );
+                                       break;
+                               }
+                       }
+                       
+                       /* Ensure the table has an ID - required for accessibility */
+                       if ( sId === null || sId === "" )
+                       {
+                               sId = "DataTables_Table_"+(DataTable.ext._oExternConfig.iNextUnique++);
+                               this.id = sId;
+                       }
+                       
+                       /* Create the settings object for this table and set some of the default parameters */
+                       var oSettings = $.extend( true, {}, DataTable.models.oSettings, {
+                               "nTable":        this,
+                               "oApi":          _that.oApi,
+                               "oInit":         oInit,
+                               "sDestroyWidth": $(this).width(),
+                               "sInstance":     sId,
+                               "sTableId":      sId
+                       } );
+                       DataTable.settings.push( oSettings );
+                       
+                       // Need to add the instance after the instance after the settings object has been added
+                       // to the settings array, so we can self reference the table instance if more than one
+                       oSettings.oInstance = (_that.length===1) ? _that : $(this).dataTable();
+                       
+                       /* Setting up the initialisation object */
+                       if ( !oInit )
+                       {
+                               oInit = {};
+                       }
+                       
+                       // Backwards compatibility, before we apply all the defaults
+                       if ( oInit.oLanguage )
+                       {
+                               _fnLanguageCompat( oInit.oLanguage );
+                       }
+                       
+                       oInit = _fnExtend( $.extend(true, {}, DataTable.defaults), oInit );
+                       
+                       // Map the initialisation options onto the settings object
+                       _fnMap( oSettings.oFeatures, oInit, "bPaginate" );
+                       _fnMap( oSettings.oFeatures, oInit, "bLengthChange" );
+                       _fnMap( oSettings.oFeatures, oInit, "bFilter" );
+                       _fnMap( oSettings.oFeatures, oInit, "bSort" );
+                       _fnMap( oSettings.oFeatures, oInit, "bInfo" );
+                       _fnMap( oSettings.oFeatures, oInit, "bProcessing" );
+                       _fnMap( oSettings.oFeatures, oInit, "bAutoWidth" );
+                       _fnMap( oSettings.oFeatures, oInit, "bSortClasses" );
+                       _fnMap( oSettings.oFeatures, oInit, "bServerSide" );
+                       _fnMap( oSettings.oFeatures, oInit, "bDeferRender" );
+                       _fnMap( oSettings.oScroll, oInit, "sScrollX", "sX" );
+                       _fnMap( oSettings.oScroll, oInit, "sScrollXInner", "sXInner" );
+                       _fnMap( oSettings.oScroll, oInit, "sScrollY", "sY" );
+                       _fnMap( oSettings.oScroll, oInit, "bScrollCollapse", "bCollapse" );
+                       _fnMap( oSettings.oScroll, oInit, "bScrollInfinite", "bInfinite" );
+                       _fnMap( oSettings.oScroll, oInit, "iScrollLoadGap", "iLoadGap" );
+                       _fnMap( oSettings.oScroll, oInit, "bScrollAutoCss", "bAutoCss" );
+                       _fnMap( oSettings, oInit, "asStripeClasses" );
+                       _fnMap( oSettings, oInit, "asStripClasses", "asStripeClasses" ); // legacy
+                       _fnMap( oSettings, oInit, "fnServerData" );
+                       _fnMap( oSettings, oInit, "fnFormatNumber" );
+                       _fnMap( oSettings, oInit, "sServerMethod" );
+                       _fnMap( oSettings, oInit, "aaSorting" );
+                       _fnMap( oSettings, oInit, "aaSortingFixed" );
+                       _fnMap( oSettings, oInit, "aLengthMenu" );
+                       _fnMap( oSettings, oInit, "sPaginationType" );
+                       _fnMap( oSettings, oInit, "sAjaxSource" );
+                       _fnMap( oSettings, oInit, "sAjaxDataProp" );
+                       _fnMap( oSettings, oInit, "iCookieDuration" );
+                       _fnMap( oSettings, oInit, "sCookiePrefix" );
+                       _fnMap( oSettings, oInit, "sDom" );
+                       _fnMap( oSettings, oInit, "bSortCellsTop" );
+                       _fnMap( oSettings, oInit, "iTabIndex" );
+                       _fnMap( oSettings, oInit, "oSearch", "oPreviousSearch" );
+                       _fnMap( oSettings, oInit, "aoSearchCols", "aoPreSearchCols" );
+                       _fnMap( oSettings, oInit, "iDisplayLength", "_iDisplayLength" );
+                       _fnMap( oSettings, oInit, "bJQueryUI", "bJUI" );
+                       _fnMap( oSettings, oInit, "fnCookieCallback" );
+                       _fnMap( oSettings, oInit, "fnStateLoad" );
+                       _fnMap( oSettings, oInit, "fnStateSave" );
+                       _fnMap( oSettings.oLanguage, oInit, "fnInfoCallback" );
+                       
+                       /* Callback functions which are array driven */
+                       _fnCallbackReg( oSettings, 'aoDrawCallback',       oInit.fnDrawCallback,      'user' );
+                       _fnCallbackReg( oSettings, 'aoServerParams',       oInit.fnServerParams,      'user' );
+                       _fnCallbackReg( oSettings, 'aoStateSaveParams',    oInit.fnStateSaveParams,   'user' );
+                       _fnCallbackReg( oSettings, 'aoStateLoadParams',    oInit.fnStateLoadParams,   'user' );
+                       _fnCallbackReg( oSettings, 'aoStateLoaded',        oInit.fnStateLoaded,       'user' );
+                       _fnCallbackReg( oSettings, 'aoRowCallback',        oInit.fnRowCallback,       'user' );
+                       _fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow,        'user' );
+                       _fnCallbackReg( oSettings, 'aoHeaderCallback',     oInit.fnHeaderCallback,    'user' );
+                       _fnCallbackReg( oSettings, 'aoFooterCallback',     oInit.fnFooterCallback,    'user' );
+                       _fnCallbackReg( oSettings, 'aoInitComplete',       oInit.fnInitComplete,      'user' );
+                       _fnCallbackReg( oSettings, 'aoPreDrawCallback',    oInit.fnPreDrawCallback,   'user' );
+                       
+                       if ( oSettings.oFeatures.bServerSide && oSettings.oFeatures.bSort &&
+                                  oSettings.oFeatures.bSortClasses )
+                       {
+                               /* Enable sort classes for server-side processing. Safe to do it here, since server-side
+                                * processing must be enabled by the developer
+                                */
+                               _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSortingClasses, 'server_side_sort_classes' );
+                       }
+                       else if ( oSettings.oFeatures.bDeferRender )
+                       {
+                               _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSortingClasses, 'defer_sort_classes' );
+                       }
+                       
+                       if ( oInit.bJQueryUI )
+                       {
+                               /* Use the JUI classes object for display. You could clone the oStdClasses object if 
+                                * you want to have multiple tables with multiple independent classes 
+                                */
+                               $.extend( oSettings.oClasses, DataTable.ext.oJUIClasses );
+                               
+                               if ( oInit.sDom === DataTable.defaults.sDom && DataTable.defaults.sDom === "lfrtip" )
+                               {
+                                       /* Set the DOM to use a layout suitable for jQuery UI's theming */
+                                       oSettings.sDom = '<"H"lfr>t<"F"ip>';
+                               }
+                       }
+                       else
+                       {
+                               $.extend( oSettings.oClasses, DataTable.ext.oStdClasses );
+                       }
+                       $(this).addClass( oSettings.oClasses.sTable );
+                       
+                       /* Calculate the scroll bar width and cache it for use later on */
+                       if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" )
+                       {
+                               oSettings.oScroll.iBarWidth = _fnScrollBarWidth();
+                       }
+                       
+                       if ( oSettings.iInitDisplayStart === undefined )
+                       {
+                               /* Display start point, taking into account the save saving */
+                               oSettings.iInitDisplayStart = oInit.iDisplayStart;
+                               oSettings._iDisplayStart = oInit.iDisplayStart;
+                       }
+                       
+                       /* Must be done after everything which can be overridden by a cookie! */
+                       if ( oInit.bStateSave )
+                       {
+                               oSettings.oFeatures.bStateSave = true;
+                               _fnLoadState( oSettings, oInit );
+                               _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );
+                       }
+                       
+                       if ( oInit.iDeferLoading !== null )
+                       {
+                               oSettings.bDeferLoading = true;
+                               var tmp = $.isArray( oInit.iDeferLoading );
+                               oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;
+                               oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;
+                       }
+                       
+                       if ( oInit.aaData !== null )
+                       {
+                               bUsePassedData = true;
+                       }
+                       
+                       /* Language definitions */
+                       if ( oInit.oLanguage.sUrl !== "" )
+                       {
+                               /* Get the language definitions from a file - because this Ajax call makes the language
+                                * get async to the remainder of this function we use bInitHandedOff to indicate that 
+                                * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor
+                                */
+                               oSettings.oLanguage.sUrl = oInit.oLanguage.sUrl;
+                               $.getJSON( oSettings.oLanguage.sUrl, null, function( json ) {
+                                       _fnLanguageCompat( json );
+                                       $.extend( true, oSettings.oLanguage, oInit.oLanguage, json );
+                                       _fnInitialise( oSettings );
+                               } );
+                               bInitHandedOff = true;
+                       }
+                       else
+                       {
+                               $.extend( true, oSettings.oLanguage, oInit.oLanguage );
+                       }
+                       
+                       
+                       /*
+                        * Stripes
+                        */
+                       if ( oInit.asStripeClasses === null )
+                       {
+                               oSettings.asStripeClasses =[
+                                       oSettings.oClasses.sStripeOdd,
+                                       oSettings.oClasses.sStripeEven
+                               ];
+                       }
+                       
+                       /* Remove row stripe classes if they are already on the table row */
+                       iLen=oSettings.asStripeClasses.length;
+                       oSettings.asDestroyStripes = [];
+                       if (iLen)
+                       {
+                               var bStripeRemove = false;
+                               var anRows = $(this).children('tbody').children('tr:lt(' + iLen + ')');
+                               for ( i=0 ; i<iLen ; i++ )
+                               {
+                                       if ( anRows.hasClass( oSettings.asStripeClasses[i] ) )
+                                       {
+                                               bStripeRemove = true;
+                                               
+                                               /* Store the classes which we are about to remove so they can be re-added on destroy */
+                                               oSettings.asDestroyStripes.push( oSettings.asStripeClasses[i] );
+                                       }
+                               }
+                               
+                               if ( bStripeRemove )
+                               {
+                                       anRows.removeClass( oSettings.asStripeClasses.join(' ') );
+                               }
+                       }
+                       
+                       /*
+                        * Columns
+                        * See if we should load columns automatically or use defined ones
+                        */
+                       var anThs = [];
+                       var aoColumnsInit;
+                       var nThead = this.getElementsByTagName('thead');
+                       if ( nThead.length !== 0 )
+                       {
+                               _fnDetectHeader( oSettings.aoHeader, nThead[0] );
+                               anThs = _fnGetUniqueThs( oSettings );
+                       }
+                       
+                       /* If not given a column array, generate one with nulls */
+                       if ( oInit.aoColumns === null )
+                       {
+                               aoColumnsInit = [];
+                               for ( i=0, iLen=anThs.length ; i<iLen ; i++ )
+                               {
+                                       aoColumnsInit.push( null );
+                               }
+                       }
+                       else
+                       {
+                               aoColumnsInit = oInit.aoColumns;
+                       }
+                       
+                       /* Add the columns */
+                       for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )
+                       {
+                               /* Short cut - use the loop to check if we have column visibility state to restore */
+                               if ( oInit.saved_aoColumns !== undefined && oInit.saved_aoColumns.length == iLen )
+                               {
+                                       if ( aoColumnsInit[i] === null )
+                                       {
+                                               aoColumnsInit[i] = {};
+                                       }
+                                       aoColumnsInit[i].bVisible = oInit.saved_aoColumns[i].bVisible;
+                               }
+                               
+                               _fnAddColumn( oSettings, anThs ? anThs[i] : null );
+                       }
+                       
+                       /* Apply the column definitions */
+                       _fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {
+                               _fnColumnOptions( oSettings, iCol, oDef );
+                       } );
+                       
+                       
+                       /*
+                        * Sorting
+                        * Check the aaSorting array
+                        */
+                       for ( i=0, iLen=oSettings.aaSorting.length ; i<iLen ; i++ )
+                       {
+                               if ( oSettings.aaSorting[i][0] >= oSettings.aoColumns.length )
+                               {
+                                       oSettings.aaSorting[i][0] = 0;
+                               }
+                               var oColumn = oSettings.aoColumns[ oSettings.aaSorting[i][0] ];
+                               
+                               /* Add a default sorting index */
+                               if ( oSettings.aaSorting[i][2] === undefined )
+                               {
+                                       oSettings.aaSorting[i][2] = 0;
+                               }
+                               
+                               /* If aaSorting is not defined, then we use the first indicator in asSorting */
+                               if ( oInit.aaSorting === undefined && oSettings.saved_aaSorting === undefined )
+                               {
+                                       oSettings.aaSorting[i][1] = oColumn.asSorting[0];
+                               }
+                               
+                               /* Set the current sorting index based on aoColumns.asSorting */
+                               for ( j=0, jLen=oColumn.asSorting.length ; j<jLen ; j++ )
+                               {
+                                       if ( oSettings.aaSorting[i][1] == oColumn.asSorting[j] )
+                                       {
+                                               oSettings.aaSorting[i][2] = j;
+                                               break;
+                                       }
+                               }
+                       }
+                               
+                       /* Do a first pass on the sorting classes (allows any size changes to be taken into
+                        * account, and also will apply sorting disabled classes if disabled
+                        */
+                       _fnSortingClasses( oSettings );
+                       
+                       
+                       /*
+                        * Final init
+                        * Cache the header, body and footer as required, creating them if needed
+                        */
+                       
+                       /* Browser support detection */
+                       _fnBrowserDetect( oSettings );
+                       
+                       // Work around for Webkit bug 83867 - store the caption-side before removing from doc
+                       var captions = $(this).children('caption').each( function () {
+                               this._captionSide = $(this).css('caption-side');
+                       } );
+                       
+                       var thead = $(this).children('thead');
+                       if ( thead.length === 0 )
+                       {
+                               thead = [ document.createElement( 'thead' ) ];
+                               this.appendChild( thead[0] );
+                       }
+                       oSettings.nTHead = thead[0];
+                       
+                       var tbody = $(this).children('tbody');
+                       if ( tbody.length === 0 )
+                       {
+                               tbody = [ document.createElement( 'tbody' ) ];
+                               this.appendChild( tbody[0] );
+                       }
+                       oSettings.nTBody = tbody[0];
+                       oSettings.nTBody.setAttribute( "role", "alert" );
+                       oSettings.nTBody.setAttribute( "aria-live", "polite" );
+                       oSettings.nTBody.setAttribute( "aria-relevant", "all" );
+                       
+                       var tfoot = $(this).children('tfoot');
+                       if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") )
+                       {
+                               // If we are a scrolling table, and no footer has been given, then we need to create
+                               // a tfoot element for the caption element to be appended to
+                               tfoot = [ document.createElement( 'tfoot' ) ];
+                               this.appendChild( tfoot[0] );
+                       }
+                       
+                       if ( tfoot.length > 0 )
+                       {
+                               oSettings.nTFoot = tfoot[0];
+                               _fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );
+                       }
+                       
+                       /* Check if there is data passing into the constructor */
+                       if ( bUsePassedData )
+                       {
+                               for ( i=0 ; i<oInit.aaData.length ; i++ )
+                               {
+                                       _fnAddData( oSettings, oInit.aaData[ i ] );
+                               }
+                       }
+                       else
+                       {
+                               /* Grab the data from the page */
+                               _fnGatherData( oSettings );
+                       }
+                       
+                       /* Copy the data index array */
+                       oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+                       
+                       /* Initialisation complete - table can be drawn */
+                       oSettings.bInitialised = true;
+                       
+                       /* Check if we need to initialise the table (it might not have been handed off to the
+                        * language processor)
+                        */
+                       if ( bInitHandedOff === false )
+                       {
+                               _fnInitialise( oSettings );
+                       }
+               } );
+               _that = null;
+               return this;
+       };
+
+       
+       
+       /**
+        * Provide a common method for plug-ins to check the version of DataTables being used, in order
+        * to ensure compatibility.
+        *  @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
+        *    formats "X" and "X.Y" are also acceptable.
+        *  @returns {boolean} true if this version of DataTables is greater or equal to the required
+        *    version, or false if this version of DataTales is not suitable
+        *  @static
+        *  @dtopt API-Static
+        *
+        *  @example
+        *    alert( $.fn.dataTable.fnVersionCheck( '1.9.0' ) );
+        */
+       DataTable.fnVersionCheck = function( sVersion )
+       {
+               /* This is cheap, but effective */
+               var fnZPad = function (Zpad, count)
+               {
+                       while(Zpad.length < count) {
+                               Zpad += '0';
+                       }
+                       return Zpad;
+               };
+               var aThis = DataTable.ext.sVersion.split('.');
+               var aThat = sVersion.split('.');
+               var sThis = '', sThat = '';
+               
+               for ( var i=0, iLen=aThat.length ; i<iLen ; i++ )
+               {
+                       sThis += fnZPad( aThis[i], 3 );
+                       sThat += fnZPad( aThat[i], 3 );
+               }
+               
+               return parseInt(sThis, 10) >= parseInt(sThat, 10);
+       };
+       
+       
+       /**
+        * Check if a TABLE node is a DataTable table already or not.
+        *  @param {node} nTable The TABLE node to check if it is a DataTable or not (note that other
+        *    node types can be passed in, but will always return false).
+        *  @returns {boolean} true the table given is a DataTable, or false otherwise
+        *  @static
+        *  @dtopt API-Static
+        *
+        *  @example
+        *    var ex = document.getElementById('example');
+        *    if ( ! $.fn.DataTable.fnIsDataTable( ex ) ) {
+        *      $(ex).dataTable();
+        *    }
+        */
+       DataTable.fnIsDataTable = function ( nTable )
+       {
+               var o = DataTable.settings;
+       
+               for ( var i=0 ; i<o.length ; i++ )
+               {
+                       if ( o[i].nTable === nTable || o[i].nScrollHead === nTable || o[i].nScrollFoot === nTable )
+                       {
+                               return true;
+                       }
+               }
+       
+               return false;
+       };
+       
+       
+       /**
+        * Get all DataTable tables that have been initialised - optionally you can select to
+        * get only currently visible tables.
+        *  @param {boolean} [bVisible=false] Flag to indicate if you want all (default) or 
+        *    visible tables only.
+        *  @returns {array} Array of TABLE nodes (not DataTable instances) which are DataTables
+        *  @static
+        *  @dtopt API-Static
+        *
+        *  @example
+        *    var table = $.fn.dataTable.fnTables(true);
+        *    if ( table.length > 0 ) {
+        *      $(table).dataTable().fnAdjustColumnSizing();
+        *    }
+        */
+       DataTable.fnTables = function ( bVisible )
+       {
+               var out = [];
+       
+               jQuery.each( DataTable.settings, function (i, o) {
+                       if ( !bVisible || (bVisible === true && $(o.nTable).is(':visible')) )
+                       {
+                               out.push( o.nTable );
+                       }
+               } );
+       
+               return out;
+       };
+       
+
+       /**
+        * Version string for plug-ins to check compatibility. Allowed format is
+        * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and
+        * e are optional
+        *  @member
+        *  @type string
+        *  @default Version number
+        */
+       DataTable.version = "1.9.4";
+
+       /**
+        * Private data store, containing all of the settings objects that are created for the
+        * tables on a given page.
+        * 
+        * Note that the <i>DataTable.settings</i> object is aliased to <i>jQuery.fn.dataTableExt</i> 
+        * through which it may be accessed and manipulated, or <i>jQuery.fn.dataTable.settings</i>.
+        *  @member
+        *  @type array
+        *  @default []
+        *  @private
+        */
+       DataTable.settings = [];
+
+       /**
+        * Object models container, for the various models that DataTables has available
+        * to it. These models define the objects that are used to hold the active state 
+        * and configuration of the table.
+        *  @namespace
+        */
+       DataTable.models = {};
+       
+       
+       /**
+        * DataTables extension options and plug-ins. This namespace acts as a collection "area"
+        * for plug-ins that can be used to extend the default DataTables behaviour - indeed many
+        * of the build in methods use this method to provide their own capabilities (sorting methods
+        * for example).
+        * 
+        * Note that this namespace is aliased to jQuery.fn.dataTableExt so it can be readily accessed
+        * and modified by plug-ins.
+        *  @namespace
+        */
+       DataTable.models.ext = {
+               /**
+                * Plug-in filtering functions - this method of filtering is complimentary to the default
+                * type based filtering, and a lot more comprehensive as it allows you complete control
+                * over the filtering logic. Each element in this array is a function (parameters
+                * described below) that is called for every row in the table, and your logic decides if
+                * it should be included in the filtered data set or not.
+                *   <ul>
+                *     <li>
+                *       Function input parameters:
+                *       <ul>
+                *         <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
+                *         <li>{array|object} Data for the row to be processed (same as the original format
+                *           that was passed in as the data source, or an array from a DOM data source</li>
+                *         <li>{int} Row index in aoData ({@link DataTable.models.oSettings.aoData}), which can
+                *           be useful to retrieve the TR element if you need DOM interaction.</li>
+                *       </ul>
+                *     </li>
+                *     <li>
+                *       Function return:
+                *       <ul>
+                *         <li>{boolean} Include the row in the filtered result set (true) or not (false)</li>
+                *       </ul>
+                *     </il>
+                *   </ul>
+                *  @type array
+                *  @default []
+                *
+                *  @example
+                *    // The following example shows custom filtering being applied to the fourth column (i.e.
+                *    // the aData[3] index) based on two input values from the end-user, matching the data in 
+                *    // a certain range.
+                *    $.fn.dataTableExt.afnFiltering.push(
+                *      function( oSettings, aData, iDataIndex ) {
+                *        var iMin = document.getElementById('min').value * 1;
+                *        var iMax = document.getElementById('max').value * 1;
+                *        var iVersion = aData[3] == "-" ? 0 : aData[3]*1;
+                *        if ( iMin == "" && iMax == "" ) {
+                *          return true;
+                *        }
+                *        else if ( iMin == "" && iVersion < iMax ) {
+                *          return true;
+                *        }
+                *        else if ( iMin < iVersion && "" == iMax ) {
+                *          return true;
+                *        }
+                *        else if ( iMin < iVersion && iVersion < iMax ) {
+                *          return true;
+                *        }
+                *        return false;
+                *      }
+                *    );
+                */
+               "afnFiltering": [],
+       
+       
+               /**
+                * Plug-in sorting functions - this method of sorting is complimentary to the default type
+                * based sorting that DataTables does automatically, allowing much greater control over the
+                * the data that is being used to sort a column. This is useful if you want to do sorting
+                * based on live data (for example the contents of an 'input' element) rather than just the
+                * static string that DataTables knows of. The way these plug-ins work is that you create
+                * an array of the values you wish to be sorted for the column in question and then return
+                * that array. Which pre-sorting function is run here depends on the sSortDataType parameter
+                * that is used for the column (if any). This is the corollary of <i>ofnSearch</i> for sort 
+                * data.
+                *   <ul>
+            *     <li>
+            *       Function input parameters:
+            *       <ul>
+                *         <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
+            *         <li>{int} Target column index</li>
+            *       </ul>
+            *     </li>
+                *     <li>
+                *       Function return:
+                *       <ul>
+                *         <li>{array} Data for the column to be sorted upon</li>
+                *       </ul>
+                *     </il>
+                *   </ul>
+                *  
+                * Note that as of v1.9, it is typically preferable to use <i>mData</i> to prepare data for
+                * the different uses that DataTables can put the data to. Specifically <i>mData</i> when
+                * used as a function will give you a 'type' (sorting, filtering etc) that you can use to 
+                * prepare the data as required for the different types. As such, this method is deprecated.
+                *  @type array
+                *  @default []
+                *  @deprecated
+                *
+                *  @example
+                *    // Updating the cached sorting information with user entered values in HTML input elements
+                *    jQuery.fn.dataTableExt.afnSortData['dom-text'] = function ( oSettings, iColumn )
+                *    {
+                *      var aData = [];
+                *      $( 'td:eq('+iColumn+') input', oSettings.oApi._fnGetTrNodes(oSettings) ).each( function () {
+                *        aData.push( this.value );
+                *      } );
+                *      return aData;
+                *    }
+                */
+               "afnSortData": [],
+       
+       
+               /**
+                * Feature plug-ins - This is an array of objects which describe the feature plug-ins that are
+                * available to DataTables. These feature plug-ins are accessible through the sDom initialisation
+                * option. As such, each feature plug-in must describe a function that is used to initialise
+                * itself (fnInit), a character so the feature can be enabled by sDom (cFeature) and the name
+                * of the feature (sFeature). Thus the objects attached to this method must provide:
+                *   <ul>
+                *     <li>{function} fnInit Initialisation of the plug-in
+                *       <ul>
+            *         <li>
+            *           Function input parameters:
+            *           <ul>
+                *             <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
+            *           </ul>
+            *         </li>
+                *         <li>
+                *           Function return:
+                *           <ul>
+                *             <li>{node|null} The element which contains your feature. Note that the return
+                *                may also be void if your plug-in does not require to inject any DOM elements 
+                *                into DataTables control (sDom) - for example this might be useful when 
+                *                developing a plug-in which allows table control via keyboard entry.</li>
+                *           </ul>
+                *         </il>
+                *       </ul>
+                *     </li>
+                *     <li>{character} cFeature Character that will be matched in sDom - case sensitive</li>
+                *     <li>{string} sFeature Feature name</li>
+                *   </ul>
+                *  @type array
+                *  @default []
+                * 
+                *  @example
+                *    // How TableTools initialises itself.
+                *    $.fn.dataTableExt.aoFeatures.push( {
+                *      "fnInit": function( oSettings ) {
+                *        return new TableTools( { "oDTSettings": oSettings } );
+                *      },
+                *      "cFeature": "T",
+                *      "sFeature": "TableTools"
+                *    } );
+                */
+               "aoFeatures": [],
+       
+       
+               /**
+                * Type detection plug-in functions - DataTables utilises types to define how sorting and
+                * filtering behave, and types can be either  be defined by the developer (sType for the
+                * column) or they can be automatically detected by the methods in this array. The functions
+                * defined in the array are quite simple, taking a single parameter (the data to analyse) 
+                * and returning the type if it is a known type, or null otherwise.
+                *   <ul>
+            *     <li>
+            *       Function input parameters:
+            *       <ul>
+                *         <li>{*} Data from the column cell to be analysed</li>
+            *       </ul>
+            *     </li>
+                *     <li>
+                *       Function return:
+                *       <ul>
+                *         <li>{string|null} Data type detected, or null if unknown (and thus pass it
+                *           on to the other type detection functions.</li>
+                *       </ul>
+                *     </il>
+                *   </ul>
+                *  @type array
+                *  @default []
+                *  
+                *  @example
+                *    // Currency type detection plug-in:
+                *    jQuery.fn.dataTableExt.aTypes.push(
+                *      function ( sData ) {
+                *        var sValidChars = "0123456789.-";
+                *        var Char;
+                *        
+                *        // Check the numeric part
+                *        for ( i=1 ; i<sData.length ; i++ ) {
+                *          Char = sData.charAt(i); 
+                *          if (sValidChars.indexOf(Char) == -1) {
+                *            return null;
+                *          }
+                *        }
+                *        
+                *        // Check prefixed by currency
+                *        if ( sData.charAt(0) == '$' || sData.charAt(0) == '&pound;' ) {
+                *          return 'currency';
+                *        }
+                *        return null;
+                *      }
+                *    );
+                */
+               "aTypes": [],
+       
+       
+               /**
+                * Provide a common method for plug-ins to check the version of DataTables being used, 
+                * in order to ensure compatibility.
+                *  @type function
+                *  @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note 
+                *    that the formats "X" and "X.Y" are also acceptable.
+                *  @returns {boolean} true if this version of DataTables is greater or equal to the 
+                *    required version, or false if this version of DataTales is not suitable
+                *
+                *  @example
+                *    $(document).ready(function() {
+                *      var oTable = $('#example').dataTable();
+                *      alert( oTable.fnVersionCheck( '1.9.0' ) );
+                *    } );
+                */
+               "fnVersionCheck": DataTable.fnVersionCheck,
+       
+       
+               /**
+                * Index for what 'this' index API functions should use
+                *  @type int
+                *  @default 0
+                */
+               "iApiIndex": 0,
+       
+       
+               /**
+                * Pre-processing of filtering data plug-ins - When you assign the sType for a column
+                * (or have it automatically detected for you by DataTables or a type detection plug-in), 
+                * you will typically be using this for custom sorting, but it can also be used to provide 
+                * custom filtering by allowing you to pre-processing the data and returning the data in
+                * the format that should be filtered upon. This is done by adding functions this object 
+                * with a parameter name which matches the sType for that target column. This is the
+                * corollary of <i>afnSortData</i> for filtering data.
+                *   <ul>
+            *     <li>
+            *       Function input parameters:
+            *       <ul>
+                *         <li>{*} Data from the column cell to be prepared for filtering</li>
+            *       </ul>
+            *     </li>
+                *     <li>
+                *       Function return:
+                *       <ul>
+                *         <li>{string|null} Formatted string that will be used for the filtering.</li>
+                *       </ul>
+                *     </il>
+                *   </ul>
+                * 
+                * Note that as of v1.9, it is typically preferable to use <i>mData</i> to prepare data for
+                * the different uses that DataTables can put the data to. Specifically <i>mData</i> when
+                * used as a function will give you a 'type' (sorting, filtering etc) that you can use to 
+                * prepare the data as required for the different types. As such, this method is deprecated.
+                *  @type object
+                *  @default {}
+                *  @deprecated
+                *
+                *  @example
+                *    $.fn.dataTableExt.ofnSearch['title-numeric'] = function ( sData ) {
+                *      return sData.replace(/\n/g," ").replace( /<.*?>/g, "" );
+                *    }
+                */
+               "ofnSearch": {},
+       
+       
+               /**
+                * Container for all private functions in DataTables so they can be exposed externally
+                *  @type object
+                *  @default {}
+                */
+               "oApi": {},
+       
+       
+               /**
+                * Storage for the various classes that DataTables uses
+                *  @type object
+                *  @default {}
+                */
+               "oStdClasses": {},
+               
+       
+               /**
+                * Storage for the various classes that DataTables uses - jQuery UI suitable
+                *  @type object
+                *  @default {}
+                */
+               "oJUIClasses": {},
+       
+       
+               /**
+                * Pagination plug-in methods - The style and controls of the pagination can significantly 
+                * impact on how the end user interacts with the data in your table, and DataTables allows 
+                * the addition of pagination controls by extending this object, which can then be enabled
+                * through the <i>sPaginationType</i> initialisation parameter. Each pagination type that
+                * is added is an object (the property name of which is what <i>sPaginationType</i> refers
+                * to) that has two properties, both methods that are used by DataTables to update the
+                * control's state.
+                *   <ul>
+                *     <li>
+                *       fnInit -  Initialisation of the paging controls. Called only during initialisation 
+                *         of the table. It is expected that this function will add the required DOM elements 
+                *         to the page for the paging controls to work. The element pointer 
+                *         'oSettings.aanFeatures.p' array is provided by DataTables to contain the paging 
+                *         controls (note that this is a 2D array to allow for multiple instances of each 
+                *         DataTables DOM element). It is suggested that you add the controls to this element 
+                *         as children
+                *       <ul>
+            *         <li>
+            *           Function input parameters:
+            *           <ul>
+                *             <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
+                *             <li>{node} Container into which the pagination controls must be inserted</li>
+                *             <li>{function} Draw callback function - whenever the controls cause a page
+                *               change, this method must be called to redraw the table.</li>
+            *           </ul>
+            *         </li>
+                *         <li>
+                *           Function return:
+                *           <ul>
+                *             <li>No return required</li>
+                *           </ul>
+                *         </il>
+                *       </ul>
+                *     </il>
+                *     <li>
+                *       fnInit -  This function is called whenever the paging status of the table changes and is
+                *         typically used to update classes and/or text of the paging controls to reflex the new 
+                *         status.
+                *       <ul>
+            *         <li>
+            *           Function input parameters:
+            *           <ul>
+                *             <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
+                *             <li>{function} Draw callback function - in case you need to redraw the table again
+                *               or attach new event listeners</li>
+            *           </ul>
+            *         </li>
+                *         <li>
+                *           Function return:
+                *           <ul>
+                *             <li>No return required</li>
+                *           </ul>
+                *         </il>
+                *       </ul>
+                *     </il>
+                *   </ul>
+                *  @type object
+                *  @default {}
+                *
+                *  @example
+                *    $.fn.dataTableExt.oPagination.four_button = {
+                *      "fnInit": function ( oSettings, nPaging, fnCallbackDraw ) {
+                *        nFirst = document.createElement( 'span' );
+                *        nPrevious = document.createElement( 'span' );
+                *        nNext = document.createElement( 'span' );
+                *        nLast = document.createElement( 'span' );
+                *        
+                *        nFirst.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sFirst ) );
+                *        nPrevious.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sPrevious ) );
+                *        nNext.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sNext ) );
+                *        nLast.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sLast ) );
+                *        
+                *        nFirst.className = "paginate_button first";
+                *        nPrevious.className = "paginate_button previous";
+                *        nNext.className="paginate_button next";
+                *        nLast.className = "paginate_button last";
+                *        
+                *        nPaging.appendChild( nFirst );
+                *        nPaging.appendChild( nPrevious );
+                *        nPaging.appendChild( nNext );
+                *        nPaging.appendChild( nLast );
+                *        
+                *        $(nFirst).click( function () {
+                *          oSettings.oApi._fnPageChange( oSettings, "first" );
+                *          fnCallbackDraw( oSettings );
+                *        } );
+                *        
+                *        $(nPrevious).click( function() {
+                *          oSettings.oApi._fnPageChange( oSettings, "previous" );
+                *          fnCallbackDraw( oSettings );
+                *        } );
+                *        
+                *        $(nNext).click( function() {
+                *          oSettings.oApi._fnPageChange( oSettings, "next" );
+                *          fnCallbackDraw( oSettings );
+                *        } );
+                *        
+                *        $(nLast).click( function() {
+                *          oSettings.oApi._fnPageChange( oSettings, "last" );
+                *          fnCallbackDraw( oSettings );
+                *        } );
+                *        
+                *        $(nFirst).bind( 'selectstart', function () { return false; } );
+                *        $(nPrevious).bind( 'selectstart', function () { return false; } );
+                *        $(nNext).bind( 'selectstart', function () { return false; } );
+                *        $(nLast).bind( 'selectstart', function () { return false; } );
+                *      },
+                *      
+                *      "fnUpdate": function ( oSettings, fnCallbackDraw ) {
+                *        if ( !oSettings.aanFeatures.p ) {
+                *          return;
+                *        }
+                *        
+                *        // Loop over each instance of the pager
+                *        var an = oSettings.aanFeatures.p;
+                *        for ( var i=0, iLen=an.length ; i<iLen ; i++ ) {
+                *          var buttons = an[i].getElementsByTagName('span');
+                *          if ( oSettings._iDisplayStart === 0 ) {
+                *            buttons[0].className = "paginate_disabled_previous";
+                *            buttons[1].className = "paginate_disabled_previous";
+                *          }
+                *          else {
+                *            buttons[0].className = "paginate_enabled_previous";
+                *            buttons[1].className = "paginate_enabled_previous";
+                *          }
+                *          
+                *          if ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) {
+                *            buttons[2].className = "paginate_disabled_next";
+                *            buttons[3].className = "paginate_disabled_next";
+                *          }
+                *          else {
+                *            buttons[2].className = "paginate_enabled_next";
+                *            buttons[3].className = "paginate_enabled_next";
+                *          }
+                *        }
+                *      }
+                *    };
+                */
+               "oPagination": {},
+       
+       
+               /**
+                * Sorting plug-in methods - Sorting in DataTables is based on the detected type of the
+                * data column (you can add your own type detection functions, or override automatic 
+                * detection using sType). With this specific type given to the column, DataTables will 
+                * apply the required sort from the functions in the object. Each sort type must provide
+                * two mandatory methods, one each for ascending and descending sorting, and can optionally
+                * provide a pre-formatting method that will help speed up sorting by allowing DataTables
+                * to pre-format the sort data only once (rather than every time the actual sort functions
+                * are run). The two sorting functions are typical Javascript sort methods:
+                *   <ul>
+            *     <li>
+            *       Function input parameters:
+            *       <ul>
+                *         <li>{*} Data to compare to the second parameter</li>
+                *         <li>{*} Data to compare to the first parameter</li>
+            *       </ul>
+            *     </li>
+                *     <li>
+                *       Function return:
+                *       <ul>
+                *         <li>{int} Sorting match: <0 if first parameter should be sorted lower than
+                *           the second parameter, ===0 if the two parameters are equal and >0 if
+                *           the first parameter should be sorted height than the second parameter.</li>
+                *       </ul>
+                *     </il>
+                *   </ul>
+                *  @type object
+                *  @default {}
+                *
+                *  @example
+                *    // Case-sensitive string sorting, with no pre-formatting method
+                *    $.extend( $.fn.dataTableExt.oSort, {
+                *      "string-case-asc": function(x,y) {
+                *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+                *      },
+                *      "string-case-desc": function(x,y) {
+                *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+                *      }
+                *    } );
+                *
+                *  @example
+                *    // Case-insensitive string sorting, with pre-formatting
+                *    $.extend( $.fn.dataTableExt.oSort, {
+                *      "string-pre": function(x) {
+                *        return x.toLowerCase();
+                *      },
+                *      "string-asc": function(x,y) {
+                *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+                *      },
+                *      "string-desc": function(x,y) {
+                *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+                *      }
+                *    } );
+                */
+               "oSort": {},
+       
+       
+               /**
+                * Version string for plug-ins to check compatibility. Allowed format is
+                * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and
+                * e are optional
+                *  @type string
+                *  @default Version number
+                */
+               "sVersion": DataTable.version,
+       
+       
+               /**
+                * How should DataTables report an error. Can take the value 'alert' or 'throw'
+                *  @type string
+                *  @default alert
+                */
+               "sErrMode": "alert",
+       
+       
+               /**
+                * Store information for DataTables to access globally about other instances
+                *  @namespace
+                *  @private
+                */
+               "_oExternConfig": {
+                       /* int:iNextUnique - next unique number for an instance */
+                       "iNextUnique": 0
+               }
+       };
+       
+       
+       
+       
+       /**
+        * Template object for the way in which DataTables holds information about
+        * search information for the global filter and individual column filters.
+        *  @namespace
+        */
+       DataTable.models.oSearch = {
+               /**
+                * Flag to indicate if the filtering should be case insensitive or not
+                *  @type boolean
+                *  @default true
+                */
+               "bCaseInsensitive": true,
+       
+               /**
+                * Applied search term
+                *  @type string
+                *  @default <i>Empty string</i>
+                */
+               "sSearch": "",
+       
+               /**
+                * Flag to indicate if the search term should be interpreted as a
+                * regular expression (true) or not (false) and therefore and special
+                * regex characters escaped.
+                *  @type boolean
+                *  @default false
+                */
+               "bRegex": false,
+       
+               /**
+                * Flag to indicate if DataTables is to use its smart filtering or not.
+                *  @type boolean
+                *  @default true
+                */
+               "bSmart": true
+       };
+       
+       
+       
+       
+       /**
+        * Template object for the way in which DataTables holds information about
+        * each individual row. This is the object format used for the settings 
+        * aoData array.
+        *  @namespace
+        */
+       DataTable.models.oRow = {
+               /**
+                * TR element for the row
+                *  @type node
+                *  @default null
+                */
+               "nTr": null,
+       
+               /**
+                * Data object from the original data source for the row. This is either
+                * an array if using the traditional form of DataTables, or an object if
+                * using mData options. The exact type will depend on the passed in
+                * data from the data source, or will be an array if using DOM a data 
+                * source.
+                *  @type array|object
+                *  @default []
+                */
+               "_aData": [],
+       
+               /**
+                * Sorting data cache - this array is ostensibly the same length as the
+                * number of columns (although each index is generated only as it is 
+                * needed), and holds the data that is used for sorting each column in the
+                * row. We do this cache generation at the start of the sort in order that
+                * the formatting of the sort data need be done only once for each cell
+                * per sort. This array should not be read from or written to by anything
+                * other than the master sorting methods.
+                *  @type array
+                *  @default []
+                *  @private
+                */
+               "_aSortData": [],
+       
+               /**
+                * Array of TD elements that are cached for hidden rows, so they can be
+                * reinserted into the table if a column is made visible again (or to act
+                * as a store if a column is made hidden). Only hidden columns have a 
+                * reference in the array. For non-hidden columns the value is either
+                * undefined or null.
+                *  @type array nodes
+                *  @default []
+                *  @private
+                */
+               "_anHidden": [],
+       
+               /**
+                * Cache of the class name that DataTables has applied to the row, so we
+                * can quickly look at this variable rather than needing to do a DOM check
+                * on className for the nTr property.
+                *  @type string
+                *  @default <i>Empty string</i>
+                *  @private
+                */
+               "_sRowStripe": ""
+       };
+       
+       
+       
+       /**
+        * Template object for the column information object in DataTables. This object
+        * is held in the settings aoColumns array and contains all the information that
+        * DataTables needs about each individual column.
+        * 
+        * Note that this object is related to {@link DataTable.defaults.columns} 
+        * but this one is the internal data store for DataTables's cache of columns.
+        * It should NOT be manipulated outside of DataTables. Any configuration should
+        * be done through the initialisation options.
+        *  @namespace
+        */
+       DataTable.models.oColumn = {
+               /**
+                * A list of the columns that sorting should occur on when this column
+                * is sorted. That this property is an array allows multi-column sorting
+                * to be defined for a column (for example first name / last name columns
+                * would benefit from this). The values are integers pointing to the
+                * columns to be sorted on (typically it will be a single integer pointing
+                * at itself, but that doesn't need to be the case).
+                *  @type array
+                */
+               "aDataSort": null,
+       
+               /**
+                * Define the sorting directions that are applied to the column, in sequence
+                * as the column is repeatedly sorted upon - i.e. the first value is used
+                * as the sorting direction when the column if first sorted (clicked on).
+                * Sort it again (click again) and it will move on to the next index.
+                * Repeat until loop.
+                *  @type array
+                */
+               "asSorting": null,
+               
+               /**
+                * Flag to indicate if the column is searchable, and thus should be included
+                * in the filtering or not.
+                *  @type boolean
+                */
+               "bSearchable": null,
+               
+               /**
+                * Flag to indicate if the column is sortable or not.
+                *  @type boolean
+                */
+               "bSortable": null,
+               
+               /**
+                * <code>Deprecated</code> When using fnRender, you have two options for what 
+                * to do with the data, and this property serves as the switch. Firstly, you 
+                * can have the sorting and filtering use the rendered value (true - default), 
+                * or you can have the sorting and filtering us the original value (false).
+                *
+                * Please note that this option has now been deprecated and will be removed
+                * in the next version of DataTables. Please use mRender / mData rather than
+                * fnRender.
+                *  @type boolean
+                *  @deprecated
+                */
+               "bUseRendered": null,
+               
+               /**
+                * Flag to indicate if the column is currently visible in the table or not
+                *  @type boolean
+                */
+               "bVisible": null,
+               
+               /**
+                * Flag to indicate to the type detection method if the automatic type
+                * detection should be used, or if a column type (sType) has been specified
+                *  @type boolean
+                *  @default true
+                *  @private
+                */
+               "_bAutoType": true,
+               
+               /**
+                * Developer definable function that is called whenever a cell is created (Ajax source,
+                * etc) or processed for input (DOM source). This can be used as a compliment to mRender
+                * allowing you to modify the DOM element (add background colour for example) when the
+                * element is available.
+                *  @type function
+                *  @param {element} nTd The TD node that has been created
+                *  @param {*} sData The Data for the cell
+                *  @param {array|object} oData The data for the whole row
+                *  @param {int} iRow The row index for the aoData data store
+                *  @default null
+                */
+               "fnCreatedCell": null,
+               
+               /**
+                * Function to get data from a cell in a column. You should <b>never</b>
+                * access data directly through _aData internally in DataTables - always use
+                * the method attached to this property. It allows mData to function as
+                * required. This function is automatically assigned by the column 
+                * initialisation method
+                *  @type function
+                *  @param {array|object} oData The data array/object for the array 
+                *    (i.e. aoData[]._aData)
+                *  @param {string} sSpecific The specific data type you want to get - 
+                *    'display', 'type' 'filter' 'sort'
+                *  @returns {*} The data for the cell from the given row's data
+                *  @default null
+                */
+               "fnGetData": null,
+               
+               /**
+                * <code>Deprecated</code> Custom display function that will be called for the 
+                * display of each cell in this column.
+                *
+                * Please note that this option has now been deprecated and will be removed
+                * in the next version of DataTables. Please use mRender / mData rather than
+                * fnRender.
+                *  @type function
+                *  @param {object} o Object with the following parameters:
+                *  @param {int}    o.iDataRow The row in aoData
+                *  @param {int}    o.iDataColumn The column in question
+                *  @param {array}  o.aData The data for the row in question
+                *  @param {object} o.oSettings The settings object for this DataTables instance
+                *  @returns {string} The string you which to use in the display
+                *  @default null
+                *  @deprecated
+                */
+               "fnRender": null,
+               
+               /**
+                * Function to set data for a cell in the column. You should <b>never</b> 
+                * set the data directly to _aData internally in DataTables - always use
+                * this method. It allows mData to function as required. This function
+                * is automatically assigned by the column initialisation method
+                *  @type function
+                *  @param {array|object} oData The data array/object for the array 
+                *    (i.e. aoData[]._aData)
+                *  @param {*} sValue Value to set
+                *  @default null
+                */
+               "fnSetData": null,
+               
+               /**
+                * Property to read the value for the cells in the column from the data 
+                * source array / object. If null, then the default content is used, if a
+                * function is given then the return from the function is used.
+                *  @type function|int|string|null
+                *  @default null
+                */
+               "mData": null,
+               
+               /**
+                * Partner property to mData which is used (only when defined) to get
+                * the data - i.e. it is basically the same as mData, but without the
+                * 'set' option, and also the data fed to it is the result from mData.
+                * This is the rendering method to match the data method of mData.
+                *  @type function|int|string|null
+                *  @default null
+                */
+               "mRender": null,
+               
+               /**
+                * Unique header TH/TD element for this column - this is what the sorting
+                * listener is attached to (if sorting is enabled.)
+                *  @type node
+                *  @default null
+                */
+               "nTh": null,
+               
+               /**
+                * Unique footer TH/TD element for this column (if there is one). Not used 
+                * in DataTables as such, but can be used for plug-ins to reference the 
+                * footer for each column.
+                *  @type node
+                *  @default null
+                */
+               "nTf": null,
+               
+               /**
+                * The class to apply to all TD elements in the table's TBODY for the column
+                *  @type string
+                *  @default null
+                */
+               "sClass": null,
+               
+               /**
+                * When DataTables calculates the column widths to assign to each column,
+                * it finds the longest string in each column and then constructs a
+                * temporary table and reads the widths from that. The problem with this
+                * is that "mmm" is much wider then "iiii", but the latter is a longer 
+                * string - thus the calculation can go wrong (doing it properly and putting
+                * it into an DOM object and measuring that is horribly(!) slow). Thus as
+                * a "work around" we provide this option. It will append its value to the
+                * text that is found to be the longest string for the column - i.e. padding.
+                *  @type string
+                */
+               "sContentPadding": null,
+               
+               /**
+                * Allows a default value to be given for a column's data, and will be used
+                * whenever a null data source is encountered (this can be because mData
+                * is set to null, or because the data source itself is null).
+                *  @type string
+                *  @default null
+                */
+               "sDefaultContent": null,
+               
+               /**
+                * Name for the column, allowing reference to the column by name as well as
+                * by index (needs a lookup to work by name).
+                *  @type string
+                */
+               "sName": null,
+               
+               /**
+                * Custom sorting data type - defines which of the available plug-ins in
+                * afnSortData the custom sorting will use - if any is defined.
+                *  @type string
+                *  @default std
+                */
+               "sSortDataType": 'std',
+               
+               /**
+                * Class to be applied to the header element when sorting on this column
+                *  @type string
+                *  @default null
+                */
+               "sSortingClass": null,
+               
+               /**
+                * Class to be applied to the header element when sorting on this column -
+                * when jQuery UI theming is used.
+                *  @type string
+                *  @default null
+                */
+               "sSortingClassJUI": null,
+               
+               /**
+                * Title of the column - what is seen in the TH element (nTh).
+                *  @type string
+                */
+               "sTitle": null,
+               
+               /**
+                * Column sorting and filtering type
+                *  @type string
+                *  @default null
+                */
+               "sType": null,
+               
+               /**
+                * Width of the column
+                *  @type string
+                *  @default null
+                */
+               "sWidth": null,
+               
+               /**
+                * Width of the column when it was first "encountered"
+                *  @type string
+                *  @default null
+                */
+               "sWidthOrig": null
+       };
+       
+       
+       
+       /**
+        * Initialisation options that can be given to DataTables at initialisation 
+        * time.
+        *  @namespace
+        */
+       DataTable.defaults = {
+               /**
+                * An array of data to use for the table, passed in at initialisation which 
+                * will be used in preference to any data which is already in the DOM. This is
+                * particularly useful for constructing tables purely in Javascript, for
+                * example with a custom Ajax call.
+                *  @type array
+                *  @default null
+                *  @dtopt Option
+                * 
+                *  @example
+                *    // Using a 2D array data source
+                *    $(document).ready( function () {
+                *      $('#example').dataTable( {
+                *        "aaData": [
+                *          ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],
+                *          ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],
+                *        ],
+                *        "aoColumns": [
+                *          { "sTitle": "Engine" },
+                *          { "sTitle": "Browser" },
+                *          { "sTitle": "Platform" },
+                *          { "sTitle": "Version" },
+                *          { "sTitle": "Grade" }
+                *        ]
+                *      } );
+                *    } );
+                *    
+                *  @example
+                *    // Using an array of objects as a data source (mData)
+                *    $(document).ready( function () {
+                *      $('#example').dataTable( {
+                *        "aaData": [
+                *          {
+                *            "engine":   "Trident",
+                *            "browser":  "Internet Explorer 4.0",
+                *            "platform": "Win 95+",
+                *            "version":  4,
+                *            "grade":    "X"
+                *          },
+                *          {
+                *            "engine":   "Trident",
+                *            "browser":  "Internet Explorer 5.0",
+                *            "platform": "Win 95+",
+                *            "version":  5,
+                *            "grade":    "C"
+                *          }
+                *        ],
+                *        "aoColumns": [
+                *          { "sTitle": "Engine",   "mData": "engine" },
+                *          { "sTitle": "Browser",  "mData": "browser" },
+                *          { "sTitle": "Platform", "mData": "platform" },
+                *          { "sTitle": "Version",  "mData": "version" },
+                *          { "sTitle": "Grade",    "mData": "grade" }
+                *        ]
+                *      } );
+                *    } );
+                */
+               "aaData": null,
+       
+       
+               /**
+                * If sorting is enabled, then DataTables will perform a first pass sort on 
+                * initialisation. You can define which column(s) the sort is performed upon, 
+                * and the sorting direction, with this variable. The aaSorting array should 
+                * contain an array for each column to be sorted initially containing the 
+                * column's index and a direction string ('asc' or 'desc').
+                *  @type array
+                *  @default [[0,'asc']]
+                *  @dtopt Option
+                * 
+                *  @example
+                *    // Sort by 3rd column first, and then 4th column
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aaSorting": [[2,'asc'], [3,'desc']]
+                *      } );
+                *    } );
+                *    
+                *    // No initial sorting
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aaSorting": []
+                *      } );
+                *    } );
+                */
+               "aaSorting": [[0,'asc']],
+       
+       
+               /**
+                * This parameter is basically identical to the aaSorting parameter, but 
+                * cannot be overridden by user interaction with the table. What this means 
+                * is that you could have a column (visible or hidden) which the sorting will 
+                * always be forced on first - any sorting after that (from the user) will 
+                * then be performed as required. This can be useful for grouping rows 
+                * together.
+                *  @type array
+                *  @default null
+                *  @dtopt Option
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aaSortingFixed": [[0,'asc']]
+                *      } );
+                *    } )
+                */
+               "aaSortingFixed": null,
+       
+       
+               /**
+                * This parameter allows you to readily specify the entries in the length drop
+                * down menu that DataTables shows when pagination is enabled. It can be 
+                * either a 1D array of options which will be used for both the displayed 
+                * option and the value, or a 2D array which will use the array in the first 
+                * position as the value, and the array in the second position as the 
+                * displayed options (useful for language strings such as 'All').
+                *  @type array
+                *  @default [ 10, 25, 50, 100 ]
+                *  @dtopt Option
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
+                *      } );
+                *    } );
+                *  
+                *  @example
+                *    // Setting the default display length as well as length menu
+                *    // This is likely to be wanted if you remove the '10' option which
+                *    // is the iDisplayLength default.
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "iDisplayLength": 25,
+                *        "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]]
+                *      } );
+                *    } );
+                */
+               "aLengthMenu": [ 10, 25, 50, 100 ],
+       
+       
+               /**
+                * The aoColumns option in the initialisation parameter allows you to define
+                * details about the way individual columns behave. For a full list of
+                * column options that can be set, please see 
+                * {@link DataTable.defaults.columns}. Note that if you use aoColumns to
+                * define your columns, you must have an entry in the array for every single
+                * column that you have in your table (these can be null if you don't which
+                * to specify any options).
+                *  @member
+                */
+               "aoColumns": null,
+       
+               /**
+                * Very similar to aoColumns, aoColumnDefs allows you to target a specific 
+                * column, multiple columns, or all columns, using the aTargets property of 
+                * each object in the array. This allows great flexibility when creating 
+                * tables, as the aoColumnDefs arrays can be of any length, targeting the 
+                * columns you specifically want. aoColumnDefs may use any of the column 
+                * options available: {@link DataTable.defaults.columns}, but it _must_
+                * have aTargets defined in each object in the array. Values in the aTargets
+                * array may be:
+                *   <ul>
+                *     <li>a string - class name will be matched on the TH for the column</li>
+                *     <li>0 or a positive integer - column index counting from the left</li>
+                *     <li>a negative integer - column index counting from the right</li>
+                *     <li>the string "_all" - all columns (i.e. assign a default)</li>
+                *   </ul>
+                *  @member
+                */
+               "aoColumnDefs": null,
+       
+       
+               /**
+                * Basically the same as oSearch, this parameter defines the individual column
+                * filtering state at initialisation time. The array must be of the same size 
+                * as the number of columns, and each element be an object with the parameters
+                * "sSearch" and "bEscapeRegex" (the latter is optional). 'null' is also
+                * accepted and the default will be used.
+                *  @type array
+                *  @default []
+                *  @dtopt Option
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoSearchCols": [
+                *          null,
+                *          { "sSearch": "My filter" },
+                *          null,
+                *          { "sSearch": "^[0-9]", "bEscapeRegex": false }
+                *        ]
+                *      } );
+                *    } )
+                */
+               "aoSearchCols": [],
+       
+       
+               /**
+                * An array of CSS classes that should be applied to displayed rows. This 
+                * array may be of any length, and DataTables will apply each class 
+                * sequentially, looping when required.
+                *  @type array
+                *  @default null <i>Will take the values determined by the oClasses.sStripe*
+                *    options</i>
+                *  @dtopt Option
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "asStripeClasses": [ 'strip1', 'strip2', 'strip3' ]
+                *      } );
+                *    } )
+                */
+               "asStripeClasses": null,
+       
+       
+               /**
+                * Enable or disable automatic column width calculation. This can be disabled
+                * as an optimisation (it takes some time to calculate the widths) if the
+                * tables widths are passed in using aoColumns.
+                *  @type boolean
+                *  @default true
+                *  @dtopt Features
+                * 
+                *  @example
+                *    $(document).ready( function () {
+                *      $('#example').dataTable( {
+                *        "bAutoWidth": false
+                *      } );
+                *    } );
+                */
+               "bAutoWidth": true,
+       
+       
+               /**
+                * Deferred rendering can provide DataTables with a huge speed boost when you
+                * are using an Ajax or JS data source for the table. This option, when set to
+                * true, will cause DataTables to defer the creation of the table elements for
+                * each row until they are needed for a draw - saving a significant amount of
+                * time.
+                *  @type boolean
+                *  @default false
+                *  @dtopt Features
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      var oTable = $('#example').dataTable( {
+                *        "sAjaxSource": "sources/arrays.txt",
+                *        "bDeferRender": true
+                *      } );
+                *    } );
+                */
+               "bDeferRender": false,
+       
+       
+               /**
+                * Replace a DataTable which matches the given selector and replace it with 
+                * one which has the properties of the new initialisation object passed. If no
+                * table matches the selector, then the new DataTable will be constructed as
+                * per normal.
+                *  @type boolean
+                *  @default false
+                *  @dtopt Options
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "sScrollY": "200px",
+                *        "bPaginate": false
+                *      } );
+                *      
+                *      // Some time later....
+                *      $('#example').dataTable( {
+                *        "bFilter": false,
+                *        "bDestroy": true
+                *      } );
+                *    } );
+                */
+               "bDestroy": false,
+       
+       
+               /**
+                * Enable or disable filtering of data. Filtering in DataTables is "smart" in
+                * that it allows the end user to input multiple words (space separated) and
+                * will match a row containing those words, even if not in the order that was
+                * specified (this allow matching across multiple columns). Note that if you
+                * wish to use filtering in DataTables this must remain 'true' - to remove the
+                * default filtering input box and retain filtering abilities, please use
+                * {@link DataTable.defaults.sDom}.
+                *  @type boolean
+                *  @default true
+                *  @dtopt Features
+                * 
+                *  @example
+                *    $(document).ready( function () {
+                *      $('#example').dataTable( {
+                *        "bFilter": false
+                *      } );
+                *    } );
+                */
+               "bFilter": true,
+       
+       
+               /**
+                * Enable or disable the table information display. This shows information 
+                * about the data that is currently visible on the page, including information
+                * about filtered data if that action is being performed.
+                *  @type boolean
+                *  @default true
+                *  @dtopt Features
+                * 
+                *  @example
+                *    $(document).ready( function () {
+                *      $('#example').dataTable( {
+                *        "bInfo": false
+                *      } );
+                *    } );
+                */
+               "bInfo": true,
+       
+       
+               /**
+                * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some
+                * slightly different and additional mark-up from what DataTables has
+                * traditionally used).
+                *  @type boolean
+                *  @default false
+                *  @dtopt Features
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "bJQueryUI": true
+                *      } );
+                *    } );
+                */
+               "bJQueryUI": false,
+       
+       
+               /**
+                * Allows the end user to select the size of a formatted page from a select
+                * menu (sizes are 10, 25, 50 and 100). Requires pagination (bPaginate).
+                *  @type boolean
+                *  @default true
+                *  @dtopt Features
+                * 
+                *  @example
+                *    $(document).ready( function () {
+                *      $('#example').dataTable( {
+                *        "bLengthChange": false
+                *      } );
+                *    } );
+                */
+               "bLengthChange": true,
+       
+       
+               /**
+                * Enable or disable pagination.
+                *  @type boolean
+                *  @default true
+                *  @dtopt Features
+                * 
+                *  @example
+                *    $(document).ready( function () {
+                *      $('#example').dataTable( {
+                *        "bPaginate": false
+                *      } );
+                *    } );
+                */
+               "bPaginate": true,
+       
+       
+               /**
+                * Enable or disable the display of a 'processing' indicator when the table is
+                * being processed (e.g. a sort). This is particularly useful for tables with
+                * large amounts of data where it can take a noticeable amount of time to sort
+                * the entries.
+                *  @type boolean
+                *  @default false
+                *  @dtopt Features
+                * 
+                *  @example
+                *    $(document).ready( function () {
+                *      $('#example').dataTable( {
+                *        "bProcessing": true
+                *      } );
+                *    } );
+                */
+               "bProcessing": false,
+       
+       
+               /**
+                * Retrieve the DataTables object for the given selector. Note that if the
+                * table has already been initialised, this parameter will cause DataTables
+                * to simply return the object that has already been set up - it will not take
+                * account of any changes you might have made to the initialisation object
+                * passed to DataTables (setting this parameter to true is an acknowledgement
+                * that you understand this). bDestroy can be used to reinitialise a table if
+                * you need.
+                *  @type boolean
+                *  @default false
+                *  @dtopt Options
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      initTable();
+                *      tableActions();
+                *    } );
+                *    
+                *    function initTable ()
+                *    {
+                *      return $('#example').dataTable( {
+                *        "sScrollY": "200px",
+                *        "bPaginate": false,
+                *        "bRetrieve": true
+                *      } );
+                *    }
+                *    
+                *    function tableActions ()
+                *    {
+                *      var oTable = initTable();
+                *      // perform API operations with oTable 
+                *    }
+                */
+               "bRetrieve": false,
+       
+       
+               /**
+                * Indicate if DataTables should be allowed to set the padding / margin
+                * etc for the scrolling header elements or not. Typically you will want
+                * this.
+                *  @type boolean
+                *  @default true
+                *  @dtopt Options
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "bScrollAutoCss": false,
+                *        "sScrollY": "200px"
+                *      } );
+                *    } );
+                */
+               "bScrollAutoCss": true,
+       
+       
+               /**
+                * When vertical (y) scrolling is enabled, DataTables will force the height of
+                * the table's viewport to the given height at all times (useful for layout).
+                * However, this can look odd when filtering data down to a small data set,
+                * and the footer is left "floating" further down. This parameter (when
+                * enabled) will cause DataTables to collapse the table's viewport down when
+                * the result set will fit within the given Y height.
+                *  @type boolean
+                *  @default false
+                *  @dtopt Options
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "sScrollY": "200",
+                *        "bScrollCollapse": true
+                *      } );
+                *    } );
+                */
+               "bScrollCollapse": false,
+       
+       
+               /**
+                * Enable infinite scrolling for DataTables (to be used in combination with
+                * sScrollY). Infinite scrolling means that DataTables will continually load
+                * data as a user scrolls through a table, which is very useful for large
+                * dataset. This cannot be used with pagination, which is automatically
+                * disabled. Note - the Scroller extra for DataTables is recommended in
+                * in preference to this option.
+                *  @type boolean
+                *  @default false
+                *  @dtopt Features
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "bScrollInfinite": true,
+                *        "bScrollCollapse": true,
+                *        "sScrollY": "200px"
+                *      } );
+                *    } );
+                */
+               "bScrollInfinite": false,
+       
+       
+               /**
+                * Configure DataTables to use server-side processing. Note that the
+                * sAjaxSource parameter must also be given in order to give DataTables a
+                * source to obtain the required data for each draw.
+                *  @type boolean
+                *  @default false
+                *  @dtopt Features
+                *  @dtopt Server-side
+                * 
+                *  @example
+                *    $(document).ready( function () {
+                *      $('#example').dataTable( {
+                *        "bServerSide": true,
+                *        "sAjaxSource": "xhr.php"
+                *      } );
+                *    } );
+                */
+               "bServerSide": false,
+       
+       
+               /**
+                * Enable or disable sorting of columns. Sorting of individual columns can be
+                * disabled by the "bSortable" option for each column.
+                *  @type boolean
+                *  @default true
+                *  @dtopt Features
+                * 
+                *  @example
+                *    $(document).ready( function () {
+                *      $('#example').dataTable( {
+                *        "bSort": false
+                *      } );
+                *    } );
+                */
+               "bSort": true,
+       
+       
+               /**
+                * Allows control over whether DataTables should use the top (true) unique
+                * cell that is found for a single column, or the bottom (false - default).
+                * This is useful when using complex headers.
+                *  @type boolean
+                *  @default false
+                *  @dtopt Options
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "bSortCellsTop": true
+                *      } );
+                *    } );
+                */
+               "bSortCellsTop": false,
+       
+       
+               /**
+                * Enable or disable the addition of the classes 'sorting_1', 'sorting_2' and
+                * 'sorting_3' to the columns which are currently being sorted on. This is
+                * presented as a feature switch as it can increase processing time (while
+                * classes are removed and added) so for large data sets you might want to
+                * turn this off.
+                *  @type boolean
+                *  @default true
+                *  @dtopt Features
+                * 
+                *  @example
+                *    $(document).ready( function () {
+                *      $('#example').dataTable( {
+                *        "bSortClasses": false
+                *      } );
+                *    } );
+                */
+               "bSortClasses": true,
+       
+       
+               /**
+                * Enable or disable state saving. When enabled a cookie will be used to save
+                * table display information such as pagination information, display length,
+                * filtering and sorting. As such when the end user reloads the page the
+                * display display will match what thy had previously set up.
+                *  @type boolean
+                *  @default false
+                *  @dtopt Features
+                * 
+                *  @example
+                *    $(document).ready( function () {
+                *      $('#example').dataTable( {
+                *        "bStateSave": true
+                *      } );
+                *    } );
+                */
+               "bStateSave": false,
+       
+       
+               /**
+                * Customise the cookie and / or the parameters being stored when using
+                * DataTables with state saving enabled. This function is called whenever
+                * the cookie is modified, and it expects a fully formed cookie string to be
+                * returned. Note that the data object passed in is a Javascript object which
+                * must be converted to a string (JSON.stringify for example).
+                *  @type function
+                *  @param {string} sName Name of the cookie defined by DataTables
+                *  @param {object} oData Data to be stored in the cookie
+                *  @param {string} sExpires Cookie expires string
+                *  @param {string} sPath Path of the cookie to set
+                *  @returns {string} Cookie formatted string (which should be encoded by
+                *    using encodeURIComponent())
+                *  @dtopt Callbacks
+                * 
+                *  @example
+                *    $(document).ready( function () {
+                *      $('#example').dataTable( {
+                *        "fnCookieCallback": function (sName, oData, sExpires, sPath) {
+                *          // Customise oData or sName or whatever else here
+                *          return sName + "="+JSON.stringify(oData)+"; expires=" + sExpires +"; path=" + sPath;
+                *        }
+                *      } );
+                *    } );
+                */
+               "fnCookieCallback": null,
+       
+       
+               /**
+                * This function is called when a TR element is created (and all TD child
+                * elements have been inserted), or registered if using a DOM source, allowing
+                * manipulation of the TR element (adding classes etc).
+                *  @type function
+                *  @param {node} nRow "TR" element for the current row
+                *  @param {array} aData Raw data array for this row
+                *  @param {int} iDataIndex The index of this row in aoData
+                *  @dtopt Callbacks
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "fnCreatedRow": function( nRow, aData, iDataIndex ) {
+                *          // Bold the grade for all 'A' grade browsers
+                *          if ( aData[4] == "A" )
+                *          {
+                *            $('td:eq(4)', nRow).html( '<b>A</b>' );
+                *          }
+                *        }
+                *      } );
+                *    } );
+                */
+               "fnCreatedRow": null,
+       
+       
+               /**
+                * This function is called on every 'draw' event, and allows you to
+                * dynamically modify any aspect you want about the created DOM.
+                *  @type function
+                *  @param {object} oSettings DataTables settings object
+                *  @dtopt Callbacks
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "fnDrawCallback": function( oSettings ) {
+                *          alert( 'DataTables has redrawn the table' );
+                *        }
+                *      } );
+                *    } );
+                */
+               "fnDrawCallback": null,
+       
+       
+               /**
+                * Identical to fnHeaderCallback() but for the table footer this function
+                * allows you to modify the table footer on every 'draw' even.
+                *  @type function
+                *  @param {node} nFoot "TR" element for the footer
+                *  @param {array} aData Full table data (as derived from the original HTML)
+                *  @param {int} iStart Index for the current display starting point in the 
+                *    display array
+                *  @param {int} iEnd Index for the current display ending point in the 
+                *    display array
+                *  @param {array int} aiDisplay Index array to translate the visual position
+                *    to the full data array
+                *  @dtopt Callbacks
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "fnFooterCallback": function( nFoot, aData, iStart, iEnd, aiDisplay ) {
+                *          nFoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+iStart;
+                *        }
+                *      } );
+                *    } )
+                */
+               "fnFooterCallback": null,
+       
+       
+               /**
+                * When rendering large numbers in the information element for the table
+                * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers
+                * to have a comma separator for the 'thousands' units (e.g. 1 million is
+                * rendered as "1,000,000") to help readability for the end user. This
+                * function will override the default method DataTables uses.
+                *  @type function
+                *  @member
+                *  @param {int} iIn number to be formatted
+                *  @returns {string} formatted string for DataTables to show the number
+                *  @dtopt Callbacks
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "fnFormatNumber": function ( iIn ) {
+                *          if ( iIn &lt; 1000 ) {
+                *            return iIn;
+                *          } else {
+                *            var 
+                *              s=(iIn+""), 
+                *              a=s.split(""), out="", 
+                *              iLen=s.length;
+                *            
+                *            for ( var i=0 ; i&lt;iLen ; i++ ) {
+                *              if ( i%3 === 0 &amp;&amp; i !== 0 ) {
+                *                out = "'"+out;
+                *              }
+                *              out = a[iLen-i-1]+out;
+                *            }
+                *          }
+                *          return out;
+                *        };
+                *      } );
+                *    } );
+                */
+               "fnFormatNumber": function ( iIn ) {
+                       if ( iIn < 1000 )
+                       {
+                               // A small optimisation for what is likely to be the majority of use cases
+                               return iIn;
+                       }
+       
+                       var s=(iIn+""), a=s.split(""), out="", iLen=s.length;
+                       
+                       for ( var i=0 ; i<iLen ; i++ )
+                       {
+                               if ( i%3 === 0 && i !== 0 )
+                               {
+                                       out = this.oLanguage.sInfoThousands+out;
+                               }
+                               out = a[iLen-i-1]+out;
+                       }
+                       return out;
+               },
+       
+       
+               /**
+                * This function is called on every 'draw' event, and allows you to
+                * dynamically modify the header row. This can be used to calculate and
+                * display useful information about the table.
+                *  @type function
+                *  @param {node} nHead "TR" element for the header
+                *  @param {array} aData Full table data (as derived from the original HTML)
+                *  @param {int} iStart Index for the current display starting point in the
+                *    display array
+                *  @param {int} iEnd Index for the current display ending point in the
+                *    display array
+                *  @param {array int} aiDisplay Index array to translate the visual position
+                *    to the full data array
+                *  @dtopt Callbacks
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "fnHeaderCallback": function( nHead, aData, iStart, iEnd, aiDisplay ) {
+                *          nHead.getElementsByTagName('th')[0].innerHTML = "Displaying "+(iEnd-iStart)+" records";
+                *        }
+                *      } );
+                *    } )
+                */
+               "fnHeaderCallback": null,
+       
+       
+               /**
+                * The information element can be used to convey information about the current
+                * state of the table. Although the internationalisation options presented by
+                * DataTables are quite capable of dealing with most customisations, there may
+                * be times where you wish to customise the string further. This callback
+                * allows you to do exactly that.
+                *  @type function
+                *  @param {object} oSettings DataTables settings object
+                *  @param {int} iStart Starting position in data for the draw
+                *  @param {int} iEnd End position in data for the draw
+                *  @param {int} iMax Total number of rows in the table (regardless of
+                *    filtering)
+                *  @param {int} iTotal Total number of rows in the data set, after filtering
+                *  @param {string} sPre The string that DataTables has formatted using it's
+                *    own rules
+                *  @returns {string} The string to be displayed in the information element.
+                *  @dtopt Callbacks
+                * 
+                *  @example
+                *    $('#example').dataTable( {
+                *      "fnInfoCallback": function( oSettings, iStart, iEnd, iMax, iTotal, sPre ) {
+                *        return iStart +" to "+ iEnd;
+                *      }
+                *    } );
+                */
+               "fnInfoCallback": null,
+       
+       
+               /**
+                * Called when the table has been initialised. Normally DataTables will
+                * initialise sequentially and there will be no need for this function,
+                * however, this does not hold true when using external language information
+                * since that is obtained using an async XHR call.
+                *  @type function
+                *  @param {object} oSettings DataTables settings object
+                *  @param {object} json The JSON object request from the server - only
+                *    present if client-side Ajax sourced data is used
+                *  @dtopt Callbacks
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "fnInitComplete": function(oSettings, json) {
+                *          alert( 'DataTables has finished its initialisation.' );
+                *        }
+                *      } );
+                *    } )
+                */
+               "fnInitComplete": null,
+       
+       
+               /**
+                * Called at the very start of each table draw and can be used to cancel the
+                * draw by returning false, any other return (including undefined) results in
+                * the full draw occurring).
+                *  @type function
+                *  @param {object} oSettings DataTables settings object
+                *  @returns {boolean} False will cancel the draw, anything else (including no
+                *    return) will allow it to complete.
+                *  @dtopt Callbacks
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "fnPreDrawCallback": function( oSettings ) {
+                *          if ( $('#test').val() == 1 ) {
+                *            return false;
+                *          }
+                *        }
+                *      } );
+                *    } );
+                */
+               "fnPreDrawCallback": null,
+       
+       
+               /**
+                * This function allows you to 'post process' each row after it have been
+                * generated for each table draw, but before it is rendered on screen. This
+                * function might be used for setting the row class name etc.
+                *  @type function
+                *  @param {node} nRow "TR" element for the current row
+                *  @param {array} aData Raw data array for this row
+                *  @param {int} iDisplayIndex The display index for the current table draw
+                *  @param {int} iDisplayIndexFull The index of the data in the full list of
+                *    rows (after filtering)
+                *  @dtopt Callbacks
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "fnRowCallback": function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) {
+                *          // Bold the grade for all 'A' grade browsers
+                *          if ( aData[4] == "A" )
+                *          {
+                *            $('td:eq(4)', nRow).html( '<b>A</b>' );
+                *          }
+                *        }
+                *      } );
+                *    } );
+                */
+               "fnRowCallback": null,
+       
+       
+               /**
+                * This parameter allows you to override the default function which obtains
+                * the data from the server ($.getJSON) so something more suitable for your
+                * application. For example you could use POST data, or pull information from
+                * a Gears or AIR database.
+                *  @type function
+                *  @member
+                *  @param {string} sSource HTTP source to obtain the data from (sAjaxSource)
+                *  @param {array} aoData A key/value pair object containing the data to send
+                *    to the server
+                *  @param {function} fnCallback to be called on completion of the data get
+                *    process that will draw the data on the page.
+                *  @param {object} oSettings DataTables settings object
+                *  @dtopt Callbacks
+                *  @dtopt Server-side
+                * 
+                *  @example
+                *    // POST data to server
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "bProcessing": true,
+                *        "bServerSide": true,
+                *        "sAjaxSource": "xhr.php",
+                *        "fnServerData": function ( sSource, aoData, fnCallback, oSettings ) {
+                *          oSettings.jqXHR = $.ajax( {
+                *            "dataType": 'json', 
+                *            "type": "POST", 
+                *            "url": sSource, 
+                *            "data": aoData, 
+                *            "success": fnCallback
+                *          } );
+                *        }
+                *      } );
+                *    } );
+                */
+               "fnServerData": function ( sUrl, aoData, fnCallback, oSettings ) {
+                       oSettings.jqXHR = $.ajax( {
+                               "url":  sUrl,
+                               "data": aoData,
+                               "success": function (json) {
+                                       if ( json.sError ) {
+                                               oSettings.oApi._fnLog( oSettings, 0, json.sError );
+                                       }
+                                       
+                                       $(oSettings.oInstance).trigger('xhr', [oSettings, json]);
+                                       fnCallback( json );
+                               },
+                               "dataType": "json",
+                               "cache": false,
+                               "type": oSettings.sServerMethod,
+                               "error": function (xhr, error, thrown) {
+                                       if ( error == "parsererror" ) {
+                                               oSettings.oApi._fnLog( oSettings, 0, "DataTables warning: JSON data from "+
+                                                       "server could not be parsed. This is caused by a JSON formatting error." );
+                                       }
+                               }
+                       } );
+               },
+       
+       
+               /**
+                * It is often useful to send extra data to the server when making an Ajax
+                * request - for example custom filtering information, and this callback
+                * function makes it trivial to send extra information to the server. The
+                * passed in parameter is the data set that has been constructed by
+                * DataTables, and you can add to this or modify it as you require.
+                *  @type function
+                *  @param {array} aoData Data array (array of objects which are name/value
+                *    pairs) that has been constructed by DataTables and will be sent to the
+                *    server. In the case of Ajax sourced data with server-side processing
+                *    this will be an empty array, for server-side processing there will be a
+                *    significant number of parameters!
+                *  @returns {undefined} Ensure that you modify the aoData array passed in,
+                *    as this is passed by reference.
+                *  @dtopt Callbacks
+                *  @dtopt Server-side
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "bProcessing": true,
+                *        "bServerSide": true,
+                *        "sAjaxSource": "scripts/server_processing.php",
+                *        "fnServerParams": function ( aoData ) {
+                *          aoData.push( { "name": "more_data", "value": "my_value" } );
+                *        }
+                *      } );
+                *    } );
+                */
+               "fnServerParams": null,
+       
+       
+               /**
+                * Load the table state. With this function you can define from where, and how, the
+                * state of a table is loaded. By default DataTables will load from its state saving
+                * cookie, but you might wish to use local storage (HTML5) or a server-side database.
+                *  @type function
+                *  @member
+                *  @param {object} oSettings DataTables settings object
+                *  @return {object} The DataTables state object to be loaded
+                *  @dtopt Callbacks
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "bStateSave": true,
+                *        "fnStateLoad": function (oSettings) {
+                *          var o;
+                *          
+                *          // Send an Ajax request to the server to get the data. Note that
+                *          // this is a synchronous request.
+                *          $.ajax( {
+                *            "url": "/state_load",
+                *            "async": false,
+                *            "dataType": "json",
+                *            "success": function (json) {
+                *              o = json;
+                *            }
+                *          } );
+                *          
+                *          return o;
+                *        }
+                *      } );
+                *    } );
+                */
+               "fnStateLoad": function ( oSettings ) {
+                       var sData = this.oApi._fnReadCookie( oSettings.sCookiePrefix+oSettings.sInstance );
+                       var oData;
+       
+                       try {
+                               oData = (typeof $.parseJSON === 'function') ? 
+                                       $.parseJSON(sData) : eval( '('+sData+')' );
+                       } catch (e) {
+                               oData = null;
+                       }
+       
+                       return oData;
+               },
+       
+       
+               /**
+                * Callback which allows modification of the saved state prior to loading that state.
+                * This callback is called when the table is loading state from the stored data, but
+                * prior to the settings object being modified by the saved state. Note that for 
+                * plug-in authors, you should use the 'stateLoadParams' event to load parameters for 
+                * a plug-in.
+                *  @type function
+                *  @param {object} oSettings DataTables settings object
+                *  @param {object} oData The state object that is to be loaded
+                *  @dtopt Callbacks
+                * 
+                *  @example
+                *    // Remove a saved filter, so filtering is never loaded
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "bStateSave": true,
+                *        "fnStateLoadParams": function (oSettings, oData) {
+                *          oData.oSearch.sSearch = "";
+                *        }
+                *      } );
+                *    } );
+                * 
+                *  @example
+                *    // Disallow state loading by returning false
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "bStateSave": true,
+                *        "fnStateLoadParams": function (oSettings, oData) {
+                *          return false;
+                *        }
+                *      } );
+                *    } );
+                */
+               "fnStateLoadParams": null,
+       
+       
+               /**
+                * Callback that is called when the state has been loaded from the state saving method
+                * and the DataTables settings object has been modified as a result of the loaded state.
+                *  @type function
+                *  @param {object} oSettings DataTables settings object
+                *  @param {object} oData The state object that was loaded
+                *  @dtopt Callbacks
+                * 
+                *  @example
+                *    // Show an alert with the filtering value that was saved
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "bStateSave": true,
+                *        "fnStateLoaded": function (oSettings, oData) {
+                *          alert( 'Saved filter was: '+oData.oSearch.sSearch );
+                *        }
+                *      } );
+                *    } );
+                */
+               "fnStateLoaded": null,
+       
+       
+               /**
+                * Save the table state. This function allows you to define where and how the state
+                * information for the table is stored - by default it will use a cookie, but you
+                * might want to use local storage (HTML5) or a server-side database.
+                *  @type function
+                *  @member
+                *  @param {object} oSettings DataTables settings object
+                *  @param {object} oData The state object to be saved
+                *  @dtopt Callbacks
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "bStateSave": true,
+                *        "fnStateSave": function (oSettings, oData) {
+                *          // Send an Ajax request to the server with the state object
+                *          $.ajax( {
+                *            "url": "/state_save",
+                *            "data": oData,
+                *            "dataType": "json",
+                *            "method": "POST"
+                *            "success": function () {}
+                *          } );
+                *        }
+                *      } );
+                *    } );
+                */
+               "fnStateSave": function ( oSettings, oData ) {
+                       this.oApi._fnCreateCookie( 
+                               oSettings.sCookiePrefix+oSettings.sInstance, 
+                               this.oApi._fnJsonString(oData), 
+                               oSettings.iCookieDuration, 
+                               oSettings.sCookiePrefix, 
+                               oSettings.fnCookieCallback
+                       );
+               },
+       
+       
+               /**
+                * Callback which allows modification of the state to be saved. Called when the table 
+                * has changed state a new state save is required. This method allows modification of
+                * the state saving object prior to actually doing the save, including addition or 
+                * other state properties or modification. Note that for plug-in authors, you should 
+                * use the 'stateSaveParams' event to save parameters for a plug-in.
+                *  @type function
+                *  @param {object} oSettings DataTables settings object
+                *  @param {object} oData The state object to be saved
+                *  @dtopt Callbacks
+                * 
+                *  @example
+                *    // Remove a saved filter, so filtering is never saved
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "bStateSave": true,
+                *        "fnStateSaveParams": function (oSettings, oData) {
+                *          oData.oSearch.sSearch = "";
+                *        }
+                *      } );
+                *    } );
+                */
+               "fnStateSaveParams": null,
+       
+       
+               /**
+                * Duration of the cookie which is used for storing session information. This
+                * value is given in seconds.
+                *  @type int
+                *  @default 7200 <i>(2 hours)</i>
+                *  @dtopt Options
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "iCookieDuration": 60*60*24; // 1 day
+                *      } );
+                *    } )
+                */
+               "iCookieDuration": 7200,
+       
+       
+               /**
+                * When enabled DataTables will not make a request to the server for the first
+                * page draw - rather it will use the data already on the page (no sorting etc
+                * will be applied to it), thus saving on an XHR at load time. iDeferLoading
+                * is used to indicate that deferred loading is required, but it is also used
+                * to tell DataTables how many records there are in the full table (allowing
+                * the information element and pagination to be displayed correctly). In the case
+                * where a filtering is applied to the table on initial load, this can be
+                * indicated by giving the parameter as an array, where the first element is
+                * the number of records available after filtering and the second element is the
+                * number of records without filtering (allowing the table information element
+                * to be shown correctly).
+                *  @type int | array
+                *  @default null
+                *  @dtopt Options
+                * 
+                *  @example
+                *    // 57 records available in the table, no filtering applied
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "bServerSide": true,
+                *        "sAjaxSource": "scripts/server_processing.php",
+                *        "iDeferLoading": 57
+                *      } );
+                *    } );
+                * 
+                *  @example
+                *    // 57 records after filtering, 100 without filtering (an initial filter applied)
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "bServerSide": true,
+                *        "sAjaxSource": "scripts/server_processing.php",
+                *        "iDeferLoading": [ 57, 100 ],
+                *        "oSearch": {
+                *          "sSearch": "my_filter"
+                *        }
+                *      } );
+                *    } );
+                */
+               "iDeferLoading": null,
+       
+       
+               /**
+                * Number of rows to display on a single page when using pagination. If
+                * feature enabled (bLengthChange) then the end user will be able to override
+                * this to a custom setting using a pop-up menu.
+                *  @type int
+                *  @default 10
+                *  @dtopt Options
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "iDisplayLength": 50
+                *      } );
+                *    } )
+                */
+               "iDisplayLength": 10,
+       
+       
+               /**
+                * Define the starting point for data display when using DataTables with
+                * pagination. Note that this parameter is the number of records, rather than
+                * the page number, so if you have 10 records per page and want to start on
+                * the third page, it should be "20".
+                *  @type int
+                *  @default 0
+                *  @dtopt Options
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "iDisplayStart": 20
+                *      } );
+                *    } )
+                */
+               "iDisplayStart": 0,
+       
+       
+               /**
+                * The scroll gap is the amount of scrolling that is left to go before
+                * DataTables will load the next 'page' of data automatically. You typically
+                * want a gap which is big enough that the scrolling will be smooth for the
+                * user, while not so large that it will load more data than need.
+                *  @type int
+                *  @default 100
+                *  @dtopt Options
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "bScrollInfinite": true,
+                *        "bScrollCollapse": true,
+                *        "sScrollY": "200px",
+                *        "iScrollLoadGap": 50
+                *      } );
+                *    } );
+                */
+               "iScrollLoadGap": 100,
+       
+       
+               /**
+                * By default DataTables allows keyboard navigation of the table (sorting, paging,
+                * and filtering) by adding a tabindex attribute to the required elements. This
+                * allows you to tab through the controls and press the enter key to activate them.
+                * The tabindex is default 0, meaning that the tab follows the flow of the document.
+                * You can overrule this using this parameter if you wish. Use a value of -1 to
+                * disable built-in keyboard navigation.
+                *  @type int
+                *  @default 0
+                *  @dtopt Options
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "iTabIndex": 1
+                *      } );
+                *    } );
+                */
+               "iTabIndex": 0,
+       
+       
+               /**
+                * All strings that DataTables uses in the user interface that it creates
+                * are defined in this object, allowing you to modified them individually or
+                * completely replace them all as required.
+                *  @namespace
+                */
+               "oLanguage": {
+                       /**
+                        * Strings that are used for WAI-ARIA labels and controls only (these are not
+                        * actually visible on the page, but will be read by screenreaders, and thus
+                        * must be internationalised as well).
+                        *  @namespace
+                        */
+                       "oAria": {
+                               /**
+                                * ARIA label that is added to the table headers when the column may be
+                                * sorted ascending by activing the column (click or return when focused).
+                                * Note that the column header is prefixed to this string.
+                                *  @type string
+                                *  @default : activate to sort column ascending
+                                *  @dtopt Language
+                                * 
+                                *  @example
+                                *    $(document).ready( function() {
+                                *      $('#example').dataTable( {
+                                *        "oLanguage": {
+                                *          "oAria": {
+                                *            "sSortAscending": " - click/return to sort ascending"
+                                *          }
+                                *        }
+                                *      } );
+                                *    } );
+                                */
+                               "sSortAscending": ": activate to sort column ascending",
+       
+                               /**
+                                * ARIA label that is added to the table headers when the column may be
+                                * sorted descending by activing the column (click or return when focused).
+                                * Note that the column header is prefixed to this string.
+                                *  @type string
+                                *  @default : activate to sort column ascending
+                                *  @dtopt Language
+                                * 
+                                *  @example
+                                *    $(document).ready( function() {
+                                *      $('#example').dataTable( {
+                                *        "oLanguage": {
+                                *          "oAria": {
+                                *            "sSortDescending": " - click/return to sort descending"
+                                *          }
+                                *        }
+                                *      } );
+                                *    } );
+                                */
+                               "sSortDescending": ": activate to sort column descending"
+                       },
+       
+                       /**
+                        * Pagination string used by DataTables for the two built-in pagination
+                        * control types ("two_button" and "full_numbers")
+                        *  @namespace
+                        */
+                       "oPaginate": {
+                               /**
+                                * Text to use when using the 'full_numbers' type of pagination for the
+                                * button to take the user to the first page.
+                                *  @type string
+                                *  @default First
+                                *  @dtopt Language
+                                * 
+                                *  @example
+                                *    $(document).ready( function() {
+                                *      $('#example').dataTable( {
+                                *        "oLanguage": {
+                                *          "oPaginate": {
+                                *            "sFirst": "First page"
+                                *          }
+                                *        }
+                                *      } );
+                                *    } );
+                                */
+                               "sFirst": "First",
+                       
+                       
+                               /**
+                                * Text to use when using the 'full_numbers' type of pagination for the
+                                * button to take the user to the last page.
+                                *  @type string
+                                *  @default Last
+                                *  @dtopt Language
+                                * 
+                                *  @example
+                                *    $(document).ready( function() {
+                                *      $('#example').dataTable( {
+                                *        "oLanguage": {
+                                *          "oPaginate": {
+                                *            "sLast": "Last page"
+                                *          }
+                                *        }
+                                *      } );
+                                *    } );
+                                */
+                               "sLast": "Last",
+                       
+                       
+                               /**
+                                * Text to use for the 'next' pagination button (to take the user to the 
+                                * next page).
+                                *  @type string
+                                *  @default Next
+                                *  @dtopt Language
+                                * 
+                                *  @example
+                                *    $(document).ready( function() {
+                                *      $('#example').dataTable( {
+                                *        "oLanguage": {
+                                *          "oPaginate": {
+                                *            "sNext": "Next page"
+                                *          }
+                                *        }
+                                *      } );
+                                *    } );
+                                */
+                               "sNext": "Next",
+                       
+                       
+                               /**
+                                * Text to use for the 'previous' pagination button (to take the user to  
+                                * the previous page).
+                                *  @type string
+                                *  @default Previous
+                                *  @dtopt Language
+                                * 
+                                *  @example
+                                *    $(document).ready( function() {
+                                *      $('#example').dataTable( {
+                                *        "oLanguage": {
+                                *          "oPaginate": {
+                                *            "sPrevious": "Previous page"
+                                *          }
+                                *        }
+                                *      } );
+                                *    } );
+                                */
+                               "sPrevious": "Previous"
+                       },
+               
+                       /**
+                        * This string is shown in preference to sZeroRecords when the table is
+                        * empty of data (regardless of filtering). Note that this is an optional
+                        * parameter - if it is not given, the value of sZeroRecords will be used
+                        * instead (either the default or given value).
+                        *  @type string
+                        *  @default No data available in table
+                        *  @dtopt Language
+                        * 
+                        *  @example
+                        *    $(document).ready( function() {
+                        *      $('#example').dataTable( {
+                        *        "oLanguage": {
+                        *          "sEmptyTable": "No data available in table"
+                        *        }
+                        *      } );
+                        *    } );
+                        */
+                       "sEmptyTable": "No data available in table",
+               
+               
+                       /**
+                        * This string gives information to the end user about the information that 
+                        * is current on display on the page. The _START_, _END_ and _TOTAL_ 
+                        * variables are all dynamically replaced as the table display updates, and 
+                        * can be freely moved or removed as the language requirements change.
+                        *  @type string
+                        *  @default Showing _START_ to _END_ of _TOTAL_ entries
+                        *  @dtopt Language
+                        * 
+                        *  @example
+                        *    $(document).ready( function() {
+                        *      $('#example').dataTable( {
+                        *        "oLanguage": {
+                        *          "sInfo": "Got a total of _TOTAL_ entries to show (_START_ to _END_)"
+                        *        }
+                        *      } );
+                        *    } );
+                        */
+                       "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
+               
+               
+                       /**
+                        * Display information string for when the table is empty. Typically the 
+                        * format of this string should match sInfo.
+                        *  @type string
+                        *  @default Showing 0 to 0 of 0 entries
+                        *  @dtopt Language
+                        * 
+                        *  @example
+                        *    $(document).ready( function() {
+                        *      $('#example').dataTable( {
+                        *        "oLanguage": {
+                        *          "sInfoEmpty": "No entries to show"
+                        *        }
+                        *      } );
+                        *    } );
+                        */
+                       "sInfoEmpty": "Showing 0 to 0 of 0 entries",
+               
+               
+                       /**
+                        * When a user filters the information in a table, this string is appended 
+                        * to the information (sInfo) to give an idea of how strong the filtering 
+                        * is. The variable _MAX_ is dynamically updated.
+                        *  @type string
+                        *  @default (filtered from _MAX_ total entries)
+                        *  @dtopt Language
+                        * 
+                        *  @example
+                        *    $(document).ready( function() {
+                        *      $('#example').dataTable( {
+                        *        "oLanguage": {
+                        *          "sInfoFiltered": " - filtering from _MAX_ records"
+                        *        }
+                        *      } );
+                        *    } );
+                        */
+                       "sInfoFiltered": "(filtered from _MAX_ total entries)",
+               
+               
+                       /**
+                        * If can be useful to append extra information to the info string at times,
+                        * and this variable does exactly that. This information will be appended to
+                        * the sInfo (sInfoEmpty and sInfoFiltered in whatever combination they are
+                        * being used) at all times.
+                        *  @type string
+                        *  @default <i>Empty string</i>
+                        *  @dtopt Language
+                        * 
+                        *  @example
+                        *    $(document).ready( function() {
+                        *      $('#example').dataTable( {
+                        *        "oLanguage": {
+                        *          "sInfoPostFix": "All records shown are derived from real information."
+                        *        }
+                        *      } );
+                        *    } );
+                        */
+                       "sInfoPostFix": "",
+               
+               
+                       /**
+                        * DataTables has a build in number formatter (fnFormatNumber) which is used
+                        * to format large numbers that are used in the table information. By
+                        * default a comma is used, but this can be trivially changed to any
+                        * character you wish with this parameter.
+                        *  @type string
+                        *  @default ,
+                        *  @dtopt Language
+                        * 
+                        *  @example
+                        *    $(document).ready( function() {
+                        *      $('#example').dataTable( {
+                        *        "oLanguage": {
+                        *          "sInfoThousands": "'"
+                        *        }
+                        *      } );
+                        *    } );
+                        */
+                       "sInfoThousands": ",",
+               
+               
+                       /**
+                        * Detail the action that will be taken when the drop down menu for the
+                        * pagination length option is changed. The '_MENU_' variable is replaced
+                        * with a default select list of 10, 25, 50 and 100, and can be replaced
+                        * with a custom select box if required.
+                        *  @type string
+                        *  @default Show _MENU_ entries
+                        *  @dtopt Language
+                        * 
+                        *  @example
+                        *    // Language change only
+                        *    $(document).ready( function() {
+                        *      $('#example').dataTable( {
+                        *        "oLanguage": {
+                        *          "sLengthMenu": "Display _MENU_ records"
+                        *        }
+                        *      } );
+                        *    } );
+                        *    
+                        *  @example
+                        *    // Language and options change
+                        *    $(document).ready( function() {
+                        *      $('#example').dataTable( {
+                        *        "oLanguage": {
+                        *          "sLengthMenu": 'Display <select>'+
+                        *            '<option value="10">10</option>'+
+                        *            '<option value="20">20</option>'+
+                        *            '<option value="30">30</option>'+
+                        *            '<option value="40">40</option>'+
+                        *            '<option value="50">50</option>'+
+                        *            '<option value="-1">All</option>'+
+                        *            '</select> records'
+                        *        }
+                        *      } );
+                        *    } );
+                        */
+                       "sLengthMenu": "Show _MENU_ entries",
+               
+               
+                       /**
+                        * When using Ajax sourced data and during the first draw when DataTables is
+                        * gathering the data, this message is shown in an empty row in the table to
+                        * indicate to the end user the the data is being loaded. Note that this
+                        * parameter is not used when loading data by server-side processing, just
+                        * Ajax sourced data with client-side processing.
+                        *  @type string
+                        *  @default Loading...
+                        *  @dtopt Language
+                        * 
+                        *  @example
+                        *    $(document).ready( function() {
+                        *      $('#example').dataTable( {
+                        *        "oLanguage": {
+                        *          "sLoadingRecords": "Please wait - loading..."
+                        *        }
+                        *      } );
+                        *    } );
+                        */
+                       "sLoadingRecords": "Loading...",
+               
+               
+                       /**
+                        * Text which is displayed when the table is processing a user action
+                        * (usually a sort command or similar).
+                        *  @type string
+                        *  @default Processing...
+                        *  @dtopt Language
+                        * 
+                        *  @example
+                        *    $(document).ready( function() {
+                        *      $('#example').dataTable( {
+                        *        "oLanguage": {
+                        *          "sProcessing": "DataTables is currently busy"
+                        *        }
+                        *      } );
+                        *    } );
+                        */
+                       "sProcessing": "Processing...",
+               
+               
+                       /**
+                        * Details the actions that will be taken when the user types into the
+                        * filtering input text box. The variable "_INPUT_", if used in the string,
+                        * is replaced with the HTML text box for the filtering input allowing
+                        * control over where it appears in the string. If "_INPUT_" is not given
+                        * then the input box is appended to the string automatically.
+                        *  @type string
+                        *  @default Search:
+                        *  @dtopt Language
+                        * 
+                        *  @example
+                        *    // Input text box will be appended at the end automatically
+                        *    $(document).ready( function() {
+                        *      $('#example').dataTable( {
+                        *        "oLanguage": {
+                        *          "sSearch": "Filter records:"
+                        *        }
+                        *      } );
+                        *    } );
+                        *    
+                        *  @example
+                        *    // Specify where the filter should appear
+                        *    $(document).ready( function() {
+                        *      $('#example').dataTable( {
+                        *        "oLanguage": {
+                        *          "sSearch": "Apply filter _INPUT_ to table"
+                        *        }
+                        *      } );
+                        *    } );
+                        */
+                       "sSearch": "Search:",
+               
+               
+                       /**
+                        * All of the language information can be stored in a file on the
+                        * server-side, which DataTables will look up if this parameter is passed.
+                        * It must store the URL of the language file, which is in a JSON format,
+                        * and the object has the same properties as the oLanguage object in the
+                        * initialiser object (i.e. the above parameters). Please refer to one of
+                        * the example language files to see how this works in action.
+                        *  @type string
+                        *  @default <i>Empty string - i.e. disabled</i>
+                        *  @dtopt Language
+                        * 
+                        *  @example
+                        *    $(document).ready( function() {
+                        *      $('#example').dataTable( {
+                        *        "oLanguage": {
+                        *          "sUrl": "http://www.sprymedia.co.uk/dataTables/lang.txt"
+                        *        }
+                        *      } );
+                        *    } );
+                        */
+                       "sUrl": "",
+               
+               
+                       /**
+                        * Text shown inside the table records when the is no information to be
+                        * displayed after filtering. sEmptyTable is shown when there is simply no
+                        * information in the table at all (regardless of filtering).
+                        *  @type string
+                        *  @default No matching records found
+                        *  @dtopt Language
+                        * 
+                        *  @example
+                        *    $(document).ready( function() {
+                        *      $('#example').dataTable( {
+                        *        "oLanguage": {
+                        *          "sZeroRecords": "No records to display"
+                        *        }
+                        *      } );
+                        *    } );
+                        */
+                       "sZeroRecords": "No matching records found"
+               },
+       
+       
+               /**
+                * This parameter allows you to have define the global filtering state at
+                * initialisation time. As an object the "sSearch" parameter must be
+                * defined, but all other parameters are optional. When "bRegex" is true,
+                * the search string will be treated as a regular expression, when false
+                * (default) it will be treated as a straight string. When "bSmart"
+                * DataTables will use it's smart filtering methods (to word match at
+                * any point in the data), when false this will not be done.
+                *  @namespace
+                *  @extends DataTable.models.oSearch
+                *  @dtopt Options
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "oSearch": {"sSearch": "Initial search"}
+                *      } );
+                *    } )
+                */
+               "oSearch": $.extend( {}, DataTable.models.oSearch ),
+       
+       
+               /**
+                * By default DataTables will look for the property 'aaData' when obtaining
+                * data from an Ajax source or for server-side processing - this parameter
+                * allows that property to be changed. You can use Javascript dotted object
+                * notation to get a data source for multiple levels of nesting.
+                *  @type string
+                *  @default aaData
+                *  @dtopt Options
+                *  @dtopt Server-side
+                * 
+                *  @example
+                *    // Get data from { "data": [...] }
+                *    $(document).ready( function() {
+                *      var oTable = $('#example').dataTable( {
+                *        "sAjaxSource": "sources/data.txt",
+                *        "sAjaxDataProp": "data"
+                *      } );
+                *    } );
+                *    
+                *  @example
+                *    // Get data from { "data": { "inner": [...] } }
+                *    $(document).ready( function() {
+                *      var oTable = $('#example').dataTable( {
+                *        "sAjaxSource": "sources/data.txt",
+                *        "sAjaxDataProp": "data.inner"
+                *      } );
+                *    } );
+                */
+               "sAjaxDataProp": "aaData",
+       
+       
+               /**
+                * You can instruct DataTables to load data from an external source using this
+                * parameter (use aData if you want to pass data in you already have). Simply
+                * provide a url a JSON object can be obtained from. This object must include
+                * the parameter 'aaData' which is the data source for the table.
+                *  @type string
+                *  @default null
+                *  @dtopt Options
+                *  @dtopt Server-side
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "sAjaxSource": "http://www.sprymedia.co.uk/dataTables/json.php"
+                *      } );
+                *    } )
+                */
+               "sAjaxSource": null,
+       
+       
+               /**
+                * This parameter can be used to override the default prefix that DataTables
+                * assigns to a cookie when state saving is enabled.
+                *  @type string
+                *  @default SpryMedia_DataTables_
+                *  @dtopt Options
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "sCookiePrefix": "my_datatable_",
+                *      } );
+                *    } );
+                */
+               "sCookiePrefix": "SpryMedia_DataTables_",
+       
+       
+               /**
+                * This initialisation variable allows you to specify exactly where in the
+                * DOM you want DataTables to inject the various controls it adds to the page
+                * (for example you might want the pagination controls at the top of the
+                * table). DIV elements (with or without a custom class) can also be added to
+                * aid styling. The follow syntax is used:
+                *   <ul>
+                *     <li>The following options are allowed:   
+                *       <ul>
+                *         <li>'l' - Length changing</li
+                *         <li>'f' - Filtering input</li>
+                *         <li>'t' - The table!</li>
+                *         <li>'i' - Information</li>
+                *         <li>'p' - Pagination</li>
+                *         <li>'r' - pRocessing</li>
+                *       </ul>
+                *     </li>
+                *     <li>The following constants are allowed:
+                *       <ul>
+                *         <li>'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>
+                *         <li>'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>
+                *       </ul>
+                *     </li>
+                *     <li>The following syntax is expected:
+                *       <ul>
+                *         <li>'&lt;' and '&gt;' - div elements</li>
+                *         <li>'&lt;"class" and '&gt;' - div with a class</li>
+                *         <li>'&lt;"#id" and '&gt;' - div with an ID</li>
+                *       </ul>
+                *     </li>
+                *     <li>Examples:
+                *       <ul>
+                *         <li>'&lt;"wrapper"flipt&gt;'</li>
+                *         <li>'&lt;lf&lt;t&gt;ip&gt;'</li>
+                *       </ul>
+                *     </li>
+                *   </ul>
+                *  @type string
+                *  @default lfrtip <i>(when bJQueryUI is false)</i> <b>or</b> 
+                *    <"H"lfr>t<"F"ip> <i>(when bJQueryUI is true)</i>
+                *  @dtopt Options
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "sDom": '&lt;"top"i&gt;rt&lt;"bottom"flp&gt;&lt;"clear"&gt;'
+                *      } );
+                *    } );
+                */
+               "sDom": "lfrtip",
+       
+       
+               /**
+                * DataTables features two different built-in pagination interaction methods
+                * ('two_button' or 'full_numbers') which present different page controls to
+                * the end user. Further methods can be added using the API (see below).
+                *  @type string
+                *  @default two_button
+                *  @dtopt Options
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "sPaginationType": "full_numbers"
+                *      } );
+                *    } )
+                */
+               "sPaginationType": "two_button",
+       
+       
+               /**
+                * Enable horizontal scrolling. When a table is too wide to fit into a certain
+                * layout, or you have a large number of columns in the table, you can enable
+                * x-scrolling to show the table in a viewport, which can be scrolled. This
+                * property can be any CSS unit, or a number (in which case it will be treated
+                * as a pixel measurement).
+                *  @type string
+                *  @default <i>blank string - i.e. disabled</i>
+                *  @dtopt Features
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "sScrollX": "100%",
+                *        "bScrollCollapse": true
+                *      } );
+                *    } );
+                */
+               "sScrollX": "",
+       
+       
+               /**
+                * This property can be used to force a DataTable to use more width than it
+                * might otherwise do when x-scrolling is enabled. For example if you have a
+                * table which requires to be well spaced, this parameter is useful for
+                * "over-sizing" the table, and thus forcing scrolling. This property can by
+                * any CSS unit, or a number (in which case it will be treated as a pixel
+                * measurement).
+                *  @type string
+                *  @default <i>blank string - i.e. disabled</i>
+                *  @dtopt Options
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "sScrollX": "100%",
+                *        "sScrollXInner": "110%"
+                *      } );
+                *    } );
+                */
+               "sScrollXInner": "",
+       
+       
+               /**
+                * Enable vertical scrolling. Vertical scrolling will constrain the DataTable
+                * to the given height, and enable scrolling for any data which overflows the
+                * current viewport. This can be used as an alternative to paging to display
+                * a lot of data in a small area (although paging and scrolling can both be
+                * enabled at the same time). This property can be any CSS unit, or a number
+                * (in which case it will be treated as a pixel measurement).
+                *  @type string
+                *  @default <i>blank string - i.e. disabled</i>
+                *  @dtopt Features
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "sScrollY": "200px",
+                *        "bPaginate": false
+                *      } );
+                *    } );
+                */
+               "sScrollY": "",
+       
+       
+               /**
+                * Set the HTTP method that is used to make the Ajax call for server-side
+                * processing or Ajax sourced data.
+                *  @type string
+                *  @default GET
+                *  @dtopt Options
+                *  @dtopt Server-side
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "bServerSide": true,
+                *        "sAjaxSource": "scripts/post.php",
+                *        "sServerMethod": "POST"
+                *      } );
+                *    } );
+                */
+               "sServerMethod": "GET"
+       };
+       
+       
+       
+       /**
+        * Column options that can be given to DataTables at initialisation time.
+        *  @namespace
+        */
+       DataTable.defaults.columns = {
+               /**
+                * Allows a column's sorting to take multiple columns into account when 
+                * doing a sort. For example first name / last name columns make sense to 
+                * do a multi-column sort over the two columns.
+                *  @type array
+                *  @default null <i>Takes the value of the column index automatically</i>
+                *  @dtopt Columns
+                * 
+                *  @example
+                *    // Using aoColumnDefs
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumnDefs": [
+                *          { "aDataSort": [ 0, 1 ], "aTargets": [ 0 ] },
+                *          { "aDataSort": [ 1, 0 ], "aTargets": [ 1 ] },
+                *          { "aDataSort": [ 2, 3, 4 ], "aTargets": [ 2 ] }
+                *        ]
+                *      } );
+                *    } );
+                *    
+                *  @example
+                *    // Using aoColumns
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumns": [
+                *          { "aDataSort": [ 0, 1 ] },
+                *          { "aDataSort": [ 1, 0 ] },
+                *          { "aDataSort": [ 2, 3, 4 ] },
+                *          null,
+                *          null
+                *        ]
+                *      } );
+                *    } );
+                */
+               "aDataSort": null,
+       
+       
+               /**
+                * You can control the default sorting direction, and even alter the behaviour
+                * of the sort handler (i.e. only allow ascending sorting etc) using this
+                * parameter.
+                *  @type array
+                *  @default [ 'asc', 'desc' ]
+                *  @dtopt Columns
+                * 
+                *  @example
+                *    // Using aoColumnDefs
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumnDefs": [
+                *          { "asSorting": [ "asc" ], "aTargets": [ 1 ] },
+                *          { "asSorting": [ "desc", "asc", "asc" ], "aTargets": [ 2 ] },
+                *          { "asSorting": [ "desc" ], "aTargets": [ 3 ] }
+                *        ]
+                *      } );
+                *    } );
+                *    
+                *  @example
+                *    // Using aoColumns
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumns": [
+                *          null,
+                *          { "asSorting": [ "asc" ] },
+                *          { "asSorting": [ "desc", "asc", "asc" ] },
+                *          { "asSorting": [ "desc" ] },
+                *          null
+                *        ]
+                *      } );
+                *    } );
+                */
+               "asSorting": [ 'asc', 'desc' ],
+       
+       
+               /**
+                * Enable or disable filtering on the data in this column.
+                *  @type boolean
+                *  @default true
+                *  @dtopt Columns
+                * 
+                *  @example
+                *    // Using aoColumnDefs
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumnDefs": [ 
+                *          { "bSearchable": false, "aTargets": [ 0 ] }
+                *        ] } );
+                *    } );
+                *    
+                *  @example
+                *    // Using aoColumns
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumns": [ 
+                *          { "bSearchable": false },
+                *          null,
+                *          null,
+                *          null,
+                *          null
+                *        ] } );
+                *    } );
+                */
+               "bSearchable": true,
+       
+       
+               /**
+                * Enable or disable sorting on this column.
+                *  @type boolean
+                *  @default true
+                *  @dtopt Columns
+                * 
+                *  @example
+                *    // Using aoColumnDefs
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumnDefs": [ 
+                *          { "bSortable": false, "aTargets": [ 0 ] }
+                *        ] } );
+                *    } );
+                *    
+                *  @example
+                *    // Using aoColumns
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumns": [ 
+                *          { "bSortable": false },
+                *          null,
+                *          null,
+                *          null,
+                *          null
+                *        ] } );
+                *    } );
+                */
+               "bSortable": true,
+       
+       
+               /**
+                * <code>Deprecated</code> When using fnRender() for a column, you may wish 
+                * to use the original data (before rendering) for sorting and filtering 
+                * (the default is to used the rendered data that the user can see). This 
+                * may be useful for dates etc.
+                * 
+                * Please note that this option has now been deprecated and will be removed
+                * in the next version of DataTables. Please use mRender / mData rather than
+                * fnRender.
+                *  @type boolean
+                *  @default true
+                *  @dtopt Columns
+                *  @deprecated
+                */
+               "bUseRendered": true,
+       
+       
+               /**
+                * Enable or disable the display of this column.
+                *  @type boolean
+                *  @default true
+                *  @dtopt Columns
+                * 
+                *  @example
+                *    // Using aoColumnDefs
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumnDefs": [ 
+                *          { "bVisible": false, "aTargets": [ 0 ] }
+                *        ] } );
+                *    } );
+                *    
+                *  @example
+                *    // Using aoColumns
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumns": [ 
+                *          { "bVisible": false },
+                *          null,
+                *          null,
+                *          null,
+                *          null
+                *        ] } );
+                *    } );
+                */
+               "bVisible": true,
+               
+               
+               /**
+                * Developer definable function that is called whenever a cell is created (Ajax source,
+                * etc) or processed for input (DOM source). This can be used as a compliment to mRender
+                * allowing you to modify the DOM element (add background colour for example) when the
+                * element is available.
+                *  @type function
+                *  @param {element} nTd The TD node that has been created
+                *  @param {*} sData The Data for the cell
+                *  @param {array|object} oData The data for the whole row
+                *  @param {int} iRow The row index for the aoData data store
+                *  @param {int} iCol The column index for aoColumns
+                *  @dtopt Columns
+                * 
+                *  @example
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumnDefs": [ {
+                *          "aTargets": [3],
+                *          "fnCreatedCell": function (nTd, sData, oData, iRow, iCol) {
+                *            if ( sData == "1.7" ) {
+                *              $(nTd).css('color', 'blue')
+                *            }
+                *          }
+                *        } ]
+                *      });
+                *    } );
+                */
+               "fnCreatedCell": null,
+       
+       
+               /**
+                * <code>Deprecated</code> Custom display function that will be called for the 
+                * display of each cell in this column.
+                *
+                * Please note that this option has now been deprecated and will be removed
+                * in the next version of DataTables. Please use mRender / mData rather than
+                * fnRender.
+                *  @type function
+                *  @param {object} o Object with the following parameters:
+                *  @param {int}    o.iDataRow The row in aoData
+                *  @param {int}    o.iDataColumn The column in question
+                *  @param {array}  o.aData The data for the row in question
+                *  @param {object} o.oSettings The settings object for this DataTables instance
+                *  @param {object} o.mDataProp The data property used for this column
+                *  @param {*}      val The current cell value
+                *  @returns {string} The string you which to use in the display
+                *  @dtopt Columns
+                *  @deprecated
+                */
+               "fnRender": null,
+       
+       
+               /**
+                * The column index (starting from 0!) that you wish a sort to be performed
+                * upon when this column is selected for sorting. This can be used for sorting
+                * on hidden columns for example.
+                *  @type int
+                *  @default -1 <i>Use automatically calculated column index</i>
+                *  @dtopt Columns
+                * 
+                *  @example
+                *    // Using aoColumnDefs
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumnDefs": [ 
+                *          { "iDataSort": 1, "aTargets": [ 0 ] }
+                *        ]
+                *      } );
+                *    } );
+                *    
+                *  @example
+                *    // Using aoColumns
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumns": [ 
+                *          { "iDataSort": 1 },
+                *          null,
+                *          null,
+                *          null,
+                *          null
+                *        ]
+                *      } );
+                *    } );
+                */
+               "iDataSort": -1,
+       
+       
+               /**
+                * This parameter has been replaced by mData in DataTables to ensure naming
+                * consistency. mDataProp can still be used, as there is backwards compatibility
+                * in DataTables for this option, but it is strongly recommended that you use
+                * mData in preference to mDataProp.
+                *  @name DataTable.defaults.columns.mDataProp
+                */
+       
+       
+               /**
+                * This property can be used to read data from any JSON data source property,
+                * including deeply nested objects / properties. mData can be given in a
+                * number of different ways which effect its behaviour:
+                *   <ul>
+                *     <li>integer - treated as an array index for the data source. This is the
+                *       default that DataTables uses (incrementally increased for each column).</li>
+                *     <li>string - read an object property from the data source. Note that you can
+                *       use Javascript dotted notation to read deep properties / arrays from the
+                *       data source.</li>
+                *     <li>null - the sDefaultContent option will be used for the cell (null
+                *       by default, so you will need to specify the default content you want -
+                *       typically an empty string). This can be useful on generated columns such 
+                *       as edit / delete action columns.</li>
+                *     <li>function - the function given will be executed whenever DataTables 
+                *       needs to set or get the data for a cell in the column. The function 
+                *       takes three parameters:
+                *       <ul>
+                *         <li>{array|object} The data source for the row</li>
+                *         <li>{string} The type call data requested - this will be 'set' when
+                *           setting data or 'filter', 'display', 'type', 'sort' or undefined when 
+                *           gathering data. Note that when <i>undefined</i> is given for the type
+                *           DataTables expects to get the raw data for the object back</li>
+                *         <li>{*} Data to set when the second parameter is 'set'.</li>
+                *       </ul>
+                *       The return value from the function is not required when 'set' is the type
+                *       of call, but otherwise the return is what will be used for the data
+                *       requested.</li>
+                *    </ul>
+                *
+                * Note that prior to DataTables 1.9.2 mData was called mDataProp. The name change
+                * reflects the flexibility of this property and is consistent with the naming of
+                * mRender. If 'mDataProp' is given, then it will still be used by DataTables, as
+                * it automatically maps the old name to the new if required.
+                *  @type string|int|function|null
+                *  @default null <i>Use automatically calculated column index</i>
+                *  @dtopt Columns
+                * 
+                *  @example
+                *    // Read table data from objects
+                *    $(document).ready( function() {
+                *      var oTable = $('#example').dataTable( {
+                *        "sAjaxSource": "sources/deep.txt",
+                *        "aoColumns": [
+                *          { "mData": "engine" },
+                *          { "mData": "browser" },
+                *          { "mData": "platform.inner" },
+                *          { "mData": "platform.details.0" },
+                *          { "mData": "platform.details.1" }
+                *        ]
+                *      } );
+                *    } );
+                * 
+                *  @example
+                *    // Using mData as a function to provide different information for
+                *    // sorting, filtering and display. In this case, currency (price)
+                *    $(document).ready( function() {
+                *      var oTable = $('#example').dataTable( {
+                *        "aoColumnDefs": [ {
+                *          "aTargets": [ 0 ],
+                *          "mData": function ( source, type, val ) {
+                *            if (type === 'set') {
+                *              source.price = val;
+                *              // Store the computed dislay and filter values for efficiency
+                *              source.price_display = val=="" ? "" : "$"+numberFormat(val);
+                *              source.price_filter  = val=="" ? "" : "$"+numberFormat(val)+" "+val;
+                *              return;
+                *            }
+                *            else if (type === 'display') {
+                *              return source.price_display;
+                *            }
+                *            else if (type === 'filter') {
+                *              return source.price_filter;
+                *            }
+                *            // 'sort', 'type' and undefined all just use the integer
+                *            return source.price;
+                *          }
+                *        } ]
+                *      } );
+                *    } );
+                */
+               "mData": null,
+       
+       
+               /**
+                * This property is the rendering partner to mData and it is suggested that
+                * when you want to manipulate data for display (including filtering, sorting etc)
+                * but not altering the underlying data for the table, use this property. mData
+                * can actually do everything this property can and more, but this parameter is
+                * easier to use since there is no 'set' option. Like mData is can be given
+                * in a number of different ways to effect its behaviour, with the addition of 
+                * supporting array syntax for easy outputting of arrays (including arrays of
+                * objects):
+                *   <ul>
+                *     <li>integer - treated as an array index for the data source. This is the
+                *       default that DataTables uses (incrementally increased for each column).</li>
+                *     <li>string - read an object property from the data source. Note that you can
+                *       use Javascript dotted notation to read deep properties / arrays from the
+                *       data source and also array brackets to indicate that the data reader should
+                *       loop over the data source array. When characters are given between the array
+                *       brackets, these characters are used to join the data source array together.
+                *       For example: "accounts[, ].name" would result in a comma separated list with
+                *       the 'name' value from the 'accounts' array of objects.</li>
+                *     <li>function - the function given will be executed whenever DataTables 
+                *       needs to set or get the data for a cell in the column. The function 
+                *       takes three parameters:
+                *       <ul>
+                *         <li>{array|object} The data source for the row (based on mData)</li>
+                *         <li>{string} The type call data requested - this will be 'filter', 'display', 
+                *           'type' or 'sort'.</li>
+                *         <li>{array|object} The full data source for the row (not based on mData)</li>
+                *       </ul>
+                *       The return value from the function is what will be used for the data
+                *       requested.</li>
+                *    </ul>
+                *  @type string|int|function|null
+                *  @default null <i>Use mData</i>
+                *  @dtopt Columns
+                * 
+                *  @example
+                *    // Create a comma separated list from an array of objects
+                *    $(document).ready( function() {
+                *      var oTable = $('#example').dataTable( {
+                *        "sAjaxSource": "sources/deep.txt",
+                *        "aoColumns": [
+                *          { "mData": "engine" },
+                *          { "mData": "browser" },
+                *          {
+                *            "mData": "platform",
+                *            "mRender": "[, ].name"
+                *          }
+                *        ]
+                *      } );
+                *    } );
+                * 
+                *  @example
+                *    // Use as a function to create a link from the data source
+                *    $(document).ready( function() {
+                *      var oTable = $('#example').dataTable( {
+                *        "aoColumnDefs": [
+                *        {
+                *          "aTargets": [ 0 ],
+                *          "mData": "download_link",
+                *          "mRender": function ( data, type, full ) {
+                *            return '<a href="'+data+'">Download</a>';
+                *          }
+                *        ]
+                *      } );
+                *    } );
+                */
+               "mRender": null,
+       
+       
+               /**
+                * Change the cell type created for the column - either TD cells or TH cells. This
+                * can be useful as TH cells have semantic meaning in the table body, allowing them
+                * to act as a header for a row (you may wish to add scope='row' to the TH elements).
+                *  @type string
+                *  @default td
+                *  @dtopt Columns
+                * 
+                *  @example
+                *    // Make the first column use TH cells
+                *    $(document).ready( function() {
+                *      var oTable = $('#example').dataTable( {
+                *        "aoColumnDefs": [ {
+                *          "aTargets": [ 0 ],
+                *          "sCellType": "th"
+                *        } ]
+                *      } );
+                *    } );
+                */
+               "sCellType": "td",
+       
+       
+               /**
+                * Class to give to each cell in this column.
+                *  @type string
+                *  @default <i>Empty string</i>
+                *  @dtopt Columns
+                * 
+                *  @example
+                *    // Using aoColumnDefs
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumnDefs": [ 
+                *          { "sClass": "my_class", "aTargets": [ 0 ] }
+                *        ]
+                *      } );
+                *    } );
+                *    
+                *  @example
+                *    // Using aoColumns
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumns": [ 
+                *          { "sClass": "my_class" },
+                *          null,
+                *          null,
+                *          null,
+                *          null
+                *        ]
+                *      } );
+                *    } );
+                */
+               "sClass": "",
+               
+               /**
+                * When DataTables calculates the column widths to assign to each column,
+                * it finds the longest string in each column and then constructs a
+                * temporary table and reads the widths from that. The problem with this
+                * is that "mmm" is much wider then "iiii", but the latter is a longer 
+                * string - thus the calculation can go wrong (doing it properly and putting
+                * it into an DOM object and measuring that is horribly(!) slow). Thus as
+                * a "work around" we provide this option. It will append its value to the
+                * text that is found to be the longest string for the column - i.e. padding.
+                * Generally you shouldn't need this, and it is not documented on the 
+                * general DataTables.net documentation
+                *  @type string
+                *  @default <i>Empty string<i>
+                *  @dtopt Columns
+                *    
+                *  @example
+                *    // Using aoColumns
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumns": [ 
+                *          null,
+                *          null,
+                *          null,
+                *          {
+                *            "sContentPadding": "mmm"
+                *          }
+                *        ]
+                *      } );
+                *    } );
+                */
+               "sContentPadding": "",
+       
+       
+               /**
+                * Allows a default value to be given for a column's data, and will be used
+                * whenever a null data source is encountered (this can be because mData
+                * is set to null, or because the data source itself is null).
+                *  @type string
+                *  @default null
+                *  @dtopt Columns
+                * 
+                *  @example
+                *    // Using aoColumnDefs
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumnDefs": [ 
+                *          {
+                *            "mData": null,
+                *            "sDefaultContent": "Edit",
+                *            "aTargets": [ -1 ]
+                *          }
+                *        ]
+                *      } );
+                *    } );
+                *    
+                *  @example
+                *    // Using aoColumns
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumns": [ 
+                *          null,
+                *          null,
+                *          null,
+                *          {
+                *            "mData": null,
+                *            "sDefaultContent": "Edit"
+                *          }
+                *        ]
+                *      } );
+                *    } );
+                */
+               "sDefaultContent": null,
+       
+       
+               /**
+                * This parameter is only used in DataTables' server-side processing. It can
+                * be exceptionally useful to know what columns are being displayed on the
+                * client side, and to map these to database fields. When defined, the names
+                * also allow DataTables to reorder information from the server if it comes
+                * back in an unexpected order (i.e. if you switch your columns around on the
+                * client-side, your server-side code does not also need updating).
+                *  @type string
+                *  @default <i>Empty string</i>
+                *  @dtopt Columns
+                * 
+                *  @example
+                *    // Using aoColumnDefs
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumnDefs": [ 
+                *          { "sName": "engine", "aTargets": [ 0 ] },
+                *          { "sName": "browser", "aTargets": [ 1 ] },
+                *          { "sName": "platform", "aTargets": [ 2 ] },
+                *          { "sName": "version", "aTargets": [ 3 ] },
+                *          { "sName": "grade", "aTargets": [ 4 ] }
+                *        ]
+                *      } );
+                *    } );
+                *    
+                *  @example
+                *    // Using aoColumns
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumns": [ 
+                *          { "sName": "engine" },
+                *          { "sName": "browser" },
+                *          { "sName": "platform" },
+                *          { "sName": "version" },
+                *          { "sName": "grade" }
+                *        ]
+                *      } );
+                *    } );
+                */
+               "sName": "",
+       
+       
+               /**
+                * Defines a data source type for the sorting which can be used to read
+                * real-time information from the table (updating the internally cached
+                * version) prior to sorting. This allows sorting to occur on user editable
+                * elements such as form inputs.
+                *  @type string
+                *  @default std
+                *  @dtopt Columns
+                * 
+                *  @example
+                *    // Using aoColumnDefs
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumnDefs": [
+                *          { "sSortDataType": "dom-text", "aTargets": [ 2, 3 ] },
+                *          { "sType": "numeric", "aTargets": [ 3 ] },
+                *          { "sSortDataType": "dom-select", "aTargets": [ 4 ] },
+                *          { "sSortDataType": "dom-checkbox", "aTargets": [ 5 ] }
+                *        ]
+                *      } );
+                *    } );
+                *    
+                *  @example
+                *    // Using aoColumns
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumns": [
+                *          null,
+                *          null,
+                *          { "sSortDataType": "dom-text" },
+                *          { "sSortDataType": "dom-text", "sType": "numeric" },
+                *          { "sSortDataType": "dom-select" },
+                *          { "sSortDataType": "dom-checkbox" }
+                *        ]
+                *      } );
+                *    } );
+                */
+               "sSortDataType": "std",
+       
+       
+               /**
+                * The title of this column.
+                *  @type string
+                *  @default null <i>Derived from the 'TH' value for this column in the 
+                *    original HTML table.</i>
+                *  @dtopt Columns
+                * 
+                *  @example
+                *    // Using aoColumnDefs
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumnDefs": [ 
+                *          { "sTitle": "My column title", "aTargets": [ 0 ] }
+                *        ]
+                *      } );
+                *    } );
+                *    
+                *  @example
+                *    // Using aoColumns
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumns": [ 
+                *          { "sTitle": "My column title" },
+                *          null,
+                *          null,
+                *          null,
+                *          null
+                *        ]
+                *      } );
+                *    } );
+                */
+               "sTitle": null,
+       
+       
+               /**
+                * The type allows you to specify how the data for this column will be sorted.
+                * Four types (string, numeric, date and html (which will strip HTML tags
+                * before sorting)) are currently available. Note that only date formats
+                * understood by Javascript's Date() object will be accepted as type date. For
+                * example: "Mar 26, 2008 5:03 PM". May take the values: 'string', 'numeric',
+                * 'date' or 'html' (by default). Further types can be adding through
+                * plug-ins.
+                *  @type string
+                *  @default null <i>Auto-detected from raw data</i>
+                *  @dtopt Columns
+                * 
+                *  @example
+                *    // Using aoColumnDefs
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumnDefs": [ 
+                *          { "sType": "html", "aTargets": [ 0 ] }
+                *        ]
+                *      } );
+                *    } );
+                *    
+                *  @example
+                *    // Using aoColumns
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumns": [ 
+                *          { "sType": "html" },
+                *          null,
+                *          null,
+                *          null,
+                *          null
+                *        ]
+                *      } );
+                *    } );
+                */
+               "sType": null,
+       
+       
+               /**
+                * Defining the width of the column, this parameter may take any CSS value
+                * (3em, 20px etc). DataTables apples 'smart' widths to columns which have not
+                * been given a specific width through this interface ensuring that the table
+                * remains readable.
+                *  @type string
+                *  @default null <i>Automatic</i>
+                *  @dtopt Columns
+                * 
+                *  @example
+                *    // Using aoColumnDefs
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumnDefs": [ 
+                *          { "sWidth": "20%", "aTargets": [ 0 ] }
+                *        ]
+                *      } );
+                *    } );
+                *    
+                *  @example
+                *    // Using aoColumns
+                *    $(document).ready( function() {
+                *      $('#example').dataTable( {
+                *        "aoColumns": [ 
+                *          { "sWidth": "20%" },
+                *          null,
+                *          null,
+                *          null,
+                *          null
+                *        ]
+                *      } );
+                *    } );
+                */
+               "sWidth": null
+       };
+       
+       
+       
+       /**
+        * DataTables settings object - this holds all the information needed for a
+        * given table, including configuration, data and current application of the
+        * table options. DataTables does not have a single instance for each DataTable
+        * with the settings attached to that instance, but rather instances of the
+        * DataTable "class" are created on-the-fly as needed (typically by a 
+        * $().dataTable() call) and the settings object is then applied to that
+        * instance.
+        * 
+        * Note that this object is related to {@link DataTable.defaults} but this 
+        * one is the internal data store for DataTables's cache of columns. It should
+        * NOT be manipulated outside of DataTables. Any configuration should be done
+        * through the initialisation options.
+        *  @namespace
+        *  @todo Really should attach the settings object to individual instances so we
+        *    don't need to create new instances on each $().dataTable() call (if the
+        *    table already exists). It would also save passing oSettings around and
+        *    into every single function. However, this is a very significant 
+        *    architecture change for DataTables and will almost certainly break
+        *    backwards compatibility with older installations. This is something that
+        *    will be done in 2.0.
+        */
+       DataTable.models.oSettings = {
+               /**
+                * Primary features of DataTables and their enablement state.
+                *  @namespace
+                */
+               "oFeatures": {
+                       
+                       /**
+                        * Flag to say if DataTables should automatically try to calculate the
+                        * optimum table and columns widths (true) or not (false).
+                        * Note that this parameter will be set by the initialisation routine. To
+                        * set a default use {@link DataTable.defaults}.
+                        *  @type boolean
+                        */
+                       "bAutoWidth": null,
+       
+                       /**
+                        * Delay the creation of TR and TD elements until they are actually
+                        * needed by a driven page draw. This can give a significant speed
+                        * increase for Ajax source and Javascript source data, but makes no
+                        * difference at all fro DOM and server-side processing tables.
+                        * Note that this parameter will be set by the initialisation routine. To
+                        * set a default use {@link DataTable.defaults}.
+                        *  @type boolean
+                        */
+                       "bDeferRender": null,
+                       
+                       /**
+                        * Enable filtering on the table or not. Note that if this is disabled
+                        * then there is no filtering at all on the table, including fnFilter.
+                        * To just remove the filtering input use sDom and remove the 'f' option.
+                        * Note that this parameter will be set by the initialisation routine. To
+                        * set a default use {@link DataTable.defaults}.
+                        *  @type boolean
+                        */
+                       "bFilter": null,
+                       
+                       /**
+                        * Table information element (the 'Showing x of y records' div) enable
+                        * flag.
+                        * Note that this parameter will be set by the initialisation routine. To
+                        * set a default use {@link DataTable.defaults}.
+                        *  @type boolean
+                        */
+                       "bInfo": null,
+                       
+                       /**
+                        * Present a user control allowing the end user to change the page size
+                        * when pagination is enabled.
+                        * Note that this parameter will be set by the initialisation routine. To
+                        * set a default use {@link DataTable.defaults}.
+                        *  @type boolean
+                        */
+                       "bLengthChange": null,
+       
+                       /**
+                        * Pagination enabled or not. Note that if this is disabled then length
+                        * changing must also be disabled.
+                        * Note that this parameter will be set by the initialisation routine. To
+                        * set a default use {@link DataTable.defaults}.
+                        *  @type boolean
+                        */
+                       "bPaginate": null,
+                       
+                       /**
+                        * Processing indicator enable flag whenever DataTables is enacting a
+                        * user request - typically an Ajax request for server-side processing.
+                        * Note that this parameter will be set by the initialisation routine. To
+                        * set a default use {@link DataTable.defaults}.
+                        *  @type boolean
+                        */
+                       "bProcessing": null,
+                       
+                       /**
+                        * Server-side processing enabled flag - when enabled DataTables will
+                        * get all data from the server for every draw - there is no filtering,
+                        * sorting or paging done on the client-side.
+                        * Note that this parameter will be set by the initialisation routine. To
+                        * set a default use {@link DataTable.defaults}.
+                        *  @type boolean
+                        */
+                       "bServerSide": null,
+                       
+                       /**
+                        * Sorting enablement flag.
+                        * Note that this parameter will be set by the initialisation routine. To
+                        * set a default use {@link DataTable.defaults}.
+                        *  @type boolean
+                        */
+                       "bSort": null,
+                       
+                       /**
+                        * Apply a class to the columns which are being sorted to provide a
+                        * visual highlight or not. This can slow things down when enabled since
+                        * there is a lot of DOM interaction.
+                        * Note that this parameter will be set by the initialisation routine. To
+                        * set a default use {@link DataTable.defaults}.
+                        *  @type boolean
+                        */
+                       "bSortClasses": null,
+                       
+                       /**
+                        * State saving enablement flag.
+                        * Note that this parameter will be set by the initialisation routine. To
+                        * set a default use {@link DataTable.defaults}.
+                        *  @type boolean
+                        */
+                       "bStateSave": null
+               },
+               
+       
+               /**
+                * Scrolling settings for a table.
+                *  @namespace
+                */
+               "oScroll": {
+                       /**
+                        * Indicate if DataTables should be allowed to set the padding / margin
+                        * etc for the scrolling header elements or not. Typically you will want
+                        * this.
+                        * Note that this parameter will be set by the initialisation routine. To
+                        * set a default use {@link DataTable.defaults}.
+                        *  @type boolean
+                        */
+                       "bAutoCss": null,
+                       
+                       /**
+                        * When the table is shorter in height than sScrollY, collapse the
+                        * table container down to the height of the table (when true).
+                        * Note that this parameter will be set by the initialisation routine. To
+                        * set a default use {@link DataTable.defaults}.
+                        *  @type boolean
+                        */
+                       "bCollapse": null,
+                       
+                       /**
+                        * Infinite scrolling enablement flag. Now deprecated in favour of
+                        * using the Scroller plug-in.
+                        * Note that this parameter will be set by the initialisation routine. To
+                        * set a default use {@link DataTable.defaults}.
+                        *  @type boolean
+                        */
+                       "bInfinite": null,
+                       
+                       /**
+                        * Width of the scrollbar for the web-browser's platform. Calculated
+                        * during table initialisation.
+                        *  @type int
+                        *  @default 0
+                        */
+                       "iBarWidth": 0,
+                       
+                       /**
+                        * Space (in pixels) between the bottom of the scrolling container and 
+                        * the bottom of the scrolling viewport before the next page is loaded
+                        * when using infinite scrolling.
+                        * Note that this parameter will be set by the initialisation routine. To
+                        * set a default use {@link DataTable.defaults}.
+                        *  @type int
+                        */
+                       "iLoadGap": null,
+                       
+                       /**
+                        * Viewport width for horizontal scrolling. Horizontal scrolling is 
+                        * disabled if an empty string.
+                        * Note that this parameter will be set by the initialisation routine. To
+                        * set a default use {@link DataTable.defaults}.
+                        *  @type string
+                        */
+                       "sX": null,
+                       
+                       /**
+                        * Width to expand the table to when using x-scrolling. Typically you
+                        * should not need to use this.
+                        * Note that this parameter will be set by the initialisation routine. To
+                        * set a default use {@link DataTable.defaults}.
+                        *  @type string
+                        *  @deprecated
+                        */
+                       "sXInner": null,
+                       
+                       /**
+                        * Viewport height for vertical scrolling. Vertical scrolling is disabled
+                        * if an empty string.
+                        * Note that this parameter will be set by the initialisation routine. To
+                        * set a default use {@link DataTable.defaults}.
+                        *  @type string
+                        */
+                       "sY": null
+               },
+               
+               /**
+                * Language information for the table.
+                *  @namespace
+                *  @extends DataTable.defaults.oLanguage
+                */
+               "oLanguage": {
+                       /**
+                        * Information callback function. See 
+                        * {@link DataTable.defaults.fnInfoCallback}
+                        *  @type function
+                        *  @default null
+                        */
+                       "fnInfoCallback": null
+               },
+               
+               /**
+                * Browser support parameters
+                *  @namespace
+                */
+               "oBrowser": {
+                       /**
+                        * Indicate if the browser incorrectly calculates width:100% inside a
+                        * scrolling element (IE6/7)
+                        *  @type boolean
+                        *  @default false
+                        */
+                       "bScrollOversize": false
+               },
+               
+               /**
+                * Array referencing the nodes which are used for the features. The 
+                * parameters of this object match what is allowed by sDom - i.e.
+                *   <ul>
+                *     <li>'l' - Length changing</li>
+                *     <li>'f' - Filtering input</li>
+                *     <li>'t' - The table!</li>
+                *     <li>'i' - Information</li>
+                *     <li>'p' - Pagination</li>
+                *     <li>'r' - pRocessing</li>
+                *   </ul>
+                *  @type array
+                *  @default []
+                */
+               "aanFeatures": [],
+               
+               /**
+                * Store data information - see {@link DataTable.models.oRow} for detailed
+                * information.
+                *  @type array
+                *  @default []
+                */
+               "aoData": [],
+               
+               /**
+                * Array of indexes which are in the current display (after filtering etc)
+                *  @type array
+                *  @default []
+                */
+               "aiDisplay": [],
+               
+               /**
+                * Array of indexes for display - no filtering
+                *  @type array
+                *  @default []
+                */
+               "aiDisplayMaster": [],
+               
+               /**
+                * Store information about each column that is in use
+                *  @type array
+                *  @default []
+                */
+               "aoColumns": [],
+               
+               /**
+                * Store information about the table's header
+                *  @type array
+                *  @default []
+                */
+               "aoHeader": [],
+               
+               /**
+                * Store information about the table's footer
+                *  @type array
+                *  @default []
+                */
+               "aoFooter": [],
+               
+               /**
+                * Search data array for regular expression searching
+                *  @type array
+                *  @default []
+                */
+               "asDataSearch": [],
+               
+               /**
+                * Store the applied global search information in case we want to force a 
+                * research or compare the old search to a new one.
+                * Note that this parameter will be set by the initialisation routine. To
+                * set a default use {@link DataTable.defaults}.
+                *  @namespace
+                *  @extends DataTable.models.oSearch
+                */
+               "oPreviousSearch": {},
+               
+               /**
+                * Store the applied search for each column - see 
+                * {@link DataTable.models.oSearch} for the format that is used for the
+                * filtering information for each column.
+                *  @type array
+                *  @default []
+                */
+               "aoPreSearchCols": [],
+               
+               /**
+                * Sorting that is applied to the table. Note that the inner arrays are
+                * used in the following manner:
+                * <ul>
+                *   <li>Index 0 - column number</li>
+                *   <li>Index 1 - current sorting direction</li>
+                *   <li>Index 2 - index of asSorting for this column</li>
+                * </ul>
+                * Note that this parameter will be set by the initialisation routine. To
+                * set a default use {@link DataTable.defaults}.
+                *  @type array
+                *  @todo These inner arrays should really be objects
+                */
+               "aaSorting": null,
+               
+               /**
+                * Sorting that is always applied to the table (i.e. prefixed in front of
+                * aaSorting).
+                * Note that this parameter will be set by the initialisation routine. To
+                * set a default use {@link DataTable.defaults}.
+                *  @type array|null
+                *  @default null
+                */
+               "aaSortingFixed": null,
+               
+               /**
+                * Classes to use for the striping of a table.
+                * Note that this parameter will be set by the initialisation routine. To
+                * set a default use {@link DataTable.defaults}.
+                *  @type array
+                *  @default []
+                */
+               "asStripeClasses": null,
+               
+               /**
+                * If restoring a table - we should restore its striping classes as well
+                *  @type array
+                *  @default []
+                */
+               "asDestroyStripes": [],
+               
+               /**
+                * If restoring a table - we should restore its width 
+                *  @type int
+                *  @default 0
+                */
+               "sDestroyWidth": 0,
+               
+               /**
+                * Callback functions array for every time a row is inserted (i.e. on a draw).
+                *  @type array
+                *  @default []
+                */
+               "aoRowCallback": [],
+               
+               /**
+                * Callback functions for the header on each draw.
+                *  @type array
+                *  @default []
+                */
+               "aoHeaderCallback": [],
+               
+               /**
+                * Callback function for the footer on each draw.
+                *  @type array
+                *  @default []
+                */
+               "aoFooterCallback": [],
+               
+               /**
+                * Array of callback functions for draw callback functions
+                *  @type array
+                *  @default []
+                */
+               "aoDrawCallback": [],
+               
+               /**
+                * Array of callback functions for row created function
+                *  @type array
+                *  @default []
+                */
+               "aoRowCreatedCallback": [],
+               
+               /**
+                * Callback functions for just before the table is redrawn. A return of 
+                * false will be used to cancel the draw.
+                *  @type array
+                *  @default []
+                */
+               "aoPreDrawCallback": [],
+               
+               /**
+                * Callback functions for when the table has been initialised.
+                *  @type array
+                *  @default []
+                */
+               "aoInitComplete": [],
+       
+               
+               /**
+                * Callbacks for modifying the settings to be stored for state saving, prior to
+                * saving state.
+                *  @type array
+                *  @default []
+                */
+               "aoStateSaveParams": [],
+               
+               /**
+                * Callbacks for modifying the settings that have been stored for state saving
+                * prior to using the stored values to restore the state.
+                *  @type array
+                *  @default []
+                */
+               "aoStateLoadParams": [],
+               
+               /**
+                * Callbacks for operating on the settings object once the saved state has been
+                * loaded
+                *  @type array
+                *  @default []
+                */
+               "aoStateLoaded": [],
+               
+               /**
+                * Cache the table ID for quick access
+                *  @type string
+                *  @default <i>Empty string</i>
+                */
+               "sTableId": "",
+               
+               /**
+                * The TABLE node for the main table
+                *  @type node
+                *  @default null
+                */
+               "nTable": null,
+               
+               /**
+                * Permanent ref to the thead element
+                *  @type node
+                *  @default null
+                */
+               "nTHead": null,
+               
+               /**
+                * Permanent ref to the tfoot element - if it exists
+                *  @type node
+                *  @default null
+                */
+               "nTFoot": null,
+               
+               /**
+                * Permanent ref to the tbody element
+                *  @type node
+                *  @default null
+                */
+               "nTBody": null,
+               
+               /**
+                * Cache the wrapper node (contains all DataTables controlled elements)
+                *  @type node
+                *  @default null
+                */
+               "nTableWrapper": null,
+               
+               /**
+                * Indicate if when using server-side processing the loading of data 
+                * should be deferred until the second draw.
+                * Note that this parameter will be set by the initialisation routine. To
+                * set a default use {@link DataTable.defaults}.
+                *  @type boolean
+                *  @default false
+                */
+               "bDeferLoading": false,
+               
+               /**
+                * Indicate if all required information has been read in
+                *  @type boolean
+                *  @default false
+                */
+               "bInitialised": false,
+               
+               /**
+                * Information about open rows. Each object in the array has the parameters
+                * 'nTr' and 'nParent'
+                *  @type array
+                *  @default []
+                */
+               "aoOpenRows": [],
+               
+               /**
+                * Dictate the positioning of DataTables' control elements - see
+                * {@link DataTable.model.oInit.sDom}.
+                * Note that this parameter will be set by the initialisation routine. To
+                * set a default use {@link DataTable.defaults}.
+                *  @type string
+                *  @default null
+                */
+               "sDom": null,
+               
+               /**
+                * Which type of pagination should be used.
+                * Note that this parameter will be set by the initialisation routine. To
+                * set a default use {@link DataTable.defaults}.
+                *  @type string 
+                *  @default two_button
+                */
+               "sPaginationType": "two_button",
+               
+               /**
+                * The cookie duration (for bStateSave) in seconds.
+                * Note that this parameter will be set by the initialisation routine. To
+                * set a default use {@link DataTable.defaults}.
+                *  @type int
+                *  @default 0
+                */
+               "iCookieDuration": 0,
+               
+               /**
+                * The cookie name prefix.
+                * Note that this parameter will be set by the initialisation routine. To
+                * set a default use {@link DataTable.defaults}.
+                *  @type string
+                *  @default <i>Empty string</i>
+                */
+               "sCookiePrefix": "",
+               
+               /**
+                * Callback function for cookie creation.
+                * Note that this parameter will be set by the initialisation routine. To
+                * set a default use {@link DataTable.defaults}.
+                *  @type function
+                *  @default null
+                */
+               "fnCookieCallback": null,
+               
+               /**
+                * Array of callback functions for state saving. Each array element is an 
+                * object with the following parameters:
+                *   <ul>
+                *     <li>function:fn - function to call. Takes two parameters, oSettings
+                *       and the JSON string to save that has been thus far created. Returns
+                *       a JSON string to be inserted into a json object 
+                *       (i.e. '"param": [ 0, 1, 2]')</li>
+                *     <li>string:sName - name of callback</li>
+                *   </ul>
+                *  @type array
+                *  @default []
+                */
+               "aoStateSave": [],
+               
+               /**
+                * Array of callback functions for state loading. Each array element is an 
+                * object with the following parameters:
+                *   <ul>
+                *     <li>function:fn - function to call. Takes two parameters, oSettings 
+                *       and the object stored. May return false to cancel state loading</li>
+                *     <li>string:sName - name of callback</li>
+                *   </ul>
+                *  @type array
+                *  @default []
+                */
+               "aoStateLoad": [],
+               
+               /**
+                * State that was loaded from the cookie. Useful for back reference
+                *  @type object
+                *  @default null
+                */
+               "oLoadedState": null,
+               
+               /**
+                * Source url for AJAX data for the table.
+                * Note that this parameter will be set by the initialisation routine. To
+                * set a default use {@link DataTable.defaults}.
+                *  @type string
+                *  @default null
+                */
+               "sAjaxSource": null,
+               
+               /**
+                * Property from a given object from which to read the table data from. This
+                * can be an empty string (when not server-side processing), in which case 
+                * it is  assumed an an array is given directly.
+                * Note that this parameter will be set by the initialisation routine. To
+                * set a default use {@link DataTable.defaults}.
+                *  @type string
+                */
+               "sAjaxDataProp": null,
+               
+               /**
+                * Note if draw should be blocked while getting data
+                *  @type boolean
+                *  @default true
+                */
+               "bAjaxDataGet": true,
+               
+               /**
+                * The last jQuery XHR object that was used for server-side data gathering. 
+                * This can be used for working with the XHR information in one of the 
+                * callbacks
+                *  @type object
+                *  @default null
+                */
+               "jqXHR": null,
+               
+               /**
+                * Function to get the server-side data.
+                * Note that this parameter will be set by the initialisation routine. To
+                * set a default use {@link DataTable.defaults}.
+                *  @type function
+                */
+               "fnServerData": null,
+               
+               /**
+                * Functions which are called prior to sending an Ajax request so extra 
+                * parameters can easily be sent to the server
+                *  @type array
+                *  @default []
+                */
+               "aoServerParams": [],
+               
+               /**
+                * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if 
+                * required).
+                * Note that this parameter will be set by the initialisation routine. To
+                * set a default use {@link DataTable.defaults}.
+                *  @type string
+                */
+               "sServerMethod": null,
+               
+               /**
+                * Format numbers for display.
+                * Note that this parameter will be set by the initialisation routine. To
+                * set a default use {@link DataTable.defaults}.
+                *  @type function
+                */
+               "fnFormatNumber": null,
+               
+               /**
+                * List of options that can be used for the user selectable length menu.
+                * Note that this parameter will be set by the initialisation routine. To
+                * set a default use {@link DataTable.defaults}.
+                *  @type array
+                *  @default []
+                */
+               "aLengthMenu": null,
+               
+               /**
+                * Counter for the draws that the table does. Also used as a tracker for
+                * server-side processing
+                *  @type int
+                *  @default 0
+                */
+               "iDraw": 0,
+               
+               /**
+                * Indicate if a redraw is being done - useful for Ajax
+                *  @type boolean
+                *  @default false
+                */
+               "bDrawing": false,
+               
+               /**
+                * Draw index (iDraw) of the last error when parsing the returned data
+                *  @type int
+                *  @default -1
+                */
+               "iDrawError": -1,
+               
+               /**
+                * Paging display length
+                *  @type int
+                *  @default 10
+                */
+               "_iDisplayLength": 10,
+       
+               /**
+                * Paging start point - aiDisplay index
+                *  @type int
+                *  @default 0
+                */
+               "_iDisplayStart": 0,
+       
+               /**
+                * Paging end point - aiDisplay index. Use fnDisplayEnd rather than
+                * this property to get the end point
+                *  @type int
+                *  @default 10
+                *  @private
+                */
+               "_iDisplayEnd": 10,
+               
+               /**
+                * Server-side processing - number of records in the result set
+                * (i.e. before filtering), Use fnRecordsTotal rather than
+                * this property to get the value of the number of records, regardless of
+                * the server-side processing setting.
+                *  @type int
+                *  @default 0
+                *  @private
+                */
+               "_iRecordsTotal": 0,
+       
+               /**
+                * Server-side processing - number of records in the current display set
+                * (i.e. after filtering). Use fnRecordsDisplay rather than
+                * this property to get the value of the number of records, regardless of
+                * the server-side processing setting.
+                *  @type boolean
+                *  @default 0
+                *  @private
+                */
+               "_iRecordsDisplay": 0,
+               
+               /**
+                * Flag to indicate if jQuery UI marking and classes should be used.
+                * Note that this parameter will be set by the initialisation routine. To
+                * set a default use {@link DataTable.defaults}.
+                *  @type boolean
+                */
+               "bJUI": null,
+               
+               /**
+                * The classes to use for the table
+                *  @type object
+                *  @default {}
+                */
+               "oClasses": {},
+               
+               /**
+                * Flag attached to the settings object so you can check in the draw 
+                * callback if filtering has been done in the draw. Deprecated in favour of
+                * events.
+                *  @type boolean
+                *  @default false
+                *  @deprecated
+                */
+               "bFiltered": false,
+               
+               /**
+                * Flag attached to the settings object so you can check in the draw 
+                * callback if sorting has been done in the draw. Deprecated in favour of
+                * events.
+                *  @type boolean
+                *  @default false
+                *  @deprecated
+                */
+               "bSorted": false,
+               
+               /**
+                * Indicate that if multiple rows are in the header and there is more than 
+                * one unique cell per column, if the top one (true) or bottom one (false) 
+                * should be used for sorting / title by DataTables.
+                * Note that this parameter will be set by the initialisation routine. To
+                * set a default use {@link DataTable.defaults}.
+                *  @type boolean
+                */
+               "bSortCellsTop": null,
+               
+               /**
+                * Initialisation object that is used for the table
+                *  @type object
+                *  @default null
+                */
+               "oInit": null,
+               
+               /**
+                * Destroy callback functions - for plug-ins to attach themselves to the
+                * destroy so they can clean up markup and events.
+                *  @type array
+                *  @default []
+                */
+               "aoDestroyCallback": [],
+       
+               
+               /**
+                * Get the number of records in the current record set, before filtering
+                *  @type function
+                */
+               "fnRecordsTotal": function ()
+               {
+                       if ( this.oFeatures.bServerSide ) {
+                               return parseInt(this._iRecordsTotal, 10);
+                       } else {
+                               return this.aiDisplayMaster.length;
+                       }
+               },
+               
+               /**
+                * Get the number of records in the current record set, after filtering
+                *  @type function
+                */
+               "fnRecordsDisplay": function ()
+               {
+                       if ( this.oFeatures.bServerSide ) {
+                               return parseInt(this._iRecordsDisplay, 10);
+                       } else {
+                               return this.aiDisplay.length;
+                       }
+               },
+               
+               /**
+                * Set the display end point - aiDisplay index
+                *  @type function
+                *  @todo Should do away with _iDisplayEnd and calculate it on-the-fly here
+                */
+               "fnDisplayEnd": function ()
+               {
+                       if ( this.oFeatures.bServerSide ) {
+                               if ( this.oFeatures.bPaginate === false || this._iDisplayLength == -1 ) {
+                                       return this._iDisplayStart+this.aiDisplay.length;
+                               } else {
+                                       return Math.min( this._iDisplayStart+this._iDisplayLength, 
+                                               this._iRecordsDisplay );
+                               }
+                       } else {
+                               return this._iDisplayEnd;
+                       }
+               },
+               
+               /**
+                * The DataTables object for this table
+                *  @type object
+                *  @default null
+                */
+               "oInstance": null,
+               
+               /**
+                * Unique identifier for each instance of the DataTables object. If there
+                * is an ID on the table node, then it takes that value, otherwise an
+                * incrementing internal counter is used.
+                *  @type string
+                *  @default null
+                */
+               "sInstance": null,
+       
+               /**
+                * tabindex attribute value that is added to DataTables control elements, allowing
+                * keyboard navigation of the table and its controls.
+                */
+               "iTabIndex": 0,
+       
+               /**
+                * DIV container for the footer scrolling table if scrolling
+                */
+               "nScrollHead": null,
+       
+               /**
+                * DIV container for the footer scrolling table if scrolling
+                */
+               "nScrollFoot": null
+       };
+
+       /**
+        * Extension object for DataTables that is used to provide all extension options.
+        * 
+        * Note that the <i>DataTable.ext</i> object is available through
+        * <i>jQuery.fn.dataTable.ext</i> where it may be accessed and manipulated. It is
+        * also aliased to <i>jQuery.fn.dataTableExt</i> for historic reasons.
+        *  @namespace
+        *  @extends DataTable.models.ext
+        */
+       DataTable.ext = $.extend( true, {}, DataTable.models.ext );
+       
+       $.extend( DataTable.ext.oStdClasses, {
+               "sTable": "dataTable",
+       
+               /* Two buttons buttons */
+               "sPagePrevEnabled": "paginate_enabled_previous",
+               "sPagePrevDisabled": "paginate_disabled_previous",
+               "sPageNextEnabled": "paginate_enabled_next",
+               "sPageNextDisabled": "paginate_disabled_next",
+               "sPageJUINext": "",
+               "sPageJUIPrev": "",
+               
+               /* Full numbers paging buttons */
+               "sPageButton": "paginate_button",
+               "sPageButtonActive": "paginate_active",
+               "sPageButtonStaticDisabled": "paginate_button paginate_button_disabled",
+               "sPageFirst": "first",
+               "sPagePrevious": "previous",
+               "sPageNext": "next",
+               "sPageLast": "last",
+               
+               /* Striping classes */
+               "sStripeOdd": "odd",
+               "sStripeEven": "even",
+               
+               /* Empty row */
+               "sRowEmpty": "dataTables_empty",
+               
+               /* Features */
+               "sWrapper": "dataTables_wrapper",
+               "sFilter": "dataTables_filter",
+               "sInfo": "dataTables_info",
+               "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */
+               "sLength": "dataTables_length",
+               "sProcessing": "dataTables_processing",
+               
+               /* Sorting */
+               "sSortAsc": "sorting_asc",
+               "sSortDesc": "sorting_desc",
+               "sSortable": "sorting", /* Sortable in both directions */
+               "sSortableAsc": "sorting_asc_disabled",
+               "sSortableDesc": "sorting_desc_disabled",
+               "sSortableNone": "sorting_disabled",
+               "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
+               "sSortJUIAsc": "",
+               "sSortJUIDesc": "",
+               "sSortJUI": "",
+               "sSortJUIAscAllowed": "",
+               "sSortJUIDescAllowed": "",
+               "sSortJUIWrapper": "",
+               "sSortIcon": "",
+               
+               /* Scrolling */
+               "sScrollWrapper": "dataTables_scroll",
+               "sScrollHead": "dataTables_scrollHead",
+               "sScrollHeadInner": "dataTables_scrollHeadInner",
+               "sScrollBody": "dataTables_scrollBody",
+               "sScrollFoot": "dataTables_scrollFoot",
+               "sScrollFootInner": "dataTables_scrollFootInner",
+               
+               /* Misc */
+               "sFooterTH": "",
+               "sJUIHeader": "",
+               "sJUIFooter": ""
+       } );
+       
+       
+       $.extend( DataTable.ext.oJUIClasses, DataTable.ext.oStdClasses, {
+               /* Two buttons buttons */
+               "sPagePrevEnabled": "fg-button ui-button ui-state-default ui-corner-left",
+               "sPagePrevDisabled": "fg-button ui-button ui-state-default ui-corner-left ui-state-disabled",
+               "sPageNextEnabled": "fg-button ui-button ui-state-default ui-corner-right",
+               "sPageNextDisabled": "fg-button ui-button ui-state-default ui-corner-right ui-state-disabled",
+               "sPageJUINext": "ui-icon ui-icon-circle-arrow-e",
+               "sPageJUIPrev": "ui-icon ui-icon-circle-arrow-w",
+               
+               /* Full numbers paging buttons */
+               "sPageButton": "fg-button ui-button ui-state-default",
+               "sPageButtonActive": "fg-button ui-button ui-state-default ui-state-disabled",
+               "sPageButtonStaticDisabled": "fg-button ui-button ui-state-default ui-state-disabled",
+               "sPageFirst": "first ui-corner-tl ui-corner-bl",
+               "sPageLast": "last ui-corner-tr ui-corner-br",
+               
+               /* Features */
+               "sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+
+                       "ui-buttonset-multi paging_", /* Note that the type is postfixed */
+               
+               /* Sorting */
+               "sSortAsc": "ui-state-default",
+               "sSortDesc": "ui-state-default",
+               "sSortable": "ui-state-default",
+               "sSortableAsc": "ui-state-default",
+               "sSortableDesc": "ui-state-default",
+               "sSortableNone": "ui-state-default",
+               "sSortJUIAsc": "css_right ui-icon ui-icon-triangle-1-n",
+               "sSortJUIDesc": "css_right ui-icon ui-icon-triangle-1-s",
+               "sSortJUI": "css_right ui-icon ui-icon-carat-2-n-s",
+               "sSortJUIAscAllowed": "css_right ui-icon ui-icon-carat-1-n",
+               "sSortJUIDescAllowed": "css_right ui-icon ui-icon-carat-1-s",
+               "sSortJUIWrapper": "DataTables_sort_wrapper",
+               "sSortIcon": "DataTables_sort_icon",
+               
+               /* Scrolling */
+               "sScrollHead": "dataTables_scrollHead ui-state-default",
+               "sScrollFoot": "dataTables_scrollFoot ui-state-default",
+               
+               /* Misc */
+               "sFooterTH": "ui-state-default",
+               "sJUIHeader": "fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix",
+               "sJUIFooter": "fg-toolbar ui-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix"
+       } );
+       
+       /*
+        * Variable: oPagination
+        * Purpose:  
+        * Scope:    jQuery.fn.dataTableExt
+        */
+       $.extend( DataTable.ext.oPagination, {
+               /*
+                * Variable: two_button
+                * Purpose:  Standard two button (forward/back) pagination
+                * Scope:    jQuery.fn.dataTableExt.oPagination
+                */
+               "two_button": {
+                       /*
+                        * Function: oPagination.two_button.fnInit
+                        * Purpose:  Initialise dom elements required for pagination with forward/back buttons only
+                        * Returns:  -
+                        * Inputs:   object:oSettings - dataTables settings object
+                        *           node:nPaging - the DIV which contains this pagination control
+                        *           function:fnCallbackDraw - draw function which must be called on update
+                        */
+                       "fnInit": function ( oSettings, nPaging, fnCallbackDraw )
+                       {
+                               var oLang = oSettings.oLanguage.oPaginate;
+                               var oClasses = oSettings.oClasses;
+                               var fnClickHandler = function ( e ) {
+                                       if ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) )
+                                       {
+                                               fnCallbackDraw( oSettings );
+                                       }
+                               };
+       
+                               var sAppend = (!oSettings.bJUI) ?
+                                       '<a class="'+oSettings.oClasses.sPagePrevDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button">'+oLang.sPrevious+'</a>'+
+                                       '<a class="'+oSettings.oClasses.sPageNextDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button">'+oLang.sNext+'</a>'
+                                       :
+                                       '<a class="'+oSettings.oClasses.sPagePrevDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button"><span class="'+oSettings.oClasses.sPageJUIPrev+'"></span></a>'+
+                                       '<a class="'+oSettings.oClasses.sPageNextDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button"><span class="'+oSettings.oClasses.sPageJUINext+'"></span></a>';
+                               $(nPaging).append( sAppend );
+                               
+                               var els = $('a', nPaging);
+                               var nPrevious = els[0],
+                                       nNext = els[1];
+                               
+                               oSettings.oApi._fnBindAction( nPrevious, {action: "previous"}, fnClickHandler );
+                               oSettings.oApi._fnBindAction( nNext,     {action: "next"},     fnClickHandler );
+                               
+                               /* ID the first elements only */
+                               if ( !oSettings.aanFeatures.p )
+                               {
+                                       nPaging.id = oSettings.sTableId+'_paginate';
+                                       nPrevious.id = oSettings.sTableId+'_previous';
+                                       nNext.id = oSettings.sTableId+'_next';
+       
+                                       nPrevious.setAttribute('aria-controls', oSettings.sTableId);
+                                       nNext.setAttribute('aria-controls', oSettings.sTableId);
+                               }
+                       },
+                       
+                       /*
+                        * Function: oPagination.two_button.fnUpdate
+                        * Purpose:  Update the two button pagination at the end of the draw
+                        * Returns:  -
+                        * Inputs:   object:oSettings - dataTables settings object
+                        *           function:fnCallbackDraw - draw function to call on page change
+                        */
+                       "fnUpdate": function ( oSettings, fnCallbackDraw )
+                       {
+                               if ( !oSettings.aanFeatures.p )
+                               {
+                                       return;
+                               }
+                               
+                               var oClasses = oSettings.oClasses;
+                               var an = oSettings.aanFeatures.p;
+                               var nNode;
+       
+                               /* Loop over each instance of the pager */
+                               for ( var i=0, iLen=an.length ; i<iLen ; i++ )
+                               {
+                                       nNode = an[i].firstChild;
+                                       if ( nNode )
+                                       {
+                                               /* Previous page */
+                                               nNode.className = ( oSettings._iDisplayStart === 0 ) ?
+                                                   oClasses.sPagePrevDisabled : oClasses.sPagePrevEnabled;
+                                                   
+                                               /* Next page */
+                                               nNode = nNode.nextSibling;
+                                               nNode.className = ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) ?
+                                                   oClasses.sPageNextDisabled : oClasses.sPageNextEnabled;
+                                       }
+                               }
+                       }
+               },
+               
+               
+               /*
+                * Variable: iFullNumbersShowPages
+                * Purpose:  Change the number of pages which can be seen
+                * Scope:    jQuery.fn.dataTableExt.oPagination
+                */
+               "iFullNumbersShowPages": 5,
+               
+               /*
+                * Variable: full_numbers
+                * Purpose:  Full numbers pagination
+                * Scope:    jQuery.fn.dataTableExt.oPagination
+                */
+               "full_numbers": {
+                       /*
+                        * Function: oPagination.full_numbers.fnInit
+                        * Purpose:  Initialise dom elements required for pagination with a list of the pages
+                        * Returns:  -
+                        * Inputs:   object:oSettings - dataTables settings object
+                        *           node:nPaging - the DIV which contains this pagination control
+                        *           function:fnCallbackDraw - draw function which must be called on update
+                        */
+                       "fnInit": function ( oSettings, nPaging, fnCallbackDraw )
+                       {
+                               var oLang = oSettings.oLanguage.oPaginate;
+                               var oClasses = oSettings.oClasses;
+                               var fnClickHandler = function ( e ) {
+                                       if ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) )
+                                       {
+                                               fnCallbackDraw( oSettings );
+                                       }
+                               };
+       
+                               $(nPaging).append(
+                                       '<a  tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageFirst+'">'+oLang.sFirst+'</a>'+
+                                       '<a  tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPagePrevious+'">'+oLang.sPrevious+'</a>'+
+                                       '<span></span>'+
+                                       '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageNext+'">'+oLang.sNext+'</a>'+
+                                       '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageLast+'">'+oLang.sLast+'</a>'
+                               );
+                               var els = $('a', nPaging);
+                               var nFirst = els[0],
+                                       nPrev = els[1],
+                                       nNext = els[2],
+                                       nLast = els[3];
+                               
+                               oSettings.oApi._fnBindAction( nFirst, {action: "first"},    fnClickHandler );
+                               oSettings.oApi._fnBindAction( nPrev,  {action: "previous"}, fnClickHandler );
+                               oSettings.oApi._fnBindAction( nNext,  {action: "next"},     fnClickHandler );
+                               oSettings.oApi._fnBindAction( nLast,  {action: "last"},     fnClickHandler );
+                               
+                               /* ID the first elements only */
+                               if ( !oSettings.aanFeatures.p )
+                               {
+                                       nPaging.id = oSettings.sTableId+'_paginate';
+                                       nFirst.id =oSettings.sTableId+'_first';
+                                       nPrev.id =oSettings.sTableId+'_previous';
+                                       nNext.id =oSettings.sTableId+'_next';
+                                       nLast.id =oSettings.sTableId+'_last';
+                               }
+                       },
+                       
+                       /*
+                        * Function: oPagination.full_numbers.fnUpdate
+                        * Purpose:  Update the list of page buttons shows
+                        * Returns:  -
+                        * Inputs:   object:oSettings - dataTables settings object
+                        *           function:fnCallbackDraw - draw function to call on page change
+                        */
+                       "fnUpdate": function ( oSettings, fnCallbackDraw )
+                       {
+                               if ( !oSettings.aanFeatures.p )
+                               {
+                                       return;
+                               }
+                               
+                               var iPageCount = DataTable.ext.oPagination.iFullNumbersShowPages;
+                               var iPageCountHalf = Math.floor(iPageCount / 2);
+                               var iPages = Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength);
+                               var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
+                               var sList = "";
+                               var iStartButton, iEndButton, i, iLen;
+                               var oClasses = oSettings.oClasses;
+                               var anButtons, anStatic, nPaginateList, nNode;
+                               var an = oSettings.aanFeatures.p;
+                               var fnBind = function (j) {
+                                       oSettings.oApi._fnBindAction( this, {"page": j+iStartButton-1}, function(e) {
+                                               /* Use the information in the element to jump to the required page */
+                                               oSettings.oApi._fnPageChange( oSettings, e.data.page );
+                                               fnCallbackDraw( oSettings );
+                                               e.preventDefault();
+                                       } );
+                               };
+                               
+                               /* Pages calculation */
+                               if ( oSettings._iDisplayLength === -1 )
+                               {
+                                       iStartButton = 1;
+                                       iEndButton = 1;
+                                       iCurrentPage = 1;
+                               }
+                               else if (iPages < iPageCount)
+                               {
+                                       iStartButton = 1;
+                                       iEndButton = iPages;
+                               }
+                               else if (iCurrentPage <= iPageCountHalf)
+                               {
+                                       iStartButton = 1;
+                                       iEndButton = iPageCount;
+                               }
+                               else if (iCurrentPage >= (iPages - iPageCountHalf))
+                               {
+                                       iStartButton = iPages - iPageCount + 1;
+                                       iEndButton = iPages;
+                               }
+                               else
+                               {
+                                       iStartButton = iCurrentPage - Math.ceil(iPageCount / 2) + 1;
+                                       iEndButton = iStartButton + iPageCount - 1;
+                               }
+       
+                               
+                               /* Build the dynamic list */
+                               for ( i=iStartButton ; i<=iEndButton ; i++ )
+                               {
+                                       sList += (iCurrentPage !== i) ?
+                                               '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+'">'+oSettings.fnFormatNumber(i)+'</a>' :
+                                               '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButtonActive+'">'+oSettings.fnFormatNumber(i)+'</a>';
+                               }
+                               
+                               /* Loop over each instance of the pager */
+                               for ( i=0, iLen=an.length ; i<iLen ; i++ )
+                               {
+                                       nNode = an[i];
+                                       if ( !nNode.hasChildNodes() )
+                                       {
+                                               continue;
+                                       }
+                                       
+                                       /* Build up the dynamic list first - html and listeners */
+                                       $('span:eq(0)', nNode)
+                                               .html( sList )
+                                               .children('a').each( fnBind );
+                                       
+                                       /* Update the permanent button's classes */
+                                       anButtons = nNode.getElementsByTagName('a');
+                                       anStatic = [
+                                               anButtons[0], anButtons[1], 
+                                               anButtons[anButtons.length-2], anButtons[anButtons.length-1]
+                                       ];
+       
+                                       $(anStatic).removeClass( oClasses.sPageButton+" "+oClasses.sPageButtonActive+" "+oClasses.sPageButtonStaticDisabled );
+                                       $([anStatic[0], anStatic[1]]).addClass( 
+                                               (iCurrentPage==1) ?
+                                                       oClasses.sPageButtonStaticDisabled :
+                                                       oClasses.sPageButton
+                                       );
+                                       $([anStatic[2], anStatic[3]]).addClass(
+                                               (iPages===0 || iCurrentPage===iPages || oSettings._iDisplayLength===-1) ?
+                                                       oClasses.sPageButtonStaticDisabled :
+                                                       oClasses.sPageButton
+                                       );
+                               }
+                       }
+               }
+       } );
+       
+       $.extend( DataTable.ext.oSort, {
+               /*
+                * text sorting
+                */
+               "string-pre": function ( a )
+               {
+                       if ( typeof a != 'string' ) {
+                               a = (a !== null && a.toString) ? a.toString() : '';
+                       }
+                       return a.toLowerCase();
+               },
+       
+               "string-asc": function ( x, y )
+               {
+                       return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+               },
+               
+               "string-desc": function ( x, y )
+               {
+                       return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+               },
+               
+               
+               /*
+                * html sorting (ignore html tags)
+                */
+               "html-pre": function ( a )
+               {
+                       return a.replace( /<.*?>/g, "" ).toLowerCase();
+               },
+               
+               "html-asc": function ( x, y )
+               {
+                       return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+               },
+               
+               "html-desc": function ( x, y )
+               {
+                       return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+               },
+               
+               
+               /*
+                * date sorting
+                */
+               "date-pre": function ( a )
+               {
+                       var x = Date.parse( a );
+                       
+                       if ( isNaN(x) || x==="" )
+                       {
+                               x = Date.parse( "01/01/1970 00:00:00" );
+                       }
+                       return x;
+               },
+       
+               "date-asc": function ( x, y )
+               {
+                       return x - y;
+               },
+               
+               "date-desc": function ( x, y )
+               {
+                       return y - x;
+               },
+               
+               
+               /*
+                * numerical sorting
+                */
+               "numeric-pre": function ( a )
+               {
+                       return (a=="-" || a==="") ? 0 : a*1;
+               },
+       
+               "numeric-asc": function ( x, y )
+               {
+                       return x - y;
+               },
+               
+               "numeric-desc": function ( x, y )
+               {
+                       return y - x;
+               }
+       } );
+       
+       
+       $.extend( DataTable.ext.aTypes, [
+               /*
+                * Function: -
+                * Purpose:  Check to see if a string is numeric
+                * Returns:  string:'numeric' or null
+                * Inputs:   mixed:sText - string to check
+                */
+               function ( sData )
+               {
+                       /* Allow zero length strings as a number */
+                       if ( typeof sData === 'number' )
+                       {
+                               return 'numeric';
+                       }
+                       else if ( typeof sData !== 'string' )
+                       {
+                               return null;
+                       }
+                       
+                       var sValidFirstChars = "0123456789-";
+                       var sValidChars = "0123456789.";
+                       var Char;
+                       var bDecimal = false;
+                       
+                       /* Check for a valid first char (no period and allow negatives) */
+                       Char = sData.charAt(0); 
+                       if (sValidFirstChars.indexOf(Char) == -1) 
+                       {
+                               return null;
+                       }
+                       
+                       /* Check all the other characters are valid */
+                       for ( var i=1 ; i<sData.length ; i++ ) 
+                       {
+                               Char = sData.charAt(i); 
+                               if (sValidChars.indexOf(Char) == -1) 
+                               {
+                                       return null;
+                               }
+                               
+                               /* Only allowed one decimal place... */
+                               if ( Char == "." )
+                               {
+                                       if ( bDecimal )
+                                       {
+                                               return null;
+                                       }
+                                       bDecimal = true;
+                               }
+                       }
+                       
+                       return 'numeric';
+               },
+               
+               /*
+                * Function: -
+                * Purpose:  Check to see if a string is actually a formatted date
+                * Returns:  string:'date' or null
+                * Inputs:   string:sText - string to check
+                */
+               function ( sData )
+               {
+                       var iParse = Date.parse(sData);
+                       if ( (iParse !== null && !isNaN(iParse)) || (typeof sData === 'string' && sData.length === 0) )
+                       {
+                               return 'date';
+                       }
+                       return null;
+               },
+               
+               /*
+                * Function: -
+                * Purpose:  Check to see if a string should be treated as an HTML string
+                * Returns:  string:'html' or null
+                * Inputs:   string:sText - string to check
+                */
+               function ( sData )
+               {
+                       if ( typeof sData === 'string' && sData.indexOf('<') != -1 && sData.indexOf('>') != -1 )
+                       {
+                               return 'html';
+                       }
+                       return null;
+               }
+       ] );
+       
+
+       // jQuery aliases
+       $.fn.DataTable = DataTable;
+       $.fn.dataTable = DataTable;
+       $.fn.dataTableSettings = DataTable.settings;
+       $.fn.dataTableExt = DataTable.ext;
+
+
+       // Information about events fired by DataTables - for documentation.
+       /**
+        * Draw event, fired whenever the table is redrawn on the page, at the same point as
+        * fnDrawCallback. This may be useful for binding events or performing calculations when
+        * the table is altered at all.
+        *  @name DataTable#draw
+        *  @event
+        *  @param {event} e jQuery event object
+        *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+        */
+
+       /**
+        * Filter event, fired when the filtering applied to the table (using the build in global
+        * global filter, or column filters) is altered.
+        *  @name DataTable#filter
+        *  @event
+        *  @param {event} e jQuery event object
+        *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+        */
+
+       /**
+        * Page change event, fired when the paging of the table is altered.
+        *  @name DataTable#page
+        *  @event
+        *  @param {event} e jQuery event object
+        *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+        */
+
+       /**
+        * Sort event, fired when the sorting applied to the table is altered.
+        *  @name DataTable#sort
+        *  @event
+        *  @param {event} e jQuery event object
+        *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+        */
+
+       /**
+        * DataTables initialisation complete event, fired when the table is fully drawn,
+        * including Ajax data loaded, if Ajax data is required.
+        *  @name DataTable#init
+        *  @event
+        *  @param {event} e jQuery event object
+        *  @param {object} oSettings DataTables settings object
+        *  @param {object} json The JSON object request from the server - only
+        *    present if client-side Ajax sourced data is used</li></ol>
+        */
+
+       /**
+        * State save event, fired when the table has changed state a new state save is required.
+        * This method allows modification of the state saving object prior to actually doing the
+        * save, including addition or other state properties (for plug-ins) or modification
+        * of a DataTables core property.
+        *  @name DataTable#stateSaveParams
+        *  @event
+        *  @param {event} e jQuery event object
+        *  @param {object} oSettings DataTables settings object
+        *  @param {object} json The state information to be saved
+        */
+
+       /**
+        * State load event, fired when the table is loading state from the stored data, but
+        * prior to the settings object being modified by the saved state - allowing modification
+        * of the saved state is required or loading of state for a plug-in.
+        *  @name DataTable#stateLoadParams
+        *  @event
+        *  @param {event} e jQuery event object
+        *  @param {object} oSettings DataTables settings object
+        *  @param {object} json The saved state information
+        */
+
+       /**
+        * State loaded event, fired when state has been loaded from stored data and the settings
+        * object has been modified by the loaded data.
+        *  @name DataTable#stateLoaded
+        *  @event
+        *  @param {event} e jQuery event object
+        *  @param {object} oSettings DataTables settings object
+        *  @param {object} json The saved state information
+        */
+
+       /**
+        * Processing event, fired when DataTables is doing some kind of processing (be it,
+        * sort, filter or anything else). Can be used to indicate to the end user that
+        * there is something happening, or that something has finished.
+        *  @name DataTable#processing
+        *  @event
+        *  @param {event} e jQuery event object
+        *  @param {object} oSettings DataTables settings object
+        *  @param {boolean} bShow Flag for if DataTables is doing processing or not
+        */
+
+       /**
+        * Ajax (XHR) event, fired whenever an Ajax request is completed from a request to 
+        * made to the server for new data (note that this trigger is called in fnServerData,
+        * if you override fnServerData and which to use this event, you need to trigger it in
+        * you success function).
+        *  @name DataTable#xhr
+        *  @event
+        *  @param {event} e jQuery event object
+        *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+        *  @param {object} json JSON returned from the server
+        */
+
+       /**
+        * Destroy event, fired when the DataTable is destroyed by calling fnDestroy or passing
+        * the bDestroy:true parameter in the initialisation object. This can be used to remove
+        * bound events, added DOM nodes, etc.
+        *  @name DataTable#destroy
+        *  @event
+        *  @param {event} e jQuery event object
+        *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+        */
+}));
+
+}(window, document));
+
deleted file mode 120000 (symlink)
index 99ed19d0ab4e3e4d16cfe3505bf93dafb754d302..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1 +0,0 @@
-jquery-1.10.2.js
\ No newline at end of file
new file mode 100644 (file)
index 0000000000000000000000000000000000000000..c5c648255c1574dcc95c506b82c25044f0972dfd
--- /dev/null
+/*!
+ * jQuery JavaScript Library v1.10.2
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-07-03T13:48Z
+ */
+(function( window, undefined ) {
+
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//"use strict";
+var
+       // The deferred used on DOM ready
+       readyList,
+
+       // A central reference to the root jQuery(document)
+       rootjQuery,
+
+       // Support: IE<10
+       // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
+       core_strundefined = typeof undefined,
+
+       // Use the correct document accordingly with window argument (sandbox)
+       location = window.location,
+       document = window.document,
+       docElem = document.documentElement,
+
+       // Map over jQuery in case of overwrite
+       _jQuery = window.jQuery,
+
+       // Map over the $ in case of overwrite
+       _$ = window.$,
+
+       // [[Class]] -> type pairs
+       class2type = {},
+
+       // List of deleted data cache ids, so we can reuse them
+       core_deletedIds = [],
+
+       core_version = "1.10.2",
+
+       // Save a reference to some core methods
+       core_concat = core_deletedIds.concat,
+       core_push = core_deletedIds.push,
+       core_slice = core_deletedIds.slice,
+       core_indexOf = core_deletedIds.indexOf,
+       core_toString = class2type.toString,
+       core_hasOwn = class2type.hasOwnProperty,
+       core_trim = core_version.trim,
+
+       // Define a local copy of jQuery
+       jQuery = function( selector, context ) {
+               // The jQuery object is actually just the init constructor 'enhanced'
+               return new jQuery.fn.init( selector, context, rootjQuery );
+       },
+
+       // Used for matching numbers
+       core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
+
+       // Used for splitting on whitespace
+       core_rnotwhite = /\S+/g,
+
+       // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+       rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+       // A simple way to check for HTML strings
+       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+       // Strict HTML recognition (#11290: must start with <)
+       rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+       // Match a standalone tag
+       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+       // JSON RegExp
+       rvalidchars = /^[\],:{}\s]*$/,
+       rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+       rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+       rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
+
+       // Matches dashed string for camelizing
+       rmsPrefix = /^-ms-/,
+       rdashAlpha = /-([\da-z])/gi,
+
+       // Used by jQuery.camelCase as callback to replace()
+       fcamelCase = function( all, letter ) {
+               return letter.toUpperCase();
+       },
+
+       // The ready event handler
+       completed = function( event ) {
+
+               // readyState === "complete" is good enough for us to call the dom ready in oldIE
+               if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
+                       detach();
+                       jQuery.ready();
+               }
+       },
+       // Clean-up method for dom ready events
+       detach = function() {
+               if ( document.addEventListener ) {
+                       document.removeEventListener( "DOMContentLoaded", completed, false );
+                       window.removeEventListener( "load", completed, false );
+
+               } else {
+                       document.detachEvent( "onreadystatechange", completed );
+                       window.detachEvent( "onload", completed );
+               }
+       };
+
+jQuery.fn = jQuery.prototype = {
+       // The current version of jQuery being used
+       jquery: core_version,
+
+       constructor: jQuery,
+       init: function( selector, context, rootjQuery ) {
+               var match, elem;
+
+               // HANDLE: $(""), $(null), $(undefined), $(false)
+               if ( !selector ) {
+                       return this;
+               }
+
+               // Handle HTML strings
+               if ( typeof selector === "string" ) {
+                       if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+                               // Assume that strings that start and end with <> are HTML and skip the regex check
+                               match = [ null, selector, null ];
+
+                       } else {
+                               match = rquickExpr.exec( selector );
+                       }
+
+                       // Match html or make sure no context is specified for #id
+                       if ( match && (match[1] || !context) ) {
+
+                               // HANDLE: $(html) -> $(array)
+                               if ( match[1] ) {
+                                       context = context instanceof jQuery ? context[0] : context;
+
+                                       // scripts is true for back-compat
+                                       jQuery.merge( this, jQuery.parseHTML(
+                                               match[1],
+                                               context && context.nodeType ? context.ownerDocument || context : document,
+                                               true
+                                       ) );
+
+                                       // HANDLE: $(html, props)
+                                       if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+                                               for ( match in context ) {
+                                                       // Properties of context are called as methods if possible
+                                                       if ( jQuery.isFunction( this[ match ] ) ) {
+                                                               this[ match ]( context[ match ] );
+
+                                                       // ...and otherwise set as attributes
+                                                       } else {
+                                                               this.attr( match, context[ match ] );
+                                                       }
+                                               }
+                                       }
+
+                                       return this;
+
+                               // HANDLE: $(#id)
+                               } else {
+                                       elem = document.getElementById( match[2] );
+
+                                       // Check parentNode to catch when Blackberry 4.6 returns
+                                       // nodes that are no longer in the document #6963
+                                       if ( elem && elem.parentNode ) {
+                                               // Handle the case where IE and Opera return items
+                                               // by name instead of ID
+                                               if ( elem.id !== match[2] ) {
+                                                       return rootjQuery.find( selector );
+                                               }
+
+                                               // Otherwise, we inject the element directly into the jQuery object
+                                               this.length = 1;
+                                               this[0] = elem;
+                                       }
+
+                                       this.context = document;
+                                       this.selector = selector;
+                                       return this;
+                               }
+
+                       // HANDLE: $(expr, $(...))
+                       } else if ( !context || context.jquery ) {
+                               return ( context || rootjQuery ).find( selector );
+
+                       // HANDLE: $(expr, context)
+                       // (which is just equivalent to: $(context).find(expr)
+                       } else {
+                               return this.constructor( context ).find( selector );
+                       }
+
+               // HANDLE: $(DOMElement)
+               } else if ( selector.nodeType ) {
+                       this.context = this[0] = selector;
+                       this.length = 1;
+                       return this;
+
+               // HANDLE: $(function)
+               // Shortcut for document ready
+               } else if ( jQuery.isFunction( selector ) ) {
+                       return rootjQuery.ready( selector );
+               }
+
+               if ( selector.selector !== undefined ) {
+                       this.selector = selector.selector;
+                       this.context = selector.context;
+               }
+
+               return jQuery.makeArray( selector, this );
+       },
+
+       // Start with an empty selector
+       selector: "",
+
+       // The default length of a jQuery object is 0
+       length: 0,
+
+       toArray: function() {
+               return core_slice.call( this );
+       },
+
+       // Get the Nth element in the matched element set OR
+       // Get the whole matched element set as a clean array
+       get: function( num ) {
+               return num == null ?
+
+                       // Return a 'clean' array
+                       this.toArray() :
+
+                       // Return just the object
+                       ( num < 0 ? this[ this.length + num ] : this[ num ] );
+       },
+
+       // Take an array of elements and push it onto the stack
+       // (returning the new matched element set)
+       pushStack: function( elems ) {
+
+               // Build a new jQuery matched element set
+               var ret = jQuery.merge( this.constructor(), elems );
+
+               // Add the old object onto the stack (as a reference)
+               ret.prevObject = this;
+               ret.context = this.context;
+
+               // Return the newly-formed element set
+               return ret;
+       },
+
+       // Execute a callback for every element in the matched set.
+       // (You can seed the arguments with an array of args, but this is
+       // only used internally.)
+       each: function( callback, args ) {
+               return jQuery.each( this, callback, args );
+       },
+
+       ready: function( fn ) {
+               // Add the callback
+               jQuery.ready.promise().done( fn );
+
+               return this;
+       },
+
+       slice: function() {
+               return this.pushStack( core_slice.apply( this, arguments ) );
+       },
+
+       first: function() {
+               return this.eq( 0 );
+       },
+
+       last: function() {
+               return this.eq( -1 );
+       },
+
+       eq: function( i ) {
+               var len = this.length,
+                       j = +i + ( i < 0 ? len : 0 );
+               return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+       },
+
+       map: function( callback ) {
+               return this.pushStack( jQuery.map(this, function( elem, i ) {
+                       return callback.call( elem, i, elem );
+               }));
+       },
+
+       end: function() {
+               return this.prevObject || this.constructor(null);
+       },
+
+       // For internal use only.
+       // Behaves like an Array's method, not like a jQuery method.
+       push: core_push,
+       sort: [].sort,
+       splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+       var src, copyIsArray, copy, name, options, clone,
+               target = arguments[0] || {},
+               i = 1,
+               length = arguments.length,
+               deep = false;
+
+       // Handle a deep copy situation
+       if ( typeof target === "boolean" ) {
+               deep = target;
+               target = arguments[1] || {};
+               // skip the boolean and the target
+               i = 2;
+       }
+
+       // Handle case when target is a string or something (possible in deep copy)
+       if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+               target = {};
+       }
+
+       // extend jQuery itself if only one argument is passed
+       if ( length === i ) {
+               target = this;
+               --i;
+       }
+
+       for ( ; i < length; i++ ) {
+               // Only deal with non-null/undefined values
+               if ( (options = arguments[ i ]) != null ) {
+                       // Extend the base object
+                       for ( name in options ) {
+                               src = target[ name ];
+                               copy = options[ name ];
+
+                               // Prevent never-ending loop
+                               if ( target === copy ) {
+                                       continue;
+                               }
+
+                               // Recurse if we're merging plain objects or arrays
+                               if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+                                       if ( copyIsArray ) {
+                                               copyIsArray = false;
+                                               clone = src && jQuery.isArray(src) ? src : [];
+
+                                       } else {
+                                               clone = src && jQuery.isPlainObject(src) ? src : {};
+                                       }
+
+                                       // Never move original objects, clone them
+                                       target[ name ] = jQuery.extend( deep, clone, copy );
+
+                               // Don't bring in undefined values
+                               } else if ( copy !== undefined ) {
+                                       target[ name ] = copy;
+                               }
+                       }
+               }
+       }
+
+       // Return the modified object
+       return target;
+};
+
+jQuery.extend({
+       // Unique for each copy of jQuery on the page
+       // Non-digits removed to match rinlinejQuery
+       expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
+
+       noConflict: function( deep ) {
+               if ( window.$ === jQuery ) {
+                       window.$ = _$;
+               }
+
+               if ( deep && window.jQuery === jQuery ) {
+                       window.jQuery = _jQuery;
+               }
+
+               return jQuery;
+       },
+
+       // Is the DOM ready to be used? Set to true once it occurs.
+       isReady: false,
+
+       // A counter to track how many items to wait for before
+       // the ready event fires. See #6781
+       readyWait: 1,
+
+       // Hold (or release) the ready event
+       holdReady: function( hold ) {
+               if ( hold ) {
+                       jQuery.readyWait++;
+               } else {
+                       jQuery.ready( true );
+               }
+       },
+
+       // Handle when the DOM is ready
+       ready: function( wait ) {
+
+               // Abort if there are pending holds or we're already ready
+               if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+                       return;
+               }
+
+               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+               if ( !document.body ) {
+                       return setTimeout( jQuery.ready );
+               }
+
+               // Remember that the DOM is ready
+               jQuery.isReady = true;
+
+               // If a normal DOM Ready event fired, decrement, and wait if need be
+               if ( wait !== true && --jQuery.readyWait > 0 ) {
+                       return;
+               }
+
+               // If there are functions bound, to execute
+               readyList.resolveWith( document, [ jQuery ] );
+
+               // Trigger any bound ready events
+               if ( jQuery.fn.trigger ) {
+                       jQuery( document ).trigger("ready").off("ready");
+               }
+       },
+
+       // See test/unit/core.js for details concerning isFunction.
+       // Since version 1.3, DOM methods and functions like alert
+       // aren't supported. They return false on IE (#2968).
+       isFunction: function( obj ) {
+               return jQuery.type(obj) === "function";
+       },
+
+       isArray: Array.isArray || function( obj ) {
+               return jQuery.type(obj) === "array";
+       },
+
+       isWindow: function( obj ) {
+               /* jshint eqeqeq: false */
+               return obj != null && obj == obj.window;
+       },
+
+       isNumeric: function( obj ) {
+               return !isNaN( parseFloat(obj) ) && isFinite( obj );
+       },
+
+       type: function( obj ) {
+               if ( obj == null ) {
+                       return String( obj );
+               }
+               return typeof obj === "object" || typeof obj === "function" ?
+                       class2type[ core_toString.call(obj) ] || "object" :
+                       typeof obj;
+       },
+
+       isPlainObject: function( obj ) {
+               var key;
+
+               // Must be an Object.
+               // Because of IE, we also have to check the presence of the constructor property.
+               // Make sure that DOM nodes and window objects don't pass through, as well
+               if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+                       return false;
+               }
+
+               try {
+                       // Not own constructor property must be Object
+                       if ( obj.constructor &&
+                               !core_hasOwn.call(obj, "constructor") &&
+                               !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+                               return false;
+                       }
+               } catch ( e ) {
+                       // IE8,9 Will throw exceptions on certain host objects #9897
+                       return false;
+               }
+
+               // Support: IE<9
+               // Handle iteration over inherited properties before own properties.
+               if ( jQuery.support.ownLast ) {
+                       for ( key in obj ) {
+                               return core_hasOwn.call( obj, key );
+                       }
+               }
+
+               // Own properties are enumerated firstly, so to speed up,
+               // if last one is own, then all properties are own.
+               for ( key in obj ) {}
+
+               return key === undefined || core_hasOwn.call( obj, key );
+       },
+
+       isEmptyObject: function( obj ) {
+               var name;
+               for ( name in obj ) {
+                       return false;
+               }
+               return true;
+       },
+
+       error: function( msg ) {
+               throw new Error( msg );
+       },
+
+       // data: string of html
+       // context (optional): If specified, the fragment will be created in this context, defaults to document
+       // keepScripts (optional): If true, will include scripts passed in the html string
+       parseHTML: function( data, context, keepScripts ) {
+               if ( !data || typeof data !== "string" ) {
+                       return null;
+               }
+               if ( typeof context === "boolean" ) {
+                       keepScripts = context;
+                       context = false;
+               }
+               context = context || document;
+
+               var parsed = rsingleTag.exec( data ),
+                       scripts = !keepScripts && [];
+
+               // Single tag
+               if ( parsed ) {
+                       return [ context.createElement( parsed[1] ) ];
+               }
+
+               parsed = jQuery.buildFragment( [ data ], context, scripts );
+               if ( scripts ) {
+                       jQuery( scripts ).remove();
+               }
+               return jQuery.merge( [], parsed.childNodes );
+       },
+
+       parseJSON: function( data ) {
+               // Attempt to parse using the native JSON parser first
+               if ( window.JSON && window.JSON.parse ) {
+                       return window.JSON.parse( data );
+               }
+
+               if ( data === null ) {
+                       return data;
+               }
+
+               if ( typeof data === "string" ) {
+
+                       // Make sure leading/trailing whitespace is removed (IE can't handle it)
+                       data = jQuery.trim( data );
+
+                       if ( data ) {
+                               // Make sure the incoming data is actual JSON
+                               // Logic borrowed from http://json.org/json2.js
+                               if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+                                       .replace( rvalidtokens, "]" )
+                                       .replace( rvalidbraces, "")) ) {
+
+                                       return ( new Function( "return " + data ) )();
+                               }
+                       }
+               }
+
+               jQuery.error( "Invalid JSON: " + data );
+       },
+
+       // Cross-browser xml parsing
+       parseXML: function( data ) {
+               var xml, tmp;
+               if ( !data || typeof data !== "string" ) {
+                       return null;
+               }
+               try {
+                       if ( window.DOMParser ) { // Standard
+                               tmp = new DOMParser();
+                               xml = tmp.parseFromString( data , "text/xml" );
+                       } else { // IE
+                               xml = new ActiveXObject( "Microsoft.XMLDOM" );
+                               xml.async = "false";
+                               xml.loadXML( data );
+                       }
+               } catch( e ) {
+                       xml = undefined;
+               }
+               if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+                       jQuery.error( "Invalid XML: " + data );
+               }
+               return xml;
+       },
+
+       noop: function() {},
+
+       // Evaluates a script in a global context
+       // Workarounds based on findings by Jim Driscoll
+       // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+       globalEval: function( data ) {
+               if ( data && jQuery.trim( data ) ) {
+                       // We use execScript on Internet Explorer
+                       // We use an anonymous function so that context is window
+                       // rather than jQuery in Firefox
+                       ( window.execScript || function( data ) {
+                               window[ "eval" ].call( window, data );
+                       } )( data );
+               }
+       },
+
+       // Convert dashed to camelCase; used by the css and data modules
+       // Microsoft forgot to hump their vendor prefix (#9572)
+       camelCase: function( string ) {
+               return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+       },
+
+       nodeName: function( elem, name ) {
+               return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+       },
+
+       // args is for internal usage only
+       each: function( obj, callback, args ) {
+               var value,
+                       i = 0,
+                       length = obj.length,
+                       isArray = isArraylike( obj );
+
+               if ( args ) {
+                       if ( isArray ) {
+                               for ( ; i < length; i++ ) {
+                                       value = callback.apply( obj[ i ], args );
+
+                                       if ( value === false ) {
+                                               break;
+                                       }
+                               }
+                       } else {
+                               for ( i in obj ) {
+                                       value = callback.apply( obj[ i ], args );
+
+                                       if ( value === false ) {
+                                               break;
+                                       }
+                               }
+                       }
+
+               // A special, fast, case for the most common use of each
+               } else {
+                       if ( isArray ) {
+                               for ( ; i < length; i++ ) {
+                                       value = callback.call( obj[ i ], i, obj[ i ] );
+
+                                       if ( value === false ) {
+                                               break;
+                                       }
+                               }
+                       } else {
+                               for ( i in obj ) {
+                                       value = callback.call( obj[ i ], i, obj[ i ] );
+
+                                       if ( value === false ) {
+                                               break;
+                                       }
+                               }
+                       }
+               }
+
+               return obj;
+       },
+
+       // Use native String.trim function wherever possible
+       trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+               function( text ) {
+                       return text == null ?
+                               "" :
+                               core_trim.call( text );
+               } :
+
+               // Otherwise use our own trimming functionality
+               function( text ) {
+                       return text == null ?
+                               "" :
+                               ( text + "" ).replace( rtrim, "" );
+               },
+
+       // results is for internal usage only
+       makeArray: function( arr, results ) {
+               var ret = results || [];
+
+               if ( arr != null ) {
+                       if ( isArraylike( Object(arr) ) ) {
+                               jQuery.merge( ret,
+                                       typeof arr === "string" ?
+                                       [ arr ] : arr
+                               );
+                       } else {
+                               core_push.call( ret, arr );
+                       }
+               }
+
+               return ret;
+       },
+
+       inArray: function( elem, arr, i ) {
+               var len;
+
+               if ( arr ) {
+                       if ( core_indexOf ) {
+                               return core_indexOf.call( arr, elem, i );
+                       }
+
+                       len = arr.length;
+                       i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+                       for ( ; i < len; i++ ) {
+                               // Skip accessing in sparse arrays
+                               if ( i in arr && arr[ i ] === elem ) {
+                                       return i;
+                               }
+                       }
+               }
+
+               return -1;
+       },
+
+       merge: function( first, second ) {
+               var l = second.length,
+                       i = first.length,
+                       j = 0;
+
+               if ( typeof l === "number" ) {
+                       for ( ; j < l; j++ ) {
+                               first[ i++ ] = second[ j ];
+                       }
+               } else {
+                       while ( second[j] !== undefined ) {
+                               first[ i++ ] = second[ j++ ];
+                       }
+               }
+
+               first.length = i;
+
+               return first;
+       },
+
+       grep: function( elems, callback, inv ) {
+               var retVal,
+                       ret = [],
+                       i = 0,
+                       length = elems.length;
+               inv = !!inv;
+
+               // Go through the array, only saving the items
+               // that pass the validator function
+               for ( ; i < length; i++ ) {
+                       retVal = !!callback( elems[ i ], i );
+                       if ( inv !== retVal ) {
+                               ret.push( elems[ i ] );
+                       }
+               }
+
+               return ret;
+       },
+
+       // arg is for internal usage only
+       map: function( elems, callback, arg ) {
+               var value,
+                       i = 0,
+                       length = elems.length,
+                       isArray = isArraylike( elems ),
+                       ret = [];
+
+               // Go through the array, translating each of the items to their
+               if ( isArray ) {
+                       for ( ; i < length; i++ ) {
+                               value = callback( elems[ i ], i, arg );
+
+                               if ( value != null ) {
+                                       ret[ ret.length ] = value;
+                               }
+                       }
+
+               // Go through every key on the object,
+               } else {
+                       for ( i in elems ) {
+                               value = callback( elems[ i ], i, arg );
+
+                               if ( value != null ) {
+                                       ret[ ret.length ] = value;
+                               }
+                       }
+               }
+
+               // Flatten any nested arrays
+               return core_concat.apply( [], ret );
+       },
+
+       // A global GUID counter for objects
+       guid: 1,
+
+       // Bind a function to a context, optionally partially applying any
+       // arguments.
+       proxy: function( fn, context ) {
+               var args, proxy, tmp;
+
+               if ( typeof context === "string" ) {
+                       tmp = fn[ context ];
+                       context = fn;
+                       fn = tmp;
+               }
+
+               // Quick check to determine if target is callable, in the spec
+               // this throws a TypeError, but we will just return undefined.
+               if ( !jQuery.isFunction( fn ) ) {
+                       return undefined;
+               }
+
+               // Simulated bind
+               args = core_slice.call( arguments, 2 );
+               proxy = function() {
+                       return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
+               };
+
+               // Set the guid of unique handler to the same of original handler, so it can be removed
+               proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+               return proxy;
+       },
+
+       // Multifunctional method to get and set values of a collection
+       // The value/s can optionally be executed if it's a function
+       access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
+               var i = 0,
+                       length = elems.length,
+                       bulk = key == null;
+
+               // Sets many values
+               if ( jQuery.type( key ) === "object" ) {
+                       chainable = true;
+                       for ( i in key ) {
+                               jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+                       }
+
+               // Sets one value
+               } else if ( value !== undefined ) {
+                       chainable = true;
+
+                       if ( !jQuery.isFunction( value ) ) {
+                               raw = true;
+                       }
+
+                       if ( bulk ) {
+                               // Bulk operations run against the entire set
+                               if ( raw ) {
+                                       fn.call( elems, value );
+                                       fn = null;
+
+                               // ...except when executing function values
+                               } else {
+                                       bulk = fn;
+                                       fn = function( elem, key, value ) {
+                                               return bulk.call( jQuery( elem ), value );
+                                       };
+                               }
+                       }
+
+                       if ( fn ) {
+                               for ( ; i < length; i++ ) {
+                                       fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+                               }
+                       }
+               }
+
+               return chainable ?
+                       elems :
+
+                       // Gets
+                       bulk ?
+                               fn.call( elems ) :
+                               length ? fn( elems[0], key ) : emptyGet;
+       },
+
+       now: function() {
+               return ( new Date() ).getTime();
+       },
+
+       // A method for quickly swapping in/out CSS properties to get correct calculations.
+       // Note: this method belongs to the css module but it's needed here for the support module.
+       // If support gets modularized, this method should be moved back to the css module.
+       swap: function( elem, options, callback, args ) {
+               var ret, name,
+                       old = {};
+
+               // Remember the old values, and insert the new ones
+               for ( name in options ) {
+                       old[ name ] = elem.style[ name ];
+                       elem.style[ name ] = options[ name ];
+               }
+
+               ret = callback.apply( elem, args || [] );
+
+               // Revert the old values
+               for ( name in options ) {
+                       elem.style[ name ] = old[ name ];
+               }
+
+               return ret;
+       }
+});
+
+jQuery.ready.promise = function( obj ) {
+       if ( !readyList ) {
+
+               readyList = jQuery.Deferred();
+
+               // Catch cases where $(document).ready() is called after the browser event has already occurred.
+               // we once tried to use readyState "interactive" here, but it caused issues like the one
+               // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+               if ( document.readyState === "complete" ) {
+                       // Handle it asynchronously to allow scripts the opportunity to delay ready
+                       setTimeout( jQuery.ready );
+
+               // Standards-based browsers support DOMContentLoaded
+               } else if ( document.addEventListener ) {
+                       // Use the handy event callback
+                       document.addEventListener( "DOMContentLoaded", completed, false );
+
+                       // A fallback to window.onload, that will always work
+                       window.addEventListener( "load", completed, false );
+
+               // If IE event model is used
+               } else {
+                       // Ensure firing before onload, maybe late but safe also for iframes
+                       document.attachEvent( "onreadystatechange", completed );
+
+                       // A fallback to window.onload, that will always work
+                       window.attachEvent( "onload", completed );
+
+                       // If IE and not a frame
+                       // continually check to see if the document is ready
+                       var top = false;
+
+                       try {
+                               top = window.frameElement == null && document.documentElement;
+                       } catch(e) {}
+
+                       if ( top && top.doScroll ) {
+                               (function doScrollCheck() {
+                                       if ( !jQuery.isReady ) {
+
+                                               try {
+                                                       // Use the trick by Diego Perini
+                                                       // http://javascript.nwbox.com/IEContentLoaded/
+                                                       top.doScroll("left");
+                                               } catch(e) {
+                                                       return setTimeout( doScrollCheck, 50 );
+                                               }
+
+                                               // detach all dom ready events
+                                               detach();
+
+                                               // and execute any waiting functions
+                                               jQuery.ready();
+                                       }
+                               })();
+                       }
+               }
+       }
+       return readyList.promise( obj );
+};
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+       class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+       var length = obj.length,
+               type = jQuery.type( obj );
+
+       if ( jQuery.isWindow( obj ) ) {
+               return false;
+       }
+
+       if ( obj.nodeType === 1 && length ) {
+               return true;
+       }
+
+       return type === "array" || type !== "function" &&
+               ( length === 0 ||
+               typeof length === "number" && length > 0 && ( length - 1 ) in obj );
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+/*!
+ * Sizzle CSS Selector Engine v1.10.2
+ * http://sizzlejs.com/
+ *
+ * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-07-03
+ */
+(function( window, undefined ) {
+
+var i,
+       support,
+       cachedruns,
+       Expr,
+       getText,
+       isXML,
+       compile,
+       outermostContext,
+       sortInput,
+
+       // Local document vars
+       setDocument,
+       document,
+       docElem,
+       documentIsHTML,
+       rbuggyQSA,
+       rbuggyMatches,
+       matches,
+       contains,
+
+       // Instance-specific data
+       expando = "sizzle" + -(new Date()),
+       preferredDoc = window.document,
+       dirruns = 0,
+       done = 0,
+       classCache = createCache(),
+       tokenCache = createCache(),
+       compilerCache = createCache(),
+       hasDuplicate = false,
+       sortOrder = function( a, b ) {
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+               }
+               return 0;
+       },
+
+       // General-purpose constants
+       strundefined = typeof undefined,
+       MAX_NEGATIVE = 1 << 31,
+
+       // Instance methods
+       hasOwn = ({}).hasOwnProperty,
+       arr = [],
+       pop = arr.pop,
+       push_native = arr.push,
+       push = arr.push,
+       slice = arr.slice,
+       // Use a stripped-down indexOf if we can't use a native one
+       indexOf = arr.indexOf || function( elem ) {
+               var i = 0,
+                       len = this.length;
+               for ( ; i < len; i++ ) {
+                       if ( this[i] === elem ) {
+                               return i;
+                       }
+               }
+               return -1;
+       },
+
+       booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+       // Regular expressions
+
+       // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+       whitespace = "[\\x20\\t\\r\\n\\f]",
+       // http://www.w3.org/TR/css3-syntax/#characters
+       characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+       // Loosely modeled on CSS identifier characters
+       // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+       // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+       identifier = characterEncoding.replace( "w", "w#" ),
+
+       // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
+       attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
+               "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
+
+       // Prefer arguments quoted,
+       //   then not containing pseudos/brackets,
+       //   then attribute selectors/non-parenthetical expressions,
+       //   then anything else
+       // These preferences are here to reduce the number of selectors
+       //   needing tokenize in the PSEUDO preFilter
+       pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
+
+       // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+       rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+       rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+       rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+       rsibling = new RegExp( whitespace + "*[+~]" ),
+       rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ),
+
+       rpseudo = new RegExp( pseudos ),
+       ridentifier = new RegExp( "^" + identifier + "$" ),
+
+       matchExpr = {
+               "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+               "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+               "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+               "ATTR": new RegExp( "^" + attributes ),
+               "PSEUDO": new RegExp( "^" + pseudos ),
+               "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+                       "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+                       "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+               "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+               // For use in libraries implementing .is()
+               // We use this for POS matching in `select`
+               "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+                       whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+       },
+
+       rnative = /^[^{]+\{\s*\[native \w/,
+
+       // Easily-parseable/retrievable ID or TAG or CLASS selectors
+       rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+       rinputs = /^(?:input|select|textarea|button)$/i,
+       rheader = /^h\d$/i,
+
+       rescape = /'|\\/g,
+
+       // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+       runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+       funescape = function( _, escaped, escapedWhitespace ) {
+               var high = "0x" + escaped - 0x10000;
+               // NaN means non-codepoint
+               // Support: Firefox
+               // Workaround erroneous numeric interpretation of +"0x"
+               return high !== high || escapedWhitespace ?
+                       escaped :
+                       // BMP codepoint
+                       high < 0 ?
+                               String.fromCharCode( high + 0x10000 ) :
+                               // Supplemental Plane codepoint (surrogate pair)
+                               String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+       };
+
+// Optimize for push.apply( _, NodeList )
+try {
+       push.apply(
+               (arr = slice.call( preferredDoc.childNodes )),
+               preferredDoc.childNodes
+       );
+       // Support: Android<4.0
+       // Detect silently failing push.apply
+       arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+       push = { apply: arr.length ?
+
+               // Leverage slice if possible
+               function( target, els ) {
+                       push_native.apply( target, slice.call(els) );
+               } :
+
+               // Support: IE<9
+               // Otherwise append directly
+               function( target, els ) {
+                       var j = target.length,
+                               i = 0;
+                       // Can't trust NodeList.length
+                       while ( (target[j++] = els[i++]) ) {}
+                       target.length = j - 1;
+               }
+       };
+}
+
+function Sizzle( selector, context, results, seed ) {
+       var match, elem, m, nodeType,
+               // QSA vars
+               i, groups, old, nid, newContext, newSelector;
+
+       if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+               setDocument( context );
+       }
+
+       context = context || document;
+       results = results || [];
+
+       if ( !selector || typeof selector !== "string" ) {
+               return results;
+       }
+
+       if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
+               return [];
+       }
+
+       if ( documentIsHTML && !seed ) {
+
+               // Shortcuts
+               if ( (match = rquickExpr.exec( selector )) ) {
+                       // Speed-up: Sizzle("#ID")
+                       if ( (m = match[1]) ) {
+                               if ( nodeType === 9 ) {
+                                       elem = context.getElementById( m );
+                                       // Check parentNode to catch when Blackberry 4.6 returns
+                                       // nodes that are no longer in the document #6963
+                                       if ( elem && elem.parentNode ) {
+                                               // Handle the case where IE, Opera, and Webkit return items
+                                               // by name instead of ID
+                                               if ( elem.id === m ) {
+                                                       results.push( elem );
+                                                       return results;
+                                               }
+                                       } else {
+                                               return results;
+                                       }
+                               } else {
+                                       // Context is not a document
+                                       if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+                                               contains( context, elem ) && elem.id === m ) {
+                                               results.push( elem );
+                                               return results;
+                                       }
+                               }
+
+                       // Speed-up: Sizzle("TAG")
+                       } else if ( match[2] ) {
+                               push.apply( results, context.getElementsByTagName( selector ) );
+                               return results;
+
+                       // Speed-up: Sizzle(".CLASS")
+                       } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+                               push.apply( results, context.getElementsByClassName( m ) );
+                               return results;
+                       }
+               }
+
+               // QSA path
+               if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+                       nid = old = expando;
+                       newContext = context;
+                       newSelector = nodeType === 9 && selector;
+
+                       // qSA works strangely on Element-rooted queries
+                       // We can work around this by specifying an extra ID on the root
+                       // and working up from there (Thanks to Andrew Dupont for the technique)
+                       // IE 8 doesn't work on object elements
+                       if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+                               groups = tokenize( selector );
+
+                               if ( (old = context.getAttribute("id")) ) {
+                                       nid = old.replace( rescape, "\\$&" );
+                               } else {
+                                       context.setAttribute( "id", nid );
+                               }
+                               nid = "[id='" + nid + "'] ";
+
+                               i = groups.length;
+                               while ( i-- ) {
+                                       groups[i] = nid + toSelector( groups[i] );
+                               }
+                               newContext = rsibling.test( selector ) && context.parentNode || context;
+                               newSelector = groups.join(",");
+                       }
+
+                       if ( newSelector ) {
+                               try {
+                                       push.apply( results,
+                                               newContext.querySelectorAll( newSelector )
+                                       );
+                                       return results;
+                               } catch(qsaError) {
+                               } finally {
+                                       if ( !old ) {
+                                               context.removeAttribute("id");
+                                       }
+                               }
+                       }
+               }
+       }
+
+       // All others
+       return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ *     property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ *     deleting the oldest entry
+ */
+function createCache() {
+       var keys = [];
+
+       function cache( key, value ) {
+               // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+               if ( keys.push( key += " " ) > Expr.cacheLength ) {
+                       // Only keep the most recent entries
+                       delete cache[ keys.shift() ];
+               }
+               return (cache[ key ] = value);
+       }
+       return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+       fn[ expando ] = true;
+       return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+       var div = document.createElement("div");
+
+       try {
+               return !!fn( div );
+       } catch (e) {
+               return false;
+       } finally {
+               // Remove from its parent by default
+               if ( div.parentNode ) {
+                       div.parentNode.removeChild( div );
+               }
+               // release memory in IE
+               div = null;
+       }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+       var arr = attrs.split("|"),
+               i = attrs.length;
+
+       while ( i-- ) {
+               Expr.attrHandle[ arr[i] ] = handler;
+       }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+       var cur = b && a,
+               diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+                       ( ~b.sourceIndex || MAX_NEGATIVE ) -
+                       ( ~a.sourceIndex || MAX_NEGATIVE );
+
+       // Use IE sourceIndex if available on both nodes
+       if ( diff ) {
+               return diff;
+       }
+
+       // Check if b follows a
+       if ( cur ) {
+               while ( (cur = cur.nextSibling) ) {
+                       if ( cur === b ) {
+                               return -1;
+                       }
+               }
+       }
+
+       return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+       return function( elem ) {
+               var name = elem.nodeName.toLowerCase();
+               return name === "input" && elem.type === type;
+       };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+       return function( elem ) {
+               var name = elem.nodeName.toLowerCase();
+               return (name === "input" || name === "button") && elem.type === type;
+       };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+       return markFunction(function( argument ) {
+               argument = +argument;
+               return markFunction(function( seed, matches ) {
+                       var j,
+                               matchIndexes = fn( [], seed.length, argument ),
+                               i = matchIndexes.length;
+
+                       // Match elements found at the specified indexes
+                       while ( i-- ) {
+                               if ( seed[ (j = matchIndexes[i]) ] ) {
+                                       seed[j] = !(matches[j] = seed[j]);
+                               }
+                       }
+               });
+       });
+}
+
+/**
+ * Detect xml
+ * @param {Element|Object} elem An element or a document
+ */
+isXML = Sizzle.isXML = function( elem ) {
+       // documentElement is verified for cases where it doesn't yet exist
+       // (such as loading iframes in IE - #4833)
+       var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+       return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+       var doc = node ? node.ownerDocument || node : preferredDoc,
+               parent = doc.defaultView;
+
+       // If no document and documentElement is available, return
+       if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+               return document;
+       }
+
+       // Set our document
+       document = doc;
+       docElem = doc.documentElement;
+
+       // Support tests
+       documentIsHTML = !isXML( doc );
+
+       // Support: IE>8
+       // If iframe document is assigned to "document" variable and if iframe has been reloaded,
+       // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+       // IE6-8 do not support the defaultView property so parent will be undefined
+       if ( parent && parent.attachEvent && parent !== parent.top ) {
+               parent.attachEvent( "onbeforeunload", function() {
+                       setDocument();
+               });
+       }
+
+       /* Attributes
+       ---------------------------------------------------------------------- */
+
+       // Support: IE<8
+       // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+       support.attributes = assert(function( div ) {
+               div.className = "i";
+               return !div.getAttribute("className");
+       });
+
+       /* getElement(s)By*
+       ---------------------------------------------------------------------- */
+
+       // Check if getElementsByTagName("*") returns only elements
+       support.getElementsByTagName = assert(function( div ) {
+               div.appendChild( doc.createComment("") );
+               return !div.getElementsByTagName("*").length;
+       });
+
+       // Check if getElementsByClassName can be trusted
+       support.getElementsByClassName = assert(function( div ) {
+               div.innerHTML = "<div class='a'></div><div class='a i'></div>";
+
+               // Support: Safari<4
+               // Catch class over-caching
+               div.firstChild.className = "i";
+               // Support: Opera<10
+               // Catch gEBCN failure to find non-leading classes
+               return div.getElementsByClassName("i").length === 2;
+       });
+
+       // Support: IE<10
+       // Check if getElementById returns elements by name
+       // The broken getElementById methods don't pick up programatically-set names,
+       // so use a roundabout getElementsByName test
+       support.getById = assert(function( div ) {
+               docElem.appendChild( div ).id = expando;
+               return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+       });
+
+       // ID find and filter
+       if ( support.getById ) {
+               Expr.find["ID"] = function( id, context ) {
+                       if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+                               var m = context.getElementById( id );
+                               // Check parentNode to catch when Blackberry 4.6 returns
+                               // nodes that are no longer in the document #6963
+                               return m && m.parentNode ? [m] : [];
+                       }
+               };
+               Expr.filter["ID"] = function( id ) {
+                       var attrId = id.replace( runescape, funescape );
+                       return function( elem ) {
+                               return elem.getAttribute("id") === attrId;
+                       };
+               };
+       } else {
+               // Support: IE6/7
+               // getElementById is not reliable as a find shortcut
+               delete Expr.find["ID"];
+
+               Expr.filter["ID"] =  function( id ) {
+                       var attrId = id.replace( runescape, funescape );
+                       return function( elem ) {
+                               var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+                               return node && node.value === attrId;
+                       };
+               };
+       }
+
+       // Tag
+       Expr.find["TAG"] = support.getElementsByTagName ?
+               function( tag, context ) {
+                       if ( typeof context.getElementsByTagName !== strundefined ) {
+                               return context.getElementsByTagName( tag );
+                       }
+               } :
+               function( tag, context ) {
+                       var elem,
+                               tmp = [],
+                               i = 0,
+                               results = context.getElementsByTagName( tag );
+
+                       // Filter out possible comments
+                       if ( tag === "*" ) {
+                               while ( (elem = results[i++]) ) {
+                                       if ( elem.nodeType === 1 ) {
+                                               tmp.push( elem );
+                                       }
+                               }
+
+                               return tmp;
+                       }
+                       return results;
+               };
+
+       // Class
+       Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+               if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
+                       return context.getElementsByClassName( className );
+               }
+       };
+
+       /* QSA/matchesSelector
+       ---------------------------------------------------------------------- */
+
+       // QSA and matchesSelector support
+
+       // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+       rbuggyMatches = [];
+
+       // qSa(:focus) reports false when true (Chrome 21)
+       // We allow this because of a bug in IE8/9 that throws an error
+       // whenever `document.activeElement` is accessed on an iframe
+       // So, we allow :focus to pass through QSA all the time to avoid the IE error
+       // See http://bugs.jquery.com/ticket/13378
+       rbuggyQSA = [];
+
+       if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+               // Build QSA regex
+               // Regex strategy adopted from Diego Perini
+               assert(function( div ) {
+                       // Select is set to empty string on purpose
+                       // This is to test IE's treatment of not explicitly
+                       // setting a boolean content attribute,
+                       // since its presence should be enough
+                       // http://bugs.jquery.com/ticket/12359
+                       div.innerHTML = "<select><option selected=''></option></select>";
+
+                       // Support: IE8
+                       // Boolean attributes and "value" are not treated correctly
+                       if ( !div.querySelectorAll("[selected]").length ) {
+                               rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+                       }
+
+                       // Webkit/Opera - :checked should return selected option elements
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+                       // IE8 throws error here and will not see later tests
+                       if ( !div.querySelectorAll(":checked").length ) {
+                               rbuggyQSA.push(":checked");
+                       }
+               });
+
+               assert(function( div ) {
+
+                       // Support: Opera 10-12/IE8
+                       // ^= $= *= and empty values
+                       // Should not select anything
+                       // Support: Windows 8 Native Apps
+                       // The type attribute is restricted during .innerHTML assignment
+                       var input = doc.createElement("input");
+                       input.setAttribute( "type", "hidden" );
+                       div.appendChild( input ).setAttribute( "t", "" );
+
+                       if ( div.querySelectorAll("[t^='']").length ) {
+                               rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+                       }
+
+                       // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+                       // IE8 throws error here and will not see later tests
+                       if ( !div.querySelectorAll(":enabled").length ) {
+                               rbuggyQSA.push( ":enabled", ":disabled" );
+                       }
+
+                       // Opera 10-11 does not throw on post-comma invalid pseudos
+                       div.querySelectorAll("*,:x");
+                       rbuggyQSA.push(",.*:");
+               });
+       }
+
+       if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||
+               docElem.mozMatchesSelector ||
+               docElem.oMatchesSelector ||
+               docElem.msMatchesSelector) )) ) {
+
+               assert(function( div ) {
+                       // Check to see if it's possible to do matchesSelector
+                       // on a disconnected node (IE 9)
+                       support.disconnectedMatch = matches.call( div, "div" );
+
+                       // This should fail with an exception
+                       // Gecko does not error, returns false instead
+                       matches.call( div, "[s!='']:x" );
+                       rbuggyMatches.push( "!=", pseudos );
+               });
+       }
+
+       rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+       rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+       /* Contains
+       ---------------------------------------------------------------------- */
+
+       // Element contains another
+       // Purposefully does not implement inclusive descendent
+       // As in, an element does not contain itself
+       contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?
+               function( a, b ) {
+                       var adown = a.nodeType === 9 ? a.documentElement : a,
+                               bup = b && b.parentNode;
+                       return a === bup || !!( bup && bup.nodeType === 1 && (
+                               adown.contains ?
+                                       adown.contains( bup ) :
+                                       a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+                       ));
+               } :
+               function( a, b ) {
+                       if ( b ) {
+                               while ( (b = b.parentNode) ) {
+                                       if ( b === a ) {
+                                               return true;
+                                       }
+                               }
+                       }
+                       return false;
+               };
+
+       /* Sorting
+       ---------------------------------------------------------------------- */
+
+       // Document order sorting
+       sortOrder = docElem.compareDocumentPosition ?
+       function( a, b ) {
+
+               // Flag for duplicate removal
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+               }
+
+               var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );
+
+               if ( compare ) {
+                       // Disconnected nodes
+                       if ( compare & 1 ||
+                               (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+                               // Choose the first element that is related to our preferred document
+                               if ( a === doc || contains(preferredDoc, a) ) {
+                                       return -1;
+                               }
+                               if ( b === doc || contains(preferredDoc, b) ) {
+                                       return 1;
+                               }
+
+                               // Maintain original order
+                               return sortInput ?
+                                       ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+                                       0;
+                       }
+
+                       return compare & 4 ? -1 : 1;
+               }
+
+               // Not directly comparable, sort on existence of method
+               return a.compareDocumentPosition ? -1 : 1;
+       } :
+       function( a, b ) {
+               var cur,
+                       i = 0,
+                       aup = a.parentNode,
+                       bup = b.parentNode,
+                       ap = [ a ],
+                       bp = [ b ];
+
+               // Exit early if the nodes are identical
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+
+               // Parentless nodes are either documents or disconnected
+               } else if ( !aup || !bup ) {
+                       return a === doc ? -1 :
+                               b === doc ? 1 :
+                               aup ? -1 :
+                               bup ? 1 :
+                               sortInput ?
+                               ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+                               0;
+
+               // If the nodes are siblings, we can do a quick check
+               } else if ( aup === bup ) {
+                       return siblingCheck( a, b );
+               }
+
+               // Otherwise we need full lists of their ancestors for comparison
+               cur = a;
+               while ( (cur = cur.parentNode) ) {
+                       ap.unshift( cur );
+               }
+               cur = b;
+               while ( (cur = cur.parentNode) ) {
+                       bp.unshift( cur );
+               }
+
+               // Walk down the tree looking for a discrepancy
+               while ( ap[i] === bp[i] ) {
+                       i++;
+               }
+
+               return i ?
+                       // Do a sibling check if the nodes have a common ancestor
+                       siblingCheck( ap[i], bp[i] ) :
+
+                       // Otherwise nodes in our document sort first
+                       ap[i] === preferredDoc ? -1 :
+                       bp[i] === preferredDoc ? 1 :
+                       0;
+       };
+
+       return doc;
+};
+
+Sizzle.matches = function( expr, elements ) {
+       return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+       // Set document vars if needed
+       if ( ( elem.ownerDocument || elem ) !== document ) {
+               setDocument( elem );
+       }
+
+       // Make sure that attribute selectors are quoted
+       expr = expr.replace( rattributeQuotes, "='$1']" );
+
+       if ( support.matchesSelector && documentIsHTML &&
+               ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+               ( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
+
+               try {
+                       var ret = matches.call( elem, expr );
+
+                       // IE 9's matchesSelector returns false on disconnected nodes
+                       if ( ret || support.disconnectedMatch ||
+                                       // As well, disconnected nodes are said to be in a document
+                                       // fragment in IE 9
+                                       elem.document && elem.document.nodeType !== 11 ) {
+                               return ret;
+                       }
+               } catch(e) {}
+       }
+
+       return Sizzle( expr, document, null, [elem] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+       // Set document vars if needed
+       if ( ( context.ownerDocument || context ) !== document ) {
+               setDocument( context );
+       }
+       return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+       // Set document vars if needed
+       if ( ( elem.ownerDocument || elem ) !== document ) {
+               setDocument( elem );
+       }
+
+       var fn = Expr.attrHandle[ name.toLowerCase() ],
+               // Don't get fooled by Object.prototype properties (jQuery #13807)
+               val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+                       fn( elem, name, !documentIsHTML ) :
+                       undefined;
+
+       return val === undefined ?
+               support.attributes || !documentIsHTML ?
+                       elem.getAttribute( name ) :
+                       (val = elem.getAttributeNode(name)) && val.specified ?
+                               val.value :
+                               null :
+               val;
+};
+
+Sizzle.error = function( msg ) {
+       throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+       var elem,
+               duplicates = [],
+               j = 0,
+               i = 0;
+
+       // Unless we *know* we can detect duplicates, assume their presence
+       hasDuplicate = !support.detectDuplicates;
+       sortInput = !support.sortStable && results.slice( 0 );
+       results.sort( sortOrder );
+
+       if ( hasDuplicate ) {
+               while ( (elem = results[i++]) ) {
+                       if ( elem === results[ i ] ) {
+                               j = duplicates.push( i );
+                       }
+               }
+               while ( j-- ) {
+                       results.splice( duplicates[ j ], 1 );
+               }
+       }
+
+       return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+       var node,
+               ret = "",
+               i = 0,
+               nodeType = elem.nodeType;
+
+       if ( !nodeType ) {
+               // If no nodeType, this is expected to be an array
+               for ( ; (node = elem[i]); i++ ) {
+                       // Do not traverse comment nodes
+                       ret += getText( node );
+               }
+       } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+               // Use textContent for elements
+               // innerText usage removed for consistency of new lines (see #11153)
+               if ( typeof elem.textContent === "string" ) {
+                       return elem.textContent;
+               } else {
+                       // Traverse its children
+                       for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+                               ret += getText( elem );
+                       }
+               }
+       } else if ( nodeType === 3 || nodeType === 4 ) {
+               return elem.nodeValue;
+       }
+       // Do not include comment or processing instruction nodes
+
+       return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+       // Can be adjusted by the user
+       cacheLength: 50,
+
+       createPseudo: markFunction,
+
+       match: matchExpr,
+
+       attrHandle: {},
+
+       find: {},
+
+       relative: {
+               ">": { dir: "parentNode", first: true },
+               " ": { dir: "parentNode" },
+               "+": { dir: "previousSibling", first: true },
+               "~": { dir: "previousSibling" }
+       },
+
+       preFilter: {
+               "ATTR": function( match ) {
+                       match[1] = match[1].replace( runescape, funescape );
+
+                       // Move the given value to match[3] whether quoted or unquoted
+                       match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
+
+                       if ( match[2] === "~=" ) {
+                               match[3] = " " + match[3] + " ";
+                       }
+
+                       return match.slice( 0, 4 );
+               },
+
+               "CHILD": function( match ) {
+                       /* matches from matchExpr["CHILD"]
+                               1 type (only|nth|...)
+                               2 what (child|of-type)
+                               3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+                               4 xn-component of xn+y argument ([+-]?\d*n|)
+                               5 sign of xn-component
+                               6 x of xn-component
+                               7 sign of y-component
+                               8 y of y-component
+                       */
+                       match[1] = match[1].toLowerCase();
+
+                       if ( match[1].slice( 0, 3 ) === "nth" ) {
+                               // nth-* requires argument
+                               if ( !match[3] ) {
+                                       Sizzle.error( match[0] );
+                               }
+
+                               // numeric x and y parameters for Expr.filter.CHILD
+                               // remember that false/true cast respectively to 0/1
+                               match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+                               match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+                       // other types prohibit arguments
+                       } else if ( match[3] ) {
+                               Sizzle.error( match[0] );
+                       }
+
+                       return match;
+               },
+
+               "PSEUDO": function( match ) {
+                       var excess,
+                               unquoted = !match[5] && match[2];
+
+                       if ( matchExpr["CHILD"].test( match[0] ) ) {
+                               return null;
+                       }
+
+                       // Accept quoted arguments as-is
+                       if ( match[3] && match[4] !== undefined ) {
+                               match[2] = match[4];
+
+                       // Strip excess characters from unquoted arguments
+                       } else if ( unquoted && rpseudo.test( unquoted ) &&
+                               // Get excess from tokenize (recursively)
+                               (excess = tokenize( unquoted, true )) &&
+                               // advance to the next closing parenthesis
+                               (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+                               // excess is a negative index
+                               match[0] = match[0].slice( 0, excess );
+                               match[2] = unquoted.slice( 0, excess );
+                       }
+
+                       // Return only captures needed by the pseudo filter method (type and argument)
+                       return match.slice( 0, 3 );
+               }
+       },
+
+       filter: {
+
+               "TAG": function( nodeNameSelector ) {
+                       var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+                       return nodeNameSelector === "*" ?
+                               function() { return true; } :
+                               function( elem ) {
+                                       return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+                               };
+               },
+
+               "CLASS": function( className ) {
+                       var pattern = classCache[ className + " " ];
+
+                       return pattern ||
+                               (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+                               classCache( className, function( elem ) {
+                                       return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
+                               });
+               },
+
+               "ATTR": function( name, operator, check ) {
+                       return function( elem ) {
+                               var result = Sizzle.attr( elem, name );
+
+                               if ( result == null ) {
+                                       return operator === "!=";
+                               }
+                               if ( !operator ) {
+                                       return true;
+                               }
+
+                               result += "";
+
+                               return operator === "=" ? result === check :
+                                       operator === "!=" ? result !== check :
+                                       operator === "^=" ? check && result.indexOf( check ) === 0 :
+                                       operator === "*=" ? check && result.indexOf( check ) > -1 :
+                                       operator === "$=" ? check && result.slice( -check.length ) === check :
+                                       operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+                                       operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+                                       false;
+                       };
+               },
+
+               "CHILD": function( type, what, argument, first, last ) {
+                       var simple = type.slice( 0, 3 ) !== "nth",
+                               forward = type.slice( -4 ) !== "last",
+                               ofType = what === "of-type";
+
+                       return first === 1 && last === 0 ?
+
+                               // Shortcut for :nth-*(n)
+                               function( elem ) {
+                                       return !!elem.parentNode;
+                               } :
+
+                               function( elem, context, xml ) {
+                                       var cache, outerCache, node, diff, nodeIndex, start,
+                                               dir = simple !== forward ? "nextSibling" : "previousSibling",
+                                               parent = elem.parentNode,
+                                               name = ofType && elem.nodeName.toLowerCase(),
+                                               useCache = !xml && !ofType;
+
+                                       if ( parent ) {
+
+                                               // :(first|last|only)-(child|of-type)
+                                               if ( simple ) {
+                                                       while ( dir ) {
+                                                               node = elem;
+                                                               while ( (node = node[ dir ]) ) {
+                                                                       if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+                                                                               return false;
+                                                                       }
+                                                               }
+                                                               // Reverse direction for :only-* (if we haven't yet done so)
+                                                               start = dir = type === "only" && !start && "nextSibling";
+                                                       }
+                                                       return true;
+                                               }
+
+                                               start = [ forward ? parent.firstChild : parent.lastChild ];
+
+                                               // non-xml :nth-child(...) stores cache data on `parent`
+                                               if ( forward && useCache ) {
+                                                       // Seek `elem` from a previously-cached index
+                                                       outerCache = parent[ expando ] || (parent[ expando ] = {});
+                                                       cache = outerCache[ type ] || [];
+                                                       nodeIndex = cache[0] === dirruns && cache[1];
+                                                       diff = cache[0] === dirruns && cache[2];
+                                                       node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+                                                       while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+                                                               // Fallback to seeking `elem` from the start
+                                                               (diff = nodeIndex = 0) || start.pop()) ) {
+
+                                                               // When found, cache indexes on `parent` and break
+                                                               if ( node.nodeType === 1 && ++diff && node === elem ) {
+                                                                       outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+                                                                       break;
+                                                               }
+                                                       }
+
+                                               // Use previously-cached element index if available
+                                               } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+                                                       diff = cache[1];
+
+                                               // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+                                               } else {
+                                                       // Use the same loop as above to seek `elem` from the start
+                                                       while ( (node = ++nodeIndex && node && node[ dir ] ||
+                                                               (diff = nodeIndex = 0) || start.pop()) ) {
+
+                                                               if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+                                                                       // Cache the index of each encountered element
+                                                                       if ( useCache ) {
+                                                                               (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+                                                                       }
+
+                                                                       if ( node === elem ) {
+                                                                               break;
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+
+                                               // Incorporate the offset, then check against cycle size
+                                               diff -= last;
+                                               return diff === first || ( diff % first === 0 && diff / first >= 0 );
+                                       }
+                               };
+               },
+
+               "PSEUDO": function( pseudo, argument ) {
+                       // pseudo-class names are case-insensitive
+                       // http://www.w3.org/TR/selectors/#pseudo-classes
+                       // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+                       // Remember that setFilters inherits from pseudos
+                       var args,
+                               fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+                                       Sizzle.error( "unsupported pseudo: " + pseudo );
+
+                       // The user may use createPseudo to indicate that
+                       // arguments are needed to create the filter function
+                       // just as Sizzle does
+                       if ( fn[ expando ] ) {
+                               return fn( argument );
+                       }
+
+                       // But maintain support for old signatures
+                       if ( fn.length > 1 ) {
+                               args = [ pseudo, pseudo, "", argument ];
+                               return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+                                       markFunction(function( seed, matches ) {
+                                               var idx,
+                                                       matched = fn( seed, argument ),
+                                                       i = matched.length;
+                                               while ( i-- ) {
+                                                       idx = indexOf.call( seed, matched[i] );
+                                                       seed[ idx ] = !( matches[ idx ] = matched[i] );
+                                               }
+                                       }) :
+                                       function( elem ) {
+                                               return fn( elem, 0, args );
+                                       };
+                       }
+
+                       return fn;
+               }
+       },
+
+       pseudos: {
+               // Potentially complex pseudos
+               "not": markFunction(function( selector ) {
+                       // Trim the selector passed to compile
+                       // to avoid treating leading and trailing
+                       // spaces as combinators
+                       var input = [],
+                               results = [],
+                               matcher = compile( selector.replace( rtrim, "$1" ) );
+
+                       return matcher[ expando ] ?
+                               markFunction(function( seed, matches, context, xml ) {
+                                       var elem,
+                                               unmatched = matcher( seed, null, xml, [] ),
+                                               i = seed.length;
+
+                                       // Match elements unmatched by `matcher`
+                                       while ( i-- ) {
+                                               if ( (elem = unmatched[i]) ) {
+                                                       seed[i] = !(matches[i] = elem);
+                                               }
+                                       }
+                               }) :
+                               function( elem, context, xml ) {
+                                       input[0] = elem;
+                                       matcher( input, null, xml, results );
+                                       return !results.pop();
+                               };
+               }),
+
+               "has": markFunction(function( selector ) {
+                       return function( elem ) {
+                               return Sizzle( selector, elem ).length > 0;
+                       };
+               }),
+
+               "contains": markFunction(function( text ) {
+                       return function( elem ) {
+                               return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+                       };
+               }),
+
+               // "Whether an element is represented by a :lang() selector
+               // is based solely on the element's language value
+               // being equal to the identifier C,
+               // or beginning with the identifier C immediately followed by "-".
+               // The matching of C against the element's language value is performed case-insensitively.
+               // The identifier C does not have to be a valid language name."
+               // http://www.w3.org/TR/selectors/#lang-pseudo
+               "lang": markFunction( function( lang ) {
+                       // lang value must be a valid identifier
+                       if ( !ridentifier.test(lang || "") ) {
+                               Sizzle.error( "unsupported lang: " + lang );
+                       }
+                       lang = lang.replace( runescape, funescape ).toLowerCase();
+                       return function( elem ) {
+                               var elemLang;
+                               do {
+                                       if ( (elemLang = documentIsHTML ?
+                                               elem.lang :
+                                               elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+                                               elemLang = elemLang.toLowerCase();
+                                               return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+                                       }
+                               } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+                               return false;
+                       };
+               }),
+
+               // Miscellaneous
+               "target": function( elem ) {
+                       var hash = window.location && window.location.hash;
+                       return hash && hash.slice( 1 ) === elem.id;
+               },
+
+               "root": function( elem ) {
+                       return elem === docElem;
+               },
+
+               "focus": function( elem ) {
+                       return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+               },
+
+               // Boolean properties
+               "enabled": function( elem ) {
+                       return elem.disabled === false;
+               },
+
+               "disabled": function( elem ) {
+                       return elem.disabled === true;
+               },
+
+               "checked": function( elem ) {
+                       // In CSS3, :checked should return both checked and selected elements
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+                       var nodeName = elem.nodeName.toLowerCase();
+                       return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+               },
+
+               "selected": function( elem ) {
+                       // Accessing this property makes selected-by-default
+                       // options in Safari work properly
+                       if ( elem.parentNode ) {
+                               elem.parentNode.selectedIndex;
+                       }
+
+                       return elem.selected === true;
+               },
+
+               // Contents
+               "empty": function( elem ) {
+                       // http://www.w3.org/TR/selectors/#empty-pseudo
+                       // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
+                       //   not comment, processing instructions, or others
+                       // Thanks to Diego Perini for the nodeName shortcut
+                       //   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
+                       for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+                               if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               },
+
+               "parent": function( elem ) {
+                       return !Expr.pseudos["empty"]( elem );
+               },
+
+               // Element/input types
+               "header": function( elem ) {
+                       return rheader.test( elem.nodeName );
+               },
+
+               "input": function( elem ) {
+                       return rinputs.test( elem.nodeName );
+               },
+
+               "button": function( elem ) {
+                       var name = elem.nodeName.toLowerCase();
+                       return name === "input" && elem.type === "button" || name === "button";
+               },
+
+               "text": function( elem ) {
+                       var attr;
+                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+                       // use getAttribute instead to test this case
+                       return elem.nodeName.toLowerCase() === "input" &&
+                               elem.type === "text" &&
+                               ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
+               },
+
+               // Position-in-collection
+               "first": createPositionalPseudo(function() {
+                       return [ 0 ];
+               }),
+
+               "last": createPositionalPseudo(function( matchIndexes, length ) {
+                       return [ length - 1 ];
+               }),
+
+               "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       return [ argument < 0 ? argument + length : argument ];
+               }),
+
+               "even": createPositionalPseudo(function( matchIndexes, length ) {
+                       var i = 0;
+                       for ( ; i < length; i += 2 ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               }),
+
+               "odd": createPositionalPseudo(function( matchIndexes, length ) {
+                       var i = 1;
+                       for ( ; i < length; i += 2 ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               }),
+
+               "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       var i = argument < 0 ? argument + length : argument;
+                       for ( ; --i >= 0; ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               }),
+
+               "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       var i = argument < 0 ? argument + length : argument;
+                       for ( ; ++i < length; ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               })
+       }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+       Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+       Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+function tokenize( selector, parseOnly ) {
+       var matched, match, tokens, type,
+               soFar, groups, preFilters,
+               cached = tokenCache[ selector + " " ];
+
+       if ( cached ) {
+               return parseOnly ? 0 : cached.slice( 0 );
+       }
+
+       soFar = selector;
+       groups = [];
+       preFilters = Expr.preFilter;
+
+       while ( soFar ) {
+
+               // Comma and first run
+               if ( !matched || (match = rcomma.exec( soFar )) ) {
+                       if ( match ) {
+                               // Don't consume trailing commas as valid
+                               soFar = soFar.slice( match[0].length ) || soFar;
+                       }
+                       groups.push( tokens = [] );
+               }
+
+               matched = false;
+
+               // Combinators
+               if ( (match = rcombinators.exec( soFar )) ) {
+                       matched = match.shift();
+                       tokens.push({
+                               value: matched,
+                               // Cast descendant combinators to space
+                               type: match[0].replace( rtrim, " " )
+                       });
+                       soFar = soFar.slice( matched.length );
+               }
+
+               // Filters
+               for ( type in Expr.filter ) {
+                       if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+                               (match = preFilters[ type ]( match ))) ) {
+                               matched = match.shift();
+                               tokens.push({
+                                       value: matched,
+                                       type: type,
+                                       matches: match
+                               });
+                               soFar = soFar.slice( matched.length );
+                       }
+               }
+
+               if ( !matched ) {
+                       break;
+               }
+       }
+
+       // Return the length of the invalid excess
+       // if we're just parsing
+       // Otherwise, throw an error or return tokens
+       return parseOnly ?
+               soFar.length :
+               soFar ?
+                       Sizzle.error( selector ) :
+                       // Cache the tokens
+                       tokenCache( selector, groups ).slice( 0 );
+}
+
+function toSelector( tokens ) {
+       var i = 0,
+               len = tokens.length,
+               selector = "";
+       for ( ; i < len; i++ ) {
+               selector += tokens[i].value;
+       }
+       return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+       var dir = combinator.dir,
+               checkNonElements = base && dir === "parentNode",
+               doneName = done++;
+
+       return combinator.first ?
+               // Check against closest ancestor/preceding element
+               function( elem, context, xml ) {
+                       while ( (elem = elem[ dir ]) ) {
+                               if ( elem.nodeType === 1 || checkNonElements ) {
+                                       return matcher( elem, context, xml );
+                               }
+                       }
+               } :
+
+               // Check against all ancestor/preceding elements
+               function( elem, context, xml ) {
+                       var data, cache, outerCache,
+                               dirkey = dirruns + " " + doneName;
+
+                       // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+                       if ( xml ) {
+                               while ( (elem = elem[ dir ]) ) {
+                                       if ( elem.nodeType === 1 || checkNonElements ) {
+                                               if ( matcher( elem, context, xml ) ) {
+                                                       return true;
+                                               }
+                                       }
+                               }
+                       } else {
+                               while ( (elem = elem[ dir ]) ) {
+                                       if ( elem.nodeType === 1 || checkNonElements ) {
+                                               outerCache = elem[ expando ] || (elem[ expando ] = {});
+                                               if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
+                                                       if ( (data = cache[1]) === true || data === cachedruns ) {
+                                                               return data === true;
+                                                       }
+                                               } else {
+                                                       cache = outerCache[ dir ] = [ dirkey ];
+                                                       cache[1] = matcher( elem, context, xml ) || cachedruns;
+                                                       if ( cache[1] === true ) {
+                                                               return true;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               };
+}
+
+function elementMatcher( matchers ) {
+       return matchers.length > 1 ?
+               function( elem, context, xml ) {
+                       var i = matchers.length;
+                       while ( i-- ) {
+                               if ( !matchers[i]( elem, context, xml ) ) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               } :
+               matchers[0];
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+       var elem,
+               newUnmatched = [],
+               i = 0,
+               len = unmatched.length,
+               mapped = map != null;
+
+       for ( ; i < len; i++ ) {
+               if ( (elem = unmatched[i]) ) {
+                       if ( !filter || filter( elem, context, xml ) ) {
+                               newUnmatched.push( elem );
+                               if ( mapped ) {
+                                       map.push( i );
+                               }
+                       }
+               }
+       }
+
+       return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+       if ( postFilter && !postFilter[ expando ] ) {
+               postFilter = setMatcher( postFilter );
+       }
+       if ( postFinder && !postFinder[ expando ] ) {
+               postFinder = setMatcher( postFinder, postSelector );
+       }
+       return markFunction(function( seed, results, context, xml ) {
+               var temp, i, elem,
+                       preMap = [],
+                       postMap = [],
+                       preexisting = results.length,
+
+                       // Get initial elements from seed or context
+                       elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+                       // Prefilter to get matcher input, preserving a map for seed-results synchronization
+                       matcherIn = preFilter && ( seed || !selector ) ?
+                               condense( elems, preMap, preFilter, context, xml ) :
+                               elems,
+
+                       matcherOut = matcher ?
+                               // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+                               postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+                                       // ...intermediate processing is necessary
+                                       [] :
+
+                                       // ...otherwise use results directly
+                                       results :
+                               matcherIn;
+
+               // Find primary matches
+               if ( matcher ) {
+                       matcher( matcherIn, matcherOut, context, xml );
+               }
+
+               // Apply postFilter
+               if ( postFilter ) {
+                       temp = condense( matcherOut, postMap );
+                       postFilter( temp, [], context, xml );
+
+                       // Un-match failing elements by moving them back to matcherIn
+                       i = temp.length;
+                       while ( i-- ) {
+                               if ( (elem = temp[i]) ) {
+                                       matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+                               }
+                       }
+               }
+
+               if ( seed ) {
+                       if ( postFinder || preFilter ) {
+                               if ( postFinder ) {
+                                       // Get the final matcherOut by condensing this intermediate into postFinder contexts
+                                       temp = [];
+                                       i = matcherOut.length;
+                                       while ( i-- ) {
+                                               if ( (elem = matcherOut[i]) ) {
+                                                       // Restore matcherIn since elem is not yet a final match
+                                                       temp.push( (matcherIn[i] = elem) );
+                                               }
+                                       }
+                                       postFinder( null, (matcherOut = []), temp, xml );
+                               }
+
+                               // Move matched elements from seed to results to keep them synchronized
+                               i = matcherOut.length;
+                               while ( i-- ) {
+                                       if ( (elem = matcherOut[i]) &&
+                                               (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+
+                                               seed[temp] = !(results[temp] = elem);
+                                       }
+                               }
+                       }
+
+               // Add elements to results, through postFinder if defined
+               } else {
+                       matcherOut = condense(
+                               matcherOut === results ?
+                                       matcherOut.splice( preexisting, matcherOut.length ) :
+                                       matcherOut
+                       );
+                       if ( postFinder ) {
+                               postFinder( null, results, matcherOut, xml );
+                       } else {
+                               push.apply( results, matcherOut );
+                       }
+               }
+       });
+}
+
+function matcherFromTokens( tokens ) {
+       var checkContext, matcher, j,
+               len = tokens.length,
+               leadingRelative = Expr.relative[ tokens[0].type ],
+               implicitRelative = leadingRelative || Expr.relative[" "],
+               i = leadingRelative ? 1 : 0,
+
+               // The foundational matcher ensures that elements are reachable from top-level context(s)
+               matchContext = addCombinator( function( elem ) {
+                       return elem === checkContext;
+               }, implicitRelative, true ),
+               matchAnyContext = addCombinator( function( elem ) {
+                       return indexOf.call( checkContext, elem ) > -1;
+               }, implicitRelative, true ),
+               matchers = [ function( elem, context, xml ) {
+                       return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+                               (checkContext = context).nodeType ?
+                                       matchContext( elem, context, xml ) :
+                                       matchAnyContext( elem, context, xml ) );
+               } ];
+
+       for ( ; i < len; i++ ) {
+               if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+                       matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+               } else {
+                       matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+                       // Return special upon seeing a positional matcher
+                       if ( matcher[ expando ] ) {
+                               // Find the next relative operator (if any) for proper handling
+                               j = ++i;
+                               for ( ; j < len; j++ ) {
+                                       if ( Expr.relative[ tokens[j].type ] ) {
+                                               break;
+                                       }
+                               }
+                               return setMatcher(
+                                       i > 1 && elementMatcher( matchers ),
+                                       i > 1 && toSelector(
+                                               // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+                                               tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+                                       ).replace( rtrim, "$1" ),
+                                       matcher,
+                                       i < j && matcherFromTokens( tokens.slice( i, j ) ),
+                                       j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+                                       j < len && toSelector( tokens )
+                               );
+                       }
+                       matchers.push( matcher );
+               }
+       }
+
+       return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+       // A counter to specify which element is currently being matched
+       var matcherCachedRuns = 0,
+               bySet = setMatchers.length > 0,
+               byElement = elementMatchers.length > 0,
+               superMatcher = function( seed, context, xml, results, expandContext ) {
+                       var elem, j, matcher,
+                               setMatched = [],
+                               matchedCount = 0,
+                               i = "0",
+                               unmatched = seed && [],
+                               outermost = expandContext != null,
+                               contextBackup = outermostContext,
+                               // We must always have either seed elements or context
+                               elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
+                               // Use integer dirruns iff this is the outermost matcher
+                               dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
+
+                       if ( outermost ) {
+                               outermostContext = context !== document && context;
+                               cachedruns = matcherCachedRuns;
+                       }
+
+                       // Add elements passing elementMatchers directly to results
+                       // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+                       for ( ; (elem = elems[i]) != null; i++ ) {
+                               if ( byElement && elem ) {
+                                       j = 0;
+                                       while ( (matcher = elementMatchers[j++]) ) {
+                                               if ( matcher( elem, context, xml ) ) {
+                                                       results.push( elem );
+                                                       break;
+                                               }
+                                       }
+                                       if ( outermost ) {
+                                               dirruns = dirrunsUnique;
+                                               cachedruns = ++matcherCachedRuns;
+                                       }
+                               }
+
+                               // Track unmatched elements for set filters
+                               if ( bySet ) {
+                                       // They will have gone through all possible matchers
+                                       if ( (elem = !matcher && elem) ) {
+                                               matchedCount--;
+                                       }
+
+                                       // Lengthen the array for every element, matched or not
+                                       if ( seed ) {
+                                               unmatched.push( elem );
+                                       }
+                               }
+                       }
+
+                       // Apply set filters to unmatched elements
+                       matchedCount += i;
+                       if ( bySet && i !== matchedCount ) {
+                               j = 0;
+                               while ( (matcher = setMatchers[j++]) ) {
+                                       matcher( unmatched, setMatched, context, xml );
+                               }
+
+                               if ( seed ) {
+                                       // Reintegrate element matches to eliminate the need for sorting
+                                       if ( matchedCount > 0 ) {
+                                               while ( i-- ) {
+                                                       if ( !(unmatched[i] || setMatched[i]) ) {
+                                                               setMatched[i] = pop.call( results );
+                                                       }
+                                               }
+                                       }
+
+                                       // Discard index placeholder values to get only actual matches
+                                       setMatched = condense( setMatched );
+                               }
+
+                               // Add matches to results
+                               push.apply( results, setMatched );
+
+                               // Seedless set matches succeeding multiple successful matchers stipulate sorting
+                               if ( outermost && !seed && setMatched.length > 0 &&
+                                       ( matchedCount + setMatchers.length ) > 1 ) {
+
+                                       Sizzle.uniqueSort( results );
+                               }
+                       }
+
+                       // Override manipulation of globals by nested matchers
+                       if ( outermost ) {
+                               dirruns = dirrunsUnique;
+                               outermostContext = contextBackup;
+                       }
+
+                       return unmatched;
+               };
+
+       return bySet ?
+               markFunction( superMatcher ) :
+               superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
+       var i,
+               setMatchers = [],
+               elementMatchers = [],
+               cached = compilerCache[ selector + " " ];
+
+       if ( !cached ) {
+               // Generate a function of recursive functions that can be used to check each element
+               if ( !group ) {
+                       group = tokenize( selector );
+               }
+               i = group.length;
+               while ( i-- ) {
+                       cached = matcherFromTokens( group[i] );
+                       if ( cached[ expando ] ) {
+                               setMatchers.push( cached );
+                       } else {
+                               elementMatchers.push( cached );
+                       }
+               }
+
+               // Cache the compiled function
+               cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+       }
+       return cached;
+};
+
+function multipleContexts( selector, contexts, results ) {
+       var i = 0,
+               len = contexts.length;
+       for ( ; i < len; i++ ) {
+               Sizzle( selector, contexts[i], results );
+       }
+       return results;
+}
+
+function select( selector, context, results, seed ) {
+       var i, tokens, token, type, find,
+               match = tokenize( selector );
+
+       if ( !seed ) {
+               // Try to minimize operations if there is only one group
+               if ( match.length === 1 ) {
+
+                       // Take a shortcut and set the context if the root selector is an ID
+                       tokens = match[0] = match[0].slice( 0 );
+                       if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+                                       support.getById && context.nodeType === 9 && documentIsHTML &&
+                                       Expr.relative[ tokens[1].type ] ) {
+
+                               context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+                               if ( !context ) {
+                                       return results;
+                               }
+                               selector = selector.slice( tokens.shift().value.length );
+                       }
+
+                       // Fetch a seed set for right-to-left matching
+                       i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+                       while ( i-- ) {
+                               token = tokens[i];
+
+                               // Abort if we hit a combinator
+                               if ( Expr.relative[ (type = token.type) ] ) {
+                                       break;
+                               }
+                               if ( (find = Expr.find[ type ]) ) {
+                                       // Search, expanding context for leading sibling combinators
+                                       if ( (seed = find(
+                                               token.matches[0].replace( runescape, funescape ),
+                                               rsibling.test( tokens[0].type ) && context.parentNode || context
+                                       )) ) {
+
+                                               // If seed is empty or no tokens remain, we can return early
+                                               tokens.splice( i, 1 );
+                                               selector = seed.length && toSelector( tokens );
+                                               if ( !selector ) {
+                                                       push.apply( results, seed );
+                                                       return results;
+                                               }
+
+                                               break;
+                                       }
+                               }
+                       }
+               }
+       }
+
+       // Compile and execute a filtering function
+       // Provide `match` to avoid retokenization if we modified the selector above
+       compile( selector, match )(
+               seed,
+               context,
+               !documentIsHTML,
+               results,
+               rsibling.test( selector )
+       );
+       return results;
+}
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome<14
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+       // Should return 1, but returns 4 (following)
+       return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+       div.innerHTML = "<a href='#'></a>";
+       return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+       addHandle( "type|href|height|width", function( elem, name, isXML ) {
+               if ( !isXML ) {
+                       return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+               }
+       });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+       div.innerHTML = "<input/>";
+       div.firstChild.setAttribute( "value", "" );
+       return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+       addHandle( "value", function( elem, name, isXML ) {
+               if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+                       return elem.defaultValue;
+               }
+       });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+       return div.getAttribute("disabled") == null;
+}) ) {
+       addHandle( booleans, function( elem, name, isXML ) {
+               var val;
+               if ( !isXML ) {
+                       return (val = elem.getAttributeNode( name )) && val.specified ?
+                               val.value :
+                               elem[ name ] === true ? name.toLowerCase() : null;
+               }
+       });
+}
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})( window );
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+       var object = optionsCache[ options ] = {};
+       jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
+               object[ flag ] = true;
+       });
+       return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *     options: an optional list of space-separated options that will change how
+ *                     the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *     once:                   will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *     memory:                 will keep track of previous values and will call any callback added
+ *                                     after the list has been fired right away with the latest "memorized"
+ *                                     values (like a Deferred)
+ *
+ *     unique:                 will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *     stopOnFalse:    interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+       // Convert options from String-formatted to Object-formatted if needed
+       // (we check in cache first)
+       options = typeof options === "string" ?
+               ( optionsCache[ options ] || createOptions( options ) ) :
+               jQuery.extend( {}, options );
+
+       var // Flag to know if list is currently firing
+               firing,
+               // Last fire value (for non-forgettable lists)
+               memory,
+               // Flag to know if list was already fired
+               fired,
+               // End of the loop when firing
+               firingLength,
+               // Index of currently firing callback (modified by remove if needed)
+               firingIndex,
+               // First callback to fire (used internally by add and fireWith)
+               firingStart,
+               // Actual callback list
+               list = [],
+               // Stack of fire calls for repeatable lists
+               stack = !options.once && [],
+               // Fire callbacks
+               fire = function( data ) {
+                       memory = options.memory && data;
+                       fired = true;
+                       firingIndex = firingStart || 0;
+                       firingStart = 0;
+                       firingLength = list.length;
+                       firing = true;
+                       for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+                               if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+                                       memory = false; // To prevent further calls using add
+                                       break;
+                               }
+                       }
+                       firing = false;
+                       if ( list ) {
+                               if ( stack ) {
+                                       if ( stack.length ) {
+                                               fire( stack.shift() );
+                                       }
+                               } else if ( memory ) {
+                                       list = [];
+                               } else {
+                                       self.disable();
+                               }
+                       }
+               },
+               // Actual Callbacks object
+               self = {
+                       // Add a callback or a collection of callbacks to the list
+                       add: function() {
+                               if ( list ) {
+                                       // First, we save the current length
+                                       var start = list.length;
+                                       (function add( args ) {
+                                               jQuery.each( args, function( _, arg ) {
+                                                       var type = jQuery.type( arg );
+                                                       if ( type === "function" ) {
+                                                               if ( !options.unique || !self.has( arg ) ) {
+                                                                       list.push( arg );
+                                                               }
+                                                       } else if ( arg && arg.length && type !== "string" ) {
+                                                               // Inspect recursively
+                                                               add( arg );
+                                                       }
+                                               });
+                                       })( arguments );
+                                       // Do we need to add the callbacks to the
+                                       // current firing batch?
+                                       if ( firing ) {
+                                               firingLength = list.length;
+                                       // With memory, if we're not firing then
+                                       // we should call right away
+                                       } else if ( memory ) {
+                                               firingStart = start;
+                                               fire( memory );
+                                       }
+                               }
+                               return this;
+                       },
+                       // Remove a callback from the list
+                       remove: function() {
+                               if ( list ) {
+                                       jQuery.each( arguments, function( _, arg ) {
+                                               var index;
+                                               while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+                                                       list.splice( index, 1 );
+                                                       // Handle firing indexes
+                                                       if ( firing ) {
+                                                               if ( index <= firingLength ) {
+                                                                       firingLength--;
+                                                               }
+                                                               if ( index <= firingIndex ) {
+                                                                       firingIndex--;
+                                                               }
+                                                       }
+                                               }
+                                       });
+                               }
+                               return this;
+                       },
+                       // Check if a given callback is in the list.
+                       // If no argument is given, return whether or not list has callbacks attached.
+                       has: function( fn ) {
+                               return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+                       },
+                       // Remove all callbacks from the list
+                       empty: function() {
+                               list = [];
+                               firingLength = 0;
+                               return this;
+                       },
+                       // Have the list do nothing anymore
+                       disable: function() {
+                               list = stack = memory = undefined;
+                               return this;
+                       },
+                       // Is it disabled?
+                       disabled: function() {
+                               return !list;
+                       },
+                       // Lock the list in its current state
+                       lock: function() {
+                               stack = undefined;
+                               if ( !memory ) {
+                                       self.disable();
+                               }
+                               return this;
+                       },
+                       // Is it locked?
+                       locked: function() {
+                               return !stack;
+                       },
+                       // Call all callbacks with the given context and arguments
+                       fireWith: function( context, args ) {
+                               if ( list && ( !fired || stack ) ) {
+                                       args = args || [];
+                                       args = [ context, args.slice ? args.slice() : args ];
+                                       if ( firing ) {
+                                               stack.push( args );
+                                       } else {
+                                               fire( args );
+                                       }
+                               }
+                               return this;
+                       },
+                       // Call all the callbacks with the given arguments
+                       fire: function() {
+                               self.fireWith( this, arguments );
+                               return this;
+                       },
+                       // To know if the callbacks have already been called at least once
+                       fired: function() {
+                               return !!fired;
+                       }
+               };
+
+       return self;
+};
+jQuery.extend({
+
+       Deferred: function( func ) {
+               var tuples = [
+                               // action, add listener, listener list, final state
+                               [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+                               [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+                               [ "notify", "progress", jQuery.Callbacks("memory") ]
+                       ],
+                       state = "pending",
+                       promise = {
+                               state: function() {
+                                       return state;
+                               },
+                               always: function() {
+                                       deferred.done( arguments ).fail( arguments );
+                                       return this;
+                               },
+                               then: function( /* fnDone, fnFail, fnProgress */ ) {
+                                       var fns = arguments;
+                                       return jQuery.Deferred(function( newDefer ) {
+                                               jQuery.each( tuples, function( i, tuple ) {
+                                                       var action = tuple[ 0 ],
+                                                               fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+                                                       // deferred[ done | fail | progress ] for forwarding actions to newDefer
+                                                       deferred[ tuple[1] ](function() {
+                                                               var returned = fn && fn.apply( this, arguments );
+                                                               if ( returned && jQuery.isFunction( returned.promise ) ) {
+                                                                       returned.promise()
+                                                                               .done( newDefer.resolve )
+                                                                               .fail( newDefer.reject )
+                                                                               .progress( newDefer.notify );
+                                                               } else {
+                                                                       newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+                                                               }
+                                                       });
+                                               });
+                                               fns = null;
+                                       }).promise();
+                               },
+                               // Get a promise for this deferred
+                               // If obj is provided, the promise aspect is added to the object
+                               promise: function( obj ) {
+                                       return obj != null ? jQuery.extend( obj, promise ) : promise;
+                               }
+                       },
+                       deferred = {};
+
+               // Keep pipe for back-compat
+               promise.pipe = promise.then;
+
+               // Add list-specific methods
+               jQuery.each( tuples, function( i, tuple ) {
+                       var list = tuple[ 2 ],
+                               stateString = tuple[ 3 ];
+
+                       // promise[ done | fail | progress ] = list.add
+                       promise[ tuple[1] ] = list.add;
+
+                       // Handle state
+                       if ( stateString ) {
+                               list.add(function() {
+                                       // state = [ resolved | rejected ]
+                                       state = stateString;
+
+                               // [ reject_list | resolve_list ].disable; progress_list.lock
+                               }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+                       }
+
+                       // deferred[ resolve | reject | notify ]
+                       deferred[ tuple[0] ] = function() {
+                               deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+                               return this;
+                       };
+                       deferred[ tuple[0] + "With" ] = list.fireWith;
+               });
+
+               // Make the deferred a promise
+               promise.promise( deferred );
+
+               // Call given func if any
+               if ( func ) {
+                       func.call( deferred, deferred );
+               }
+
+               // All done!
+               return deferred;
+       },
+
+       // Deferred helper
+       when: function( subordinate /* , ..., subordinateN */ ) {
+               var i = 0,
+                       resolveValues = core_slice.call( arguments ),
+                       length = resolveValues.length,
+
+                       // the count of uncompleted subordinates
+                       remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+                       // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+                       deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+                       // Update function for both resolve and progress values
+                       updateFunc = function( i, contexts, values ) {
+                               return function( value ) {
+                                       contexts[ i ] = this;
+                                       values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+                                       if( values === progressValues ) {
+                                               deferred.notifyWith( contexts, values );
+                                       } else if ( !( --remaining ) ) {
+                                               deferred.resolveWith( contexts, values );
+                                       }
+                               };
+                       },
+
+                       progressValues, progressContexts, resolveContexts;
+
+               // add listeners to Deferred subordinates; treat others as resolved
+               if ( length > 1 ) {
+                       progressValues = new Array( length );
+                       progressContexts = new Array( length );
+                       resolveContexts = new Array( length );
+                       for ( ; i < length; i++ ) {
+                               if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+                                       resolveValues[ i ].promise()
+                                               .done( updateFunc( i, resolveContexts, resolveValues ) )
+                                               .fail( deferred.reject )
+                                               .progress( updateFunc( i, progressContexts, progressValues ) );
+                               } else {
+                                       --remaining;
+                               }
+                       }
+               }
+
+               // if we're not waiting on anything, resolve the master
+               if ( !remaining ) {
+                       deferred.resolveWith( resolveContexts, resolveValues );
+               }
+
+               return deferred.promise();
+       }
+});
+jQuery.support = (function( support ) {
+
+       var all, a, input, select, fragment, opt, eventName, isSupported, i,
+               div = document.createElement("div");
+
+       // Setup
+       div.setAttribute( "className", "t" );
+       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+
+       // Finish early in limited (non-browser) environments
+       all = div.getElementsByTagName("*") || [];
+       a = div.getElementsByTagName("a")[ 0 ];
+       if ( !a || !a.style || !all.length ) {
+               return support;
+       }
+
+       // First batch of tests
+       select = document.createElement("select");
+       opt = select.appendChild( document.createElement("option") );
+       input = div.getElementsByTagName("input")[ 0 ];
+
+       a.style.cssText = "top:1px;float:left;opacity:.5";
+
+       // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+       support.getSetAttribute = div.className !== "t";
+
+       // IE strips leading whitespace when .innerHTML is used
+       support.leadingWhitespace = div.firstChild.nodeType === 3;
+
+       // Make sure that tbody elements aren't automatically inserted
+       // IE will insert them into empty tables
+       support.tbody = !div.getElementsByTagName("tbody").length;
+
+       // Make sure that link elements get serialized correctly by innerHTML
+       // This requires a wrapper element in IE
+       support.htmlSerialize = !!div.getElementsByTagName("link").length;
+
+       // Get the style information from getAttribute
+       // (IE uses .cssText instead)
+       support.style = /top/.test( a.getAttribute("style") );
+
+       // Make sure that URLs aren't manipulated
+       // (IE normalizes it by default)
+       support.hrefNormalized = a.getAttribute("href") === "/a";
+
+       // Make sure that element opacity exists
+       // (IE uses filter instead)
+       // Use a regex to work around a WebKit issue. See #5145
+       support.opacity = /^0.5/.test( a.style.opacity );
+
+       // Verify style float existence
+       // (IE uses styleFloat instead of cssFloat)
+       support.cssFloat = !!a.style.cssFloat;
+
+       // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
+       support.checkOn = !!input.value;
+
+       // Make sure that a selected-by-default option has a working selected property.
+       // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+       support.optSelected = opt.selected;
+
+       // Tests for enctype support on a form (#6743)
+       support.enctype = !!document.createElement("form").enctype;
+
+       // Makes sure cloning an html5 element does not cause problems
+       // Where outerHTML is undefined, this still works
+       support.html5Clone = document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>";
+
+       // Will be defined later
+       support.inlineBlockNeedsLayout = false;
+       support.shrinkWrapBlocks = false;
+       support.pixelPosition = false;
+       support.deleteExpando = true;
+       support.noCloneEvent = true;
+       support.reliableMarginRight = true;
+       support.boxSizingReliable = true;
+
+       // Make sure checked status is properly cloned
+       input.checked = true;
+       support.noCloneChecked = input.cloneNode( true ).checked;
+
+       // Make sure that the options inside disabled selects aren't marked as disabled
+       // (WebKit marks them as disabled)
+       select.disabled = true;
+       support.optDisabled = !opt.disabled;
+
+       // Support: IE<9
+       try {
+               delete div.test;
+       } catch( e ) {
+               support.deleteExpando = false;
+       }
+
+       // Check if we can trust getAttribute("value")
+       input = document.createElement("input");
+       input.setAttribute( "value", "" );
+       support.input = input.getAttribute( "value" ) === "";
+
+       // Check if an input maintains its value after becoming a radio
+       input.value = "t";
+       input.setAttribute( "type", "radio" );
+       support.radioValue = input.value === "t";
+
+       // #11217 - WebKit loses check when the name is after the checked attribute
+       input.setAttribute( "checked", "t" );
+       input.setAttribute( "name", "t" );
+
+       fragment = document.createDocumentFragment();
+       fragment.appendChild( input );
+
+       // Check if a disconnected checkbox will retain its checked
+       // value of true after appended to the DOM (IE6/7)
+       support.appendChecked = input.checked;
+
+       // WebKit doesn't clone checked state correctly in fragments
+       support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+       // Support: IE<9
+       // Opera does not clone events (and typeof div.attachEvent === undefined).
+       // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
+       if ( div.attachEvent ) {
+               div.attachEvent( "onclick", function() {
+                       support.noCloneEvent = false;
+               });
+
+               div.cloneNode( true ).click();
+       }
+
+       // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
+       // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
+       for ( i in { submit: true, change: true, focusin: true }) {
+               div.setAttribute( eventName = "on" + i, "t" );
+
+               support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
+       }
+
+       div.style.backgroundClip = "content-box";
+       div.cloneNode( true ).style.backgroundClip = "";
+       support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+       // Support: IE<9
+       // Iteration over object's inherited properties before its own.
+       for ( i in jQuery( support ) ) {
+               break;
+       }
+       support.ownLast = i !== "0";
+
+       // Run tests that need a body at doc ready
+       jQuery(function() {
+               var container, marginDiv, tds,
+                       divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
+                       body = document.getElementsByTagName("body")[0];
+
+               if ( !body ) {
+                       // Return for frameset docs that don't have a body
+                       return;
+               }
+
+               container = document.createElement("div");
+               container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
+
+               body.appendChild( container ).appendChild( div );
+
+               // Support: IE8
+               // Check if table cells still have offsetWidth/Height when they are set
+               // to display:none and there are still other visible table cells in a
+               // table row; if so, offsetWidth/Height are not reliable for use when
+               // determining if an element has been hidden directly using
+               // display:none (it is still safe to use offsets if a parent element is
+               // hidden; don safety goggles and see bug #4512 for more information).
+               div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+               tds = div.getElementsByTagName("td");
+               tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
+               isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+               tds[ 0 ].style.display = "";
+               tds[ 1 ].style.display = "none";
+
+               // Support: IE8
+               // Check if empty table cells still have offsetWidth/Height
+               support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+               // Check box-sizing and margin behavior.
+               div.innerHTML = "";
+               div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
+
+               // Workaround failing boxSizing test due to offsetWidth returning wrong value
+               // with some non-1 values of body zoom, ticket #13543
+               jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {
+                       support.boxSizing = div.offsetWidth === 4;
+               });
+
+               // Use window.getComputedStyle because jsdom on node.js will break without it.
+               if ( window.getComputedStyle ) {
+                       support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+                       support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+                       // Check if div with explicit width and no margin-right incorrectly
+                       // gets computed margin-right based on width of container. (#3333)
+                       // Fails in WebKit before Feb 2011 nightlies
+                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                       marginDiv = div.appendChild( document.createElement("div") );
+                       marginDiv.style.cssText = div.style.cssText = divReset;
+                       marginDiv.style.marginRight = marginDiv.style.width = "0";
+                       div.style.width = "1px";
+
+                       support.reliableMarginRight =
+                               !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+               }
+
+               if ( typeof div.style.zoom !== core_strundefined ) {
+                       // Support: IE<8
+                       // Check if natively block-level elements act like inline-block
+                       // elements when setting their display to 'inline' and giving
+                       // them layout
+                       div.innerHTML = "";
+                       div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
+                       support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+                       // Support: IE6
+                       // Check if elements with layout shrink-wrap their children
+                       div.style.display = "block";
+                       div.innerHTML = "<div></div>";
+                       div.firstChild.style.width = "5px";
+                       support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+
+                       if ( support.inlineBlockNeedsLayout ) {
+                               // Prevent IE 6 from affecting layout for positioned elements #11048
+                               // Prevent IE from shrinking the body in IE 7 mode #12869
+                               // Support: IE<8
+                               body.style.zoom = 1;
+                       }
+               }
+
+               body.removeChild( container );
+
+               // Null elements to avoid leaks in IE
+               container = div = tds = marginDiv = null;
+       });
+
+       // Null elements to avoid leaks in IE
+       all = select = fragment = opt = a = input = null;
+
+       return support;
+})({});
+
+var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+       rmultiDash = /([A-Z])/g;
+
+function internalData( elem, name, data, pvt /* Internal Use Only */ ){
+       if ( !jQuery.acceptData( elem ) ) {
+               return;
+       }
+
+       var ret, thisCache,
+               internalKey = jQuery.expando,
+
+               // We have to handle DOM nodes and JS objects differently because IE6-7
+               // can't GC object references properly across the DOM-JS boundary
+               isNode = elem.nodeType,
+
+               // Only DOM nodes need the global jQuery cache; JS object data is
+               // attached directly to the object so GC can occur automatically
+               cache = isNode ? jQuery.cache : elem,
+
+               // Only defining an ID for JS objects if its cache already exists allows
+               // the code to shortcut on the same path as a DOM node with no cache
+               id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+
+       // Avoid doing any more work than we need to when trying to get data on an
+       // object that has no data at all
+       if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) {
+               return;
+       }
+
+       if ( !id ) {
+               // Only DOM nodes need a new unique ID for each element since their data
+               // ends up in the global cache
+               if ( isNode ) {
+                       id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++;
+               } else {
+                       id = internalKey;
+               }
+       }
+
+       if ( !cache[ id ] ) {
+               // Avoid exposing jQuery metadata on plain JS objects when the object
+               // is serialized using JSON.stringify
+               cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
+       }
+
+       // An object can be passed to jQuery.data instead of a key/value pair; this gets
+       // shallow copied over onto the existing cache
+       if ( typeof name === "object" || typeof name === "function" ) {
+               if ( pvt ) {
+                       cache[ id ] = jQuery.extend( cache[ id ], name );
+               } else {
+                       cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+               }
+       }
+
+       thisCache = cache[ id ];
+
+       // jQuery data() is stored in a separate object inside the object's internal data
+       // cache in order to avoid key collisions between internal data and user-defined
+       // data.
+       if ( !pvt ) {
+               if ( !thisCache.data ) {
+                       thisCache.data = {};
+               }
+
+               thisCache = thisCache.data;
+       }
+
+       if ( data !== undefined ) {
+               thisCache[ jQuery.camelCase( name ) ] = data;
+       }
+
+       // Check for both converted-to-camel and non-converted data property names
+       // If a data property was specified
+       if ( typeof name === "string" ) {
+
+               // First Try to find as-is property data
+               ret = thisCache[ name ];
+
+               // Test for null|undefined property data
+               if ( ret == null ) {
+
+                       // Try to find the camelCased property
+                       ret = thisCache[ jQuery.camelCase( name ) ];
+               }
+       } else {
+               ret = thisCache;
+       }
+
+       return ret;
+}
+
+function internalRemoveData( elem, name, pvt ) {
+       if ( !jQuery.acceptData( elem ) ) {
+               return;
+       }
+
+       var thisCache, i,
+               isNode = elem.nodeType,
+
+               // See jQuery.data for more information
+               cache = isNode ? jQuery.cache : elem,
+               id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+       // If there is already no cache entry for this object, there is no
+       // purpose in continuing
+       if ( !cache[ id ] ) {
+               return;
+       }
+
+       if ( name ) {
+
+               thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+               if ( thisCache ) {
+
+                       // Support array or space separated string names for data keys
+                       if ( !jQuery.isArray( name ) ) {
+
+                               // try the string as a key before any manipulation
+                               if ( name in thisCache ) {
+                                       name = [ name ];
+                               } else {
+
+                                       // split the camel cased version by spaces unless a key with the spaces exists
+                                       name = jQuery.camelCase( name );
+                                       if ( name in thisCache ) {
+                                               name = [ name ];
+                                       } else {
+                                               name = name.split(" ");
+                                       }
+                               }
+                       } else {
+                               // If "name" is an array of keys...
+                               // When data is initially created, via ("key", "val") signature,
+                               // keys will be converted to camelCase.
+                               // Since there is no way to tell _how_ a key was added, remove
+                               // both plain key and camelCase key. #12786
+                               // This will only penalize the array argument path.
+                               name = name.concat( jQuery.map( name, jQuery.camelCase ) );
+                       }
+
+                       i = name.length;
+                       while ( i-- ) {
+                               delete thisCache[ name[i] ];
+                       }
+
+                       // If there is no data left in the cache, we want to continue
+                       // and let the cache object itself get destroyed
+                       if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {
+                               return;
+                       }
+               }
+       }
+
+       // See jQuery.data for more information
+       if ( !pvt ) {
+               delete cache[ id ].data;
+
+               // Don't destroy the parent cache unless the internal data object
+               // had been the only thing left in it
+               if ( !isEmptyDataObject( cache[ id ] ) ) {
+                       return;
+               }
+       }
+
+       // Destroy the cache
+       if ( isNode ) {
+               jQuery.cleanData( [ elem ], true );
+
+       // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+       /* jshint eqeqeq: false */
+       } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
+               /* jshint eqeqeq: true */
+               delete cache[ id ];
+
+       // When all else fails, null
+       } else {
+               cache[ id ] = null;
+       }
+}
+
+jQuery.extend({
+       cache: {},
+
+       // The following elements throw uncatchable exceptions if you
+       // attempt to add expando properties to them.
+       noData: {
+               "applet": true,
+               "embed": true,
+               // Ban all objects except for Flash (which handle expandos)
+               "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+       },
+
+       hasData: function( elem ) {
+               elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+               return !!elem && !isEmptyDataObject( elem );
+       },
+
+       data: function( elem, name, data ) {
+               return internalData( elem, name, data );
+       },
+
+       removeData: function( elem, name ) {
+               return internalRemoveData( elem, name );
+       },
+
+       // For internal use only.
+       _data: function( elem, name, data ) {
+               return internalData( elem, name, data, true );
+       },
+
+       _removeData: function( elem, name ) {
+               return internalRemoveData( elem, name, true );
+       },
+
+       // A method for determining if a DOM node can handle the data expando
+       acceptData: function( elem ) {
+               // Do not set data on non-element because it will not be cleared (#8335).
+               if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
+                       return false;
+               }
+
+               var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+               // nodes accept data unless otherwise specified; rejection can be conditional
+               return !noData || noData !== true && elem.getAttribute("classid") === noData;
+       }
+});
+
+jQuery.fn.extend({
+       data: function( key, value ) {
+               var attrs, name,
+                       data = null,
+                       i = 0,
+                       elem = this[0];
+
+               // Special expections of .data basically thwart jQuery.access,
+               // so implement the relevant behavior ourselves
+
+               // Gets all values
+               if ( key === undefined ) {
+                       if ( this.length ) {
+                               data = jQuery.data( elem );
+
+                               if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+                                       attrs = elem.attributes;
+                                       for ( ; i < attrs.length; i++ ) {
+                                               name = attrs[i].name;
+
+                                               if ( name.indexOf("data-") === 0 ) {
+                                                       name = jQuery.camelCase( name.slice(5) );
+
+                                                       dataAttr( elem, name, data[ name ] );
+                                               }
+                                       }
+                                       jQuery._data( elem, "parsedAttrs", true );
+                               }
+                       }
+
+                       return data;
+               }
+
+               // Sets multiple values
+               if ( typeof key === "object" ) {
+                       return this.each(function() {
+                               jQuery.data( this, key );
+                       });
+               }
+
+               return arguments.length > 1 ?
+
+                       // Sets one value
+                       this.each(function() {
+                               jQuery.data( this, key, value );
+                       }) :
+
+                       // Gets one value
+                       // Try to fetch any internally stored data first
+                       elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
+       },
+
+       removeData: function( key ) {
+               return this.each(function() {
+                       jQuery.removeData( this, key );
+               });
+       }
+});
+
+function dataAttr( elem, key, data ) {
+       // If nothing was found internally, try to fetch any
+       // data from the HTML5 data-* attribute
+       if ( data === undefined && elem.nodeType === 1 ) {
+
+               var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+               data = elem.getAttribute( name );
+
+               if ( typeof data === "string" ) {
+                       try {
+                               data = data === "true" ? true :
+                                       data === "false" ? false :
+                                       data === "null" ? null :
+                                       // Only convert to a number if it doesn't change the string
+                                       +data + "" === data ? +data :
+                                       rbrace.test( data ) ? jQuery.parseJSON( data ) :
+                                               data;
+                       } catch( e ) {}
+
+                       // Make sure we set the data so it isn't changed later
+                       jQuery.data( elem, key, data );
+
+               } else {
+                       data = undefined;
+               }
+       }
+
+       return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+       var name;
+       for ( name in obj ) {
+
+               // if the public data object is empty, the private is still empty
+               if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+                       continue;
+               }
+               if ( name !== "toJSON" ) {
+                       return false;
+               }
+       }
+
+       return true;
+}
+jQuery.extend({
+       queue: function( elem, type, data ) {
+               var queue;
+
+               if ( elem ) {
+                       type = ( type || "fx" ) + "queue";
+                       queue = jQuery._data( elem, type );
+
+                       // Speed up dequeue by getting out quickly if this is just a lookup
+                       if ( data ) {
+                               if ( !queue || jQuery.isArray(data) ) {
+                                       queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+                               } else {
+                                       queue.push( data );
+                               }
+                       }
+                       return queue || [];
+               }
+       },
+
+       dequeue: function( elem, type ) {
+               type = type || "fx";
+
+               var queue = jQuery.queue( elem, type ),
+                       startLength = queue.length,
+                       fn = queue.shift(),
+                       hooks = jQuery._queueHooks( elem, type ),
+                       next = function() {
+                               jQuery.dequeue( elem, type );
+                       };
+
+               // If the fx queue is dequeued, always remove the progress sentinel
+               if ( fn === "inprogress" ) {
+                       fn = queue.shift();
+                       startLength--;
+               }
+
+               if ( fn ) {
+
+                       // Add a progress sentinel to prevent the fx queue from being
+                       // automatically dequeued
+                       if ( type === "fx" ) {
+                               queue.unshift( "inprogress" );
+                       }
+
+                       // clear up the last queue stop function
+                       delete hooks.stop;
+                       fn.call( elem, next, hooks );
+               }
+
+               if ( !startLength && hooks ) {
+                       hooks.empty.fire();
+               }
+       },
+
+       // not intended for public consumption - generates a queueHooks object, or returns the current one
+       _queueHooks: function( elem, type ) {
+               var key = type + "queueHooks";
+               return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+                       empty: jQuery.Callbacks("once memory").add(function() {
+                               jQuery._removeData( elem, type + "queue" );
+                               jQuery._removeData( elem, key );
+                       })
+               });
+       }
+});
+
+jQuery.fn.extend({
+       queue: function( type, data ) {
+               var setter = 2;
+
+               if ( typeof type !== "string" ) {
+                       data = type;
+                       type = "fx";
+                       setter--;
+               }
+
+               if ( arguments.length < setter ) {
+                       return jQuery.queue( this[0], type );
+               }
+
+               return data === undefined ?
+                       this :
+                       this.each(function() {
+                               var queue = jQuery.queue( this, type, data );
+
+                               // ensure a hooks for this queue
+                               jQuery._queueHooks( this, type );
+
+                               if ( type === "fx" && queue[0] !== "inprogress" ) {
+                                       jQuery.dequeue( this, type );
+                               }
+                       });
+       },
+       dequeue: function( type ) {
+               return this.each(function() {
+                       jQuery.dequeue( this, type );
+               });
+       },
+       // Based off of the plugin by Clint Helfers, with permission.
+       // http://blindsignals.com/index.php/2009/07/jquery-delay/
+       delay: function( time, type ) {
+               time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+               type = type || "fx";
+
+               return this.queue( type, function( next, hooks ) {
+                       var timeout = setTimeout( next, time );
+                       hooks.stop = function() {
+                               clearTimeout( timeout );
+                       };
+               });
+       },
+       clearQueue: function( type ) {
+               return this.queue( type || "fx", [] );
+       },
+       // Get a promise resolved when queues of a certain type
+       // are emptied (fx is the type by default)
+       promise: function( type, obj ) {
+               var tmp,
+                       count = 1,
+                       defer = jQuery.Deferred(),
+                       elements = this,
+                       i = this.length,
+                       resolve = function() {
+                               if ( !( --count ) ) {
+                                       defer.resolveWith( elements, [ elements ] );
+                               }
+                       };
+
+               if ( typeof type !== "string" ) {
+                       obj = type;
+                       type = undefined;
+               }
+               type = type || "fx";
+
+               while( i-- ) {
+                       tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+                       if ( tmp && tmp.empty ) {
+                               count++;
+                               tmp.empty.add( resolve );
+                       }
+               }
+               resolve();
+               return defer.promise( obj );
+       }
+});
+var nodeHook, boolHook,
+       rclass = /[\t\r\n\f]/g,
+       rreturn = /\r/g,
+       rfocusable = /^(?:input|select|textarea|button|object)$/i,
+       rclickable = /^(?:a|area)$/i,
+       ruseDefault = /^(?:checked|selected)$/i,
+       getSetAttribute = jQuery.support.getSetAttribute,
+       getSetInput = jQuery.support.input;
+
+jQuery.fn.extend({
+       attr: function( name, value ) {
+               return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+       },
+
+       removeAttr: function( name ) {
+               return this.each(function() {
+                       jQuery.removeAttr( this, name );
+               });
+       },
+
+       prop: function( name, value ) {
+               return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+       },
+
+       removeProp: function( name ) {
+               name = jQuery.propFix[ name ] || name;
+               return this.each(function() {
+                       // try/catch handles cases where IE balks (such as removing a property on window)
+                       try {
+                               this[ name ] = undefined;
+                               delete this[ name ];
+                       } catch( e ) {}
+               });
+       },
+
+       addClass: function( value ) {
+               var classes, elem, cur, clazz, j,
+                       i = 0,
+                       len = this.length,
+                       proceed = typeof value === "string" && value;
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).addClass( value.call( this, j, this.className ) );
+                       });
+               }
+
+               if ( proceed ) {
+                       // The disjunction here is for better compressibility (see removeClass)
+                       classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+                       for ( ; i < len; i++ ) {
+                               elem = this[ i ];
+                               cur = elem.nodeType === 1 && ( elem.className ?
+                                       ( " " + elem.className + " " ).replace( rclass, " " ) :
+                                       " "
+                               );
+
+                               if ( cur ) {
+                                       j = 0;
+                                       while ( (clazz = classes[j++]) ) {
+                                               if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+                                                       cur += clazz + " ";
+                                               }
+                                       }
+                                       elem.className = jQuery.trim( cur );
+
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       removeClass: function( value ) {
+               var classes, elem, cur, clazz, j,
+                       i = 0,
+                       len = this.length,
+                       proceed = arguments.length === 0 || typeof value === "string" && value;
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).removeClass( value.call( this, j, this.className ) );
+                       });
+               }
+               if ( proceed ) {
+                       classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+                       for ( ; i < len; i++ ) {
+                               elem = this[ i ];
+                               // This expression is here for better compressibility (see addClass)
+                               cur = elem.nodeType === 1 && ( elem.className ?
+                                       ( " " + elem.className + " " ).replace( rclass, " " ) :
+                                       ""
+                               );
+
+                               if ( cur ) {
+                                       j = 0;
+                                       while ( (clazz = classes[j++]) ) {
+                                               // Remove *all* instances
+                                               while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+                                                       cur = cur.replace( " " + clazz + " ", " " );
+                                               }
+                                       }
+                                       elem.className = value ? jQuery.trim( cur ) : "";
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       toggleClass: function( value, stateVal ) {
+               var type = typeof value;
+
+               if ( typeof stateVal === "boolean" && type === "string" ) {
+                       return stateVal ? this.addClass( value ) : this.removeClass( value );
+               }
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( i ) {
+                               jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+                       });
+               }
+
+               return this.each(function() {
+                       if ( type === "string" ) {
+                               // toggle individual class names
+                               var className,
+                                       i = 0,
+                                       self = jQuery( this ),
+                                       classNames = value.match( core_rnotwhite ) || [];
+
+                               while ( (className = classNames[ i++ ]) ) {
+                                       // check each className given, space separated list
+                                       if ( self.hasClass( className ) ) {
+                                               self.removeClass( className );
+                                       } else {
+                                               self.addClass( className );
+                                       }
+                               }
+
+                       // Toggle whole class name
+                       } else if ( type === core_strundefined || type === "boolean" ) {
+                               if ( this.className ) {
+                                       // store className if set
+                                       jQuery._data( this, "__className__", this.className );
+                               }
+
+                               // If the element has a class name or if we're passed "false",
+                               // then remove the whole classname (if there was one, the above saved it).
+                               // Otherwise bring back whatever was previously saved (if anything),
+                               // falling back to the empty string if nothing was stored.
+                               this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+                       }
+               });
+       },
+
+       hasClass: function( selector ) {
+               var className = " " + selector + " ",
+                       i = 0,
+                       l = this.length;
+               for ( ; i < l; i++ ) {
+                       if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+                               return true;
+                       }
+               }
+
+               return false;
+       },
+
+       val: function( value ) {
+               var ret, hooks, isFunction,
+                       elem = this[0];
+
+               if ( !arguments.length ) {
+                       if ( elem ) {
+                               hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+                                       return ret;
+                               }
+
+                               ret = elem.value;
+
+                               return typeof ret === "string" ?
+                                       // handle most common string cases
+                                       ret.replace(rreturn, "") :
+                                       // handle cases where value is null/undef or number
+                                       ret == null ? "" : ret;
+                       }
+
+                       return;
+               }
+
+               isFunction = jQuery.isFunction( value );
+
+               return this.each(function( i ) {
+                       var val;
+
+                       if ( this.nodeType !== 1 ) {
+                               return;
+                       }
+
+                       if ( isFunction ) {
+                               val = value.call( this, i, jQuery( this ).val() );
+                       } else {
+                               val = value;
+                       }
+
+                       // Treat null/undefined as ""; convert numbers to string
+                       if ( val == null ) {
+                               val = "";
+                       } else if ( typeof val === "number" ) {
+                               val += "";
+                       } else if ( jQuery.isArray( val ) ) {
+                               val = jQuery.map(val, function ( value ) {
+                                       return value == null ? "" : value + "";
+                               });
+                       }
+
+                       hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+                       // If set returns undefined, fall back to normal setting
+                       if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+                               this.value = val;
+                       }
+               });
+       }
+});
+
+jQuery.extend({
+       valHooks: {
+               option: {
+                       get: function( elem ) {
+                               // Use proper attribute retrieval(#6932, #12072)
+                               var val = jQuery.find.attr( elem, "value" );
+                               return val != null ?
+                                       val :
+                                       elem.text;
+                       }
+               },
+               select: {
+                       get: function( elem ) {
+                               var value, option,
+                                       options = elem.options,
+                                       index = elem.selectedIndex,
+                                       one = elem.type === "select-one" || index < 0,
+                                       values = one ? null : [],
+                                       max = one ? index + 1 : options.length,
+                                       i = index < 0 ?
+                                               max :
+                                               one ? index : 0;
+
+                               // Loop through all the selected options
+                               for ( ; i < max; i++ ) {
+                                       option = options[ i ];
+
+                                       // oldIE doesn't update selected after form reset (#2551)
+                                       if ( ( option.selected || i === index ) &&
+                                                       // Don't return options that are disabled or in a disabled optgroup
+                                                       ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
+                                                       ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+                                               // Get the specific value for the option
+                                               value = jQuery( option ).val();
+
+                                               // We don't need an array for one selects
+                                               if ( one ) {
+                                                       return value;
+                                               }
+
+                                               // Multi-Selects return an array
+                                               values.push( value );
+                                       }
+                               }
+
+                               return values;
+                       },
+
+                       set: function( elem, value ) {
+                               var optionSet, option,
+                                       options = elem.options,
+                                       values = jQuery.makeArray( value ),
+                                       i = options.length;
+
+                               while ( i-- ) {
+                                       option = options[ i ];
+                                       if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {
+                                               optionSet = true;
+                                       }
+                               }
+
+                               // force browsers to behave consistently when non-matching value is set
+                               if ( !optionSet ) {
+                                       elem.selectedIndex = -1;
+                               }
+                               return values;
+                       }
+               }
+       },
+
+       attr: function( elem, name, value ) {
+               var hooks, ret,
+                       nType = elem.nodeType;
+
+               // don't get/set attributes on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                       return;
+               }
+
+               // Fallback to prop when attributes are not supported
+               if ( typeof elem.getAttribute === core_strundefined ) {
+                       return jQuery.prop( elem, name, value );
+               }
+
+               // All attributes are lowercase
+               // Grab necessary hook if one is defined
+               if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+                       name = name.toLowerCase();
+                       hooks = jQuery.attrHooks[ name ] ||
+                               ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+               }
+
+               if ( value !== undefined ) {
+
+                       if ( value === null ) {
+                               jQuery.removeAttr( elem, name );
+
+                       } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+                               return ret;
+
+                       } else {
+                               elem.setAttribute( name, value + "" );
+                               return value;
+                       }
+
+               } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+                       return ret;
+
+               } else {
+                       ret = jQuery.find.attr( elem, name );
+
+                       // Non-existent attributes return null, we normalize to undefined
+                       return ret == null ?
+                               undefined :
+                               ret;
+               }
+       },
+
+       removeAttr: function( elem, value ) {
+               var name, propName,
+                       i = 0,
+                       attrNames = value && value.match( core_rnotwhite );
+
+               if ( attrNames && elem.nodeType === 1 ) {
+                       while ( (name = attrNames[i++]) ) {
+                               propName = jQuery.propFix[ name ] || name;
+
+                               // Boolean attributes get special treatment (#10870)
+                               if ( jQuery.expr.match.bool.test( name ) ) {
+                                       // Set corresponding property to false
+                                       if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+                                               elem[ propName ] = false;
+                                       // Support: IE<9
+                                       // Also clear defaultChecked/defaultSelected (if appropriate)
+                                       } else {
+                                               elem[ jQuery.camelCase( "default-" + name ) ] =
+                                                       elem[ propName ] = false;
+                                       }
+
+                               // See #9699 for explanation of this approach (setting first, then removal)
+                               } else {
+                                       jQuery.attr( elem, name, "" );
+                               }
+
+                               elem.removeAttribute( getSetAttribute ? name : propName );
+                       }
+               }
+       },
+
+       attrHooks: {
+               type: {
+                       set: function( elem, value ) {
+                               if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+                                       // Setting the type on a radio button after the value resets the value in IE6-9
+                                       // Reset value to default in case type is set after value during creation
+                                       var val = elem.value;
+                                       elem.setAttribute( "type", value );
+                                       if ( val ) {
+                                               elem.value = val;
+                                       }
+                                       return value;
+                               }
+                       }
+               }
+       },
+
+       propFix: {
+               "for": "htmlFor",
+               "class": "className"
+       },
+
+       prop: function( elem, name, value ) {
+               var ret, hooks, notxml,
+                       nType = elem.nodeType;
+
+               // don't get/set properties on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                       return;
+               }
+
+               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+               if ( notxml ) {
+                       // Fix name and attach hooks
+                       name = jQuery.propFix[ name ] || name;
+                       hooks = jQuery.propHooks[ name ];
+               }
+
+               if ( value !== undefined ) {
+                       return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+                               ret :
+                               ( elem[ name ] = value );
+
+               } else {
+                       return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+                               ret :
+                               elem[ name ];
+               }
+       },
+
+       propHooks: {
+               tabIndex: {
+                       get: function( elem ) {
+                               // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+                               // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+                               // Use proper attribute retrieval(#12072)
+                               var tabindex = jQuery.find.attr( elem, "tabindex" );
+
+                               return tabindex ?
+                                       parseInt( tabindex, 10 ) :
+                                       rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+                                               0 :
+                                               -1;
+                       }
+               }
+       }
+});
+
+// Hooks for boolean attributes
+boolHook = {
+       set: function( elem, value, name ) {
+               if ( value === false ) {
+                       // Remove boolean attributes when set to false
+                       jQuery.removeAttr( elem, name );
+               } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+                       // IE<8 needs the *property* name
+                       elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
+
+               // Use defaultChecked and defaultSelected for oldIE
+               } else {
+                       elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
+               }
+
+               return name;
+       }
+};
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+       var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;
+
+       jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
+               function( elem, name, isXML ) {
+                       var fn = jQuery.expr.attrHandle[ name ],
+                               ret = isXML ?
+                                       undefined :
+                                       /* jshint eqeqeq: false */
+                                       (jQuery.expr.attrHandle[ name ] = undefined) !=
+                                               getter( elem, name, isXML ) ?
+
+                                               name.toLowerCase() :
+                                               null;
+                       jQuery.expr.attrHandle[ name ] = fn;
+                       return ret;
+               } :
+               function( elem, name, isXML ) {
+                       return isXML ?
+                               undefined :
+                               elem[ jQuery.camelCase( "default-" + name ) ] ?
+                                       name.toLowerCase() :
+                                       null;
+               };
+});
+
+// fix oldIE attroperties
+if ( !getSetInput || !getSetAttribute ) {
+       jQuery.attrHooks.value = {
+               set: function( elem, value, name ) {
+                       if ( jQuery.nodeName( elem, "input" ) ) {
+                               // Does not return so that setAttribute is also used
+                               elem.defaultValue = value;
+                       } else {
+                               // Use nodeHook if defined (#1954); otherwise setAttribute is fine
+                               return nodeHook && nodeHook.set( elem, value, name );
+                       }
+               }
+       };
+}
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+       // Use this for any attribute in IE6/7
+       // This fixes almost every IE6/7 issue
+       nodeHook = {
+               set: function( elem, value, name ) {
+                       // Set the existing or create a new attribute node
+                       var ret = elem.getAttributeNode( name );
+                       if ( !ret ) {
+                               elem.setAttributeNode(
+                                       (ret = elem.ownerDocument.createAttribute( name ))
+                               );
+                       }
+
+                       ret.value = value += "";
+
+                       // Break association with cloned elements by also using setAttribute (#9646)
+                       return name === "value" || value === elem.getAttribute( name ) ?
+                               value :
+                               undefined;
+               }
+       };
+       jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords =
+               // Some attributes are constructed with empty-string values when not defined
+               function( elem, name, isXML ) {
+                       var ret;
+                       return isXML ?
+                               undefined :
+                               (ret = elem.getAttributeNode( name )) && ret.value !== "" ?
+                                       ret.value :
+                                       null;
+               };
+       jQuery.valHooks.button = {
+               get: function( elem, name ) {
+                       var ret = elem.getAttributeNode( name );
+                       return ret && ret.specified ?
+                               ret.value :
+                               undefined;
+               },
+               set: nodeHook.set
+       };
+
+       // Set contenteditable to false on removals(#10429)
+       // Setting to empty string throws an error as an invalid value
+       jQuery.attrHooks.contenteditable = {
+               set: function( elem, value, name ) {
+                       nodeHook.set( elem, value === "" ? false : value, name );
+               }
+       };
+
+       // Set width and height to auto instead of 0 on empty string( Bug #8150 )
+       // This is for removals
+       jQuery.each([ "width", "height" ], function( i, name ) {
+               jQuery.attrHooks[ name ] = {
+                       set: function( elem, value ) {
+                               if ( value === "" ) {
+                                       elem.setAttribute( name, "auto" );
+                                       return value;
+                               }
+                       }
+               };
+       });
+}
+
+
+// Some attributes require a special call on IE
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !jQuery.support.hrefNormalized ) {
+       // href/src property should get the full normalized URL (#10299/#12915)
+       jQuery.each([ "href", "src" ], function( i, name ) {
+               jQuery.propHooks[ name ] = {
+                       get: function( elem ) {
+                               return elem.getAttribute( name, 4 );
+                       }
+               };
+       });
+}
+
+if ( !jQuery.support.style ) {
+       jQuery.attrHooks.style = {
+               get: function( elem ) {
+                       // Return undefined in the case of empty string
+                       // Note: IE uppercases css property names, but if we were to .toLowerCase()
+                       // .cssText, that would destroy case senstitivity in URL's, like in "background"
+                       return elem.style.cssText || undefined;
+               },
+               set: function( elem, value ) {
+                       return ( elem.style.cssText = value + "" );
+               }
+       };
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+       jQuery.propHooks.selected = {
+               get: function( elem ) {
+                       var parent = elem.parentNode;
+
+                       if ( parent ) {
+                               parent.selectedIndex;
+
+                               // Make sure that it also works with optgroups, see #5701
+                               if ( parent.parentNode ) {
+                                       parent.parentNode.selectedIndex;
+                               }
+                       }
+                       return null;
+               }
+       };
+}
+
+jQuery.each([
+       "tabIndex",
+       "readOnly",
+       "maxLength",
+       "cellSpacing",
+       "cellPadding",
+       "rowSpan",
+       "colSpan",
+       "useMap",
+       "frameBorder",
+       "contentEditable"
+], function() {
+       jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+       jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+       jQuery.valHooks[ this ] = {
+               set: function( elem, value ) {
+                       if ( jQuery.isArray( value ) ) {
+                               return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+                       }
+               }
+       };
+       if ( !jQuery.support.checkOn ) {
+               jQuery.valHooks[ this ].get = function( elem ) {
+                       // Support: Webkit
+                       // "" is returned instead of "on" if a value isn't specified
+                       return elem.getAttribute("value") === null ? "on" : elem.value;
+               };
+       }
+});
+var rformElems = /^(?:input|select|textarea)$/i,
+       rkeyEvent = /^key/,
+       rmouseEvent = /^(?:mouse|contextmenu)|click/,
+       rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+       rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+       return true;
+}
+
+function returnFalse() {
+       return false;
+}
+
+function safeActiveElement() {
+       try {
+               return document.activeElement;
+       } catch ( err ) { }
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+       global: {},
+
+       add: function( elem, types, handler, data, selector ) {
+               var tmp, events, t, handleObjIn,
+                       special, eventHandle, handleObj,
+                       handlers, type, namespaces, origType,
+                       elemData = jQuery._data( elem );
+
+               // Don't attach events to noData or text/comment nodes (but allow plain objects)
+               if ( !elemData ) {
+                       return;
+               }
+
+               // Caller can pass in an object of custom data in lieu of the handler
+               if ( handler.handler ) {
+                       handleObjIn = handler;
+                       handler = handleObjIn.handler;
+                       selector = handleObjIn.selector;
+               }
+
+               // Make sure that the handler has a unique ID, used to find/remove it later
+               if ( !handler.guid ) {
+                       handler.guid = jQuery.guid++;
+               }
+
+               // Init the element's event structure and main handler, if this is the first
+               if ( !(events = elemData.events) ) {
+                       events = elemData.events = {};
+               }
+               if ( !(eventHandle = elemData.handle) ) {
+                       eventHandle = elemData.handle = function( e ) {
+                               // Discard the second event of a jQuery.event.trigger() and
+                               // when an event is called after a page has unloaded
+                               return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
+                                       jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+                                       undefined;
+                       };
+                       // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+                       eventHandle.elem = elem;
+               }
+
+               // Handle multiple events separated by a space
+               types = ( types || "" ).match( core_rnotwhite ) || [""];
+               t = types.length;
+               while ( t-- ) {
+                       tmp = rtypenamespace.exec( types[t] ) || [];
+                       type = origType = tmp[1];
+                       namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+                       // There *must* be a type, no attaching namespace-only handlers
+                       if ( !type ) {
+                               continue;
+                       }
+
+                       // If event changes its type, use the special event handlers for the changed type
+                       special = jQuery.event.special[ type ] || {};
+
+                       // If selector defined, determine special event api type, otherwise given type
+                       type = ( selector ? special.delegateType : special.bindType ) || type;
+
+                       // Update special based on newly reset type
+                       special = jQuery.event.special[ type ] || {};
+
+                       // handleObj is passed to all event handlers
+                       handleObj = jQuery.extend({
+                               type: type,
+                               origType: origType,
+                               data: data,
+                               handler: handler,
+                               guid: handler.guid,
+                               selector: selector,
+                               needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+                               namespace: namespaces.join(".")
+                       }, handleObjIn );
+
+                       // Init the event handler queue if we're the first
+                       if ( !(handlers = events[ type ]) ) {
+                               handlers = events[ type ] = [];
+                               handlers.delegateCount = 0;
+
+                               // Only use addEventListener/attachEvent if the special events handler returns false
+                               if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+                                       // Bind the global event handler to the element
+                                       if ( elem.addEventListener ) {
+                                               elem.addEventListener( type, eventHandle, false );
+
+                                       } else if ( elem.attachEvent ) {
+                                               elem.attachEvent( "on" + type, eventHandle );
+                                       }
+                               }
+                       }
+
+                       if ( special.add ) {
+                               special.add.call( elem, handleObj );
+
+                               if ( !handleObj.handler.guid ) {
+                                       handleObj.handler.guid = handler.guid;
+                               }
+                       }
+
+                       // Add to the element's handler list, delegates in front
+                       if ( selector ) {
+                               handlers.splice( handlers.delegateCount++, 0, handleObj );
+                       } else {
+                               handlers.push( handleObj );
+                       }
+
+                       // Keep track of which events have ever been used, for event optimization
+                       jQuery.event.global[ type ] = true;
+               }
+
+               // Nullify elem to prevent memory leaks in IE
+               elem = null;
+       },
+
+       // Detach an event or set of events from an element
+       remove: function( elem, types, handler, selector, mappedTypes ) {
+               var j, handleObj, tmp,
+                       origCount, t, events,
+                       special, handlers, type,
+                       namespaces, origType,
+                       elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+               if ( !elemData || !(events = elemData.events) ) {
+                       return;
+               }
+
+               // Once for each type.namespace in types; type may be omitted
+               types = ( types || "" ).match( core_rnotwhite ) || [""];
+               t = types.length;
+               while ( t-- ) {
+                       tmp = rtypenamespace.exec( types[t] ) || [];
+                       type = origType = tmp[1];
+                       namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+                       // Unbind all events (on this namespace, if provided) for the element
+                       if ( !type ) {
+                               for ( type in events ) {
+                                       jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+                               }
+                               continue;
+                       }
+
+                       special = jQuery.event.special[ type ] || {};
+                       type = ( selector ? special.delegateType : special.bindType ) || type;
+                       handlers = events[ type ] || [];
+                       tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+                       // Remove matching events
+                       origCount = j = handlers.length;
+                       while ( j-- ) {
+                               handleObj = handlers[ j ];
+
+                               if ( ( mappedTypes || origType === handleObj.origType ) &&
+                                       ( !handler || handler.guid === handleObj.guid ) &&
+                                       ( !tmp || tmp.test( handleObj.namespace ) ) &&
+                                       ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+                                       handlers.splice( j, 1 );
+
+                                       if ( handleObj.selector ) {
+                                               handlers.delegateCount--;
+                                       }
+                                       if ( special.remove ) {
+                                               special.remove.call( elem, handleObj );
+                                       }
+                               }
+                       }
+
+                       // Remove generic event handler if we removed something and no more handlers exist
+                       // (avoids potential for endless recursion during removal of special event handlers)
+                       if ( origCount && !handlers.length ) {
+                               if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+                                       jQuery.removeEvent( elem, type, elemData.handle );
+                               }
+
+                               delete events[ type ];
+                       }
+               }
+
+               // Remove the expando if it's no longer used
+               if ( jQuery.isEmptyObject( events ) ) {
+                       delete elemData.handle;
+
+                       // removeData also checks for emptiness and clears the expando if empty
+                       // so use it instead of delete
+                       jQuery._removeData( elem, "events" );
+               }
+       },
+
+       trigger: function( event, data, elem, onlyHandlers ) {
+               var handle, ontype, cur,
+                       bubbleType, special, tmp, i,
+                       eventPath = [ elem || document ],
+                       type = core_hasOwn.call( event, "type" ) ? event.type : event,
+                       namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+               cur = tmp = elem = elem || document;
+
+               // Don't do events on text and comment nodes
+               if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+                       return;
+               }
+
+               // focus/blur morphs to focusin/out; ensure we're not firing them right now
+               if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+                       return;
+               }
+
+               if ( type.indexOf(".") >= 0 ) {
+                       // Namespaced trigger; create a regexp to match event type in handle()
+                       namespaces = type.split(".");
+                       type = namespaces.shift();
+                       namespaces.sort();
+               }
+               ontype = type.indexOf(":") < 0 && "on" + type;
+
+               // Caller can pass in a jQuery.Event object, Object, or just an event type string
+               event = event[ jQuery.expando ] ?
+                       event :
+                       new jQuery.Event( type, typeof event === "object" && event );
+
+               // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+               event.isTrigger = onlyHandlers ? 2 : 3;
+               event.namespace = namespaces.join(".");
+               event.namespace_re = event.namespace ?
+                       new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+                       null;
+
+               // Clean up the event in case it is being reused
+               event.result = undefined;
+               if ( !event.target ) {
+                       event.target = elem;
+               }
+
+               // Clone any incoming data and prepend the event, creating the handler arg list
+               data = data == null ?
+                       [ event ] :
+                       jQuery.makeArray( data, [ event ] );
+
+               // Allow special events to draw outside the lines
+               special = jQuery.event.special[ type ] || {};
+               if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+                       return;
+               }
+
+               // Determine event propagation path in advance, per W3C events spec (#9951)
+               // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+               if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+                       bubbleType = special.delegateType || type;
+                       if ( !rfocusMorph.test( bubbleType + type ) ) {
+                               cur = cur.parentNode;
+                       }
+                       for ( ; cur; cur = cur.parentNode ) {
+                               eventPath.push( cur );
+                               tmp = cur;
+                       }
+
+                       // Only add window if we got to document (e.g., not plain obj or detached DOM)
+                       if ( tmp === (elem.ownerDocument || document) ) {
+                               eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+                       }
+               }
+
+               // Fire handlers on the event path
+               i = 0;
+               while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+                       event.type = i > 1 ?
+                               bubbleType :
+                               special.bindType || type;
+
+                       // jQuery handler
+                       handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+                       if ( handle ) {
+                               handle.apply( cur, data );
+                       }
+
+                       // Native handler
+                       handle = ontype && cur[ ontype ];
+                       if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
+                               event.preventDefault();
+                       }
+               }
+               event.type = type;
+
+               // If nobody prevented the default action, do it now
+               if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+                       if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
+                               jQuery.acceptData( elem ) ) {
+
+                               // Call a native DOM method on the target with the same name name as the event.
+                               // Can't use an .isFunction() check here because IE6/7 fails that test.
+                               // Don't do default actions on window, that's where global variables be (#6170)
+                               if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
+
+                                       // Don't re-trigger an onFOO event when we call its FOO() method
+                                       tmp = elem[ ontype ];
+
+                                       if ( tmp ) {
+                                               elem[ ontype ] = null;
+                                       }
+
+                                       // Prevent re-triggering of the same event, since we already bubbled it above
+                                       jQuery.event.triggered = type;
+                                       try {
+                                               elem[ type ]();
+                                       } catch ( e ) {
+                                               // IE<9 dies on focus/blur to hidden element (#1486,#12518)
+                                               // only reproducible on winXP IE8 native, not IE9 in IE8 mode
+                                       }
+                                       jQuery.event.triggered = undefined;
+
+                                       if ( tmp ) {
+                                               elem[ ontype ] = tmp;
+                                       }
+                               }
+                       }
+               }
+
+               return event.result;
+       },
+
+       dispatch: function( event ) {
+
+               // Make a writable jQuery.Event from the native event object
+               event = jQuery.event.fix( event );
+
+               var i, ret, handleObj, matched, j,
+                       handlerQueue = [],
+                       args = core_slice.call( arguments ),
+                       handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
+                       special = jQuery.event.special[ event.type ] || {};
+
+               // Use the fix-ed jQuery.Event rather than the (read-only) native event
+               args[0] = event;
+               event.delegateTarget = this;
+
+               // Call the preDispatch hook for the mapped type, and let it bail if desired
+               if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+                       return;
+               }
+
+               // Determine handlers
+               handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+               // Run delegates first; they may want to stop propagation beneath us
+               i = 0;
+               while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+                       event.currentTarget = matched.elem;
+
+                       j = 0;
+                       while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+                               // Triggered event must either 1) have no namespace, or
+                               // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+                               if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+                                       event.handleObj = handleObj;
+                                       event.data = handleObj.data;
+
+                                       ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+                                                       .apply( matched.elem, args );
+
+                                       if ( ret !== undefined ) {
+                                               if ( (event.result = ret) === false ) {
+                                                       event.preventDefault();
+                                                       event.stopPropagation();
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               // Call the postDispatch hook for the mapped type
+               if ( special.postDispatch ) {
+                       special.postDispatch.call( this, event );
+               }
+
+               return event.result;
+       },
+
+       handlers: function( event, handlers ) {
+               var sel, handleObj, matches, i,
+                       handlerQueue = [],
+                       delegateCount = handlers.delegateCount,
+                       cur = event.target;
+
+               // Find delegate handlers
+               // Black-hole SVG <use> instance trees (#13180)
+               // Avoid non-left-click bubbling in Firefox (#3861)
+               if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+                       /* jshint eqeqeq: false */
+                       for ( ; cur != this; cur = cur.parentNode || this ) {
+                               /* jshint eqeqeq: true */
+
+                               // Don't check non-elements (#13208)
+                               // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+                               if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
+                                       matches = [];
+                                       for ( i = 0; i < delegateCount; i++ ) {
+                                               handleObj = handlers[ i ];
+
+                                               // Don't conflict with Object.prototype properties (#13203)
+                                               sel = handleObj.selector + " ";
+
+                                               if ( matches[ sel ] === undefined ) {
+                                                       matches[ sel ] = handleObj.needsContext ?
+                                                               jQuery( sel, this ).index( cur ) >= 0 :
+                                                               jQuery.find( sel, this, null, [ cur ] ).length;
+                                               }
+                                               if ( matches[ sel ] ) {
+                                                       matches.push( handleObj );
+                                               }
+                                       }
+                                       if ( matches.length ) {
+                                               handlerQueue.push({ elem: cur, handlers: matches });
+                                       }
+                               }
+                       }
+               }
+
+               // Add the remaining (directly-bound) handlers
+               if ( delegateCount < handlers.length ) {
+                       handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+               }
+
+               return handlerQueue;
+       },
+
+       fix: function( event ) {
+               if ( event[ jQuery.expando ] ) {
+                       return event;
+               }
+
+               // Create a writable copy of the event object and normalize some properties
+               var i, prop, copy,
+                       type = event.type,
+                       originalEvent = event,
+                       fixHook = this.fixHooks[ type ];
+
+               if ( !fixHook ) {
+                       this.fixHooks[ type ] = fixHook =
+                               rmouseEvent.test( type ) ? this.mouseHooks :
+                               rkeyEvent.test( type ) ? this.keyHooks :
+                               {};
+               }
+               copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+               event = new jQuery.Event( originalEvent );
+
+               i = copy.length;
+               while ( i-- ) {
+                       prop = copy[ i ];
+                       event[ prop ] = originalEvent[ prop ];
+               }
+
+               // Support: IE<9
+               // Fix target property (#1925)
+               if ( !event.target ) {
+                       event.target = originalEvent.srcElement || document;
+               }
+
+               // Support: Chrome 23+, Safari?
+               // Target should not be a text node (#504, #13143)
+               if ( event.target.nodeType === 3 ) {
+                       event.target = event.target.parentNode;
+               }
+
+               // Support: IE<9
+               // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
+               event.metaKey = !!event.metaKey;
+
+               return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+       },
+
+       // Includes some event props shared by KeyEvent and MouseEvent
+       props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+       fixHooks: {},
+
+       keyHooks: {
+               props: "char charCode key keyCode".split(" "),
+               filter: function( event, original ) {
+
+                       // Add which for key events
+                       if ( event.which == null ) {
+                               event.which = original.charCode != null ? original.charCode : original.keyCode;
+                       }
+
+                       return event;
+               }
+       },
+
+       mouseHooks: {
+               props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+               filter: function( event, original ) {
+                       var body, eventDoc, doc,
+                               button = original.button,
+                               fromElement = original.fromElement;
+
+                       // Calculate pageX/Y if missing and clientX/Y available
+                       if ( event.pageX == null && original.clientX != null ) {
+                               eventDoc = event.target.ownerDocument || document;
+                               doc = eventDoc.documentElement;
+                               body = eventDoc.body;
+
+                               event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+                               event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+                       }
+
+                       // Add relatedTarget, if necessary
+                       if ( !event.relatedTarget && fromElement ) {
+                               event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+                       }
+
+                       // Add which for click: 1 === left; 2 === middle; 3 === right
+                       // Note: button is not normalized, so don't use it
+                       if ( !event.which && button !== undefined ) {
+                               event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+                       }
+
+                       return event;
+               }
+       },
+
+       special: {
+               load: {
+                       // Prevent triggered image.load events from bubbling to window.load
+                       noBubble: true
+               },
+               focus: {
+                       // Fire native event if possible so blur/focus sequence is correct
+                       trigger: function() {
+                               if ( this !== safeActiveElement() && this.focus ) {
+                                       try {
+                                               this.focus();
+                                               return false;
+                                       } catch ( e ) {
+                                               // Support: IE<9
+                                               // If we error on focus to hidden element (#1486, #12518),
+                                               // let .trigger() run the handlers
+                                       }
+                               }
+                       },
+                       delegateType: "focusin"
+               },
+               blur: {
+                       trigger: function() {
+                               if ( this === safeActiveElement() && this.blur ) {
+                                       this.blur();
+                                       return false;
+                               }
+                       },
+                       delegateType: "focusout"
+               },
+               click: {
+                       // For checkbox, fire native event so checked state will be right
+                       trigger: function() {
+                               if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
+                                       this.click();
+                                       return false;
+                               }
+                       },
+
+                       // For cross-browser consistency, don't fire native .click() on links
+                       _default: function( event ) {
+                               return jQuery.nodeName( event.target, "a" );
+                       }
+               },
+
+               beforeunload: {
+                       postDispatch: function( event ) {
+
+                               // Even when returnValue equals to undefined Firefox will still show alert
+                               if ( event.result !== undefined ) {
+                                       event.originalEvent.returnValue = event.result;
+                               }
+                       }
+               }
+       },
+
+       simulate: function( type, elem, event, bubble ) {
+               // Piggyback on a donor event to simulate a different one.
+               // Fake originalEvent to avoid donor's stopPropagation, but if the
+               // simulated event prevents default then we do the same on the donor.
+               var e = jQuery.extend(
+                       new jQuery.Event(),
+                       event,
+                       {
+                               type: type,
+                               isSimulated: true,
+                               originalEvent: {}
+                       }
+               );
+               if ( bubble ) {
+                       jQuery.event.trigger( e, null, elem );
+               } else {
+                       jQuery.event.dispatch.call( elem, e );
+               }
+               if ( e.isDefaultPrevented() ) {
+                       event.preventDefault();
+               }
+       }
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+       function( elem, type, handle ) {
+               if ( elem.removeEventListener ) {
+                       elem.removeEventListener( type, handle, false );
+               }
+       } :
+       function( elem, type, handle ) {
+               var name = "on" + type;
+
+               if ( elem.detachEvent ) {
+
+                       // #8545, #7054, preventing memory leaks for custom events in IE6-8
+                       // detachEvent needed property on element, by name of that event, to properly expose it to GC
+                       if ( typeof elem[ name ] === core_strundefined ) {
+                               elem[ name ] = null;
+                       }
+
+                       elem.detachEvent( name, handle );
+               }
+       };
+
+jQuery.Event = function( src, props ) {
+       // Allow instantiation without the 'new' keyword
+       if ( !(this instanceof jQuery.Event) ) {
+               return new jQuery.Event( src, props );
+       }
+
+       // Event object
+       if ( src && src.type ) {
+               this.originalEvent = src;
+               this.type = src.type;
+
+               // Events bubbling up the document may have been marked as prevented
+               // by a handler lower down the tree; reflect the correct value.
+               this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+                       src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+       // Event type
+       } else {
+               this.type = src;
+       }
+
+       // Put explicitly provided properties onto the event object
+       if ( props ) {
+               jQuery.extend( this, props );
+       }
+
+       // Create a timestamp if incoming event doesn't have one
+       this.timeStamp = src && src.timeStamp || jQuery.now();
+
+       // Mark it as fixed
+       this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+       isDefaultPrevented: returnFalse,
+       isPropagationStopped: returnFalse,
+       isImmediatePropagationStopped: returnFalse,
+
+       preventDefault: function() {
+               var e = this.originalEvent;
+
+               this.isDefaultPrevented = returnTrue;
+               if ( !e ) {
+                       return;
+               }
+
+               // If preventDefault exists, run it on the original event
+               if ( e.preventDefault ) {
+                       e.preventDefault();
+
+               // Support: IE
+               // Otherwise set the returnValue property of the original event to false
+               } else {
+                       e.returnValue = false;
+               }
+       },
+       stopPropagation: function() {
+               var e = this.originalEvent;
+
+               this.isPropagationStopped = returnTrue;
+               if ( !e ) {
+                       return;
+               }
+               // If stopPropagation exists, run it on the original event
+               if ( e.stopPropagation ) {
+                       e.stopPropagation();
+               }
+
+               // Support: IE
+               // Set the cancelBubble property of the original event to true
+               e.cancelBubble = true;
+       },
+       stopImmediatePropagation: function() {
+               this.isImmediatePropagationStopped = returnTrue;
+               this.stopPropagation();
+       }
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+       mouseenter: "mouseover",
+       mouseleave: "mouseout"
+}, function( orig, fix ) {
+       jQuery.event.special[ orig ] = {
+               delegateType: fix,
+               bindType: fix,
+
+               handle: function( event ) {
+                       var ret,
+                               target = this,
+                               related = event.relatedTarget,
+                               handleObj = event.handleObj;
+
+                       // For mousenter/leave call the handler if related is outside the target.
+                       // NB: No relatedTarget if the mouse left/entered the browser window
+                       if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+                               event.type = handleObj.origType;
+                               ret = handleObj.handler.apply( this, arguments );
+                               event.type = fix;
+                       }
+                       return ret;
+               }
+       };
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+       jQuery.event.special.submit = {
+               setup: function() {
+                       // Only need this for delegated form submit events
+                       if ( jQuery.nodeName( this, "form" ) ) {
+                               return false;
+                       }
+
+                       // Lazy-add a submit handler when a descendant form may potentially be submitted
+                       jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+                               // Node name check avoids a VML-related crash in IE (#9807)
+                               var elem = e.target,
+                                       form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+                               if ( form && !jQuery._data( form, "submitBubbles" ) ) {
+                                       jQuery.event.add( form, "submit._submit", function( event ) {
+                                               event._submit_bubble = true;
+                                       });
+                                       jQuery._data( form, "submitBubbles", true );
+                               }
+                       });
+                       // return undefined since we don't need an event listener
+               },
+
+               postDispatch: function( event ) {
+                       // If form was submitted by the user, bubble the event up the tree
+                       if ( event._submit_bubble ) {
+                               delete event._submit_bubble;
+                               if ( this.parentNode && !event.isTrigger ) {
+                                       jQuery.event.simulate( "submit", this.parentNode, event, true );
+                               }
+                       }
+               },
+
+               teardown: function() {
+                       // Only need this for delegated form submit events
+                       if ( jQuery.nodeName( this, "form" ) ) {
+                               return false;
+                       }
+
+                       // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+                       jQuery.event.remove( this, "._submit" );
+               }
+       };
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+       jQuery.event.special.change = {
+
+               setup: function() {
+
+                       if ( rformElems.test( this.nodeName ) ) {
+                               // IE doesn't fire change on a check/radio until blur; trigger it on click
+                               // after a propertychange. Eat the blur-change in special.change.handle.
+                               // This still fires onchange a second time for check/radio after blur.
+                               if ( this.type === "checkbox" || this.type === "radio" ) {
+                                       jQuery.event.add( this, "propertychange._change", function( event ) {
+                                               if ( event.originalEvent.propertyName === "checked" ) {
+                                                       this._just_changed = true;
+                                               }
+                                       });
+                                       jQuery.event.add( this, "click._change", function( event ) {
+                                               if ( this._just_changed && !event.isTrigger ) {
+                                                       this._just_changed = false;
+                                               }
+                                               // Allow triggered, simulated change events (#11500)
+                                               jQuery.event.simulate( "change", this, event, true );
+                                       });
+                               }
+                               return false;
+                       }
+                       // Delegated event; lazy-add a change handler on descendant inputs
+                       jQuery.event.add( this, "beforeactivate._change", function( e ) {
+                               var elem = e.target;
+
+                               if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
+                                       jQuery.event.add( elem, "change._change", function( event ) {
+                                               if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+                                                       jQuery.event.simulate( "change", this.parentNode, event, true );
+                                               }
+                                       });
+                                       jQuery._data( elem, "changeBubbles", true );
+                               }
+                       });
+               },
+
+               handle: function( event ) {
+                       var elem = event.target;
+
+                       // Swallow native change events from checkbox/radio, we already triggered them above
+                       if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+                               return event.handleObj.handler.apply( this, arguments );
+                       }
+               },
+
+               teardown: function() {
+                       jQuery.event.remove( this, "._change" );
+
+                       return !rformElems.test( this.nodeName );
+               }
+       };
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+       jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+               // Attach a single capturing handler while someone wants focusin/focusout
+               var attaches = 0,
+                       handler = function( event ) {
+                               jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+                       };
+
+               jQuery.event.special[ fix ] = {
+                       setup: function() {
+                               if ( attaches++ === 0 ) {
+                                       document.addEventListener( orig, handler, true );
+                               }
+                       },
+                       teardown: function() {
+                               if ( --attaches === 0 ) {
+                                       document.removeEventListener( orig, handler, true );
+                               }
+                       }
+               };
+       });
+}
+
+jQuery.fn.extend({
+
+       on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+               var type, origFn;
+
+               // Types can be a map of types/handlers
+               if ( typeof types === "object" ) {
+                       // ( types-Object, selector, data )
+                       if ( typeof selector !== "string" ) {
+                               // ( types-Object, data )
+                               data = data || selector;
+                               selector = undefined;
+                       }
+                       for ( type in types ) {
+                               this.on( type, selector, data, types[ type ], one );
+                       }
+                       return this;
+               }
+
+               if ( data == null && fn == null ) {
+                       // ( types, fn )
+                       fn = selector;
+                       data = selector = undefined;
+               } else if ( fn == null ) {
+                       if ( typeof selector === "string" ) {
+                               // ( types, selector, fn )
+                               fn = data;
+                               data = undefined;
+                       } else {
+                               // ( types, data, fn )
+                               fn = data;
+                               data = selector;
+                               selector = undefined;
+                       }
+               }
+               if ( fn === false ) {
+                       fn = returnFalse;
+               } else if ( !fn ) {
+                       return this;
+               }
+
+               if ( one === 1 ) {
+                       origFn = fn;
+                       fn = function( event ) {
+                               // Can use an empty set, since event contains the info
+                               jQuery().off( event );
+                               return origFn.apply( this, arguments );
+                       };
+                       // Use same guid so caller can remove using origFn
+                       fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+               }
+               return this.each( function() {
+                       jQuery.event.add( this, types, fn, data, selector );
+               });
+       },
+       one: function( types, selector, data, fn ) {
+               return this.on( types, selector, data, fn, 1 );
+       },
+       off: function( types, selector, fn ) {
+               var handleObj, type;
+               if ( types && types.preventDefault && types.handleObj ) {
+                       // ( event )  dispatched jQuery.Event
+                       handleObj = types.handleObj;
+                       jQuery( types.delegateTarget ).off(
+                               handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+                               handleObj.selector,
+                               handleObj.handler
+                       );
+                       return this;
+               }
+               if ( typeof types === "object" ) {
+                       // ( types-object [, selector] )
+                       for ( type in types ) {
+                               this.off( type, selector, types[ type ] );
+                       }
+                       return this;
+               }
+               if ( selector === false || typeof selector === "function" ) {
+                       // ( types [, fn] )
+                       fn = selector;
+                       selector = undefined;
+               }
+               if ( fn === false ) {
+                       fn = returnFalse;
+               }
+               return this.each(function() {
+                       jQuery.event.remove( this, types, fn, selector );
+               });
+       },
+
+       trigger: function( type, data ) {
+               return this.each(function() {
+                       jQuery.event.trigger( type, data, this );
+               });
+       },
+       triggerHandler: function( type, data ) {
+               var elem = this[0];
+               if ( elem ) {
+                       return jQuery.event.trigger( type, data, elem, true );
+               }
+       }
+});
+var isSimple = /^.[^:#\[\.,]*$/,
+       rparentsprev = /^(?:parents|prev(?:Until|All))/,
+       rneedsContext = jQuery.expr.match.needsContext,
+       // methods guaranteed to produce a unique set when starting from a unique set
+       guaranteedUnique = {
+               children: true,
+               contents: true,
+               next: true,
+               prev: true
+       };
+
+jQuery.fn.extend({
+       find: function( selector ) {
+               var i,
+                       ret = [],
+                       self = this,
+                       len = self.length;
+
+               if ( typeof selector !== "string" ) {
+                       return this.pushStack( jQuery( selector ).filter(function() {
+                               for ( i = 0; i < len; i++ ) {
+                                       if ( jQuery.contains( self[ i ], this ) ) {
+                                               return true;
+                                       }
+                               }
+                       }) );
+               }
+
+               for ( i = 0; i < len; i++ ) {
+                       jQuery.find( selector, self[ i ], ret );
+               }
+
+               // Needed because $( selector, context ) becomes $( context ).find( selector )
+               ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+               ret.selector = this.selector ? this.selector + " " + selector : selector;
+               return ret;
+       },
+
+       has: function( target ) {
+               var i,
+                       targets = jQuery( target, this ),
+                       len = targets.length;
+
+               return this.filter(function() {
+                       for ( i = 0; i < len; i++ ) {
+                               if ( jQuery.contains( this, targets[i] ) ) {
+                                       return true;
+                               }
+                       }
+               });
+       },
+
+       not: function( selector ) {
+               return this.pushStack( winnow(this, selector || [], true) );
+       },
+
+       filter: function( selector ) {
+               return this.pushStack( winnow(this, selector || [], false) );
+       },
+
+       is: function( selector ) {
+               return !!winnow(
+                       this,
+
+                       // If this is a positional/relative selector, check membership in the returned set
+                       // so $("p:first").is("p:last") won't return true for a doc with two "p".
+                       typeof selector === "string" && rneedsContext.test( selector ) ?
+                               jQuery( selector ) :
+                               selector || [],
+                       false
+               ).length;
+       },
+
+       closest: function( selectors, context ) {
+               var cur,
+                       i = 0,
+                       l = this.length,
+                       ret = [],
+                       pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+                               jQuery( selectors, context || this.context ) :
+                               0;
+
+               for ( ; i < l; i++ ) {
+                       for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+                               // Always skip document fragments
+                               if ( cur.nodeType < 11 && (pos ?
+                                       pos.index(cur) > -1 :
+
+                                       // Don't pass non-elements to Sizzle
+                                       cur.nodeType === 1 &&
+                                               jQuery.find.matchesSelector(cur, selectors)) ) {
+
+                                       cur = ret.push( cur );
+                                       break;
+                               }
+                       }
+               }
+
+               return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
+       },
+
+       // Determine the position of an element within
+       // the matched set of elements
+       index: function( elem ) {
+
+               // No argument, return index in parent
+               if ( !elem ) {
+                       return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
+               }
+
+               // index in selector
+               if ( typeof elem === "string" ) {
+                       return jQuery.inArray( this[0], jQuery( elem ) );
+               }
+
+               // Locate the position of the desired element
+               return jQuery.inArray(
+                       // If it receives a jQuery object, the first element is used
+                       elem.jquery ? elem[0] : elem, this );
+       },
+
+       add: function( selector, context ) {
+               var set = typeof selector === "string" ?
+                               jQuery( selector, context ) :
+                               jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+                       all = jQuery.merge( this.get(), set );
+
+               return this.pushStack( jQuery.unique(all) );
+       },
+
+       addBack: function( selector ) {
+               return this.add( selector == null ?
+                       this.prevObject : this.prevObject.filter(selector)
+               );
+       }
+});
+
+function sibling( cur, dir ) {
+       do {
+               cur = cur[ dir ];
+       } while ( cur && cur.nodeType !== 1 );
+
+       return cur;
+}
+
+jQuery.each({
+       parent: function( elem ) {
+               var parent = elem.parentNode;
+               return parent && parent.nodeType !== 11 ? parent : null;
+       },
+       parents: function( elem ) {
+               return jQuery.dir( elem, "parentNode" );
+       },
+       parentsUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "parentNode", until );
+       },
+       next: function( elem ) {
+               return sibling( elem, "nextSibling" );
+       },
+       prev: function( elem ) {
+               return sibling( elem, "previousSibling" );
+       },
+       nextAll: function( elem ) {
+               return jQuery.dir( elem, "nextSibling" );
+       },
+       prevAll: function( elem ) {
+               return jQuery.dir( elem, "previousSibling" );
+       },
+       nextUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "nextSibling", until );
+       },
+       prevUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "previousSibling", until );
+       },
+       siblings: function( elem ) {
+               return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+       },
+       children: function( elem ) {
+               return jQuery.sibling( elem.firstChild );
+       },
+       contents: function( elem ) {
+               return jQuery.nodeName( elem, "iframe" ) ?
+                       elem.contentDocument || elem.contentWindow.document :
+                       jQuery.merge( [], elem.childNodes );
+       }
+}, function( name, fn ) {
+       jQuery.fn[ name ] = function( until, selector ) {
+               var ret = jQuery.map( this, fn, until );
+
+               if ( name.slice( -5 ) !== "Until" ) {
+                       selector = until;
+               }
+
+               if ( selector && typeof selector === "string" ) {
+                       ret = jQuery.filter( selector, ret );
+               }
+
+               if ( this.length > 1 ) {
+                       // Remove duplicates
+                       if ( !guaranteedUnique[ name ] ) {
+                               ret = jQuery.unique( ret );
+                       }
+
+                       // Reverse order for parents* and prev-derivatives
+                       if ( rparentsprev.test( name ) ) {
+                               ret = ret.reverse();
+                       }
+               }
+
+               return this.pushStack( ret );
+       };
+});
+
+jQuery.extend({
+       filter: function( expr, elems, not ) {
+               var elem = elems[ 0 ];
+
+               if ( not ) {
+                       expr = ":not(" + expr + ")";
+               }
+
+               return elems.length === 1 && elem.nodeType === 1 ?
+                       jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+                       jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+                               return elem.nodeType === 1;
+                       }));
+       },
+
+       dir: function( elem, dir, until ) {
+               var matched = [],
+                       cur = elem[ dir ];
+
+               while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+                       if ( cur.nodeType === 1 ) {
+                               matched.push( cur );
+                       }
+                       cur = cur[dir];
+               }
+               return matched;
+       },
+
+       sibling: function( n, elem ) {
+               var r = [];
+
+               for ( ; n; n = n.nextSibling ) {
+                       if ( n.nodeType === 1 && n !== elem ) {
+                               r.push( n );
+                       }
+               }
+
+               return r;
+       }
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+       if ( jQuery.isFunction( qualifier ) ) {
+               return jQuery.grep( elements, function( elem, i ) {
+                       /* jshint -W018 */
+                       return !!qualifier.call( elem, i, elem ) !== not;
+               });
+
+       }
+
+       if ( qualifier.nodeType ) {
+               return jQuery.grep( elements, function( elem ) {
+                       return ( elem === qualifier ) !== not;
+               });
+
+       }
+
+       if ( typeof qualifier === "string" ) {
+               if ( isSimple.test( qualifier ) ) {
+                       return jQuery.filter( qualifier, elements, not );
+               }
+
+               qualifier = jQuery.filter( qualifier, elements );
+       }
+
+       return jQuery.grep( elements, function( elem ) {
+               return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
+       });
+}
+function createSafeFragment( document ) {
+       var list = nodeNames.split( "|" ),
+               safeFrag = document.createDocumentFragment();
+
+       if ( safeFrag.createElement ) {
+               while ( list.length ) {
+                       safeFrag.createElement(
+                               list.pop()
+                       );
+               }
+       }
+       return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+               "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+       rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+       rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+       rleadingWhitespace = /^\s+/,
+       rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+       rtagName = /<([\w:]+)/,
+       rtbody = /<tbody/i,
+       rhtml = /<|&#?\w+;/,
+       rnoInnerhtml = /<(?:script|style|link)/i,
+       manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
+       // checked="checked" or checked
+       rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+       rscriptType = /^$|\/(?:java|ecma)script/i,
+       rscriptTypeMasked = /^true\/(.*)/,
+       rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+
+       // We have to close these tags to support XHTML (#13200)
+       wrapMap = {
+               option: [ 1, "<select multiple='multiple'>", "</select>" ],
+               legend: [ 1, "<fieldset>", "</fieldset>" ],
+               area: [ 1, "<map>", "</map>" ],
+               param: [ 1, "<object>", "</object>" ],
+               thead: [ 1, "<table>", "</table>" ],
+               tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+               col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+               td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+               // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+               // unless wrapped in a div with non-breaking characters in front of it.
+               _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
+       },
+       safeFragment = createSafeFragment( document ),
+       fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+jQuery.fn.extend({
+       text: function( value ) {
+               return jQuery.access( this, function( value ) {
+                       return value === undefined ?
+                               jQuery.text( this ) :
+                               this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+               }, null, value, arguments.length );
+       },
+
+       append: function() {
+               return this.domManip( arguments, function( elem ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+                               var target = manipulationTarget( this, elem );
+                               target.appendChild( elem );
+                       }
+               });
+       },
+
+       prepend: function() {
+               return this.domManip( arguments, function( elem ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+                               var target = manipulationTarget( this, elem );
+                               target.insertBefore( elem, target.firstChild );
+                       }
+               });
+       },
+
+       before: function() {
+               return this.domManip( arguments, function( elem ) {
+                       if ( this.parentNode ) {
+                               this.parentNode.insertBefore( elem, this );
+                       }
+               });
+       },
+
+       after: function() {
+               return this.domManip( arguments, function( elem ) {
+                       if ( this.parentNode ) {
+                               this.parentNode.insertBefore( elem, this.nextSibling );
+                       }
+               });
+       },
+
+       // keepData is for internal use only--do not document
+       remove: function( selector, keepData ) {
+               var elem,
+                       elems = selector ? jQuery.filter( selector, this ) : this,
+                       i = 0;
+
+               for ( ; (elem = elems[i]) != null; i++ ) {
+
+                       if ( !keepData && elem.nodeType === 1 ) {
+                               jQuery.cleanData( getAll( elem ) );
+                       }
+
+                       if ( elem.parentNode ) {
+                               if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+                                       setGlobalEval( getAll( elem, "script" ) );
+                               }
+                               elem.parentNode.removeChild( elem );
+                       }
+               }
+
+               return this;
+       },
+
+       empty: function() {
+               var elem,
+                       i = 0;
+
+               for ( ; (elem = this[i]) != null; i++ ) {
+                       // Remove element nodes and prevent memory leaks
+                       if ( elem.nodeType === 1 ) {
+                               jQuery.cleanData( getAll( elem, false ) );
+                       }
+
+                       // Remove any remaining nodes
+                       while ( elem.firstChild ) {
+                               elem.removeChild( elem.firstChild );
+                       }
+
+                       // If this is a select, ensure that it displays empty (#12336)
+                       // Support: IE<9
+                       if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
+                               elem.options.length = 0;
+                       }
+               }
+
+               return this;
+       },
+
+       clone: function( dataAndEvents, deepDataAndEvents ) {
+               dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+               deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+               return this.map( function () {
+                       return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+               });
+       },
+
+       html: function( value ) {
+               return jQuery.access( this, function( value ) {
+                       var elem = this[0] || {},
+                               i = 0,
+                               l = this.length;
+
+                       if ( value === undefined ) {
+                               return elem.nodeType === 1 ?
+                                       elem.innerHTML.replace( rinlinejQuery, "" ) :
+                                       undefined;
+                       }
+
+                       // See if we can take a shortcut and just use innerHTML
+                       if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+                               ( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+                               ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+                               !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+
+                               value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+                               try {
+                                       for (; i < l; i++ ) {
+                                               // Remove element nodes and prevent memory leaks
+                                               elem = this[i] || {};
+                                               if ( elem.nodeType === 1 ) {
+                                                       jQuery.cleanData( getAll( elem, false ) );
+                                                       elem.innerHTML = value;
+                                               }
+                                       }
+
+                                       elem = 0;
+
+                               // If using innerHTML throws an exception, use the fallback method
+                               } catch(e) {}
+                       }
+
+                       if ( elem ) {
+                               this.empty().append( value );
+                       }
+               }, null, value, arguments.length );
+       },
+
+       replaceWith: function() {
+               var
+                       // Snapshot the DOM in case .domManip sweeps something relevant into its fragment
+                       args = jQuery.map( this, function( elem ) {
+                               return [ elem.nextSibling, elem.parentNode ];
+                       }),
+                       i = 0;
+
+               // Make the changes, replacing each context element with the new content
+               this.domManip( arguments, function( elem ) {
+                       var next = args[ i++ ],
+                               parent = args[ i++ ];
+
+                       if ( parent ) {
+                               // Don't use the snapshot next if it has moved (#13810)
+                               if ( next && next.parentNode !== parent ) {
+                                       next = this.nextSibling;
+                               }
+                               jQuery( this ).remove();
+                               parent.insertBefore( elem, next );
+                       }
+               // Allow new content to include elements from the context set
+               }, true );
+
+               // Force removal if there was no new content (e.g., from empty arguments)
+               return i ? this : this.remove();
+       },
+
+       detach: function( selector ) {
+               return this.remove( selector, true );
+       },
+
+       domManip: function( args, callback, allowIntersection ) {
+
+               // Flatten any nested arrays
+               args = core_concat.apply( [], args );
+
+               var first, node, hasScripts,
+                       scripts, doc, fragment,
+                       i = 0,
+                       l = this.length,
+                       set = this,
+                       iNoClone = l - 1,
+                       value = args[0],
+                       isFunction = jQuery.isFunction( value );
+
+               // We can't cloneNode fragments that contain checked, in WebKit
+               if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
+                       return this.each(function( index ) {
+                               var self = set.eq( index );
+                               if ( isFunction ) {
+                                       args[0] = value.call( this, index, self.html() );
+                               }
+                               self.domManip( args, callback, allowIntersection );
+                       });
+               }
+
+               if ( l ) {
+                       fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );
+                       first = fragment.firstChild;
+
+                       if ( fragment.childNodes.length === 1 ) {
+                               fragment = first;
+                       }
+
+                       if ( first ) {
+                               scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+                               hasScripts = scripts.length;
+
+                               // Use the original fragment for the last item instead of the first because it can end up
+                               // being emptied incorrectly in certain situations (#8070).
+                               for ( ; i < l; i++ ) {
+                                       node = fragment;
+
+                                       if ( i !== iNoClone ) {
+                                               node = jQuery.clone( node, true, true );
+
+                                               // Keep references to cloned scripts for later restoration
+                                               if ( hasScripts ) {
+                                                       jQuery.merge( scripts, getAll( node, "script" ) );
+                                               }
+                                       }
+
+                                       callback.call( this[i], node, i );
+                               }
+
+                               if ( hasScripts ) {
+                                       doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+                                       // Reenable scripts
+                                       jQuery.map( scripts, restoreScript );
+
+                                       // Evaluate executable scripts on first document insertion
+                                       for ( i = 0; i < hasScripts; i++ ) {
+                                               node = scripts[ i ];
+                                               if ( rscriptType.test( node.type || "" ) &&
+                                                       !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+                                                       if ( node.src ) {
+                                                               // Hope ajax is available...
+                                                               jQuery._evalUrl( node.src );
+                                                       } else {
+                                                               jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               // Fix #11809: Avoid leaking memory
+                               fragment = first = null;
+                       }
+               }
+
+               return this;
+       }
+});
+
+// Support: IE<8
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+       return jQuery.nodeName( elem, "table" ) &&
+               jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ?
+
+               elem.getElementsByTagName("tbody")[0] ||
+                       elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+               elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+       elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type;
+       return elem;
+}
+function restoreScript( elem ) {
+       var match = rscriptTypeMasked.exec( elem.type );
+       if ( match ) {
+               elem.type = match[1];
+       } else {
+               elem.removeAttribute("type");
+       }
+       return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+       var elem,
+               i = 0;
+       for ( ; (elem = elems[i]) != null; i++ ) {
+               jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
+       }
+}
+
+function cloneCopyEvent( src, dest ) {
+
+       if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+               return;
+       }
+
+       var type, i, l,
+               oldData = jQuery._data( src ),
+               curData = jQuery._data( dest, oldData ),
+               events = oldData.events;
+
+       if ( events ) {
+               delete curData.handle;
+               curData.events = {};
+
+               for ( type in events ) {
+                       for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+                               jQuery.event.add( dest, type, events[ type ][ i ] );
+                       }
+               }
+       }
+
+       // make the cloned public data object a copy from the original
+       if ( curData.data ) {
+               curData.data = jQuery.extend( {}, curData.data );
+       }
+}
+
+function fixCloneNodeIssues( src, dest ) {
+       var nodeName, e, data;
+
+       // We do not need to do anything for non-Elements
+       if ( dest.nodeType !== 1 ) {
+               return;
+       }
+
+       nodeName = dest.nodeName.toLowerCase();
+
+       // IE6-8 copies events bound via attachEvent when using cloneNode.
+       if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
+               data = jQuery._data( dest );
+
+               for ( e in data.events ) {
+                       jQuery.removeEvent( dest, e, data.handle );
+               }
+
+               // Event data gets referenced instead of copied if the expando gets copied too
+               dest.removeAttribute( jQuery.expando );
+       }
+
+       // IE blanks contents when cloning scripts, and tries to evaluate newly-set text
+       if ( nodeName === "script" && dest.text !== src.text ) {
+               disableScript( dest ).text = src.text;
+               restoreScript( dest );
+
+       // IE6-10 improperly clones children of object elements using classid.
+       // IE10 throws NoModificationAllowedError if parent is null, #12132.
+       } else if ( nodeName === "object" ) {
+               if ( dest.parentNode ) {
+                       dest.outerHTML = src.outerHTML;
+               }
+
+               // This path appears unavoidable for IE9. When cloning an object
+               // element in IE9, the outerHTML strategy above is not sufficient.
+               // If the src has innerHTML and the destination does not,
+               // copy the src.innerHTML into the dest.innerHTML. #10324
+               if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
+                       dest.innerHTML = src.innerHTML;
+               }
+
+       } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
+               // IE6-8 fails to persist the checked state of a cloned checkbox
+               // or radio button. Worse, IE6-7 fail to give the cloned element
+               // a checked appearance if the defaultChecked value isn't also set
+
+               dest.defaultChecked = dest.checked = src.checked;
+
+               // IE6-7 get confused and end up setting the value of a cloned
+               // checkbox/radio button to an empty string instead of "on"
+               if ( dest.value !== src.value ) {
+                       dest.value = src.value;
+               }
+
+       // IE6-8 fails to return the selected option to the default selected
+       // state when cloning options
+       } else if ( nodeName === "option" ) {
+               dest.defaultSelected = dest.selected = src.defaultSelected;
+
+       // IE6-8 fails to set the defaultValue to the correct value when
+       // cloning other types of input fields
+       } else if ( nodeName === "input" || nodeName === "textarea" ) {
+               dest.defaultValue = src.defaultValue;
+       }
+}
+
+jQuery.each({
+       appendTo: "append",
+       prependTo: "prepend",
+       insertBefore: "before",
+       insertAfter: "after",
+       replaceAll: "replaceWith"
+}, function( name, original ) {
+       jQuery.fn[ name ] = function( selector ) {
+               var elems,
+                       i = 0,
+                       ret = [],
+                       insert = jQuery( selector ),
+                       last = insert.length - 1;
+
+               for ( ; i <= last; i++ ) {
+                       elems = i === last ? this : this.clone(true);
+                       jQuery( insert[i] )[ original ]( elems );
+
+                       // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
+                       core_push.apply( ret, elems.get() );
+               }
+
+               return this.pushStack( ret );
+       };
+});
+
+function getAll( context, tag ) {
+       var elems, elem,
+               i = 0,
+               found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
+                       typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
+                       undefined;
+
+       if ( !found ) {
+               for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
+                       if ( !tag || jQuery.nodeName( elem, tag ) ) {
+                               found.push( elem );
+                       } else {
+                               jQuery.merge( found, getAll( elem, tag ) );
+                       }
+               }
+       }
+
+       return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+               jQuery.merge( [ context ], found ) :
+               found;
+}
+
+// Used in buildFragment, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+       if ( manipulation_rcheckableType.test( elem.type ) ) {
+               elem.defaultChecked = elem.checked;
+       }
+}
+
+jQuery.extend({
+       clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+               var destElements, node, clone, i, srcElements,
+                       inPage = jQuery.contains( elem.ownerDocument, elem );
+
+               if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+                       clone = elem.cloneNode( true );
+
+               // IE<=8 does not properly clone detached, unknown element nodes
+               } else {
+                       fragmentDiv.innerHTML = elem.outerHTML;
+                       fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+               }
+
+               if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+                               (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+
+                       // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+                       destElements = getAll( clone );
+                       srcElements = getAll( elem );
+
+                       // Fix all IE cloning issues
+                       for ( i = 0; (node = srcElements[i]) != null; ++i ) {
+                               // Ensure that the destination node is not null; Fixes #9587
+                               if ( destElements[i] ) {
+                                       fixCloneNodeIssues( node, destElements[i] );
+                               }
+                       }
+               }
+
+               // Copy the events from the original to the clone
+               if ( dataAndEvents ) {
+                       if ( deepDataAndEvents ) {
+                               srcElements = srcElements || getAll( elem );
+                               destElements = destElements || getAll( clone );
+
+                               for ( i = 0; (node = srcElements[i]) != null; i++ ) {
+                                       cloneCopyEvent( node, destElements[i] );
+                               }
+                       } else {
+                               cloneCopyEvent( elem, clone );
+                       }
+               }
+
+               // Preserve script evaluation history
+               destElements = getAll( clone, "script" );
+               if ( destElements.length > 0 ) {
+                       setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+               }
+
+               destElements = srcElements = node = null;
+
+               // Return the cloned set
+               return clone;
+       },
+
+       buildFragment: function( elems, context, scripts, selection ) {
+               var j, elem, contains,
+                       tmp, tag, tbody, wrap,
+                       l = elems.length,
+
+                       // Ensure a safe fragment
+                       safe = createSafeFragment( context ),
+
+                       nodes = [],
+                       i = 0;
+
+               for ( ; i < l; i++ ) {
+                       elem = elems[ i ];
+
+                       if ( elem || elem === 0 ) {
+
+                               // Add nodes directly
+                               if ( jQuery.type( elem ) === "object" ) {
+                                       jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+                               // Convert non-html into a text node
+                               } else if ( !rhtml.test( elem ) ) {
+                                       nodes.push( context.createTextNode( elem ) );
+
+                               // Convert html into DOM nodes
+                               } else {
+                                       tmp = tmp || safe.appendChild( context.createElement("div") );
+
+                                       // Deserialize a standard representation
+                                       tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
+                                       wrap = wrapMap[ tag ] || wrapMap._default;
+
+                                       tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
+
+                                       // Descend through wrappers to the right content
+                                       j = wrap[0];
+                                       while ( j-- ) {
+                                               tmp = tmp.lastChild;
+                                       }
+
+                                       // Manually add leading whitespace removed by IE
+                                       if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+                                               nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
+                                       }
+
+                                       // Remove IE's autoinserted <tbody> from table fragments
+                                       if ( !jQuery.support.tbody ) {
+
+                                               // String was a <table>, *may* have spurious <tbody>
+                                               elem = tag === "table" && !rtbody.test( elem ) ?
+                                                       tmp.firstChild :
+
+                                                       // String was a bare <thead> or <tfoot>
+                                                       wrap[1] === "<table>" && !rtbody.test( elem ) ?
+                                                               tmp :
+                                                               0;
+
+                                               j = elem && elem.childNodes.length;
+                                               while ( j-- ) {
+                                                       if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
+                                                               elem.removeChild( tbody );
+                                                       }
+                                               }
+                                       }
+
+                                       jQuery.merge( nodes, tmp.childNodes );
+
+                                       // Fix #12392 for WebKit and IE > 9
+                                       tmp.textContent = "";
+
+                                       // Fix #12392 for oldIE
+                                       while ( tmp.firstChild ) {
+                                               tmp.removeChild( tmp.firstChild );
+                                       }
+
+                                       // Remember the top-level container for proper cleanup
+                                       tmp = safe.lastChild;
+                               }
+                       }
+               }
+
+               // Fix #11356: Clear elements from fragment
+               if ( tmp ) {
+                       safe.removeChild( tmp );
+               }
+
+               // Reset defaultChecked for any radios and checkboxes
+               // about to be appended to the DOM in IE 6/7 (#8060)
+               if ( !jQuery.support.appendChecked ) {
+                       jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
+               }
+
+               i = 0;
+               while ( (elem = nodes[ i++ ]) ) {
+
+                       // #4087 - If origin and destination elements are the same, and this is
+                       // that element, do not do anything
+                       if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+                               continue;
+                       }
+
+                       contains = jQuery.contains( elem.ownerDocument, elem );
+
+                       // Append to fragment
+                       tmp = getAll( safe.appendChild( elem ), "script" );
+
+                       // Preserve script evaluation history
+                       if ( contains ) {
+                               setGlobalEval( tmp );
+                       }
+
+                       // Capture executables
+                       if ( scripts ) {
+                               j = 0;
+                               while ( (elem = tmp[ j++ ]) ) {
+                                       if ( rscriptType.test( elem.type || "" ) ) {
+                                               scripts.push( elem );
+                                       }
+                               }
+                       }
+               }
+
+               tmp = null;
+
+               return safe;
+       },
+
+       cleanData: function( elems, /* internal */ acceptData ) {
+               var elem, type, id, data,
+                       i = 0,
+                       internalKey = jQuery.expando,
+                       cache = jQuery.cache,
+                       deleteExpando = jQuery.support.deleteExpando,
+                       special = jQuery.event.special;
+
+               for ( ; (elem = elems[i]) != null; i++ ) {
+
+                       if ( acceptData || jQuery.acceptData( elem ) ) {
+
+                               id = elem[ internalKey ];
+                               data = id && cache[ id ];
+
+                               if ( data ) {
+                                       if ( data.events ) {
+                                               for ( type in data.events ) {
+                                                       if ( special[ type ] ) {
+                                                               jQuery.event.remove( elem, type );
+
+                                                       // This is a shortcut to avoid jQuery.event.remove's overhead
+                                                       } else {
+                                                               jQuery.removeEvent( elem, type, data.handle );
+                                                       }
+                                               }
+                                       }
+
+                                       // Remove cache only if it was not already removed by jQuery.event.remove
+                                       if ( cache[ id ] ) {
+
+                                               delete cache[ id ];
+
+                                               // IE does not allow us to delete expando properties from nodes,
+                                               // nor does it have a removeAttribute function on Document nodes;
+                                               // we must handle all of these cases
+                                               if ( deleteExpando ) {
+                                                       delete elem[ internalKey ];
+
+                                               } else if ( typeof elem.removeAttribute !== core_strundefined ) {
+                                                       elem.removeAttribute( internalKey );
+
+                                               } else {
+                                                       elem[ internalKey ] = null;
+                                               }
+
+                                               core_deletedIds.push( id );
+                                       }
+                               }
+                       }
+               }
+       },
+
+       _evalUrl: function( url ) {
+               return jQuery.ajax({
+                       url: url,
+                       type: "GET",
+                       dataType: "script",
+                       async: false,
+                       global: false,
+                       "throws": true
+               });
+       }
+});
+jQuery.fn.extend({
+       wrapAll: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapAll( html.call(this, i) );
+                       });
+               }
+
+               if ( this[0] ) {
+                       // The elements to wrap the target around
+                       var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+                       if ( this[0].parentNode ) {
+                               wrap.insertBefore( this[0] );
+                       }
+
+                       wrap.map(function() {
+                               var elem = this;
+
+                               while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+                                       elem = elem.firstChild;
+                               }
+
+                               return elem;
+                       }).append( this );
+               }
+
+               return this;
+       },
+
+       wrapInner: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapInner( html.call(this, i) );
+                       });
+               }
+
+               return this.each(function() {
+                       var self = jQuery( this ),
+                               contents = self.contents();
+
+                       if ( contents.length ) {
+                               contents.wrapAll( html );
+
+                       } else {
+                               self.append( html );
+                       }
+               });
+       },
+
+       wrap: function( html ) {
+               var isFunction = jQuery.isFunction( html );
+
+               return this.each(function(i) {
+                       jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+               });
+       },
+
+       unwrap: function() {
+               return this.parent().each(function() {
+                       if ( !jQuery.nodeName( this, "body" ) ) {
+                               jQuery( this ).replaceWith( this.childNodes );
+                       }
+               }).end();
+       }
+});
+var iframe, getStyles, curCSS,
+       ralpha = /alpha\([^)]*\)/i,
+       ropacity = /opacity\s*=\s*([^)]*)/,
+       rposition = /^(top|right|bottom|left)$/,
+       // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+       // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+       rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+       rmargin = /^margin/,
+       rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
+       rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
+       rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
+       elemdisplay = { BODY: "block" },
+
+       cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+       cssNormalTransform = {
+               letterSpacing: 0,
+               fontWeight: 400
+       },
+
+       cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+       cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+       // shortcut for names that are not vendor prefixed
+       if ( name in style ) {
+               return name;
+       }
+
+       // check for vendor prefixed names
+       var capName = name.charAt(0).toUpperCase() + name.slice(1),
+               origName = name,
+               i = cssPrefixes.length;
+
+       while ( i-- ) {
+               name = cssPrefixes[ i ] + capName;
+               if ( name in style ) {
+                       return name;
+               }
+       }
+
+       return origName;
+}
+
+function isHidden( elem, el ) {
+       // isHidden might be called from jQuery#filter function;
+       // in that case, element will be second argument
+       elem = el || elem;
+       return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+}
+
+function showHide( elements, show ) {
+       var display, elem, hidden,
+               values = [],
+               index = 0,
+               length = elements.length;
+
+       for ( ; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
+
+               values[ index ] = jQuery._data( elem, "olddisplay" );
+               display = elem.style.display;
+               if ( show ) {
+                       // Reset the inline display of this element to learn if it is
+                       // being hidden by cascaded rules or not
+                       if ( !values[ index ] && display === "none" ) {
+                               elem.style.display = "";
+                       }
+
+                       // Set elements which have been overridden with display: none
+                       // in a stylesheet to whatever the default browser style is
+                       // for such an element
+                       if ( elem.style.display === "" && isHidden( elem ) ) {
+                               values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+                       }
+               } else {
+
+                       if ( !values[ index ] ) {
+                               hidden = isHidden( elem );
+
+                               if ( display && display !== "none" || !hidden ) {
+                                       jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+                               }
+                       }
+               }
+       }
+
+       // Set the display of most of the elements in a second loop
+       // to avoid the constant reflow
+       for ( index = 0; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
+               if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+                       elem.style.display = show ? values[ index ] || "" : "none";
+               }
+       }
+
+       return elements;
+}
+
+jQuery.fn.extend({
+       css: function( name, value ) {
+               return jQuery.access( this, function( elem, name, value ) {
+                       var len, styles,
+                               map = {},
+                               i = 0;
+
+                       if ( jQuery.isArray( name ) ) {
+                               styles = getStyles( elem );
+                               len = name.length;
+
+                               for ( ; i < len; i++ ) {
+                                       map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+                               }
+
+                               return map;
+                       }
+
+                       return value !== undefined ?
+                               jQuery.style( elem, name, value ) :
+                               jQuery.css( elem, name );
+               }, name, value, arguments.length > 1 );
+       },
+       show: function() {
+               return showHide( this, true );
+       },
+       hide: function() {
+               return showHide( this );
+       },
+       toggle: function( state ) {
+               if ( typeof state === "boolean" ) {
+                       return state ? this.show() : this.hide();
+               }
+
+               return this.each(function() {
+                       if ( isHidden( this ) ) {
+                               jQuery( this ).show();
+                       } else {
+                               jQuery( this ).hide();
+                       }
+               });
+       }
+});
+
+jQuery.extend({
+       // Add in style property hooks for overriding the default
+       // behavior of getting and setting a style property
+       cssHooks: {
+               opacity: {
+                       get: function( elem, computed ) {
+                               if ( computed ) {
+                                       // We should always get a number back from opacity
+                                       var ret = curCSS( elem, "opacity" );
+                                       return ret === "" ? "1" : ret;
+                               }
+                       }
+               }
+       },
+
+       // Don't automatically add "px" to these possibly-unitless properties
+       cssNumber: {
+               "columnCount": true,
+               "fillOpacity": true,
+               "fontWeight": true,
+               "lineHeight": true,
+               "opacity": true,
+               "order": true,
+               "orphans": true,
+               "widows": true,
+               "zIndex": true,
+               "zoom": true
+       },
+
+       // Add in properties whose names you wish to fix before
+       // setting or getting the value
+       cssProps: {
+               // normalize float css property
+               "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+       },
+
+       // Get and set the style property on a DOM Node
+       style: function( elem, name, value, extra ) {
+               // Don't set styles on text and comment nodes
+               if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+                       return;
+               }
+
+               // Make sure that we're working with the right name
+               var ret, type, hooks,
+                       origName = jQuery.camelCase( name ),
+                       style = elem.style;
+
+               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+               // gets hook for the prefixed version
+               // followed by the unprefixed version
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+               // Check if we're setting a value
+               if ( value !== undefined ) {
+                       type = typeof value;
+
+                       // convert relative number strings (+= or -=) to relative numbers. #7345
+                       if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+                               value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+                               // Fixes bug #9237
+                               type = "number";
+                       }
+
+                       // Make sure that NaN and null values aren't set. See: #7116
+                       if ( value == null || type === "number" && isNaN( value ) ) {
+                               return;
+                       }
+
+                       // If a number was passed in, add 'px' to the (except for certain CSS properties)
+                       if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+                               value += "px";
+                       }
+
+                       // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
+                       // but it would mean to define eight (for every problematic property) identical functions
+                       if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
+                               style[ name ] = "inherit";
+                       }
+
+                       // If a hook was provided, use that value, otherwise just set the specified value
+                       if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+
+                               // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+                               // Fixes bug #5509
+                               try {
+                                       style[ name ] = value;
+                               } catch(e) {}
+                       }
+
+               } else {
+                       // If a hook was provided get the non-computed value from there
+                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+                               return ret;
+                       }
+
+                       // Otherwise just get the value from the style object
+                       return style[ name ];
+               }
+       },
+
+       css: function( elem, name, extra, styles ) {
+               var num, val, hooks,
+                       origName = jQuery.camelCase( name );
+
+               // Make sure that we're working with the right name
+               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+               // gets hook for the prefixed version
+               // followed by the unprefixed version
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+               // If a hook was provided get the computed value from there
+               if ( hooks && "get" in hooks ) {
+                       val = hooks.get( elem, true, extra );
+               }
+
+               // Otherwise, if a way to get the computed value exists, use that
+               if ( val === undefined ) {
+                       val = curCSS( elem, name, styles );
+               }
+
+               //convert "normal" to computed value
+               if ( val === "normal" && name in cssNormalTransform ) {
+                       val = cssNormalTransform[ name ];
+               }
+
+               // Return, converting to number if forced or a qualifier was provided and val looks numeric
+               if ( extra === "" || extra ) {
+                       num = parseFloat( val );
+                       return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+               }
+               return val;
+       }
+});
+
+// NOTE: we've included the "window" in window.getComputedStyle
+// because jsdom on node.js will break without it.
+if ( window.getComputedStyle ) {
+       getStyles = function( elem ) {
+               return window.getComputedStyle( elem, null );
+       };
+
+       curCSS = function( elem, name, _computed ) {
+               var width, minWidth, maxWidth,
+                       computed = _computed || getStyles( elem ),
+
+                       // getPropertyValue is only needed for .css('filter') in IE9, see #12537
+                       ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
+                       style = elem.style;
+
+               if ( computed ) {
+
+                       if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+                               ret = jQuery.style( elem, name );
+                       }
+
+                       // A tribute to the "awesome hack by Dean Edwards"
+                       // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+                       // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+                       // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+                       if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+                               // Remember the original values
+                               width = style.width;
+                               minWidth = style.minWidth;
+                               maxWidth = style.maxWidth;
+
+                               // Put in the new values to get a computed value out
+                               style.minWidth = style.maxWidth = style.width = ret;
+                               ret = computed.width;
+
+                               // Revert the changed values
+                               style.width = width;
+                               style.minWidth = minWidth;
+                               style.maxWidth = maxWidth;
+                       }
+               }
+
+               return ret;
+       };
+} else if ( document.documentElement.currentStyle ) {
+       getStyles = function( elem ) {
+               return elem.currentStyle;
+       };
+
+       curCSS = function( elem, name, _computed ) {
+               var left, rs, rsLeft,
+                       computed = _computed || getStyles( elem ),
+                       ret = computed ? computed[ name ] : undefined,
+                       style = elem.style;
+
+               // Avoid setting ret to empty string here
+               // so we don't default to auto
+               if ( ret == null && style && style[ name ] ) {
+                       ret = style[ name ];
+               }
+
+               // From the awesome hack by Dean Edwards
+               // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+               // If we're not dealing with a regular pixel number
+               // but a number that has a weird ending, we need to convert it to pixels
+               // but not position css attributes, as those are proportional to the parent element instead
+               // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
+               if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+
+                       // Remember the original values
+                       left = style.left;
+                       rs = elem.runtimeStyle;
+                       rsLeft = rs && rs.left;
+
+                       // Put in the new values to get a computed value out
+                       if ( rsLeft ) {
+                               rs.left = elem.currentStyle.left;
+                       }
+                       style.left = name === "fontSize" ? "1em" : ret;
+                       ret = style.pixelLeft + "px";
+
+                       // Revert the changed values
+                       style.left = left;
+                       if ( rsLeft ) {
+                               rs.left = rsLeft;
+                       }
+               }
+
+               return ret === "" ? "auto" : ret;
+       };
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+       var matches = rnumsplit.exec( value );
+       return matches ?
+               // Guard against undefined "subtract", e.g., when used as in cssHooks
+               Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+               value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+       var i = extra === ( isBorderBox ? "border" : "content" ) ?
+               // If we already have the right measurement, avoid augmentation
+               4 :
+               // Otherwise initialize for horizontal or vertical properties
+               name === "width" ? 1 : 0,
+
+               val = 0;
+
+       for ( ; i < 4; i += 2 ) {
+               // both box models exclude margin, so add it if we want it
+               if ( extra === "margin" ) {
+                       val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+               }
+
+               if ( isBorderBox ) {
+                       // border-box includes padding, so remove it if we want content
+                       if ( extra === "content" ) {
+                               val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+                       }
+
+                       // at this point, extra isn't border nor margin, so remove border
+                       if ( extra !== "margin" ) {
+                               val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+                       }
+               } else {
+                       // at this point, extra isn't content, so add padding
+                       val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+                       // at this point, extra isn't content nor padding, so add border
+                       if ( extra !== "padding" ) {
+                               val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+                       }
+               }
+       }
+
+       return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+       // Start with offset property, which is equivalent to the border-box value
+       var valueIsBorderBox = true,
+               val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+               styles = getStyles( elem ),
+               isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+       // some non-html elements return undefined for offsetWidth, so check for null/undefined
+       // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+       // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+       if ( val <= 0 || val == null ) {
+               // Fall back to computed then uncomputed css if necessary
+               val = curCSS( elem, name, styles );
+               if ( val < 0 || val == null ) {
+                       val = elem.style[ name ];
+               }
+
+               // Computed unit is not pixels. Stop here and return.
+               if ( rnumnonpx.test(val) ) {
+                       return val;
+               }
+
+               // we need the check for style in case a browser which returns unreliable values
+               // for getComputedStyle silently falls back to the reliable elem.style
+               valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
+
+               // Normalize "", auto, and prepare for extra
+               val = parseFloat( val ) || 0;
+       }
+
+       // use the active box-sizing model to add/subtract irrelevant styles
+       return ( val +
+               augmentWidthOrHeight(
+                       elem,
+                       name,
+                       extra || ( isBorderBox ? "border" : "content" ),
+                       valueIsBorderBox,
+                       styles
+               )
+       ) + "px";
+}
+
+// Try to determine the default display value of an element
+function css_defaultDisplay( nodeName ) {
+       var doc = document,
+               display = elemdisplay[ nodeName ];
+
+       if ( !display ) {
+               display = actualDisplay( nodeName, doc );
+
+               // If the simple way fails, read from inside an iframe
+               if ( display === "none" || !display ) {
+                       // Use the already-created iframe if possible
+                       iframe = ( iframe ||
+                               jQuery("<iframe frameborder='0' width='0' height='0'/>")
+                               .css( "cssText", "display:block !important" )
+                       ).appendTo( doc.documentElement );
+
+                       // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+                       doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
+                       doc.write("<!doctype html><html><body>");
+                       doc.close();
+
+                       display = actualDisplay( nodeName, doc );
+                       iframe.detach();
+               }
+
+               // Store the correct default display
+               elemdisplay[ nodeName ] = display;
+       }
+
+       return display;
+}
+
+// Called ONLY from within css_defaultDisplay
+function actualDisplay( name, doc ) {
+       var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+               display = jQuery.css( elem[0], "display" );
+       elem.remove();
+       return display;
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+       jQuery.cssHooks[ name ] = {
+               get: function( elem, computed, extra ) {
+                       if ( computed ) {
+                               // certain elements can have dimension info if we invisibly show them
+                               // however, it must have a current display style that would benefit from this
+                               return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
+                                       jQuery.swap( elem, cssShow, function() {
+                                               return getWidthOrHeight( elem, name, extra );
+                                       }) :
+                                       getWidthOrHeight( elem, name, extra );
+                       }
+               },
+
+               set: function( elem, value, extra ) {
+                       var styles = extra && getStyles( elem );
+                       return setPositiveNumber( elem, value, extra ?
+                               augmentWidthOrHeight(
+                                       elem,
+                                       name,
+                                       extra,
+                                       jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+                                       styles
+                               ) : 0
+                       );
+               }
+       };
+});
+
+if ( !jQuery.support.opacity ) {
+       jQuery.cssHooks.opacity = {
+               get: function( elem, computed ) {
+                       // IE uses filters for opacity
+                       return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+                               ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+                               computed ? "1" : "";
+               },
+
+               set: function( elem, value ) {
+                       var style = elem.style,
+                               currentStyle = elem.currentStyle,
+                               opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+                               filter = currentStyle && currentStyle.filter || style.filter || "";
+
+                       // IE has trouble with opacity if it does not have layout
+                       // Force it by setting the zoom level
+                       style.zoom = 1;
+
+                       // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+                       // if value === "", then remove inline opacity #12685
+                       if ( ( value >= 1 || value === "" ) &&
+                                       jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+                                       style.removeAttribute ) {
+
+                               // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+                               // if "filter:" is present at all, clearType is disabled, we want to avoid this
+                               // style.removeAttribute is IE Only, but so apparently is this code path...
+                               style.removeAttribute( "filter" );
+
+                               // if there is no filter style applied in a css rule or unset inline opacity, we are done
+                               if ( value === "" || currentStyle && !currentStyle.filter ) {
+                                       return;
+                               }
+                       }
+
+                       // otherwise, set new filter values
+                       style.filter = ralpha.test( filter ) ?
+                               filter.replace( ralpha, opacity ) :
+                               filter + " " + opacity;
+               }
+       };
+}
+
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
+jQuery(function() {
+       if ( !jQuery.support.reliableMarginRight ) {
+               jQuery.cssHooks.marginRight = {
+                       get: function( elem, computed ) {
+                               if ( computed ) {
+                                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                                       // Work around by temporarily setting element display to inline-block
+                                       return jQuery.swap( elem, { "display": "inline-block" },
+                                               curCSS, [ elem, "marginRight" ] );
+                               }
+                       }
+               };
+       }
+
+       // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+       // getComputedStyle returns percent when specified for top/left/bottom/right
+       // rather than make the css module depend on the offset module, we just check for it here
+       if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
+               jQuery.each( [ "top", "left" ], function( i, prop ) {
+                       jQuery.cssHooks[ prop ] = {
+                               get: function( elem, computed ) {
+                                       if ( computed ) {
+                                               computed = curCSS( elem, prop );
+                                               // if curCSS returns percentage, fallback to offset
+                                               return rnumnonpx.test( computed ) ?
+                                                       jQuery( elem ).position()[ prop ] + "px" :
+                                                       computed;
+                                       }
+                               }
+                       };
+               });
+       }
+
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.hidden = function( elem ) {
+               // Support: Opera <= 12.12
+               // Opera reports offsetWidths and offsetHeights less than zero on some elements
+               return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
+                       (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+       };
+
+       jQuery.expr.filters.visible = function( elem ) {
+               return !jQuery.expr.filters.hidden( elem );
+       };
+}
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+       margin: "",
+       padding: "",
+       border: "Width"
+}, function( prefix, suffix ) {
+       jQuery.cssHooks[ prefix + suffix ] = {
+               expand: function( value ) {
+                       var i = 0,
+                               expanded = {},
+
+                               // assumes a single number if not a string
+                               parts = typeof value === "string" ? value.split(" ") : [ value ];
+
+                       for ( ; i < 4; i++ ) {
+                               expanded[ prefix + cssExpand[ i ] + suffix ] =
+                                       parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+                       }
+
+                       return expanded;
+               }
+       };
+
+       if ( !rmargin.test( prefix ) ) {
+               jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+       }
+});
+var r20 = /%20/g,
+       rbracket = /\[\]$/,
+       rCRLF = /\r?\n/g,
+       rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+       rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+jQuery.fn.extend({
+       serialize: function() {
+               return jQuery.param( this.serializeArray() );
+       },
+       serializeArray: function() {
+               return this.map(function(){
+                       // Can add propHook for "elements" to filter or add form elements
+                       var elements = jQuery.prop( this, "elements" );
+                       return elements ? jQuery.makeArray( elements ) : this;
+               })
+               .filter(function(){
+                       var type = this.type;
+                       // Use .is(":disabled") so that fieldset[disabled] works
+                       return this.name && !jQuery( this ).is( ":disabled" ) &&
+                               rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+                               ( this.checked || !manipulation_rcheckableType.test( type ) );
+               })
+               .map(function( i, elem ){
+                       var val = jQuery( this ).val();
+
+                       return val == null ?
+                               null :
+                               jQuery.isArray( val ) ?
+                                       jQuery.map( val, function( val ){
+                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+                                       }) :
+                                       { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+               }).get();
+       }
+});
+
+//Serialize an array of form elements or a set of
+//key/values into a query string
+jQuery.param = function( a, traditional ) {
+       var prefix,
+               s = [],
+               add = function( key, value ) {
+                       // If value is a function, invoke it and return its value
+                       value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+                       s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+               };
+
+       // Set traditional to true for jQuery <= 1.3.2 behavior.
+       if ( traditional === undefined ) {
+               traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+       }
+
+       // If an array was passed in, assume that it is an array of form elements.
+       if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+               // Serialize the form elements
+               jQuery.each( a, function() {
+                       add( this.name, this.value );
+               });
+
+       } else {
+               // If traditional, encode the "old" way (the way 1.3.2 or older
+               // did it), otherwise encode params recursively.
+               for ( prefix in a ) {
+                       buildParams( prefix, a[ prefix ], traditional, add );
+               }
+       }
+
+       // Return the resulting serialization
+       return s.join( "&" ).replace( r20, "+" );
+};
+
+function buildParams( prefix, obj, traditional, add ) {
+       var name;
+
+       if ( jQuery.isArray( obj ) ) {
+               // Serialize array item.
+               jQuery.each( obj, function( i, v ) {
+                       if ( traditional || rbracket.test( prefix ) ) {
+                               // Treat each array item as a scalar.
+                               add( prefix, v );
+
+                       } else {
+                               // Item is non-scalar (array or object), encode its numeric index.
+                               buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+                       }
+               });
+
+       } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+               // Serialize object item.
+               for ( name in obj ) {
+                       buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+               }
+
+       } else {
+               // Serialize scalar item.
+               add( prefix, obj );
+       }
+}
+jQuery.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( i, name ) {
+
+       // Handle event binding
+       jQuery.fn[ name ] = function( data, fn ) {
+               return arguments.length > 0 ?
+                       this.on( name, null, data, fn ) :
+                       this.trigger( name );
+       };
+});
+
+jQuery.fn.extend({
+       hover: function( fnOver, fnOut ) {
+               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+       },
+
+       bind: function( types, data, fn ) {
+               return this.on( types, null, data, fn );
+       },
+       unbind: function( types, fn ) {
+               return this.off( types, null, fn );
+       },
+
+       delegate: function( selector, types, data, fn ) {
+               return this.on( types, selector, data, fn );
+       },
+       undelegate: function( selector, types, fn ) {
+               // ( namespace ) or ( selector, types [, fn] )
+               return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+       }
+});
+var
+       // Document location
+       ajaxLocParts,
+       ajaxLocation,
+       ajax_nonce = jQuery.now(),
+
+       ajax_rquery = /\?/,
+       rhash = /#.*$/,
+       rts = /([?&])_=[^&]*/,
+       rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+       // #7653, #8125, #8152: local protocol detection
+       rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+       rnoContent = /^(?:GET|HEAD)$/,
+       rprotocol = /^\/\//,
+       rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
+
+       // Keep a copy of the old load method
+       _load = jQuery.fn.load,
+
+       /* Prefilters
+        * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+        * 2) These are called:
+        *    - BEFORE asking for a transport
+        *    - AFTER param serialization (s.data is a string if s.processData is true)
+        * 3) key is the dataType
+        * 4) the catchall symbol "*" can be used
+        * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+        */
+       prefilters = {},
+
+       /* Transports bindings
+        * 1) key is the dataType
+        * 2) the catchall symbol "*" can be used
+        * 3) selection will start with transport dataType and THEN go to "*" if needed
+        */
+       transports = {},
+
+       // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+       allTypes = "*/".concat("*");
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+       ajaxLocation = location.href;
+} catch( e ) {
+       // Use the href attribute of an A element
+       // since IE will modify it given document.location
+       ajaxLocation = document.createElement( "a" );
+       ajaxLocation.href = "";
+       ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+       // dataTypeExpression is optional and defaults to "*"
+       return function( dataTypeExpression, func ) {
+
+               if ( typeof dataTypeExpression !== "string" ) {
+                       func = dataTypeExpression;
+                       dataTypeExpression = "*";
+               }
+
+               var dataType,
+                       i = 0,
+                       dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
+
+               if ( jQuery.isFunction( func ) ) {
+                       // For each dataType in the dataTypeExpression
+                       while ( (dataType = dataTypes[i++]) ) {
+                               // Prepend if requested
+                               if ( dataType[0] === "+" ) {
+                                       dataType = dataType.slice( 1 ) || "*";
+                                       (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+                               // Otherwise append
+                               } else {
+                                       (structure[ dataType ] = structure[ dataType ] || []).push( func );
+                               }
+                       }
+               }
+       };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+       var inspected = {},
+               seekingTransport = ( structure === transports );
+
+       function inspect( dataType ) {
+               var selected;
+               inspected[ dataType ] = true;
+               jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+                       var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+                       if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+                               options.dataTypes.unshift( dataTypeOrTransport );
+                               inspect( dataTypeOrTransport );
+                               return false;
+                       } else if ( seekingTransport ) {
+                               return !( selected = dataTypeOrTransport );
+                       }
+               });
+               return selected;
+       }
+
+       return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+       var deep, key,
+               flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+       for ( key in src ) {
+               if ( src[ key ] !== undefined ) {
+                       ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
+               }
+       }
+       if ( deep ) {
+               jQuery.extend( true, target, deep );
+       }
+
+       return target;
+}
+
+jQuery.fn.load = function( url, params, callback ) {
+       if ( typeof url !== "string" && _load ) {
+               return _load.apply( this, arguments );
+       }
+
+       var selector, response, type,
+               self = this,
+               off = url.indexOf(" ");
+
+       if ( off >= 0 ) {
+               selector = url.slice( off, url.length );
+               url = url.slice( 0, off );
+       }
+
+       // If it's a function
+       if ( jQuery.isFunction( params ) ) {
+
+               // We assume that it's the callback
+               callback = params;
+               params = undefined;
+
+       // Otherwise, build a param string
+       } else if ( params && typeof params === "object" ) {
+               type = "POST";
+       }
+
+       // If we have elements to modify, make the request
+       if ( self.length > 0 ) {
+               jQuery.ajax({
+                       url: url,
+
+                       // if "type" variable is undefined, then "GET" method will be used
+                       type: type,
+                       dataType: "html",
+                       data: params
+               }).done(function( responseText ) {
+
+                       // Save response for use in complete callback
+                       response = arguments;
+
+                       self.html( selector ?
+
+                               // If a selector was specified, locate the right elements in a dummy div
+                               // Exclude scripts to avoid IE 'Permission Denied' errors
+                               jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+                               // Otherwise use the full result
+                               responseText );
+
+               }).complete( callback && function( jqXHR, status ) {
+                       self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+               });
+       }
+
+       return this;
+};
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
+       jQuery.fn[ type ] = function( fn ){
+               return this.on( type, fn );
+       };
+});
+
+jQuery.extend({
+
+       // Counter for holding the number of active queries
+       active: 0,
+
+       // Last-Modified header cache for next request
+       lastModified: {},
+       etag: {},
+
+       ajaxSettings: {
+               url: ajaxLocation,
+               type: "GET",
+               isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+               global: true,
+               processData: true,
+               async: true,
+               contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+               /*
+               timeout: 0,
+               data: null,
+               dataType: null,
+               username: null,
+               password: null,
+               cache: null,
+               throws: false,
+               traditional: false,
+               headers: {},
+               */
+
+               accepts: {
+                       "*": allTypes,
+                       text: "text/plain",
+                       html: "text/html",
+                       xml: "application/xml, text/xml",
+                       json: "application/json, text/javascript"
+               },
+
+               contents: {
+                       xml: /xml/,
+                       html: /html/,
+                       json: /json/
+               },
+
+               responseFields: {
+                       xml: "responseXML",
+                       text: "responseText",
+                       json: "responseJSON"
+               },
+
+               // Data converters
+               // Keys separate source (or catchall "*") and destination types with a single space
+               converters: {
+
+                       // Convert anything to text
+                       "* text": String,
+
+                       // Text to html (true = no transformation)
+                       "text html": true,
+
+                       // Evaluate text as a json expression
+                       "text json": jQuery.parseJSON,
+
+                       // Parse text as xml
+                       "text xml": jQuery.parseXML
+               },
+
+               // For options that shouldn't be deep extended:
+               // you can add your own custom options here if
+               // and when you create one that shouldn't be
+               // deep extended (see ajaxExtend)
+               flatOptions: {
+                       url: true,
+                       context: true
+               }
+       },
+
+       // Creates a full fledged settings object into target
+       // with both ajaxSettings and settings fields.
+       // If target is omitted, writes into ajaxSettings.
+       ajaxSetup: function( target, settings ) {
+               return settings ?
+
+                       // Building a settings object
+                       ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+                       // Extending ajaxSettings
+                       ajaxExtend( jQuery.ajaxSettings, target );
+       },
+
+       ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+       ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+       // Main method
+       ajax: function( url, options ) {
+
+               // If url is an object, simulate pre-1.5 signature
+               if ( typeof url === "object" ) {
+                       options = url;
+                       url = undefined;
+               }
+
+               // Force options to be an object
+               options = options || {};
+
+               var // Cross-domain detection vars
+                       parts,
+                       // Loop variable
+                       i,
+                       // URL without anti-cache param
+                       cacheURL,
+                       // Response headers as string
+                       responseHeadersString,
+                       // timeout handle
+                       timeoutTimer,
+
+                       // To know if global events are to be dispatched
+                       fireGlobals,
+
+                       transport,
+                       // Response headers
+                       responseHeaders,
+                       // Create the final options object
+                       s = jQuery.ajaxSetup( {}, options ),
+                       // Callbacks context
+                       callbackContext = s.context || s,
+                       // Context for global events is callbackContext if it is a DOM node or jQuery collection
+                       globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
+                               jQuery( callbackContext ) :
+                               jQuery.event,
+                       // Deferreds
+                       deferred = jQuery.Deferred(),
+                       completeDeferred = jQuery.Callbacks("once memory"),
+                       // Status-dependent callbacks
+                       statusCode = s.statusCode || {},
+                       // Headers (they are sent all at once)
+                       requestHeaders = {},
+                       requestHeadersNames = {},
+                       // The jqXHR state
+                       state = 0,
+                       // Default abort message
+                       strAbort = "canceled",
+                       // Fake xhr
+                       jqXHR = {
+                               readyState: 0,
+
+                               // Builds headers hashtable if needed
+                               getResponseHeader: function( key ) {
+                                       var match;
+                                       if ( state === 2 ) {
+                                               if ( !responseHeaders ) {
+                                                       responseHeaders = {};
+                                                       while ( (match = rheaders.exec( responseHeadersString )) ) {
+                                                               responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+                                                       }
+                                               }
+                                               match = responseHeaders[ key.toLowerCase() ];
+                                       }
+                                       return match == null ? null : match;
+                               },
+
+                               // Raw string
+                               getAllResponseHeaders: function() {
+                                       return state === 2 ? responseHeadersString : null;
+                               },
+
+                               // Caches the header
+                               setRequestHeader: function( name, value ) {
+                                       var lname = name.toLowerCase();
+                                       if ( !state ) {
+                                               name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+                                               requestHeaders[ name ] = value;
+                                       }
+                                       return this;
+                               },
+
+                               // Overrides response content-type header
+                               overrideMimeType: function( type ) {
+                                       if ( !state ) {
+                                               s.mimeType = type;
+                                       }
+                                       return this;
+                               },
+
+                               // Status-dependent callbacks
+                               statusCode: function( map ) {
+                                       var code;
+                                       if ( map ) {
+                                               if ( state < 2 ) {
+                                                       for ( code in map ) {
+                                                               // Lazy-add the new callback in a way that preserves old ones
+                                                               statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+                                                       }
+                                               } else {
+                                                       // Execute the appropriate callbacks
+                                                       jqXHR.always( map[ jqXHR.status ] );
+                                               }
+                                       }
+                                       return this;
+                               },
+
+                               // Cancel the request
+                               abort: function( statusText ) {
+                                       var finalText = statusText || strAbort;
+                                       if ( transport ) {
+                                               transport.abort( finalText );
+                                       }
+                                       done( 0, finalText );
+                                       return this;
+                               }
+                       };
+
+               // Attach deferreds
+               deferred.promise( jqXHR ).complete = completeDeferred.add;
+               jqXHR.success = jqXHR.done;
+               jqXHR.error = jqXHR.fail;
+
+               // Remove hash character (#7531: and string promotion)
+               // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+               // Handle falsy url in the settings object (#10093: consistency with old signature)
+               // We also use the url parameter if available
+               s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+               // Alias method option to type as per ticket #12004
+               s.type = options.method || options.type || s.method || s.type;
+
+               // Extract dataTypes list
+               s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
+
+               // A cross-domain request is in order when we have a protocol:host:port mismatch
+               if ( s.crossDomain == null ) {
+                       parts = rurl.exec( s.url.toLowerCase() );
+                       s.crossDomain = !!( parts &&
+                               ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+                                       ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+                                               ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
+                       );
+               }
+
+               // Convert data if not already a string
+               if ( s.data && s.processData && typeof s.data !== "string" ) {
+                       s.data = jQuery.param( s.data, s.traditional );
+               }
+
+               // Apply prefilters
+               inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+               // If request was aborted inside a prefilter, stop there
+               if ( state === 2 ) {
+                       return jqXHR;
+               }
+
+               // We can fire global events as of now if asked to
+               fireGlobals = s.global;
+
+               // Watch for a new set of requests
+               if ( fireGlobals && jQuery.active++ === 0 ) {
+                       jQuery.event.trigger("ajaxStart");
+               }
+
+               // Uppercase the type
+               s.type = s.type.toUpperCase();
+
+               // Determine if request has content
+               s.hasContent = !rnoContent.test( s.type );
+
+               // Save the URL in case we're toying with the If-Modified-Since
+               // and/or If-None-Match header later on
+               cacheURL = s.url;
+
+               // More options handling for requests with no content
+               if ( !s.hasContent ) {
+
+                       // If data is available, append data to url
+                       if ( s.data ) {
+                               cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+                               // #9682: remove data so that it's not used in an eventual retry
+                               delete s.data;
+                       }
+
+                       // Add anti-cache in url if needed
+                       if ( s.cache === false ) {
+                               s.url = rts.test( cacheURL ) ?
+
+                                       // If there is already a '_' parameter, set its value
+                                       cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
+
+                                       // Otherwise add one to the end
+                                       cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
+                       }
+               }
+
+               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+               if ( s.ifModified ) {
+                       if ( jQuery.lastModified[ cacheURL ] ) {
+                               jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+                       }
+                       if ( jQuery.etag[ cacheURL ] ) {
+                               jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+                       }
+               }
+
+               // Set the correct header, if data is being sent
+               if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+                       jqXHR.setRequestHeader( "Content-Type", s.contentType );
+               }
+
+               // Set the Accepts header for the server, depending on the dataType
+               jqXHR.setRequestHeader(
+                       "Accept",
+                       s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+                               s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+                               s.accepts[ "*" ]
+               );
+
+               // Check for headers option
+               for ( i in s.headers ) {
+                       jqXHR.setRequestHeader( i, s.headers[ i ] );
+               }
+
+               // Allow custom headers/mimetypes and early abort
+               if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+                       // Abort if not done already and return
+                       return jqXHR.abort();
+               }
+
+               // aborting is no longer a cancellation
+               strAbort = "abort";
+
+               // Install callbacks on deferreds
+               for ( i in { success: 1, error: 1, complete: 1 } ) {
+                       jqXHR[ i ]( s[ i ] );
+               }
+
+               // Get transport
+               transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+               // If no transport, we auto-abort
+               if ( !transport ) {
+                       done( -1, "No Transport" );
+               } else {
+                       jqXHR.readyState = 1;
+
+                       // Send global event
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+                       }
+                       // Timeout
+                       if ( s.async && s.timeout > 0 ) {
+                               timeoutTimer = setTimeout(function() {
+                                       jqXHR.abort("timeout");
+                               }, s.timeout );
+                       }
+
+                       try {
+                               state = 1;
+                               transport.send( requestHeaders, done );
+                       } catch ( e ) {
+                               // Propagate exception as error if not done
+                               if ( state < 2 ) {
+                                       done( -1, e );
+                               // Simply rethrow otherwise
+                               } else {
+                                       throw e;
+                               }
+                       }
+               }
+
+               // Callback for when everything is done
+               function done( status, nativeStatusText, responses, headers ) {
+                       var isSuccess, success, error, response, modified,
+                               statusText = nativeStatusText;
+
+                       // Called once
+                       if ( state === 2 ) {
+                               return;
+                       }
+
+                       // State is "done" now
+                       state = 2;
+
+                       // Clear timeout if it exists
+                       if ( timeoutTimer ) {
+                               clearTimeout( timeoutTimer );
+                       }
+
+                       // Dereference transport for early garbage collection
+                       // (no matter how long the jqXHR object will be used)
+                       transport = undefined;
+
+                       // Cache response headers
+                       responseHeadersString = headers || "";
+
+                       // Set readyState
+                       jqXHR.readyState = status > 0 ? 4 : 0;
+
+                       // Determine if successful
+                       isSuccess = status >= 200 && status < 300 || status === 304;
+
+                       // Get response data
+                       if ( responses ) {
+                               response = ajaxHandleResponses( s, jqXHR, responses );
+                       }
+
+                       // Convert no matter what (that way responseXXX fields are always set)
+                       response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+                       // If successful, handle type chaining
+                       if ( isSuccess ) {
+
+                               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+                               if ( s.ifModified ) {
+                                       modified = jqXHR.getResponseHeader("Last-Modified");
+                                       if ( modified ) {
+                                               jQuery.lastModified[ cacheURL ] = modified;
+                                       }
+                                       modified = jqXHR.getResponseHeader("etag");
+                                       if ( modified ) {
+                                               jQuery.etag[ cacheURL ] = modified;
+                                       }
+                               }
+
+                               // if no content
+                               if ( status === 204 || s.type === "HEAD" ) {
+                                       statusText = "nocontent";
+
+                               // if not modified
+                               } else if ( status === 304 ) {
+                                       statusText = "notmodified";
+
+                               // If we have data, let's convert it
+                               } else {
+                                       statusText = response.state;
+                                       success = response.data;
+                                       error = response.error;
+                                       isSuccess = !error;
+                               }
+                       } else {
+                               // We extract error from statusText
+                               // then normalize statusText and status for non-aborts
+                               error = statusText;
+                               if ( status || !statusText ) {
+                                       statusText = "error";
+                                       if ( status < 0 ) {
+                                               status = 0;
+                                       }
+                               }
+                       }
+
+                       // Set data for the fake xhr object
+                       jqXHR.status = status;
+                       jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+                       // Success/Error
+                       if ( isSuccess ) {
+                               deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+                       } else {
+                               deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+                       }
+
+                       // Status-dependent callbacks
+                       jqXHR.statusCode( statusCode );
+                       statusCode = undefined;
+
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+                                       [ jqXHR, s, isSuccess ? success : error ] );
+                       }
+
+                       // Complete
+                       completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+                               // Handle the global AJAX counter
+                               if ( !( --jQuery.active ) ) {
+                                       jQuery.event.trigger("ajaxStop");
+                               }
+                       }
+               }
+
+               return jqXHR;
+       },
+
+       getJSON: function( url, data, callback ) {
+               return jQuery.get( url, data, callback, "json" );
+       },
+
+       getScript: function( url, callback ) {
+               return jQuery.get( url, undefined, callback, "script" );
+       }
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+       jQuery[ method ] = function( url, data, callback, type ) {
+               // shift arguments if data argument was omitted
+               if ( jQuery.isFunction( data ) ) {
+                       type = type || callback;
+                       callback = data;
+                       data = undefined;
+               }
+
+               return jQuery.ajax({
+                       url: url,
+                       type: method,
+                       dataType: type,
+                       data: data,
+                       success: callback
+               });
+       };
+});
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+       var firstDataType, ct, finalDataType, type,
+               contents = s.contents,
+               dataTypes = s.dataTypes;
+
+       // Remove auto dataType and get content-type in the process
+       while( dataTypes[ 0 ] === "*" ) {
+               dataTypes.shift();
+               if ( ct === undefined ) {
+                       ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+               }
+       }
+
+       // Check if we're dealing with a known content-type
+       if ( ct ) {
+               for ( type in contents ) {
+                       if ( contents[ type ] && contents[ type ].test( ct ) ) {
+                               dataTypes.unshift( type );
+                               break;
+                       }
+               }
+       }
+
+       // Check to see if we have a response for the expected dataType
+       if ( dataTypes[ 0 ] in responses ) {
+               finalDataType = dataTypes[ 0 ];
+       } else {
+               // Try convertible dataTypes
+               for ( type in responses ) {
+                       if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+                               finalDataType = type;
+                               break;
+                       }
+                       if ( !firstDataType ) {
+                               firstDataType = type;
+                       }
+               }
+               // Or just use first one
+               finalDataType = finalDataType || firstDataType;
+       }
+
+       // If we found a dataType
+       // We add the dataType to the list if needed
+       // and return the corresponding response
+       if ( finalDataType ) {
+               if ( finalDataType !== dataTypes[ 0 ] ) {
+                       dataTypes.unshift( finalDataType );
+               }
+               return responses[ finalDataType ];
+       }
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+       var conv2, current, conv, tmp, prev,
+               converters = {},
+               // Work with a copy of dataTypes in case we need to modify it for conversion
+               dataTypes = s.dataTypes.slice();
+
+       // Create converters map with lowercased keys
+       if ( dataTypes[ 1 ] ) {
+               for ( conv in s.converters ) {
+                       converters[ conv.toLowerCase() ] = s.converters[ conv ];
+               }
+       }
+
+       current = dataTypes.shift();
+
+       // Convert to each sequential dataType
+       while ( current ) {
+
+               if ( s.responseFields[ current ] ) {
+                       jqXHR[ s.responseFields[ current ] ] = response;
+               }
+
+               // Apply the dataFilter if provided
+               if ( !prev && isSuccess && s.dataFilter ) {
+                       response = s.dataFilter( response, s.dataType );
+               }
+
+               prev = current;
+               current = dataTypes.shift();
+
+               if ( current ) {
+
+                       // There's only work to do if current dataType is non-auto
+                       if ( current === "*" ) {
+
+                               current = prev;
+
+                       // Convert response if prev dataType is non-auto and differs from current
+                       } else if ( prev !== "*" && prev !== current ) {
+
+                               // Seek a direct converter
+                               conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+                               // If none found, seek a pair
+                               if ( !conv ) {
+                                       for ( conv2 in converters ) {
+
+                                               // If conv2 outputs current
+                                               tmp = conv2.split( " " );
+                                               if ( tmp[ 1 ] === current ) {
+
+                                                       // If prev can be converted to accepted input
+                                                       conv = converters[ prev + " " + tmp[ 0 ] ] ||
+                                                               converters[ "* " + tmp[ 0 ] ];
+                                                       if ( conv ) {
+                                                               // Condense equivalence converters
+                                                               if ( conv === true ) {
+                                                                       conv = converters[ conv2 ];
+
+                                                               // Otherwise, insert the intermediate dataType
+                                                               } else if ( converters[ conv2 ] !== true ) {
+                                                                       current = tmp[ 0 ];
+                                                                       dataTypes.unshift( tmp[ 1 ] );
+                                                               }
+                                                               break;
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               // Apply converter (if not an equivalence)
+                               if ( conv !== true ) {
+
+                                       // Unless errors are allowed to bubble, catch and return them
+                                       if ( conv && s[ "throws" ] ) {
+                                               response = conv( response );
+                                       } else {
+                                               try {
+                                                       response = conv( response );
+                                               } catch ( e ) {
+                                                       return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return { state: "success", data: response };
+}
+// Install script dataType
+jQuery.ajaxSetup({
+       accepts: {
+               script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+       },
+       contents: {
+               script: /(?:java|ecma)script/
+       },
+       converters: {
+               "text script": function( text ) {
+                       jQuery.globalEval( text );
+                       return text;
+               }
+       }
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+       if ( s.cache === undefined ) {
+               s.cache = false;
+       }
+       if ( s.crossDomain ) {
+               s.type = "GET";
+               s.global = false;
+       }
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+       // This transport only deals with cross domain requests
+       if ( s.crossDomain ) {
+
+               var script,
+                       head = document.head || jQuery("head")[0] || document.documentElement;
+
+               return {
+
+                       send: function( _, callback ) {
+
+                               script = document.createElement("script");
+
+                               script.async = true;
+
+                               if ( s.scriptCharset ) {
+                                       script.charset = s.scriptCharset;
+                               }
+
+                               script.src = s.url;
+
+                               // Attach handlers for all browsers
+                               script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+                                       if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+                                               // Handle memory leak in IE
+                                               script.onload = script.onreadystatechange = null;
+
+                                               // Remove the script
+                                               if ( script.parentNode ) {
+                                                       script.parentNode.removeChild( script );
+                                               }
+
+                                               // Dereference the script
+                                               script = null;
+
+                                               // Callback if not abort
+                                               if ( !isAbort ) {
+                                                       callback( 200, "success" );
+                                               }
+                                       }
+                               };
+
+                               // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
+                               // Use native DOM manipulation to avoid our domManip AJAX trickery
+                               head.insertBefore( script, head.firstChild );
+                       },
+
+                       abort: function() {
+                               if ( script ) {
+                                       script.onload( undefined, true );
+                               }
+                       }
+               };
+       }
+});
+var oldCallbacks = [],
+       rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+       jsonp: "callback",
+       jsonpCallback: function() {
+               var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
+               this[ callback ] = true;
+               return callback;
+       }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+       var callbackName, overwritten, responseContainer,
+               jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+                       "url" :
+                       typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+               );
+
+       // Handle iff the expected data type is "jsonp" or we have a parameter to set
+       if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+               // Get callback name, remembering preexisting value associated with it
+               callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+                       s.jsonpCallback() :
+                       s.jsonpCallback;
+
+               // Insert callback into url or form data
+               if ( jsonProp ) {
+                       s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+               } else if ( s.jsonp !== false ) {
+                       s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+               }
+
+               // Use data converter to retrieve json after script execution
+               s.converters["script json"] = function() {
+                       if ( !responseContainer ) {
+                               jQuery.error( callbackName + " was not called" );
+                       }
+                       return responseContainer[ 0 ];
+               };
+
+               // force json dataType
+               s.dataTypes[ 0 ] = "json";
+
+               // Install callback
+               overwritten = window[ callbackName ];
+               window[ callbackName ] = function() {
+                       responseContainer = arguments;
+               };
+
+               // Clean-up function (fires after converters)
+               jqXHR.always(function() {
+                       // Restore preexisting value
+                       window[ callbackName ] = overwritten;
+
+                       // Save back as free
+                       if ( s[ callbackName ] ) {
+                               // make sure that re-using the options doesn't screw things around
+                               s.jsonpCallback = originalSettings.jsonpCallback;
+
+                               // save the callback name for future use
+                               oldCallbacks.push( callbackName );
+                       }
+
+                       // Call if it was a function and we have a response
+                       if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+                               overwritten( responseContainer[ 0 ] );
+                       }
+
+                       responseContainer = overwritten = undefined;
+               });
+
+               // Delegate to script
+               return "script";
+       }
+});
+var xhrCallbacks, xhrSupported,
+       xhrId = 0,
+       // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+       xhrOnUnloadAbort = window.ActiveXObject && function() {
+               // Abort all pending requests
+               var key;
+               for ( key in xhrCallbacks ) {
+                       xhrCallbacks[ key ]( undefined, true );
+               }
+       };
+
+// Functions to create xhrs
+function createStandardXHR() {
+       try {
+               return new window.XMLHttpRequest();
+       } catch( e ) {}
+}
+
+function createActiveXHR() {
+       try {
+               return new window.ActiveXObject("Microsoft.XMLHTTP");
+       } catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+       /* Microsoft failed to properly
+        * implement the XMLHttpRequest in IE7 (can't request local files),
+        * so we use the ActiveXObject when it is available
+        * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+        * we need a fallback.
+        */
+       function() {
+               return !this.isLocal && createStandardXHR() || createActiveXHR();
+       } :
+       // For all other browsers, use the standard XMLHttpRequest object
+       createStandardXHR;
+
+// Determine support properties
+xhrSupported = jQuery.ajaxSettings.xhr();
+jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+xhrSupported = jQuery.support.ajax = !!xhrSupported;
+
+// Create transport if the browser can provide an xhr
+if ( xhrSupported ) {
+
+       jQuery.ajaxTransport(function( s ) {
+               // Cross domain only allowed if supported through XMLHttpRequest
+               if ( !s.crossDomain || jQuery.support.cors ) {
+
+                       var callback;
+
+                       return {
+                               send: function( headers, complete ) {
+
+                                       // Get a new xhr
+                                       var handle, i,
+                                               xhr = s.xhr();
+
+                                       // Open the socket
+                                       // Passing null username, generates a login popup on Opera (#2865)
+                                       if ( s.username ) {
+                                               xhr.open( s.type, s.url, s.async, s.username, s.password );
+                                       } else {
+                                               xhr.open( s.type, s.url, s.async );
+                                       }
+
+                                       // Apply custom fields if provided
+                                       if ( s.xhrFields ) {
+                                               for ( i in s.xhrFields ) {
+                                                       xhr[ i ] = s.xhrFields[ i ];
+                                               }
+                                       }
+
+                                       // Override mime type if needed
+                                       if ( s.mimeType && xhr.overrideMimeType ) {
+                                               xhr.overrideMimeType( s.mimeType );
+                                       }
+
+                                       // X-Requested-With header
+                                       // For cross-domain requests, seeing as conditions for a preflight are
+                                       // akin to a jigsaw puzzle, we simply never set it to be sure.
+                                       // (it can always be set on a per-request basis or even using ajaxSetup)
+                                       // For same-domain requests, won't change header if already provided.
+                                       if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+                                               headers["X-Requested-With"] = "XMLHttpRequest";
+                                       }
+
+                                       // Need an extra try/catch for cross domain requests in Firefox 3
+                                       try {
+                                               for ( i in headers ) {
+                                                       xhr.setRequestHeader( i, headers[ i ] );
+                                               }
+                                       } catch( err ) {}
+
+                                       // Do send the request
+                                       // This may raise an exception which is actually
+                                       // handled in jQuery.ajax (so no try/catch here)
+                                       xhr.send( ( s.hasContent && s.data ) || null );
+
+                                       // Listener
+                                       callback = function( _, isAbort ) {
+                                               var status, responseHeaders, statusText, responses;
+
+                                               // Firefox throws exceptions when accessing properties
+                                               // of an xhr when a network error occurred
+                                               // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+                                               try {
+
+                                                       // Was never called and is aborted or complete
+                                                       if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+                                                               // Only called once
+                                                               callback = undefined;
+
+                                                               // Do not keep as active anymore
+                                                               if ( handle ) {
+                                                                       xhr.onreadystatechange = jQuery.noop;
+                                                                       if ( xhrOnUnloadAbort ) {
+                                                                               delete xhrCallbacks[ handle ];
+                                                                       }
+                                                               }
+
+                                                               // If it's an abort
+                                                               if ( isAbort ) {
+                                                                       // Abort it manually if needed
+                                                                       if ( xhr.readyState !== 4 ) {
+                                                                               xhr.abort();
+                                                                       }
+                                                               } else {
+                                                                       responses = {};
+                                                                       status = xhr.status;
+                                                                       responseHeaders = xhr.getAllResponseHeaders();
+
+                                                                       // When requesting binary data, IE6-9 will throw an exception
+                                                                       // on any attempt to access responseText (#11426)
+                                                                       if ( typeof xhr.responseText === "string" ) {
+                                                                               responses.text = xhr.responseText;
+                                                                       }
+
+                                                                       // Firefox throws an exception when accessing
+                                                                       // statusText for faulty cross-domain requests
+                                                                       try {
+                                                                               statusText = xhr.statusText;
+                                                                       } catch( e ) {
+                                                                               // We normalize with Webkit giving an empty statusText
+                                                                               statusText = "";
+                                                                       }
+
+                                                                       // Filter status for non standard behaviors
+
+                                                                       // If the request is local and we have data: assume a success
+                                                                       // (success with no data won't get notified, that's the best we
+                                                                       // can do given current implementations)
+                                                                       if ( !status && s.isLocal && !s.crossDomain ) {
+                                                                               status = responses.text ? 200 : 404;
+                                                                       // IE - #1450: sometimes returns 1223 when it should be 204
+                                                                       } else if ( status === 1223 ) {
+                                                                               status = 204;
+                                                                       }
+                                                               }
+                                                       }
+                                               } catch( firefoxAccessException ) {
+                                                       if ( !isAbort ) {
+                                                               complete( -1, firefoxAccessException );
+                                                       }
+                                               }
+
+                                               // Call complete if needed
+                                               if ( responses ) {
+                                                       complete( status, statusText, responses, responseHeaders );
+                                               }
+                                       };
+
+                                       if ( !s.async ) {
+                                               // if we're in sync mode we fire the callback
+                                               callback();
+                                       } else if ( xhr.readyState === 4 ) {
+                                               // (IE6 & IE7) if it's in cache and has been
+                                               // retrieved directly we need to fire the callback
+                                               setTimeout( callback );
+                                       } else {
+                                               handle = ++xhrId;
+                                               if ( xhrOnUnloadAbort ) {
+                                                       // Create the active xhrs callbacks list if needed
+                                                       // and attach the unload handler
+                                                       if ( !xhrCallbacks ) {
+                                                               xhrCallbacks = {};
+                                                               jQuery( window ).unload( xhrOnUnloadAbort );
+                                                       }
+                                                       // Add to list of active xhrs callbacks
+                                                       xhrCallbacks[ handle ] = callback;
+                                               }
+                                               xhr.onreadystatechange = callback;
+                                       }
+                               },
+
+                               abort: function() {
+                                       if ( callback ) {
+                                               callback( undefined, true );
+                                       }
+                               }
+                       };
+               }
+       });
+}
+var fxNow, timerId,
+       rfxtypes = /^(?:toggle|show|hide)$/,
+       rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+       rrun = /queueHooks$/,
+       animationPrefilters = [ defaultPrefilter ],
+       tweeners = {
+               "*": [function( prop, value ) {
+                       var tween = this.createTween( prop, value ),
+                               target = tween.cur(),
+                               parts = rfxnum.exec( value ),
+                               unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+                               // Starting value computation is required for potential unit mismatches
+                               start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+                                       rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+                               scale = 1,
+                               maxIterations = 20;
+
+                       if ( start && start[ 3 ] !== unit ) {
+                               // Trust units reported by jQuery.css
+                               unit = unit || start[ 3 ];
+
+                               // Make sure we update the tween properties later on
+                               parts = parts || [];
+
+                               // Iteratively approximate from a nonzero starting point
+                               start = +target || 1;
+
+                               do {
+                                       // If previous iteration zeroed out, double until we get *something*
+                                       // Use a string for doubling factor so we don't accidentally see scale as unchanged below
+                                       scale = scale || ".5";
+
+                                       // Adjust and apply
+                                       start = start / scale;
+                                       jQuery.style( tween.elem, prop, start + unit );
+
+                               // Update scale, tolerating zero or NaN from tween.cur()
+                               // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+                               } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+                       }
+
+                       // Update tween properties
+                       if ( parts ) {
+                               start = tween.start = +start || +target || 0;
+                               tween.unit = unit;
+                               // If a +=/-= token was provided, we're doing a relative animation
+                               tween.end = parts[ 1 ] ?
+                                       start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+                                       +parts[ 2 ];
+                       }
+
+                       return tween;
+               }]
+       };
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+       setTimeout(function() {
+               fxNow = undefined;
+       });
+       return ( fxNow = jQuery.now() );
+}
+
+function createTween( value, prop, animation ) {
+       var tween,
+               collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+               index = 0,
+               length = collection.length;
+       for ( ; index < length; index++ ) {
+               if ( (tween = collection[ index ].call( animation, prop, value )) ) {
+
+                       // we're done with this property
+                       return tween;
+               }
+       }
+}
+
+function Animation( elem, properties, options ) {
+       var result,
+               stopped,
+               index = 0,
+               length = animationPrefilters.length,
+               deferred = jQuery.Deferred().always( function() {
+                       // don't match elem in the :animated selector
+                       delete tick.elem;
+               }),
+               tick = function() {
+                       if ( stopped ) {
+                               return false;
+                       }
+                       var currentTime = fxNow || createFxNow(),
+                               remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+                               // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+                               temp = remaining / animation.duration || 0,
+                               percent = 1 - temp,
+                               index = 0,
+                               length = animation.tweens.length;
+
+                       for ( ; index < length ; index++ ) {
+                               animation.tweens[ index ].run( percent );
+                       }
+
+                       deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+                       if ( percent < 1 && length ) {
+                               return remaining;
+                       } else {
+                               deferred.resolveWith( elem, [ animation ] );
+                               return false;
+                       }
+               },
+               animation = deferred.promise({
+                       elem: elem,
+                       props: jQuery.extend( {}, properties ),
+                       opts: jQuery.extend( true, { specialEasing: {} }, options ),
+                       originalProperties: properties,
+                       originalOptions: options,
+                       startTime: fxNow || createFxNow(),
+                       duration: options.duration,
+                       tweens: [],
+                       createTween: function( prop, end ) {
+                               var tween = jQuery.Tween( elem, animation.opts, prop, end,
+                                               animation.opts.specialEasing[ prop ] || animation.opts.easing );
+                               animation.tweens.push( tween );
+                               return tween;
+                       },
+                       stop: function( gotoEnd ) {
+                               var index = 0,
+                                       // if we are going to the end, we want to run all the tweens
+                                       // otherwise we skip this part
+                                       length = gotoEnd ? animation.tweens.length : 0;
+                               if ( stopped ) {
+                                       return this;
+                               }
+                               stopped = true;
+                               for ( ; index < length ; index++ ) {
+                                       animation.tweens[ index ].run( 1 );
+                               }
+
+                               // resolve when we played the last frame
+                               // otherwise, reject
+                               if ( gotoEnd ) {
+                                       deferred.resolveWith( elem, [ animation, gotoEnd ] );
+                               } else {
+                                       deferred.rejectWith( elem, [ animation, gotoEnd ] );
+                               }
+                               return this;
+                       }
+               }),
+               props = animation.props;
+
+       propFilter( props, animation.opts.specialEasing );
+
+       for ( ; index < length ; index++ ) {
+               result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+               if ( result ) {
+                       return result;
+               }
+       }
+
+       jQuery.map( props, createTween, animation );
+
+       if ( jQuery.isFunction( animation.opts.start ) ) {
+               animation.opts.start.call( elem, animation );
+       }
+
+       jQuery.fx.timer(
+               jQuery.extend( tick, {
+                       elem: elem,
+                       anim: animation,
+                       queue: animation.opts.queue
+               })
+       );
+
+       // attach callbacks from options
+       return animation.progress( animation.opts.progress )
+               .done( animation.opts.done, animation.opts.complete )
+               .fail( animation.opts.fail )
+               .always( animation.opts.always );
+}
+
+function propFilter( props, specialEasing ) {
+       var index, name, easing, value, hooks;
+
+       // camelCase, specialEasing and expand cssHook pass
+       for ( index in props ) {
+               name = jQuery.camelCase( index );
+               easing = specialEasing[ name ];
+               value = props[ index ];
+               if ( jQuery.isArray( value ) ) {
+                       easing = value[ 1 ];
+                       value = props[ index ] = value[ 0 ];
+               }
+
+               if ( index !== name ) {
+                       props[ name ] = value;
+                       delete props[ index ];
+               }
+
+               hooks = jQuery.cssHooks[ name ];
+               if ( hooks && "expand" in hooks ) {
+                       value = hooks.expand( value );
+                       delete props[ name ];
+
+                       // not quite $.extend, this wont overwrite keys already present.
+                       // also - reusing 'index' from above because we have the correct "name"
+                       for ( index in value ) {
+                               if ( !( index in props ) ) {
+                                       props[ index ] = value[ index ];
+                                       specialEasing[ index ] = easing;
+                               }
+                       }
+               } else {
+                       specialEasing[ name ] = easing;
+               }
+       }
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+       tweener: function( props, callback ) {
+               if ( jQuery.isFunction( props ) ) {
+                       callback = props;
+                       props = [ "*" ];
+               } else {
+                       props = props.split(" ");
+               }
+
+               var prop,
+                       index = 0,
+                       length = props.length;
+
+               for ( ; index < length ; index++ ) {
+                       prop = props[ index ];
+                       tweeners[ prop ] = tweeners[ prop ] || [];
+                       tweeners[ prop ].unshift( callback );
+               }
+       },
+
+       prefilter: function( callback, prepend ) {
+               if ( prepend ) {
+                       animationPrefilters.unshift( callback );
+               } else {
+                       animationPrefilters.push( callback );
+               }
+       }
+});
+
+function defaultPrefilter( elem, props, opts ) {
+       /* jshint validthis: true */
+       var prop, value, toggle, tween, hooks, oldfire,
+               anim = this,
+               orig = {},
+               style = elem.style,
+               hidden = elem.nodeType && isHidden( elem ),
+               dataShow = jQuery._data( elem, "fxshow" );
+
+       // handle queue: false promises
+       if ( !opts.queue ) {
+               hooks = jQuery._queueHooks( elem, "fx" );
+               if ( hooks.unqueued == null ) {
+                       hooks.unqueued = 0;
+                       oldfire = hooks.empty.fire;
+                       hooks.empty.fire = function() {
+                               if ( !hooks.unqueued ) {
+                                       oldfire();
+                               }
+                       };
+               }
+               hooks.unqueued++;
+
+               anim.always(function() {
+                       // doing this makes sure that the complete handler will be called
+                       // before this completes
+                       anim.always(function() {
+                               hooks.unqueued--;
+                               if ( !jQuery.queue( elem, "fx" ).length ) {
+                                       hooks.empty.fire();
+                               }
+                       });
+               });
+       }
+
+       // height/width overflow pass
+       if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+               // Make sure that nothing sneaks out
+               // Record all 3 overflow attributes because IE does not
+               // change the overflow attribute when overflowX and
+               // overflowY are set to the same value
+               opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+               // Set display property to inline-block for height/width
+               // animations on inline elements that are having width/height animated
+               if ( jQuery.css( elem, "display" ) === "inline" &&
+                               jQuery.css( elem, "float" ) === "none" ) {
+
+                       // inline-level elements accept inline-block;
+                       // block-level elements need to be inline with layout
+                       if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
+                               style.display = "inline-block";
+
+                       } else {
+                               style.zoom = 1;
+                       }
+               }
+       }
+
+       if ( opts.overflow ) {
+               style.overflow = "hidden";
+               if ( !jQuery.support.shrinkWrapBlocks ) {
+                       anim.always(function() {
+                               style.overflow = opts.overflow[ 0 ];
+                               style.overflowX = opts.overflow[ 1 ];
+                               style.overflowY = opts.overflow[ 2 ];
+                       });
+               }
+       }
+
+
+       // show/hide pass
+       for ( prop in props ) {
+               value = props[ prop ];
+               if ( rfxtypes.exec( value ) ) {
+                       delete props[ prop ];
+                       toggle = toggle || value === "toggle";
+                       if ( value === ( hidden ? "hide" : "show" ) ) {
+                               continue;
+                       }
+                       orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+               }
+       }
+
+       if ( !jQuery.isEmptyObject( orig ) ) {
+               if ( dataShow ) {
+                       if ( "hidden" in dataShow ) {
+                               hidden = dataShow.hidden;
+                       }
+               } else {
+                       dataShow = jQuery._data( elem, "fxshow", {} );
+               }
+
+               // store state if its toggle - enables .stop().toggle() to "reverse"
+               if ( toggle ) {
+                       dataShow.hidden = !hidden;
+               }
+               if ( hidden ) {
+                       jQuery( elem ).show();
+               } else {
+                       anim.done(function() {
+                               jQuery( elem ).hide();
+                       });
+               }
+               anim.done(function() {
+                       var prop;
+                       jQuery._removeData( elem, "fxshow" );
+                       for ( prop in orig ) {
+                               jQuery.style( elem, prop, orig[ prop ] );
+                       }
+               });
+               for ( prop in orig ) {
+                       tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+                       if ( !( prop in dataShow ) ) {
+                               dataShow[ prop ] = tween.start;
+                               if ( hidden ) {
+                                       tween.end = tween.start;
+                                       tween.start = prop === "width" || prop === "height" ? 1 : 0;
+                               }
+                       }
+               }
+       }
+}
+
+function Tween( elem, options, prop, end, easing ) {
+       return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+       constructor: Tween,
+       init: function( elem, options, prop, end, easing, unit ) {
+               this.elem = elem;
+               this.prop = prop;
+               this.easing = easing || "swing";
+               this.options = options;
+               this.start = this.now = this.cur();
+               this.end = end;
+               this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+       },
+       cur: function() {
+               var hooks = Tween.propHooks[ this.prop ];
+
+               return hooks && hooks.get ?
+                       hooks.get( this ) :
+                       Tween.propHooks._default.get( this );
+       },
+       run: function( percent ) {
+               var eased,
+                       hooks = Tween.propHooks[ this.prop ];
+
+               if ( this.options.duration ) {
+                       this.pos = eased = jQuery.easing[ this.easing ](
+                               percent, this.options.duration * percent, 0, 1, this.options.duration
+                       );
+               } else {
+                       this.pos = eased = percent;
+               }
+               this.now = ( this.end - this.start ) * eased + this.start;
+
+               if ( this.options.step ) {
+                       this.options.step.call( this.elem, this.now, this );
+               }
+
+               if ( hooks && hooks.set ) {
+                       hooks.set( this );
+               } else {
+                       Tween.propHooks._default.set( this );
+               }
+               return this;
+       }
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+       _default: {
+               get: function( tween ) {
+                       var result;
+
+                       if ( tween.elem[ tween.prop ] != null &&
+                               (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+                               return tween.elem[ tween.prop ];
+                       }
+
+                       // passing an empty string as a 3rd parameter to .css will automatically
+                       // attempt a parseFloat and fallback to a string if the parse fails
+                       // so, simple values such as "10px" are parsed to Float.
+                       // complex values such as "rotate(1rad)" are returned as is.
+                       result = jQuery.css( tween.elem, tween.prop, "" );
+                       // Empty strings, null, undefined and "auto" are converted to 0.
+                       return !result || result === "auto" ? 0 : result;
+               },
+               set: function( tween ) {
+                       // use step hook for back compat - use cssHook if its there - use .style if its
+                       // available and use plain properties where available
+                       if ( jQuery.fx.step[ tween.prop ] ) {
+                               jQuery.fx.step[ tween.prop ]( tween );
+                       } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+                               jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+                       } else {
+                               tween.elem[ tween.prop ] = tween.now;
+                       }
+               }
+       }
+};
+
+// Support: IE <=9
+// Panic based approach to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+       set: function( tween ) {
+               if ( tween.elem.nodeType && tween.elem.parentNode ) {
+                       tween.elem[ tween.prop ] = tween.now;
+               }
+       }
+};
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+       var cssFn = jQuery.fn[ name ];
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return speed == null || typeof speed === "boolean" ?
+                       cssFn.apply( this, arguments ) :
+                       this.animate( genFx( name, true ), speed, easing, callback );
+       };
+});
+
+jQuery.fn.extend({
+       fadeTo: function( speed, to, easing, callback ) {
+
+               // show any hidden elements after setting opacity to 0
+               return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+                       // animate to the value specified
+                       .end().animate({ opacity: to }, speed, easing, callback );
+       },
+       animate: function( prop, speed, easing, callback ) {
+               var empty = jQuery.isEmptyObject( prop ),
+                       optall = jQuery.speed( speed, easing, callback ),
+                       doAnimation = function() {
+                               // Operate on a copy of prop so per-property easing won't be lost
+                               var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+                               // Empty animations, or finishing resolves immediately
+                               if ( empty || jQuery._data( this, "finish" ) ) {
+                                       anim.stop( true );
+                               }
+                       };
+                       doAnimation.finish = doAnimation;
+
+               return empty || optall.queue === false ?
+                       this.each( doAnimation ) :
+                       this.queue( optall.queue, doAnimation );
+       },
+       stop: function( type, clearQueue, gotoEnd ) {
+               var stopQueue = function( hooks ) {
+                       var stop = hooks.stop;
+                       delete hooks.stop;
+                       stop( gotoEnd );
+               };
+
+               if ( typeof type !== "string" ) {
+                       gotoEnd = clearQueue;
+                       clearQueue = type;
+                       type = undefined;
+               }
+               if ( clearQueue && type !== false ) {
+                       this.queue( type || "fx", [] );
+               }
+
+               return this.each(function() {
+                       var dequeue = true,
+                               index = type != null && type + "queueHooks",
+                               timers = jQuery.timers,
+                               data = jQuery._data( this );
+
+                       if ( index ) {
+                               if ( data[ index ] && data[ index ].stop ) {
+                                       stopQueue( data[ index ] );
+                               }
+                       } else {
+                               for ( index in data ) {
+                                       if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+                                               stopQueue( data[ index ] );
+                                       }
+                               }
+                       }
+
+                       for ( index = timers.length; index--; ) {
+                               if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+                                       timers[ index ].anim.stop( gotoEnd );
+                                       dequeue = false;
+                                       timers.splice( index, 1 );
+                               }
+                       }
+
+                       // start the next in the queue if the last step wasn't forced
+                       // timers currently will call their complete callbacks, which will dequeue
+                       // but only if they were gotoEnd
+                       if ( dequeue || !gotoEnd ) {
+                               jQuery.dequeue( this, type );
+                       }
+               });
+       },
+       finish: function( type ) {
+               if ( type !== false ) {
+                       type = type || "fx";
+               }
+               return this.each(function() {
+                       var index,
+                               data = jQuery._data( this ),
+                               queue = data[ type + "queue" ],
+                               hooks = data[ type + "queueHooks" ],
+                               timers = jQuery.timers,
+                               length = queue ? queue.length : 0;
+
+                       // enable finishing flag on private data
+                       data.finish = true;
+
+                       // empty the queue first
+                       jQuery.queue( this, type, [] );
+
+                       if ( hooks && hooks.stop ) {
+                               hooks.stop.call( this, true );
+                       }
+
+                       // look for any active animations, and finish them
+                       for ( index = timers.length; index--; ) {
+                               if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+                                       timers[ index ].anim.stop( true );
+                                       timers.splice( index, 1 );
+                               }
+                       }
+
+                       // look for any animations in the old queue and finish them
+                       for ( index = 0; index < length; index++ ) {
+                               if ( queue[ index ] && queue[ index ].finish ) {
+                                       queue[ index ].finish.call( this );
+                               }
+                       }
+
+                       // turn off finishing flag
+                       delete data.finish;
+               });
+       }
+});
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+       var which,
+               attrs = { height: type },
+               i = 0;
+
+       // if we include width, step value is 1 to do all cssExpand values,
+       // if we don't include width, step value is 2 to skip over Left and Right
+       includeWidth = includeWidth? 1 : 0;
+       for( ; i < 4 ; i += 2 - includeWidth ) {
+               which = cssExpand[ i ];
+               attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+       }
+
+       if ( includeWidth ) {
+               attrs.opacity = attrs.width = type;
+       }
+
+       return attrs;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+       slideDown: genFx("show"),
+       slideUp: genFx("hide"),
+       slideToggle: genFx("toggle"),
+       fadeIn: { opacity: "show" },
+       fadeOut: { opacity: "hide" },
+       fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return this.animate( props, speed, easing, callback );
+       };
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+       var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+               complete: fn || !fn && easing ||
+                       jQuery.isFunction( speed ) && speed,
+               duration: speed,
+               easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+       };
+
+       opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+               opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+       // normalize opt.queue - true/undefined/null -> "fx"
+       if ( opt.queue == null || opt.queue === true ) {
+               opt.queue = "fx";
+       }
+
+       // Queueing
+       opt.old = opt.complete;
+
+       opt.complete = function() {
+               if ( jQuery.isFunction( opt.old ) ) {
+                       opt.old.call( this );
+               }
+
+               if ( opt.queue ) {
+                       jQuery.dequeue( this, opt.queue );
+               }
+       };
+
+       return opt;
+};
+
+jQuery.easing = {
+       linear: function( p ) {
+               return p;
+       },
+       swing: function( p ) {
+               return 0.5 - Math.cos( p*Math.PI ) / 2;
+       }
+};
+
+jQuery.timers = [];
+jQuery.fx = Tween.prototype.init;
+jQuery.fx.tick = function() {
+       var timer,
+               timers = jQuery.timers,
+               i = 0;
+
+       fxNow = jQuery.now();
+
+       for ( ; i < timers.length; i++ ) {
+               timer = timers[ i ];
+               // Checks the timer has not already been removed
+               if ( !timer() && timers[ i ] === timer ) {
+                       timers.splice( i--, 1 );
+               }
+       }
+
+       if ( !timers.length ) {
+               jQuery.fx.stop();
+       }
+       fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+       if ( timer() && jQuery.timers.push( timer ) ) {
+               jQuery.fx.start();
+       }
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+       if ( !timerId ) {
+               timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+       }
+};
+
+jQuery.fx.stop = function() {
+       clearInterval( timerId );
+       timerId = null;
+};
+
+jQuery.fx.speeds = {
+       slow: 600,
+       fast: 200,
+       // Default speed
+       _default: 400
+};
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.animated = function( elem ) {
+               return jQuery.grep(jQuery.timers, function( fn ) {
+                       return elem === fn.elem;
+               }).length;
+       };
+}
+jQuery.fn.offset = function( options ) {
+       if ( arguments.length ) {
+               return options === undefined ?
+                       this :
+                       this.each(function( i ) {
+                               jQuery.offset.setOffset( this, options, i );
+                       });
+       }
+
+       var docElem, win,
+               box = { top: 0, left: 0 },
+               elem = this[ 0 ],
+               doc = elem && elem.ownerDocument;
+
+       if ( !doc ) {
+               return;
+       }
+
+       docElem = doc.documentElement;
+
+       // Make sure it's not a disconnected DOM node
+       if ( !jQuery.contains( docElem, elem ) ) {
+               return box;
+       }
+
+       // If we don't have gBCR, just use 0,0 rather than error
+       // BlackBerry 5, iOS 3 (original iPhone)
+       if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
+               box = elem.getBoundingClientRect();
+       }
+       win = getWindow( doc );
+       return {
+               top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
+               left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
+       };
+};
+
+jQuery.offset = {
+
+       setOffset: function( elem, options, i ) {
+               var position = jQuery.css( elem, "position" );
+
+               // set position first, in-case top/left are set even on static elem
+               if ( position === "static" ) {
+                       elem.style.position = "relative";
+               }
+
+               var curElem = jQuery( elem ),
+                       curOffset = curElem.offset(),
+                       curCSSTop = jQuery.css( elem, "top" ),
+                       curCSSLeft = jQuery.css( elem, "left" ),
+                       calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+                       props = {}, curPosition = {}, curTop, curLeft;
+
+               // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+               if ( calculatePosition ) {
+                       curPosition = curElem.position();
+                       curTop = curPosition.top;
+                       curLeft = curPosition.left;
+               } else {
+                       curTop = parseFloat( curCSSTop ) || 0;
+                       curLeft = parseFloat( curCSSLeft ) || 0;
+               }
+
+               if ( jQuery.isFunction( options ) ) {
+                       options = options.call( elem, i, curOffset );
+               }
+
+               if ( options.top != null ) {
+                       props.top = ( options.top - curOffset.top ) + curTop;
+               }
+               if ( options.left != null ) {
+                       props.left = ( options.left - curOffset.left ) + curLeft;
+               }
+
+               if ( "using" in options ) {
+                       options.using.call( elem, props );
+               } else {
+                       curElem.css( props );
+               }
+       }
+};
+
+
+jQuery.fn.extend({
+
+       position: function() {
+               if ( !this[ 0 ] ) {
+                       return;
+               }
+
+               var offsetParent, offset,
+                       parentOffset = { top: 0, left: 0 },
+                       elem = this[ 0 ];
+
+               // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
+               if ( jQuery.css( elem, "position" ) === "fixed" ) {
+                       // we assume that getBoundingClientRect is available when computed position is fixed
+                       offset = elem.getBoundingClientRect();
+               } else {
+                       // Get *real* offsetParent
+                       offsetParent = this.offsetParent();
+
+                       // Get correct offsets
+                       offset = this.offset();
+                       if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+                               parentOffset = offsetParent.offset();
+                       }
+
+                       // Add offsetParent borders
+                       parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+                       parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+               }
+
+               // Subtract parent offsets and element margins
+               // note: when an element has margin: auto the offsetLeft and marginLeft
+               // are the same in Safari causing offset.left to incorrectly be 0
+               return {
+                       top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+                       left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
+               };
+       },
+
+       offsetParent: function() {
+               return this.map(function() {
+                       var offsetParent = this.offsetParent || docElem;
+                       while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
+                               offsetParent = offsetParent.offsetParent;
+                       }
+                       return offsetParent || docElem;
+               });
+       }
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+       var top = /Y/.test( prop );
+
+       jQuery.fn[ method ] = function( val ) {
+               return jQuery.access( this, function( elem, method, val ) {
+                       var win = getWindow( elem );
+
+                       if ( val === undefined ) {
+                               return win ? (prop in win) ? win[ prop ] :
+                                       win.document.documentElement[ method ] :
+                                       elem[ method ];
+                       }
+
+                       if ( win ) {
+                               win.scrollTo(
+                                       !top ? val : jQuery( win ).scrollLeft(),
+                                       top ? val : jQuery( win ).scrollTop()
+                               );
+
+                       } else {
+                               elem[ method ] = val;
+                       }
+               }, method, val, arguments.length, null );
+       };
+});
+
+function getWindow( elem ) {
+       return jQuery.isWindow( elem ) ?
+               elem :
+               elem.nodeType === 9 ?
+                       elem.defaultView || elem.parentWindow :
+                       false;
+}
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+       jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+               // margin is only for outerHeight, outerWidth
+               jQuery.fn[ funcName ] = function( margin, value ) {
+                       var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+                               extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+                       return jQuery.access( this, function( elem, type, value ) {
+                               var doc;
+
+                               if ( jQuery.isWindow( elem ) ) {
+                                       // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+                                       // isn't a whole lot we can do. See pull request at this URL for discussion:
+                                       // https://github.com/jquery/jquery/pull/764
+                                       return elem.document.documentElement[ "client" + name ];
+                               }
+
+                               // Get document width or height
+                               if ( elem.nodeType === 9 ) {
+                                       doc = elem.documentElement;
+
+                                       // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
+                                       // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+                                       return Math.max(
+                                               elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+                                               elem.body[ "offset" + name ], doc[ "offset" + name ],
+                                               doc[ "client" + name ]
+                                       );
+                               }
+
+                               return value === undefined ?
+                                       // Get width or height on the element, requesting but not forcing parseFloat
+                                       jQuery.css( elem, type, extra ) :
+
+                                       // Set width or height on the element
+                                       jQuery.style( elem, type, value, extra );
+                       }, type, chainable ? margin : undefined, chainable, null );
+               };
+       });
+});
+// Limit scope pollution from any deprecated API
+// (function() {
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+       return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+// })();
+if ( typeof module === "object" && module && typeof module.exports === "object" ) {
+       // Expose jQuery as module.exports in loaders that implement the Node
+       // module pattern (including browserify). Do not create the global, since
+       // the user will be storing it themselves locally, and globals are frowned
+       // upon in the Node module world.
+       module.exports = jQuery;
+} else {
+       // Otherwise expose jQuery to the global object as usual
+       window.jQuery = window.$ = jQuery;
+
+       // Register as a named AMD module, since jQuery can be concatenated with other
+       // files that may use define, but not via a proper concatenation script that
+       // understands anonymous AMD modules. A named AMD is safest and most robust
+       // way to register. Lowercase jquery is used because AMD module names are
+       // derived from file names, and jQuery is normally delivered in a lowercase
+       // file name. Do this after creating the global so that if an AMD module wants
+       // to call noConflict to hide this version of jQuery, it will work.
+       if ( typeof define === "function" && define.amd ) {
+               define( "jquery", [], function () { return jQuery; } );
+       }
+}
+
+})( window );
deleted file mode 120000 (symlink)
index 64ef93e003d0fca1ffd593ff11fceb2d466db0aa..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1 +0,0 @@
-jquery-1.10.2.min.js
\ No newline at end of file
new file mode 100644 (file)
index 0000000000000000000000000000000000000000..da4170647dd102aa92a57cb4936ff6dfa58d78c2
--- /dev/null
@@ -0,0 +1,6 @@
+/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery-1.10.2.min.map
+*/
+(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t
+}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
+u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.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(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
diff --git a/third-party/jquery-2.0.3/js/jquery-2.0.3.min.map b/third-party/jquery-2.0.3/js/jquery-2.0.3.min.map
new file mode 100644 (file)
index 0000000..472d71b
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"file":"jquery-2.0.3.min.js","sources":["jquery-2.0.3.js"],"names":["window","undefined","rootjQuery","readyList","core_strundefined","location","document","docElem","documentElement","_jQuery","jQuery","_$","$","class2type","core_deletedIds","core_version","core_concat","concat","core_push","push","core_slice","slice","core_indexOf","indexOf","core_toString","toString","core_hasOwn","hasOwnProperty","core_trim","trim","selector","context","fn","init","core_pnum","source","core_rnotwhite","rquickExpr","rsingleTag","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","completed","removeEventListener","ready","prototype","jquery","constructor","match","elem","this","charAt","length","exec","find","merge","parseHTML","nodeType","ownerDocument","test","isPlainObject","isFunction","attr","getElementById","parentNode","makeArray","toArray","call","get","num","pushStack","elems","ret","prevObject","each","callback","args","promise","done","apply","arguments","first","eq","last","i","len","j","map","end","sort","splice","extend","options","name","src","copy","copyIsArray","clone","target","deep","isArray","expando","Math","random","replace","noConflict","isReady","readyWait","holdReady","hold","wait","resolveWith","trigger","off","obj","type","Array","isWindow","isNumeric","isNaN","parseFloat","isFinite","String","e","isEmptyObject","error","msg","Error","data","keepScripts","parsed","scripts","createElement","buildFragment","remove","childNodes","parseJSON","JSON","parse","parseXML","xml","tmp","DOMParser","parseFromString","getElementsByTagName","noop","globalEval","code","script","indirect","eval","text","head","appendChild","removeChild","camelCase","string","nodeName","toLowerCase","value","isArraylike","arr","results","Object","inArray","second","l","grep","inv","retVal","arg","guid","proxy","access","key","chainable","emptyGet","raw","bulk","now","Date","swap","old","style","Deferred","readyState","setTimeout","addEventListener","split","support","cachedruns","Expr","getText","isXML","compile","outermostContext","sortInput","setDocument","documentIsHTML","rbuggyQSA","rbuggyMatches","matches","contains","preferredDoc","dirruns","classCache","createCache","tokenCache","compilerCache","hasDuplicate","sortOrder","a","b","strundefined","MAX_NEGATIVE","hasOwn","pop","push_native","booleans","whitespace","characterEncoding","identifier","attributes","pseudos","rtrim","RegExp","rcomma","rcombinators","rsibling","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rnative","rinputs","rheader","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","fromCharCode","els","Sizzle","seed","m","groups","nid","newContext","newSelector","id","getElementsByClassName","qsa","tokenize","getAttribute","setAttribute","toSelector","join","querySelectorAll","qsaError","removeAttribute","select","keys","cache","cacheLength","shift","markFunction","assert","div","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","node","doc","parent","defaultView","attachEvent","top","className","createComment","innerHTML","firstChild","getById","getElementsByName","filter","attrId","getAttributeNode","tag","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","val","specified","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","nodeValue","selectors","createPseudo","relative",">","dir"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","outerCache","nodeIndex","start","useCache","lastChild","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","root","focus","activeElement","hasFocus","href","tabIndex","enabled","disabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","dirkey","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","matcherCachedRuns","bySet","byElement","superMatcher","expandContext","setMatched","matchedCount","outermost","contextBackup","dirrunsUnique","group","contexts","token","div1","defaultValue","unique","isXMLDoc","optionsCache","createOptions","object","flag","Callbacks","memory","fired","firing","firingStart","firingLength","firingIndex","list","stack","once","fire","stopOnFalse","self","disable","add","index","lock","locked","fireWith","func","tuples","state","always","deferred","fail","then","fns","newDefer","tuple","action","returned","resolve","reject","progress","notify","pipe","stateString","when","subordinate","resolveValues","remaining","updateFunc","values","progressValues","notifyWith","progressContexts","resolveContexts","fragment","createDocumentFragment","opt","checkOn","optSelected","reliableMarginRight","boxSizingReliable","pixelPosition","noCloneChecked","cloneNode","optDisabled","radioValue","checkClone","focusinBubbles","backgroundClip","clearCloneStyle","container","marginDiv","divReset","body","cssText","zoom","boxSizing","offsetWidth","getComputedStyle","width","marginRight","data_user","data_priv","rbrace","rmultiDash","Data","defineProperty","uid","accepts","owner","descriptor","unlock","defineProperties","set","prop","stored","camel","hasData","discard","acceptData","removeData","_data","_removeData","dataAttr","camelKey","queue","dequeue","startLength","hooks","_queueHooks","next","stop","setter","delay","time","fx","speeds","timeout","clearTimeout","clearQueue","count","defer","nodeHook","boolHook","rclass","rreturn","rfocusable","removeAttr","removeProp","propFix","addClass","classes","clazz","proceed","removeClass","toggleClass","stateVal","classNames","hasClass","valHooks","option","one","max","optionSet","nType","attrHooks","propName","attrNames","for","class","notxml","propHooks","hasAttribute","getter","rkeyEvent","rmouseEvent","rfocusMorph","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","event","global","types","handleObjIn","eventHandle","events","t","handleObj","special","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","onlyHandlers","bubbleType","ontype","eventPath","Event","isTrigger","namespace_re","noBubble","parentWindow","isPropagationStopped","preventDefault","isDefaultPrevented","_default","fix","handlerQueue","delegateTarget","preDispatch","currentTarget","isImmediatePropagationStopped","stopPropagation","postDispatch","sel","props","fixHooks","keyHooks","original","which","charCode","keyCode","mouseHooks","eventDoc","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","originalEvent","fixHook","load","blur","click","beforeunload","returnValue","simulate","bubble","isSimulated","defaultPrevented","getPreventDefault","timeStamp","stopImmediatePropagation","mouseenter","mouseleave","orig","related","relatedTarget","attaches","on","origFn","triggerHandler","isSimple","rparentsprev","rneedsContext","guaranteedUnique","children","contents","prev","targets","winnow","is","closest","pos","prevAll","addBack","sibling","parents","parentsUntil","until","nextAll","nextUntil","prevUntil","siblings","contentDocument","reverse","truncate","n","qualifier","rxhtmlTag","rtagName","rhtml","rnoInnerhtml","manipulation_rcheckableType","rchecked","rscriptType","rscriptTypeMasked","rcleanScript","wrapMap","thead","col","tr","td","optgroup","tbody","tfoot","colgroup","caption","th","append","createTextNode","domManip","manipulationTarget","prepend","insertBefore","before","after","keepData","cleanData","getAll","setGlobalEval","dataAndEvents","deepDataAndEvents","html","replaceWith","detach","allowIntersection","hasScripts","iNoClone","disableScript","restoreScript","_evalUrl","appendTo","prependTo","insertAfter","replaceAll","insert","srcElements","destElements","inPage","fixInput","cloneCopyEvent","selection","wrap","nodes","url","ajax","dataType","async","throws","content","refElements","dest","pdataOld","pdataCur","udataOld","udataCur","wrapAll","firstElementChild","wrapInner","unwrap","curCSS","iframe","rdisplayswap","rmargin","rnumsplit","rnumnonpx","rrelNum","elemdisplay","BODY","cssShow","position","visibility","display","cssNormalTransform","letterSpacing","fontWeight","cssExpand","cssPrefixes","vendorPropName","capName","origName","isHidden","el","css","getStyles","showHide","show","hidden","css_defaultDisplay","styles","hide","toggle","cssHooks","opacity","computed","cssNumber","columnCount","fillOpacity","lineHeight","order","orphans","widows","zIndex","cssProps","float","extra","_computed","minWidth","maxWidth","getPropertyValue","setPositiveNumber","subtract","augmentWidthOrHeight","isBorderBox","getWidthOrHeight","valueIsBorderBox","offsetHeight","actualDisplay","contentWindow","write","close","visible","margin","padding","border","prefix","suffix","expand","expanded","parts","r20","rbracket","rCRLF","rsubmitterTypes","rsubmittable","serialize","param","serializeArray","traditional","s","encodeURIComponent","ajaxSettings","buildParams","v","hover","fnOver","fnOut","bind","unbind","delegate","undelegate","ajaxLocParts","ajaxLocation","ajax_nonce","ajax_rquery","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","rurl","_load","prefilters","transports","allTypes","addToPrefiltersOrTransports","structure","dataTypeExpression","dataTypes","inspectPrefiltersOrTransports","originalOptions","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","params","response","responseText","complete","status","active","lastModified","etag","isLocal","processData","contentType","*","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","fireGlobals","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","mimeType","abort","statusText","finalText","success","method","crossDomain","hasContent","ifModified","headers","beforeSend","send","nativeStatusText","responses","isSuccess","modified","ajaxHandleResponses","ajaxConvert","rejectWith","getJSON","getScript","ct","finalDataType","firstDataType","conv2","current","conv","dataFilter","text script","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","xhr","XMLHttpRequest","xhrSupported","xhrSuccessStatus",1223,"xhrId","xhrCallbacks","ActiveXObject","cors","open","username","xhrFields","onload","onerror","fxNow","timerId","rfxtypes","rfxnum","rrun","animationPrefilters","defaultPrefilter","tweeners","tween","createTween","unit","scale","maxIterations","createFxNow","animation","collection","Animation","properties","stopped","tick","currentTime","startTime","duration","percent","tweens","run","opts","specialEasing","originalProperties","Tween","easing","gotoEnd","propFilter","timer","anim","tweener","prefilter","oldfire","dataShow","unqueued","overflow","overflowX","overflowY","eased","step","cssFn","speed","animate","genFx","fadeTo","to","optall","doAnimation","finish","stopQueue","timers","includeWidth","height","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","linear","p","swing","cos","PI","interval","setInterval","clearInterval","slow","fast","animated","offset","setOffset","win","box","left","getBoundingClientRect","getWindow","pageYOffset","pageXOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","curElem","using","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","size","andSelf","module","exports","define","amd"],"mappings":"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"}
\ No newline at end of file
deleted file mode 120000 (symlink)
index 4992a5381c0b8dee8412ff9232dcb93ccfd37fdd..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1 +0,0 @@
-jquery-2.0.3.js
\ No newline at end of file
new file mode 100644 (file)
index 0000000000000000000000000000000000000000..ebc6c187d75fd21778c97fdb7801f389050d450a
--- /dev/null
+/*!
+ * jQuery JavaScript Library v2.0.3
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-07-03T13:30Z
+ */
+(function( window, undefined ) {
+
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//"use strict";
+var
+       // A central reference to the root jQuery(document)
+       rootjQuery,
+
+       // The deferred used on DOM ready
+       readyList,
+
+       // Support: IE9
+       // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
+       core_strundefined = typeof undefined,
+
+       // Use the correct document accordingly with window argument (sandbox)
+       location = window.location,
+       document = window.document,
+       docElem = document.documentElement,
+
+       // Map over jQuery in case of overwrite
+       _jQuery = window.jQuery,
+
+       // Map over the $ in case of overwrite
+       _$ = window.$,
+
+       // [[Class]] -> type pairs
+       class2type = {},
+
+       // List of deleted data cache ids, so we can reuse them
+       core_deletedIds = [],
+
+       core_version = "2.0.3",
+
+       // Save a reference to some core methods
+       core_concat = core_deletedIds.concat,
+       core_push = core_deletedIds.push,
+       core_slice = core_deletedIds.slice,
+       core_indexOf = core_deletedIds.indexOf,
+       core_toString = class2type.toString,
+       core_hasOwn = class2type.hasOwnProperty,
+       core_trim = core_version.trim,
+
+       // Define a local copy of jQuery
+       jQuery = function( selector, context ) {
+               // The jQuery object is actually just the init constructor 'enhanced'
+               return new jQuery.fn.init( selector, context, rootjQuery );
+       },
+
+       // Used for matching numbers
+       core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
+
+       // Used for splitting on whitespace
+       core_rnotwhite = /\S+/g,
+
+       // A simple way to check for HTML strings
+       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+       // Strict HTML recognition (#11290: must start with <)
+       rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+       // Match a standalone tag
+       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+       // Matches dashed string for camelizing
+       rmsPrefix = /^-ms-/,
+       rdashAlpha = /-([\da-z])/gi,
+
+       // Used by jQuery.camelCase as callback to replace()
+       fcamelCase = function( all, letter ) {
+               return letter.toUpperCase();
+       },
+
+       // The ready event handler and self cleanup method
+       completed = function() {
+               document.removeEventListener( "DOMContentLoaded", completed, false );
+               window.removeEventListener( "load", completed, false );
+               jQuery.ready();
+       };
+
+jQuery.fn = jQuery.prototype = {
+       // The current version of jQuery being used
+       jquery: core_version,
+
+       constructor: jQuery,
+       init: function( selector, context, rootjQuery ) {
+               var match, elem;
+
+               // HANDLE: $(""), $(null), $(undefined), $(false)
+               if ( !selector ) {
+                       return this;
+               }
+
+               // Handle HTML strings
+               if ( typeof selector === "string" ) {
+                       if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+                               // Assume that strings that start and end with <> are HTML and skip the regex check
+                               match = [ null, selector, null ];
+
+                       } else {
+                               match = rquickExpr.exec( selector );
+                       }
+
+                       // Match html or make sure no context is specified for #id
+                       if ( match && (match[1] || !context) ) {
+
+                               // HANDLE: $(html) -> $(array)
+                               if ( match[1] ) {
+                                       context = context instanceof jQuery ? context[0] : context;
+
+                                       // scripts is true for back-compat
+                                       jQuery.merge( this, jQuery.parseHTML(
+                                               match[1],
+                                               context && context.nodeType ? context.ownerDocument || context : document,
+                                               true
+                                       ) );
+
+                                       // HANDLE: $(html, props)
+                                       if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+                                               for ( match in context ) {
+                                                       // Properties of context are called as methods if possible
+                                                       if ( jQuery.isFunction( this[ match ] ) ) {
+                                                               this[ match ]( context[ match ] );
+
+                                                       // ...and otherwise set as attributes
+                                                       } else {
+                                                               this.attr( match, context[ match ] );
+                                                       }
+                                               }
+                                       }
+
+                                       return this;
+
+                               // HANDLE: $(#id)
+                               } else {
+                                       elem = document.getElementById( match[2] );
+
+                                       // Check parentNode to catch when Blackberry 4.6 returns
+                                       // nodes that are no longer in the document #6963
+                                       if ( elem && elem.parentNode ) {
+                                               // Inject the element directly into the jQuery object
+                                               this.length = 1;
+                                               this[0] = elem;
+                                       }
+
+                                       this.context = document;
+                                       this.selector = selector;
+                                       return this;
+                               }
+
+                       // HANDLE: $(expr, $(...))
+                       } else if ( !context || context.jquery ) {
+                               return ( context || rootjQuery ).find( selector );
+
+                       // HANDLE: $(expr, context)
+                       // (which is just equivalent to: $(context).find(expr)
+                       } else {
+                               return this.constructor( context ).find( selector );
+                       }
+
+               // HANDLE: $(DOMElement)
+               } else if ( selector.nodeType ) {
+                       this.context = this[0] = selector;
+                       this.length = 1;
+                       return this;
+
+               // HANDLE: $(function)
+               // Shortcut for document ready
+               } else if ( jQuery.isFunction( selector ) ) {
+                       return rootjQuery.ready( selector );
+               }
+
+               if ( selector.selector !== undefined ) {
+                       this.selector = selector.selector;
+                       this.context = selector.context;
+               }
+
+               return jQuery.makeArray( selector, this );
+       },
+
+       // Start with an empty selector
+       selector: "",
+
+       // The default length of a jQuery object is 0
+       length: 0,
+
+       toArray: function() {
+               return core_slice.call( this );
+       },
+
+       // Get the Nth element in the matched element set OR
+       // Get the whole matched element set as a clean array
+       get: function( num ) {
+               return num == null ?
+
+                       // Return a 'clean' array
+                       this.toArray() :
+
+                       // Return just the object
+                       ( num < 0 ? this[ this.length + num ] : this[ num ] );
+       },
+
+       // Take an array of elements and push it onto the stack
+       // (returning the new matched element set)
+       pushStack: function( elems ) {
+
+               // Build a new jQuery matched element set
+               var ret = jQuery.merge( this.constructor(), elems );
+
+               // Add the old object onto the stack (as a reference)
+               ret.prevObject = this;
+               ret.context = this.context;
+
+               // Return the newly-formed element set
+               return ret;
+       },
+
+       // Execute a callback for every element in the matched set.
+       // (You can seed the arguments with an array of args, but this is
+       // only used internally.)
+       each: function( callback, args ) {
+               return jQuery.each( this, callback, args );
+       },
+
+       ready: function( fn ) {
+               // Add the callback
+               jQuery.ready.promise().done( fn );
+
+               return this;
+       },
+
+       slice: function() {
+               return this.pushStack( core_slice.apply( this, arguments ) );
+       },
+
+       first: function() {
+               return this.eq( 0 );
+       },
+
+       last: function() {
+               return this.eq( -1 );
+       },
+
+       eq: function( i ) {
+               var len = this.length,
+                       j = +i + ( i < 0 ? len : 0 );
+               return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+       },
+
+       map: function( callback ) {
+               return this.pushStack( jQuery.map(this, function( elem, i ) {
+                       return callback.call( elem, i, elem );
+               }));
+       },
+
+       end: function() {
+               return this.prevObject || this.constructor(null);
+       },
+
+       // For internal use only.
+       // Behaves like an Array's method, not like a jQuery method.
+       push: core_push,
+       sort: [].sort,
+       splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+       var options, name, src, copy, copyIsArray, clone,
+               target = arguments[0] || {},
+               i = 1,
+               length = arguments.length,
+               deep = false;
+
+       // Handle a deep copy situation
+       if ( typeof target === "boolean" ) {
+               deep = target;
+               target = arguments[1] || {};
+               // skip the boolean and the target
+               i = 2;
+       }
+
+       // Handle case when target is a string or something (possible in deep copy)
+       if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+               target = {};
+       }
+
+       // extend jQuery itself if only one argument is passed
+       if ( length === i ) {
+               target = this;
+               --i;
+       }
+
+       for ( ; i < length; i++ ) {
+               // Only deal with non-null/undefined values
+               if ( (options = arguments[ i ]) != null ) {
+                       // Extend the base object
+                       for ( name in options ) {
+                               src = target[ name ];
+                               copy = options[ name ];
+
+                               // Prevent never-ending loop
+                               if ( target === copy ) {
+                                       continue;
+                               }
+
+                               // Recurse if we're merging plain objects or arrays
+                               if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+                                       if ( copyIsArray ) {
+                                               copyIsArray = false;
+                                               clone = src && jQuery.isArray(src) ? src : [];
+
+                                       } else {
+                                               clone = src && jQuery.isPlainObject(src) ? src : {};
+                                       }
+
+                                       // Never move original objects, clone them
+                                       target[ name ] = jQuery.extend( deep, clone, copy );
+
+                               // Don't bring in undefined values
+                               } else if ( copy !== undefined ) {
+                                       target[ name ] = copy;
+                               }
+                       }
+               }
+       }
+
+       // Return the modified object
+       return target;
+};
+
+jQuery.extend({
+       // Unique for each copy of jQuery on the page
+       expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
+
+       noConflict: function( deep ) {
+               if ( window.$ === jQuery ) {
+                       window.$ = _$;
+               }
+
+               if ( deep && window.jQuery === jQuery ) {
+                       window.jQuery = _jQuery;
+               }
+
+               return jQuery;
+       },
+
+       // Is the DOM ready to be used? Set to true once it occurs.
+       isReady: false,
+
+       // A counter to track how many items to wait for before
+       // the ready event fires. See #6781
+       readyWait: 1,
+
+       // Hold (or release) the ready event
+       holdReady: function( hold ) {
+               if ( hold ) {
+                       jQuery.readyWait++;
+               } else {
+                       jQuery.ready( true );
+               }
+       },
+
+       // Handle when the DOM is ready
+       ready: function( wait ) {
+
+               // Abort if there are pending holds or we're already ready
+               if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+                       return;
+               }
+
+               // Remember that the DOM is ready
+               jQuery.isReady = true;
+
+               // If a normal DOM Ready event fired, decrement, and wait if need be
+               if ( wait !== true && --jQuery.readyWait > 0 ) {
+                       return;
+               }
+
+               // If there are functions bound, to execute
+               readyList.resolveWith( document, [ jQuery ] );
+
+               // Trigger any bound ready events
+               if ( jQuery.fn.trigger ) {
+                       jQuery( document ).trigger("ready").off("ready");
+               }
+       },
+
+       // See test/unit/core.js for details concerning isFunction.
+       // Since version 1.3, DOM methods and functions like alert
+       // aren't supported. They return false on IE (#2968).
+       isFunction: function( obj ) {
+               return jQuery.type(obj) === "function";
+       },
+
+       isArray: Array.isArray,
+
+       isWindow: function( obj ) {
+               return obj != null && obj === obj.window;
+       },
+
+       isNumeric: function( obj ) {
+               return !isNaN( parseFloat(obj) ) && isFinite( obj );
+       },
+
+       type: function( obj ) {
+               if ( obj == null ) {
+                       return String( obj );
+               }
+               // Support: Safari <= 5.1 (functionish RegExp)
+               return typeof obj === "object" || typeof obj === "function" ?
+                       class2type[ core_toString.call(obj) ] || "object" :
+                       typeof obj;
+       },
+
+       isPlainObject: function( obj ) {
+               // Not plain objects:
+               // - Any object or value whose internal [[Class]] property is not "[object Object]"
+               // - DOM nodes
+               // - window
+               if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+                       return false;
+               }
+
+               // Support: Firefox <20
+               // The try/catch suppresses exceptions thrown when attempting to access
+               // the "constructor" property of certain host objects, ie. |window.location|
+               // https://bugzilla.mozilla.org/show_bug.cgi?id=814622
+               try {
+                       if ( obj.constructor &&
+                                       !core_hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
+                               return false;
+                       }
+               } catch ( e ) {
+                       return false;
+               }
+
+               // If the function hasn't returned already, we're confident that
+               // |obj| is a plain object, created by {} or constructed with new Object
+               return true;
+       },
+
+       isEmptyObject: function( obj ) {
+               var name;
+               for ( name in obj ) {
+                       return false;
+               }
+               return true;
+       },
+
+       error: function( msg ) {
+               throw new Error( msg );
+       },
+
+       // data: string of html
+       // context (optional): If specified, the fragment will be created in this context, defaults to document
+       // keepScripts (optional): If true, will include scripts passed in the html string
+       parseHTML: function( data, context, keepScripts ) {
+               if ( !data || typeof data !== "string" ) {
+                       return null;
+               }
+               if ( typeof context === "boolean" ) {
+                       keepScripts = context;
+                       context = false;
+               }
+               context = context || document;
+
+               var parsed = rsingleTag.exec( data ),
+                       scripts = !keepScripts && [];
+
+               // Single tag
+               if ( parsed ) {
+                       return [ context.createElement( parsed[1] ) ];
+               }
+
+               parsed = jQuery.buildFragment( [ data ], context, scripts );
+
+               if ( scripts ) {
+                       jQuery( scripts ).remove();
+               }
+
+               return jQuery.merge( [], parsed.childNodes );
+       },
+
+       parseJSON: JSON.parse,
+
+       // Cross-browser xml parsing
+       parseXML: function( data ) {
+               var xml, tmp;
+               if ( !data || typeof data !== "string" ) {
+                       return null;
+               }
+
+               // Support: IE9
+               try {
+                       tmp = new DOMParser();
+                       xml = tmp.parseFromString( data , "text/xml" );
+               } catch ( e ) {
+                       xml = undefined;
+               }
+
+               if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
+                       jQuery.error( "Invalid XML: " + data );
+               }
+               return xml;
+       },
+
+       noop: function() {},
+
+       // Evaluates a script in a global context
+       globalEval: function( code ) {
+               var script,
+                               indirect = eval;
+
+               code = jQuery.trim( code );
+
+               if ( code ) {
+                       // If the code includes a valid, prologue position
+                       // strict mode pragma, execute code by injecting a
+                       // script tag into the document.
+                       if ( code.indexOf("use strict") === 1 ) {
+                               script = document.createElement("script");
+                               script.text = code;
+                               document.head.appendChild( script ).parentNode.removeChild( script );
+                       } else {
+                       // Otherwise, avoid the DOM node creation, insertion
+                       // and removal by using an indirect global eval
+                               indirect( code );
+                       }
+               }
+       },
+
+       // Convert dashed to camelCase; used by the css and data modules
+       // Microsoft forgot to hump their vendor prefix (#9572)
+       camelCase: function( string ) {
+               return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+       },
+
+       nodeName: function( elem, name ) {
+               return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+       },
+
+       // args is for internal usage only
+       each: function( obj, callback, args ) {
+               var value,
+                       i = 0,
+                       length = obj.length,
+                       isArray = isArraylike( obj );
+
+               if ( args ) {
+                       if ( isArray ) {
+                               for ( ; i < length; i++ ) {
+                                       value = callback.apply( obj[ i ], args );
+
+                                       if ( value === false ) {
+                                               break;
+                                       }
+                               }
+                       } else {
+                               for ( i in obj ) {
+                                       value = callback.apply( obj[ i ], args );
+
+                                       if ( value === false ) {
+                                               break;
+                                       }
+                               }
+                       }
+
+               // A special, fast, case for the most common use of each
+               } else {
+                       if ( isArray ) {
+                               for ( ; i < length; i++ ) {
+                                       value = callback.call( obj[ i ], i, obj[ i ] );
+
+                                       if ( value === false ) {
+                                               break;
+                                       }
+                               }
+                       } else {
+                               for ( i in obj ) {
+                                       value = callback.call( obj[ i ], i, obj[ i ] );
+
+                                       if ( value === false ) {
+                                               break;
+                                       }
+                               }
+                       }
+               }
+
+               return obj;
+       },
+
+       trim: function( text ) {
+               return text == null ? "" : core_trim.call( text );
+       },
+
+       // results is for internal usage only
+       makeArray: function( arr, results ) {
+               var ret = results || [];
+
+               if ( arr != null ) {
+                       if ( isArraylike( Object(arr) ) ) {
+                               jQuery.merge( ret,
+                                       typeof arr === "string" ?
+                                       [ arr ] : arr
+                               );
+                       } else {
+                               core_push.call( ret, arr );
+                       }
+               }
+
+               return ret;
+       },
+
+       inArray: function( elem, arr, i ) {
+               return arr == null ? -1 : core_indexOf.call( arr, elem, i );
+       },
+
+       merge: function( first, second ) {
+               var l = second.length,
+                       i = first.length,
+                       j = 0;
+
+               if ( typeof l === "number" ) {
+                       for ( ; j < l; j++ ) {
+                               first[ i++ ] = second[ j ];
+                       }
+               } else {
+                       while ( second[j] !== undefined ) {
+                               first[ i++ ] = second[ j++ ];
+                       }
+               }
+
+               first.length = i;
+
+               return first;
+       },
+
+       grep: function( elems, callback, inv ) {
+               var retVal,
+                       ret = [],
+                       i = 0,
+                       length = elems.length;
+               inv = !!inv;
+
+               // Go through the array, only saving the items
+               // that pass the validator function
+               for ( ; i < length; i++ ) {
+                       retVal = !!callback( elems[ i ], i );
+                       if ( inv !== retVal ) {
+                               ret.push( elems[ i ] );
+                       }
+               }
+
+               return ret;
+       },
+
+       // arg is for internal usage only
+       map: function( elems, callback, arg ) {
+               var value,
+                       i = 0,
+                       length = elems.length,
+                       isArray = isArraylike( elems ),
+                       ret = [];
+
+               // Go through the array, translating each of the items to their
+               if ( isArray ) {
+                       for ( ; i < length; i++ ) {
+                               value = callback( elems[ i ], i, arg );
+
+                               if ( value != null ) {
+                                       ret[ ret.length ] = value;
+                               }
+                       }
+
+               // Go through every key on the object,
+               } else {
+                       for ( i in elems ) {
+                               value = callback( elems[ i ], i, arg );
+
+                               if ( value != null ) {
+                                       ret[ ret.length ] = value;
+                               }
+                       }
+               }
+
+               // Flatten any nested arrays
+               return core_concat.apply( [], ret );
+       },
+
+       // A global GUID counter for objects
+       guid: 1,
+
+       // Bind a function to a context, optionally partially applying any
+       // arguments.
+       proxy: function( fn, context ) {
+               var tmp, args, proxy;
+
+               if ( typeof context === "string" ) {
+                       tmp = fn[ context ];
+                       context = fn;
+                       fn = tmp;
+               }
+
+               // Quick check to determine if target is callable, in the spec
+               // this throws a TypeError, but we will just return undefined.
+               if ( !jQuery.isFunction( fn ) ) {
+                       return undefined;
+               }
+
+               // Simulated bind
+               args = core_slice.call( arguments, 2 );
+               proxy = function() {
+                       return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
+               };
+
+               // Set the guid of unique handler to the same of original handler, so it can be removed
+               proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+               return proxy;
+       },
+
+       // Multifunctional method to get and set values of a collection
+       // The value/s can optionally be executed if it's a function
+       access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
+               var i = 0,
+                       length = elems.length,
+                       bulk = key == null;
+
+               // Sets many values
+               if ( jQuery.type( key ) === "object" ) {
+                       chainable = true;
+                       for ( i in key ) {
+                               jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+                       }
+
+               // Sets one value
+               } else if ( value !== undefined ) {
+                       chainable = true;
+
+                       if ( !jQuery.isFunction( value ) ) {
+                               raw = true;
+                       }
+
+                       if ( bulk ) {
+                               // Bulk operations run against the entire set
+                               if ( raw ) {
+                                       fn.call( elems, value );
+                                       fn = null;
+
+                               // ...except when executing function values
+                               } else {
+                                       bulk = fn;
+                                       fn = function( elem, key, value ) {
+                                               return bulk.call( jQuery( elem ), value );
+                                       };
+                               }
+                       }
+
+                       if ( fn ) {
+                               for ( ; i < length; i++ ) {
+                                       fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+                               }
+                       }
+               }
+
+               return chainable ?
+                       elems :
+
+                       // Gets
+                       bulk ?
+                               fn.call( elems ) :
+                               length ? fn( elems[0], key ) : emptyGet;
+       },
+
+       now: Date.now,
+
+       // A method for quickly swapping in/out CSS properties to get correct calculations.
+       // Note: this method belongs to the css module but it's needed here for the support module.
+       // If support gets modularized, this method should be moved back to the css module.
+       swap: function( elem, options, callback, args ) {
+               var ret, name,
+                       old = {};
+
+               // Remember the old values, and insert the new ones
+               for ( name in options ) {
+                       old[ name ] = elem.style[ name ];
+                       elem.style[ name ] = options[ name ];
+               }
+
+               ret = callback.apply( elem, args || [] );
+
+               // Revert the old values
+               for ( name in options ) {
+                       elem.style[ name ] = old[ name ];
+               }
+
+               return ret;
+       }
+});
+
+jQuery.ready.promise = function( obj ) {
+       if ( !readyList ) {
+
+               readyList = jQuery.Deferred();
+
+               // Catch cases where $(document).ready() is called after the browser event has already occurred.
+               // we once tried to use readyState "interactive" here, but it caused issues like the one
+               // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+               if ( document.readyState === "complete" ) {
+                       // Handle it asynchronously to allow scripts the opportunity to delay ready
+                       setTimeout( jQuery.ready );
+
+               } else {
+
+                       // Use the handy event callback
+                       document.addEventListener( "DOMContentLoaded", completed, false );
+
+                       // A fallback to window.onload, that will always work
+                       window.addEventListener( "load", completed, false );
+               }
+       }
+       return readyList.promise( obj );
+};
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+       class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+       var length = obj.length,
+               type = jQuery.type( obj );
+
+       if ( jQuery.isWindow( obj ) ) {
+               return false;
+       }
+
+       if ( obj.nodeType === 1 && length ) {
+               return true;
+       }
+
+       return type === "array" || type !== "function" &&
+               ( length === 0 ||
+               typeof length === "number" && length > 0 && ( length - 1 ) in obj );
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+/*!
+ * Sizzle CSS Selector Engine v1.9.4-pre
+ * http://sizzlejs.com/
+ *
+ * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-06-03
+ */
+(function( window, undefined ) {
+
+var i,
+       support,
+       cachedruns,
+       Expr,
+       getText,
+       isXML,
+       compile,
+       outermostContext,
+       sortInput,
+
+       // Local document vars
+       setDocument,
+       document,
+       docElem,
+       documentIsHTML,
+       rbuggyQSA,
+       rbuggyMatches,
+       matches,
+       contains,
+
+       // Instance-specific data
+       expando = "sizzle" + -(new Date()),
+       preferredDoc = window.document,
+       dirruns = 0,
+       done = 0,
+       classCache = createCache(),
+       tokenCache = createCache(),
+       compilerCache = createCache(),
+       hasDuplicate = false,
+       sortOrder = function( a, b ) {
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+               }
+               return 0;
+       },
+
+       // General-purpose constants
+       strundefined = typeof undefined,
+       MAX_NEGATIVE = 1 << 31,
+
+       // Instance methods
+       hasOwn = ({}).hasOwnProperty,
+       arr = [],
+       pop = arr.pop,
+       push_native = arr.push,
+       push = arr.push,
+       slice = arr.slice,
+       // Use a stripped-down indexOf if we can't use a native one
+       indexOf = arr.indexOf || function( elem ) {
+               var i = 0,
+                       len = this.length;
+               for ( ; i < len; i++ ) {
+                       if ( this[i] === elem ) {
+                               return i;
+                       }
+               }
+               return -1;
+       },
+
+       booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+       // Regular expressions
+
+       // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+       whitespace = "[\\x20\\t\\r\\n\\f]",
+       // http://www.w3.org/TR/css3-syntax/#characters
+       characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+       // Loosely modeled on CSS identifier characters
+       // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+       // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+       identifier = characterEncoding.replace( "w", "w#" ),
+
+       // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
+       attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
+               "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
+
+       // Prefer arguments quoted,
+       //   then not containing pseudos/brackets,
+       //   then attribute selectors/non-parenthetical expressions,
+       //   then anything else
+       // These preferences are here to reduce the number of selectors
+       //   needing tokenize in the PSEUDO preFilter
+       pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
+
+       // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+       rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+       rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+       rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+       rsibling = new RegExp( whitespace + "*[+~]" ),
+       rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ),
+
+       rpseudo = new RegExp( pseudos ),
+       ridentifier = new RegExp( "^" + identifier + "$" ),
+
+       matchExpr = {
+               "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+               "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+               "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+               "ATTR": new RegExp( "^" + attributes ),
+               "PSEUDO": new RegExp( "^" + pseudos ),
+               "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+                       "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+                       "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+               "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+               // For use in libraries implementing .is()
+               // We use this for POS matching in `select`
+               "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+                       whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+       },
+
+       rnative = /^[^{]+\{\s*\[native \w/,
+
+       // Easily-parseable/retrievable ID or TAG or CLASS selectors
+       rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+       rinputs = /^(?:input|select|textarea|button)$/i,
+       rheader = /^h\d$/i,
+
+       rescape = /'|\\/g,
+
+       // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+       runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+       funescape = function( _, escaped, escapedWhitespace ) {
+               var high = "0x" + escaped - 0x10000;
+               // NaN means non-codepoint
+               // Support: Firefox
+               // Workaround erroneous numeric interpretation of +"0x"
+               return high !== high || escapedWhitespace ?
+                       escaped :
+                       // BMP codepoint
+                       high < 0 ?
+                               String.fromCharCode( high + 0x10000 ) :
+                               // Supplemental Plane codepoint (surrogate pair)
+                               String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+       };
+
+// Optimize for push.apply( _, NodeList )
+try {
+       push.apply(
+               (arr = slice.call( preferredDoc.childNodes )),
+               preferredDoc.childNodes
+       );
+       // Support: Android<4.0
+       // Detect silently failing push.apply
+       arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+       push = { apply: arr.length ?
+
+               // Leverage slice if possible
+               function( target, els ) {
+                       push_native.apply( target, slice.call(els) );
+               } :
+
+               // Support: IE<9
+               // Otherwise append directly
+               function( target, els ) {
+                       var j = target.length,
+                               i = 0;
+                       // Can't trust NodeList.length
+                       while ( (target[j++] = els[i++]) ) {}
+                       target.length = j - 1;
+               }
+       };
+}
+
+function Sizzle( selector, context, results, seed ) {
+       var match, elem, m, nodeType,
+               // QSA vars
+               i, groups, old, nid, newContext, newSelector;
+
+       if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+               setDocument( context );
+       }
+
+       context = context || document;
+       results = results || [];
+
+       if ( !selector || typeof selector !== "string" ) {
+               return results;
+       }
+
+       if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
+               return [];
+       }
+
+       if ( documentIsHTML && !seed ) {
+
+               // Shortcuts
+               if ( (match = rquickExpr.exec( selector )) ) {
+                       // Speed-up: Sizzle("#ID")
+                       if ( (m = match[1]) ) {
+                               if ( nodeType === 9 ) {
+                                       elem = context.getElementById( m );
+                                       // Check parentNode to catch when Blackberry 4.6 returns
+                                       // nodes that are no longer in the document #6963
+                                       if ( elem && elem.parentNode ) {
+                                               // Handle the case where IE, Opera, and Webkit return items
+                                               // by name instead of ID
+                                               if ( elem.id === m ) {
+                                                       results.push( elem );
+                                                       return results;
+                                               }
+                                       } else {
+                                               return results;
+                                       }
+                               } else {
+                                       // Context is not a document
+                                       if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+                                               contains( context, elem ) && elem.id === m ) {
+                                               results.push( elem );
+                                               return results;
+                                       }
+                               }
+
+                       // Speed-up: Sizzle("TAG")
+                       } else if ( match[2] ) {
+                               push.apply( results, context.getElementsByTagName( selector ) );
+                               return results;
+
+                       // Speed-up: Sizzle(".CLASS")
+                       } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+                               push.apply( results, context.getElementsByClassName( m ) );
+                               return results;
+                       }
+               }
+
+               // QSA path
+               if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+                       nid = old = expando;
+                       newContext = context;
+                       newSelector = nodeType === 9 && selector;
+
+                       // qSA works strangely on Element-rooted queries
+                       // We can work around this by specifying an extra ID on the root
+                       // and working up from there (Thanks to Andrew Dupont for the technique)
+                       // IE 8 doesn't work on object elements
+                       if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+                               groups = tokenize( selector );
+
+                               if ( (old = context.getAttribute("id")) ) {
+                                       nid = old.replace( rescape, "\\$&" );
+                               } else {
+                                       context.setAttribute( "id", nid );
+                               }
+                               nid = "[id='" + nid + "'] ";
+
+                               i = groups.length;
+                               while ( i-- ) {
+                                       groups[i] = nid + toSelector( groups[i] );
+                               }
+                               newContext = rsibling.test( selector ) && context.parentNode || context;
+                               newSelector = groups.join(",");
+                       }
+
+                       if ( newSelector ) {
+                               try {
+                                       push.apply( results,
+                                               newContext.querySelectorAll( newSelector )
+                                       );
+                                       return results;
+                               } catch(qsaError) {
+                               } finally {
+                                       if ( !old ) {
+                                               context.removeAttribute("id");
+                                       }
+                               }
+                       }
+               }
+       }
+
+       // All others
+       return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ *     property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ *     deleting the oldest entry
+ */
+function createCache() {
+       var keys = [];
+
+       function cache( key, value ) {
+               // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+               if ( keys.push( key += " " ) > Expr.cacheLength ) {
+                       // Only keep the most recent entries
+                       delete cache[ keys.shift() ];
+               }
+               return (cache[ key ] = value);
+       }
+       return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+       fn[ expando ] = true;
+       return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+       var div = document.createElement("div");
+
+       try {
+               return !!fn( div );
+       } catch (e) {
+               return false;
+       } finally {
+               // Remove from its parent by default
+               if ( div.parentNode ) {
+                       div.parentNode.removeChild( div );
+               }
+               // release memory in IE
+               div = null;
+       }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+       var arr = attrs.split("|"),
+               i = attrs.length;
+
+       while ( i-- ) {
+               Expr.attrHandle[ arr[i] ] = handler;
+       }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+       var cur = b && a,
+               diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+                       ( ~b.sourceIndex || MAX_NEGATIVE ) -
+                       ( ~a.sourceIndex || MAX_NEGATIVE );
+
+       // Use IE sourceIndex if available on both nodes
+       if ( diff ) {
+               return diff;
+       }
+
+       // Check if b follows a
+       if ( cur ) {
+               while ( (cur = cur.nextSibling) ) {
+                       if ( cur === b ) {
+                               return -1;
+                       }
+               }
+       }
+
+       return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+       return function( elem ) {
+               var name = elem.nodeName.toLowerCase();
+               return name === "input" && elem.type === type;
+       };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+       return function( elem ) {
+               var name = elem.nodeName.toLowerCase();
+               return (name === "input" || name === "button") && elem.type === type;
+       };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+       return markFunction(function( argument ) {
+               argument = +argument;
+               return markFunction(function( seed, matches ) {
+                       var j,
+                               matchIndexes = fn( [], seed.length, argument ),
+                               i = matchIndexes.length;
+
+                       // Match elements found at the specified indexes
+                       while ( i-- ) {
+                               if ( seed[ (j = matchIndexes[i]) ] ) {
+                                       seed[j] = !(matches[j] = seed[j]);
+                               }
+                       }
+               });
+       });
+}
+
+/**
+ * Detect xml
+ * @param {Element|Object} elem An element or a document
+ */
+isXML = Sizzle.isXML = function( elem ) {
+       // documentElement is verified for cases where it doesn't yet exist
+       // (such as loading iframes in IE - #4833)
+       var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+       return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+       var doc = node ? node.ownerDocument || node : preferredDoc,
+               parent = doc.defaultView;
+
+       // If no document and documentElement is available, return
+       if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+               return document;
+       }
+
+       // Set our document
+       document = doc;
+       docElem = doc.documentElement;
+
+       // Support tests
+       documentIsHTML = !isXML( doc );
+
+       // Support: IE>8
+       // If iframe document is assigned to "document" variable and if iframe has been reloaded,
+       // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+       // IE6-8 do not support the defaultView property so parent will be undefined
+       if ( parent && parent.attachEvent && parent !== parent.top ) {
+               parent.attachEvent( "onbeforeunload", function() {
+                       setDocument();
+               });
+       }
+
+       /* Attributes
+       ---------------------------------------------------------------------- */
+
+       // Support: IE<8
+       // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+       support.attributes = assert(function( div ) {
+               div.className = "i";
+               return !div.getAttribute("className");
+       });
+
+       /* getElement(s)By*
+       ---------------------------------------------------------------------- */
+
+       // Check if getElementsByTagName("*") returns only elements
+       support.getElementsByTagName = assert(function( div ) {
+               div.appendChild( doc.createComment("") );
+               return !div.getElementsByTagName("*").length;
+       });
+
+       // Check if getElementsByClassName can be trusted
+       support.getElementsByClassName = assert(function( div ) {
+               div.innerHTML = "<div class='a'></div><div class='a i'></div>";
+
+               // Support: Safari<4
+               // Catch class over-caching
+               div.firstChild.className = "i";
+               // Support: Opera<10
+               // Catch gEBCN failure to find non-leading classes
+               return div.getElementsByClassName("i").length === 2;
+       });
+
+       // Support: IE<10
+       // Check if getElementById returns elements by name
+       // The broken getElementById methods don't pick up programatically-set names,
+       // so use a roundabout getElementsByName test
+       support.getById = assert(function( div ) {
+               docElem.appendChild( div ).id = expando;
+               return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+       });
+
+       // ID find and filter
+       if ( support.getById ) {
+               Expr.find["ID"] = function( id, context ) {
+                       if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+                               var m = context.getElementById( id );
+                               // Check parentNode to catch when Blackberry 4.6 returns
+                               // nodes that are no longer in the document #6963
+                               return m && m.parentNode ? [m] : [];
+                       }
+               };
+               Expr.filter["ID"] = function( id ) {
+                       var attrId = id.replace( runescape, funescape );
+                       return function( elem ) {
+                               return elem.getAttribute("id") === attrId;
+                       };
+               };
+       } else {
+               // Support: IE6/7
+               // getElementById is not reliable as a find shortcut
+               delete Expr.find["ID"];
+
+               Expr.filter["ID"] =  function( id ) {
+                       var attrId = id.replace( runescape, funescape );
+                       return function( elem ) {
+                               var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+                               return node && node.value === attrId;
+                       };
+               };
+       }
+
+       // Tag
+       Expr.find["TAG"] = support.getElementsByTagName ?
+               function( tag, context ) {
+                       if ( typeof context.getElementsByTagName !== strundefined ) {
+                               return context.getElementsByTagName( tag );
+                       }
+               } :
+               function( tag, context ) {
+                       var elem,
+                               tmp = [],
+                               i = 0,
+                               results = context.getElementsByTagName( tag );
+
+                       // Filter out possible comments
+                       if ( tag === "*" ) {
+                               while ( (elem = results[i++]) ) {
+                                       if ( elem.nodeType === 1 ) {
+                                               tmp.push( elem );
+                                       }
+                               }
+
+                               return tmp;
+                       }
+                       return results;
+               };
+
+       // Class
+       Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+               if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
+                       return context.getElementsByClassName( className );
+               }
+       };
+
+       /* QSA/matchesSelector
+       ---------------------------------------------------------------------- */
+
+       // QSA and matchesSelector support
+
+       // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+       rbuggyMatches = [];
+
+       // qSa(:focus) reports false when true (Chrome 21)
+       // We allow this because of a bug in IE8/9 that throws an error
+       // whenever `document.activeElement` is accessed on an iframe
+       // So, we allow :focus to pass through QSA all the time to avoid the IE error
+       // See http://bugs.jquery.com/ticket/13378
+       rbuggyQSA = [];
+
+       if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+               // Build QSA regex
+               // Regex strategy adopted from Diego Perini
+               assert(function( div ) {
+                       // Select is set to empty string on purpose
+                       // This is to test IE's treatment of not explicitly
+                       // setting a boolean content attribute,
+                       // since its presence should be enough
+                       // http://bugs.jquery.com/ticket/12359
+                       div.innerHTML = "<select><option selected=''></option></select>";
+
+                       // Support: IE8
+                       // Boolean attributes and "value" are not treated correctly
+                       if ( !div.querySelectorAll("[selected]").length ) {
+                               rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+                       }
+
+                       // Webkit/Opera - :checked should return selected option elements
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+                       // IE8 throws error here and will not see later tests
+                       if ( !div.querySelectorAll(":checked").length ) {
+                               rbuggyQSA.push(":checked");
+                       }
+               });
+
+               assert(function( div ) {
+
+                       // Support: Opera 10-12/IE8
+                       // ^= $= *= and empty values
+                       // Should not select anything
+                       // Support: Windows 8 Native Apps
+                       // The type attribute is restricted during .innerHTML assignment
+                       var input = doc.createElement("input");
+                       input.setAttribute( "type", "hidden" );
+                       div.appendChild( input ).setAttribute( "t", "" );
+
+                       if ( div.querySelectorAll("[t^='']").length ) {
+                               rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+                       }
+
+                       // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+                       // IE8 throws error here and will not see later tests
+                       if ( !div.querySelectorAll(":enabled").length ) {
+                               rbuggyQSA.push( ":enabled", ":disabled" );
+                       }
+
+                       // Opera 10-11 does not throw on post-comma invalid pseudos
+                       div.querySelectorAll("*,:x");
+                       rbuggyQSA.push(",.*:");
+               });
+       }
+
+       if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||
+               docElem.mozMatchesSelector ||
+               docElem.oMatchesSelector ||
+               docElem.msMatchesSelector) )) ) {
+
+               assert(function( div ) {
+                       // Check to see if it's possible to do matchesSelector
+                       // on a disconnected node (IE 9)
+                       support.disconnectedMatch = matches.call( div, "div" );
+
+                       // This should fail with an exception
+                       // Gecko does not error, returns false instead
+                       matches.call( div, "[s!='']:x" );
+                       rbuggyMatches.push( "!=", pseudos );
+               });
+       }
+
+       rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+       rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+       /* Contains
+       ---------------------------------------------------------------------- */
+
+       // Element contains another
+       // Purposefully does not implement inclusive descendent
+       // As in, an element does not contain itself
+       contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?
+               function( a, b ) {
+                       var adown = a.nodeType === 9 ? a.documentElement : a,
+                               bup = b && b.parentNode;
+                       return a === bup || !!( bup && bup.nodeType === 1 && (
+                               adown.contains ?
+                                       adown.contains( bup ) :
+                                       a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+                       ));
+               } :
+               function( a, b ) {
+                       if ( b ) {
+                               while ( (b = b.parentNode) ) {
+                                       if ( b === a ) {
+                                               return true;
+                                       }
+                               }
+                       }
+                       return false;
+               };
+
+       /* Sorting
+       ---------------------------------------------------------------------- */
+
+       // Document order sorting
+       sortOrder = docElem.compareDocumentPosition ?
+       function( a, b ) {
+
+               // Flag for duplicate removal
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+               }
+
+               var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );
+
+               if ( compare ) {
+                       // Disconnected nodes
+                       if ( compare & 1 ||
+                               (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+                               // Choose the first element that is related to our preferred document
+                               if ( a === doc || contains(preferredDoc, a) ) {
+                                       return -1;
+                               }
+                               if ( b === doc || contains(preferredDoc, b) ) {
+                                       return 1;
+                               }
+
+                               // Maintain original order
+                               return sortInput ?
+                                       ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+                                       0;
+                       }
+
+                       return compare & 4 ? -1 : 1;
+               }
+
+               // Not directly comparable, sort on existence of method
+               return a.compareDocumentPosition ? -1 : 1;
+       } :
+       function( a, b ) {
+               var cur,
+                       i = 0,
+                       aup = a.parentNode,
+                       bup = b.parentNode,
+                       ap = [ a ],
+                       bp = [ b ];
+
+               // Exit early if the nodes are identical
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+
+               // Parentless nodes are either documents or disconnected
+               } else if ( !aup || !bup ) {
+                       return a === doc ? -1 :
+                               b === doc ? 1 :
+                               aup ? -1 :
+                               bup ? 1 :
+                               sortInput ?
+                               ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+                               0;
+
+               // If the nodes are siblings, we can do a quick check
+               } else if ( aup === bup ) {
+                       return siblingCheck( a, b );
+               }
+
+               // Otherwise we need full lists of their ancestors for comparison
+               cur = a;
+               while ( (cur = cur.parentNode) ) {
+                       ap.unshift( cur );
+               }
+               cur = b;
+               while ( (cur = cur.parentNode) ) {
+                       bp.unshift( cur );
+               }
+
+               // Walk down the tree looking for a discrepancy
+               while ( ap[i] === bp[i] ) {
+                       i++;
+               }
+
+               return i ?
+                       // Do a sibling check if the nodes have a common ancestor
+                       siblingCheck( ap[i], bp[i] ) :
+
+                       // Otherwise nodes in our document sort first
+                       ap[i] === preferredDoc ? -1 :
+                       bp[i] === preferredDoc ? 1 :
+                       0;
+       };
+
+       return doc;
+};
+
+Sizzle.matches = function( expr, elements ) {
+       return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+       // Set document vars if needed
+       if ( ( elem.ownerDocument || elem ) !== document ) {
+               setDocument( elem );
+       }
+
+       // Make sure that attribute selectors are quoted
+       expr = expr.replace( rattributeQuotes, "='$1']" );
+
+       if ( support.matchesSelector && documentIsHTML &&
+               ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+               ( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
+
+               try {
+                       var ret = matches.call( elem, expr );
+
+                       // IE 9's matchesSelector returns false on disconnected nodes
+                       if ( ret || support.disconnectedMatch ||
+                                       // As well, disconnected nodes are said to be in a document
+                                       // fragment in IE 9
+                                       elem.document && elem.document.nodeType !== 11 ) {
+                               return ret;
+                       }
+               } catch(e) {}
+       }
+
+       return Sizzle( expr, document, null, [elem] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+       // Set document vars if needed
+       if ( ( context.ownerDocument || context ) !== document ) {
+               setDocument( context );
+       }
+       return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+       // Set document vars if needed
+       if ( ( elem.ownerDocument || elem ) !== document ) {
+               setDocument( elem );
+       }
+
+       var fn = Expr.attrHandle[ name.toLowerCase() ],
+               // Don't get fooled by Object.prototype properties (jQuery #13807)
+               val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+                       fn( elem, name, !documentIsHTML ) :
+                       undefined;
+
+       return val === undefined ?
+               support.attributes || !documentIsHTML ?
+                       elem.getAttribute( name ) :
+                       (val = elem.getAttributeNode(name)) && val.specified ?
+                               val.value :
+                               null :
+               val;
+};
+
+Sizzle.error = function( msg ) {
+       throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+       var elem,
+               duplicates = [],
+               j = 0,
+               i = 0;
+
+       // Unless we *know* we can detect duplicates, assume their presence
+       hasDuplicate = !support.detectDuplicates;
+       sortInput = !support.sortStable && results.slice( 0 );
+       results.sort( sortOrder );
+
+       if ( hasDuplicate ) {
+               while ( (elem = results[i++]) ) {
+                       if ( elem === results[ i ] ) {
+                               j = duplicates.push( i );
+                       }
+               }
+               while ( j-- ) {
+                       results.splice( duplicates[ j ], 1 );
+               }
+       }
+
+       return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+       var node,
+               ret = "",
+               i = 0,
+               nodeType = elem.nodeType;
+
+       if ( !nodeType ) {
+               // If no nodeType, this is expected to be an array
+               for ( ; (node = elem[i]); i++ ) {
+                       // Do not traverse comment nodes
+                       ret += getText( node );
+               }
+       } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+               // Use textContent for elements
+               // innerText usage removed for consistency of new lines (see #11153)
+               if ( typeof elem.textContent === "string" ) {
+                       return elem.textContent;
+               } else {
+                       // Traverse its children
+                       for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+                               ret += getText( elem );
+                       }
+               }
+       } else if ( nodeType === 3 || nodeType === 4 ) {
+               return elem.nodeValue;
+       }
+       // Do not include comment or processing instruction nodes
+
+       return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+       // Can be adjusted by the user
+       cacheLength: 50,
+
+       createPseudo: markFunction,
+
+       match: matchExpr,
+
+       attrHandle: {},
+
+       find: {},
+
+       relative: {
+               ">": { dir: "parentNode", first: true },
+               " ": { dir: "parentNode" },
+               "+": { dir: "previousSibling", first: true },
+               "~": { dir: "previousSibling" }
+       },
+
+       preFilter: {
+               "ATTR": function( match ) {
+                       match[1] = match[1].replace( runescape, funescape );
+
+                       // Move the given value to match[3] whether quoted or unquoted
+                       match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
+
+                       if ( match[2] === "~=" ) {
+                               match[3] = " " + match[3] + " ";
+                       }
+
+                       return match.slice( 0, 4 );
+               },
+
+               "CHILD": function( match ) {
+                       /* matches from matchExpr["CHILD"]
+                               1 type (only|nth|...)
+                               2 what (child|of-type)
+                               3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+                               4 xn-component of xn+y argument ([+-]?\d*n|)
+                               5 sign of xn-component
+                               6 x of xn-component
+                               7 sign of y-component
+                               8 y of y-component
+                       */
+                       match[1] = match[1].toLowerCase();
+
+                       if ( match[1].slice( 0, 3 ) === "nth" ) {
+                               // nth-* requires argument
+                               if ( !match[3] ) {
+                                       Sizzle.error( match[0] );
+                               }
+
+                               // numeric x and y parameters for Expr.filter.CHILD
+                               // remember that false/true cast respectively to 0/1
+                               match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+                               match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+                       // other types prohibit arguments
+                       } else if ( match[3] ) {
+                               Sizzle.error( match[0] );
+                       }
+
+                       return match;
+               },
+
+               "PSEUDO": function( match ) {
+                       var excess,
+                               unquoted = !match[5] && match[2];
+
+                       if ( matchExpr["CHILD"].test( match[0] ) ) {
+                               return null;
+                       }
+
+                       // Accept quoted arguments as-is
+                       if ( match[3] && match[4] !== undefined ) {
+                               match[2] = match[4];
+
+                       // Strip excess characters from unquoted arguments
+                       } else if ( unquoted && rpseudo.test( unquoted ) &&
+                               // Get excess from tokenize (recursively)
+                               (excess = tokenize( unquoted, true )) &&
+                               // advance to the next closing parenthesis
+                               (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+                               // excess is a negative index
+                               match[0] = match[0].slice( 0, excess );
+                               match[2] = unquoted.slice( 0, excess );
+                       }
+
+                       // Return only captures needed by the pseudo filter method (type and argument)
+                       return match.slice( 0, 3 );
+               }
+       },
+
+       filter: {
+
+               "TAG": function( nodeNameSelector ) {
+                       var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+                       return nodeNameSelector === "*" ?
+                               function() { return true; } :
+                               function( elem ) {
+                                       return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+                               };
+               },
+
+               "CLASS": function( className ) {
+                       var pattern = classCache[ className + " " ];
+
+                       return pattern ||
+                               (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+                               classCache( className, function( elem ) {
+                                       return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
+                               });
+               },
+
+               "ATTR": function( name, operator, check ) {
+                       return function( elem ) {
+                               var result = Sizzle.attr( elem, name );
+
+                               if ( result == null ) {
+                                       return operator === "!=";
+                               }
+                               if ( !operator ) {
+                                       return true;
+                               }
+
+                               result += "";
+
+                               return operator === "=" ? result === check :
+                                       operator === "!=" ? result !== check :
+                                       operator === "^=" ? check && result.indexOf( check ) === 0 :
+                                       operator === "*=" ? check && result.indexOf( check ) > -1 :
+                                       operator === "$=" ? check && result.slice( -check.length ) === check :
+                                       operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+                                       operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+                                       false;
+                       };
+               },
+
+               "CHILD": function( type, what, argument, first, last ) {
+                       var simple = type.slice( 0, 3 ) !== "nth",
+                               forward = type.slice( -4 ) !== "last",
+                               ofType = what === "of-type";
+
+                       return first === 1 && last === 0 ?
+
+                               // Shortcut for :nth-*(n)
+                               function( elem ) {
+                                       return !!elem.parentNode;
+                               } :
+
+                               function( elem, context, xml ) {
+                                       var cache, outerCache, node, diff, nodeIndex, start,
+                                               dir = simple !== forward ? "nextSibling" : "previousSibling",
+                                               parent = elem.parentNode,
+                                               name = ofType && elem.nodeName.toLowerCase(),
+                                               useCache = !xml && !ofType;
+
+                                       if ( parent ) {
+
+                                               // :(first|last|only)-(child|of-type)
+                                               if ( simple ) {
+                                                       while ( dir ) {
+                                                               node = elem;
+                                                               while ( (node = node[ dir ]) ) {
+                                                                       if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+                                                                               return false;
+                                                                       }
+                                                               }
+                                                               // Reverse direction for :only-* (if we haven't yet done so)
+                                                               start = dir = type === "only" && !start && "nextSibling";
+                                                       }
+                                                       return true;
+                                               }
+
+                                               start = [ forward ? parent.firstChild : parent.lastChild ];
+
+                                               // non-xml :nth-child(...) stores cache data on `parent`
+                                               if ( forward && useCache ) {
+                                                       // Seek `elem` from a previously-cached index
+                                                       outerCache = parent[ expando ] || (parent[ expando ] = {});
+                                                       cache = outerCache[ type ] || [];
+                                                       nodeIndex = cache[0] === dirruns && cache[1];
+                                                       diff = cache[0] === dirruns && cache[2];
+                                                       node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+                                                       while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+                                                               // Fallback to seeking `elem` from the start
+                                                               (diff = nodeIndex = 0) || start.pop()) ) {
+
+                                                               // When found, cache indexes on `parent` and break
+                                                               if ( node.nodeType === 1 && ++diff && node === elem ) {
+                                                                       outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+                                                                       break;
+                                                               }
+                                                       }
+
+                                               // Use previously-cached element index if available
+                                               } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+                                                       diff = cache[1];
+
+                                               // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+                                               } else {
+                                                       // Use the same loop as above to seek `elem` from the start
+                                                       while ( (node = ++nodeIndex && node && node[ dir ] ||
+                                                               (diff = nodeIndex = 0) || start.pop()) ) {
+
+                                                               if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+                                                                       // Cache the index of each encountered element
+                                                                       if ( useCache ) {
+                                                                               (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+                                                                       }
+
+                                                                       if ( node === elem ) {
+                                                                               break;
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+
+                                               // Incorporate the offset, then check against cycle size
+                                               diff -= last;
+                                               return diff === first || ( diff % first === 0 && diff / first >= 0 );
+                                       }
+                               };
+               },
+
+               "PSEUDO": function( pseudo, argument ) {
+                       // pseudo-class names are case-insensitive
+                       // http://www.w3.org/TR/selectors/#pseudo-classes
+                       // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+                       // Remember that setFilters inherits from pseudos
+                       var args,
+                               fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+                                       Sizzle.error( "unsupported pseudo: " + pseudo );
+
+                       // The user may use createPseudo to indicate that
+                       // arguments are needed to create the filter function
+                       // just as Sizzle does
+                       if ( fn[ expando ] ) {
+                               return fn( argument );
+                       }
+
+                       // But maintain support for old signatures
+                       if ( fn.length > 1 ) {
+                               args = [ pseudo, pseudo, "", argument ];
+                               return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+                                       markFunction(function( seed, matches ) {
+                                               var idx,
+                                                       matched = fn( seed, argument ),
+                                                       i = matched.length;
+                                               while ( i-- ) {
+                                                       idx = indexOf.call( seed, matched[i] );
+                                                       seed[ idx ] = !( matches[ idx ] = matched[i] );
+                                               }
+                                       }) :
+                                       function( elem ) {
+                                               return fn( elem, 0, args );
+                                       };
+                       }
+
+                       return fn;
+               }
+       },
+
+       pseudos: {
+               // Potentially complex pseudos
+               "not": markFunction(function( selector ) {
+                       // Trim the selector passed to compile
+                       // to avoid treating leading and trailing
+                       // spaces as combinators
+                       var input = [],
+                               results = [],
+                               matcher = compile( selector.replace( rtrim, "$1" ) );
+
+                       return matcher[ expando ] ?
+                               markFunction(function( seed, matches, context, xml ) {
+                                       var elem,
+                                               unmatched = matcher( seed, null, xml, [] ),
+                                               i = seed.length;
+
+                                       // Match elements unmatched by `matcher`
+                                       while ( i-- ) {
+                                               if ( (elem = unmatched[i]) ) {
+                                                       seed[i] = !(matches[i] = elem);
+                                               }
+                                       }
+                               }) :
+                               function( elem, context, xml ) {
+                                       input[0] = elem;
+                                       matcher( input, null, xml, results );
+                                       return !results.pop();
+                               };
+               }),
+
+               "has": markFunction(function( selector ) {
+                       return function( elem ) {
+                               return Sizzle( selector, elem ).length > 0;
+                       };
+               }),
+
+               "contains": markFunction(function( text ) {
+                       return function( elem ) {
+                               return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+                       };
+               }),
+
+               // "Whether an element is represented by a :lang() selector
+               // is based solely on the element's language value
+               // being equal to the identifier C,
+               // or beginning with the identifier C immediately followed by "-".
+               // The matching of C against the element's language value is performed case-insensitively.
+               // The identifier C does not have to be a valid language name."
+               // http://www.w3.org/TR/selectors/#lang-pseudo
+               "lang": markFunction( function( lang ) {
+                       // lang value must be a valid identifier
+                       if ( !ridentifier.test(lang || "") ) {
+                               Sizzle.error( "unsupported lang: " + lang );
+                       }
+                       lang = lang.replace( runescape, funescape ).toLowerCase();
+                       return function( elem ) {
+                               var elemLang;
+                               do {
+                                       if ( (elemLang = documentIsHTML ?
+                                               elem.lang :
+                                               elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+                                               elemLang = elemLang.toLowerCase();
+                                               return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+                                       }
+                               } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+                               return false;
+                       };
+               }),
+
+               // Miscellaneous
+               "target": function( elem ) {
+                       var hash = window.location && window.location.hash;
+                       return hash && hash.slice( 1 ) === elem.id;
+               },
+
+               "root": function( elem ) {
+                       return elem === docElem;
+               },
+
+               "focus": function( elem ) {
+                       return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+               },
+
+               // Boolean properties
+               "enabled": function( elem ) {
+                       return elem.disabled === false;
+               },
+
+               "disabled": function( elem ) {
+                       return elem.disabled === true;
+               },
+
+               "checked": function( elem ) {
+                       // In CSS3, :checked should return both checked and selected elements
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+                       var nodeName = elem.nodeName.toLowerCase();
+                       return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+               },
+
+               "selected": function( elem ) {
+                       // Accessing this property makes selected-by-default
+                       // options in Safari work properly
+                       if ( elem.parentNode ) {
+                               elem.parentNode.selectedIndex;
+                       }
+
+                       return elem.selected === true;
+               },
+
+               // Contents
+               "empty": function( elem ) {
+                       // http://www.w3.org/TR/selectors/#empty-pseudo
+                       // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
+                       //   not comment, processing instructions, or others
+                       // Thanks to Diego Perini for the nodeName shortcut
+                       //   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
+                       for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+                               if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               },
+
+               "parent": function( elem ) {
+                       return !Expr.pseudos["empty"]( elem );
+               },
+
+               // Element/input types
+               "header": function( elem ) {
+                       return rheader.test( elem.nodeName );
+               },
+
+               "input": function( elem ) {
+                       return rinputs.test( elem.nodeName );
+               },
+
+               "button": function( elem ) {
+                       var name = elem.nodeName.toLowerCase();
+                       return name === "input" && elem.type === "button" || name === "button";
+               },
+
+               "text": function( elem ) {
+                       var attr;
+                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+                       // use getAttribute instead to test this case
+                       return elem.nodeName.toLowerCase() === "input" &&
+                               elem.type === "text" &&
+                               ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
+               },
+
+               // Position-in-collection
+               "first": createPositionalPseudo(function() {
+                       return [ 0 ];
+               }),
+
+               "last": createPositionalPseudo(function( matchIndexes, length ) {
+                       return [ length - 1 ];
+               }),
+
+               "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       return [ argument < 0 ? argument + length : argument ];
+               }),
+
+               "even": createPositionalPseudo(function( matchIndexes, length ) {
+                       var i = 0;
+                       for ( ; i < length; i += 2 ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               }),
+
+               "odd": createPositionalPseudo(function( matchIndexes, length ) {
+                       var i = 1;
+                       for ( ; i < length; i += 2 ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               }),
+
+               "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       var i = argument < 0 ? argument + length : argument;
+                       for ( ; --i >= 0; ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               }),
+
+               "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       var i = argument < 0 ? argument + length : argument;
+                       for ( ; ++i < length; ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               })
+       }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+       Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+       Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+function tokenize( selector, parseOnly ) {
+       var matched, match, tokens, type,
+               soFar, groups, preFilters,
+               cached = tokenCache[ selector + " " ];
+
+       if ( cached ) {
+               return parseOnly ? 0 : cached.slice( 0 );
+       }
+
+       soFar = selector;
+       groups = [];
+       preFilters = Expr.preFilter;
+
+       while ( soFar ) {
+
+               // Comma and first run
+               if ( !matched || (match = rcomma.exec( soFar )) ) {
+                       if ( match ) {
+                               // Don't consume trailing commas as valid
+                               soFar = soFar.slice( match[0].length ) || soFar;
+                       }
+                       groups.push( tokens = [] );
+               }
+
+               matched = false;
+
+               // Combinators
+               if ( (match = rcombinators.exec( soFar )) ) {
+                       matched = match.shift();
+                       tokens.push({
+                               value: matched,
+                               // Cast descendant combinators to space
+                               type: match[0].replace( rtrim, " " )
+                       });
+                       soFar = soFar.slice( matched.length );
+               }
+
+               // Filters
+               for ( type in Expr.filter ) {
+                       if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+                               (match = preFilters[ type ]( match ))) ) {
+                               matched = match.shift();
+                               tokens.push({
+                                       value: matched,
+                                       type: type,
+                                       matches: match
+                               });
+                               soFar = soFar.slice( matched.length );
+                       }
+               }
+
+               if ( !matched ) {
+                       break;
+               }
+       }
+
+       // Return the length of the invalid excess
+       // if we're just parsing
+       // Otherwise, throw an error or return tokens
+       return parseOnly ?
+               soFar.length :
+               soFar ?
+                       Sizzle.error( selector ) :
+                       // Cache the tokens
+                       tokenCache( selector, groups ).slice( 0 );
+}
+
+function toSelector( tokens ) {
+       var i = 0,
+               len = tokens.length,
+               selector = "";
+       for ( ; i < len; i++ ) {
+               selector += tokens[i].value;
+       }
+       return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+       var dir = combinator.dir,
+               checkNonElements = base && dir === "parentNode",
+               doneName = done++;
+
+       return combinator.first ?
+               // Check against closest ancestor/preceding element
+               function( elem, context, xml ) {
+                       while ( (elem = elem[ dir ]) ) {
+                               if ( elem.nodeType === 1 || checkNonElements ) {
+                                       return matcher( elem, context, xml );
+                               }
+                       }
+               } :
+
+               // Check against all ancestor/preceding elements
+               function( elem, context, xml ) {
+                       var data, cache, outerCache,
+                               dirkey = dirruns + " " + doneName;
+
+                       // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+                       if ( xml ) {
+                               while ( (elem = elem[ dir ]) ) {
+                                       if ( elem.nodeType === 1 || checkNonElements ) {
+                                               if ( matcher( elem, context, xml ) ) {
+                                                       return true;
+                                               }
+                                       }
+                               }
+                       } else {
+                               while ( (elem = elem[ dir ]) ) {
+                                       if ( elem.nodeType === 1 || checkNonElements ) {
+                                               outerCache = elem[ expando ] || (elem[ expando ] = {});
+                                               if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
+                                                       if ( (data = cache[1]) === true || data === cachedruns ) {
+                                                               return data === true;
+                                                       }
+                                               } else {
+                                                       cache = outerCache[ dir ] = [ dirkey ];
+                                                       cache[1] = matcher( elem, context, xml ) || cachedruns;
+                                                       if ( cache[1] === true ) {
+                                                               return true;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               };
+}
+
+function elementMatcher( matchers ) {
+       return matchers.length > 1 ?
+               function( elem, context, xml ) {
+                       var i = matchers.length;
+                       while ( i-- ) {
+                               if ( !matchers[i]( elem, context, xml ) ) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               } :
+               matchers[0];
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+       var elem,
+               newUnmatched = [],
+               i = 0,
+               len = unmatched.length,
+               mapped = map != null;
+
+       for ( ; i < len; i++ ) {
+               if ( (elem = unmatched[i]) ) {
+                       if ( !filter || filter( elem, context, xml ) ) {
+                               newUnmatched.push( elem );
+                               if ( mapped ) {
+                                       map.push( i );
+                               }
+                       }
+               }
+       }
+
+       return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+       if ( postFilter && !postFilter[ expando ] ) {
+               postFilter = setMatcher( postFilter );
+       }
+       if ( postFinder && !postFinder[ expando ] ) {
+               postFinder = setMatcher( postFinder, postSelector );
+       }
+       return markFunction(function( seed, results, context, xml ) {
+               var temp, i, elem,
+                       preMap = [],
+                       postMap = [],
+                       preexisting = results.length,
+
+                       // Get initial elements from seed or context
+                       elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+                       // Prefilter to get matcher input, preserving a map for seed-results synchronization
+                       matcherIn = preFilter && ( seed || !selector ) ?
+                               condense( elems, preMap, preFilter, context, xml ) :
+                               elems,
+
+                       matcherOut = matcher ?
+                               // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+                               postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+                                       // ...intermediate processing is necessary
+                                       [] :
+
+                                       // ...otherwise use results directly
+                                       results :
+                               matcherIn;
+
+               // Find primary matches
+               if ( matcher ) {
+                       matcher( matcherIn, matcherOut, context, xml );
+               }
+
+               // Apply postFilter
+               if ( postFilter ) {
+                       temp = condense( matcherOut, postMap );
+                       postFilter( temp, [], context, xml );
+
+                       // Un-match failing elements by moving them back to matcherIn
+                       i = temp.length;
+                       while ( i-- ) {
+                               if ( (elem = temp[i]) ) {
+                                       matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+                               }
+                       }
+               }
+
+               if ( seed ) {
+                       if ( postFinder || preFilter ) {
+                               if ( postFinder ) {
+                                       // Get the final matcherOut by condensing this intermediate into postFinder contexts
+                                       temp = [];
+                                       i = matcherOut.length;
+                                       while ( i-- ) {
+                                               if ( (elem = matcherOut[i]) ) {
+                                                       // Restore matcherIn since elem is not yet a final match
+                                                       temp.push( (matcherIn[i] = elem) );
+                                               }
+                                       }
+                                       postFinder( null, (matcherOut = []), temp, xml );
+                               }
+
+                               // Move matched elements from seed to results to keep them synchronized
+                               i = matcherOut.length;
+                               while ( i-- ) {
+                                       if ( (elem = matcherOut[i]) &&
+                                               (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+
+                                               seed[temp] = !(results[temp] = elem);
+                                       }
+                               }
+                       }
+
+               // Add elements to results, through postFinder if defined
+               } else {
+                       matcherOut = condense(
+                               matcherOut === results ?
+                                       matcherOut.splice( preexisting, matcherOut.length ) :
+                                       matcherOut
+                       );
+                       if ( postFinder ) {
+                               postFinder( null, results, matcherOut, xml );
+                       } else {
+                               push.apply( results, matcherOut );
+                       }
+               }
+       });
+}
+
+function matcherFromTokens( tokens ) {
+       var checkContext, matcher, j,
+               len = tokens.length,
+               leadingRelative = Expr.relative[ tokens[0].type ],
+               implicitRelative = leadingRelative || Expr.relative[" "],
+               i = leadingRelative ? 1 : 0,
+
+               // The foundational matcher ensures that elements are reachable from top-level context(s)
+               matchContext = addCombinator( function( elem ) {
+                       return elem === checkContext;
+               }, implicitRelative, true ),
+               matchAnyContext = addCombinator( function( elem ) {
+                       return indexOf.call( checkContext, elem ) > -1;
+               }, implicitRelative, true ),
+               matchers = [ function( elem, context, xml ) {
+                       return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+                               (checkContext = context).nodeType ?
+                                       matchContext( elem, context, xml ) :
+                                       matchAnyContext( elem, context, xml ) );
+               } ];
+
+       for ( ; i < len; i++ ) {
+               if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+                       matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+               } else {
+                       matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+                       // Return special upon seeing a positional matcher
+                       if ( matcher[ expando ] ) {
+                               // Find the next relative operator (if any) for proper handling
+                               j = ++i;
+                               for ( ; j < len; j++ ) {
+                                       if ( Expr.relative[ tokens[j].type ] ) {
+                                               break;
+                                       }
+                               }
+                               return setMatcher(
+                                       i > 1 && elementMatcher( matchers ),
+                                       i > 1 && toSelector(
+                                               // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+                                               tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+                                       ).replace( rtrim, "$1" ),
+                                       matcher,
+                                       i < j && matcherFromTokens( tokens.slice( i, j ) ),
+                                       j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+                                       j < len && toSelector( tokens )
+                               );
+                       }
+                       matchers.push( matcher );
+               }
+       }
+
+       return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+       // A counter to specify which element is currently being matched
+       var matcherCachedRuns = 0,
+               bySet = setMatchers.length > 0,
+               byElement = elementMatchers.length > 0,
+               superMatcher = function( seed, context, xml, results, expandContext ) {
+                       var elem, j, matcher,
+                               setMatched = [],
+                               matchedCount = 0,
+                               i = "0",
+                               unmatched = seed && [],
+                               outermost = expandContext != null,
+                               contextBackup = outermostContext,
+                               // We must always have either seed elements or context
+                               elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
+                               // Use integer dirruns iff this is the outermost matcher
+                               dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
+
+                       if ( outermost ) {
+                               outermostContext = context !== document && context;
+                               cachedruns = matcherCachedRuns;
+                       }
+
+                       // Add elements passing elementMatchers directly to results
+                       // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+                       for ( ; (elem = elems[i]) != null; i++ ) {
+                               if ( byElement && elem ) {
+                                       j = 0;
+                                       while ( (matcher = elementMatchers[j++]) ) {
+                                               if ( matcher( elem, context, xml ) ) {
+                                                       results.push( elem );
+                                                       break;
+                                               }
+                                       }
+                                       if ( outermost ) {
+                                               dirruns = dirrunsUnique;
+                                               cachedruns = ++matcherCachedRuns;
+                                       }
+                               }
+
+                               // Track unmatched elements for set filters
+                               if ( bySet ) {
+                                       // They will have gone through all possible matchers
+                                       if ( (elem = !matcher && elem) ) {
+                                               matchedCount--;
+                                       }
+
+                                       // Lengthen the array for every element, matched or not
+                                       if ( seed ) {
+                                               unmatched.push( elem );
+                                       }
+                               }
+                       }
+
+                       // Apply set filters to unmatched elements
+                       matchedCount += i;
+                       if ( bySet && i !== matchedCount ) {
+                               j = 0;
+                               while ( (matcher = setMatchers[j++]) ) {
+                                       matcher( unmatched, setMatched, context, xml );
+                               }
+
+                               if ( seed ) {
+                                       // Reintegrate element matches to eliminate the need for sorting
+                                       if ( matchedCount > 0 ) {
+                                               while ( i-- ) {
+                                                       if ( !(unmatched[i] || setMatched[i]) ) {
+                                                               setMatched[i] = pop.call( results );
+                                                       }
+                                               }
+                                       }
+
+                                       // Discard index placeholder values to get only actual matches
+                                       setMatched = condense( setMatched );
+                               }
+
+                               // Add matches to results
+                               push.apply( results, setMatched );
+
+                               // Seedless set matches succeeding multiple successful matchers stipulate sorting
+                               if ( outermost && !seed && setMatched.length > 0 &&
+                                       ( matchedCount + setMatchers.length ) > 1 ) {
+
+                                       Sizzle.uniqueSort( results );
+                               }
+                       }
+
+                       // Override manipulation of globals by nested matchers
+                       if ( outermost ) {
+                               dirruns = dirrunsUnique;
+                               outermostContext = contextBackup;
+                       }
+
+                       return unmatched;
+               };
+
+       return bySet ?
+               markFunction( superMatcher ) :
+               superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
+       var i,
+               setMatchers = [],
+               elementMatchers = [],
+               cached = compilerCache[ selector + " " ];
+
+       if ( !cached ) {
+               // Generate a function of recursive functions that can be used to check each element
+               if ( !group ) {
+                       group = tokenize( selector );
+               }
+               i = group.length;
+               while ( i-- ) {
+                       cached = matcherFromTokens( group[i] );
+                       if ( cached[ expando ] ) {
+                               setMatchers.push( cached );
+                       } else {
+                               elementMatchers.push( cached );
+                       }
+               }
+
+               // Cache the compiled function
+               cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+       }
+       return cached;
+};
+
+function multipleContexts( selector, contexts, results ) {
+       var i = 0,
+               len = contexts.length;
+       for ( ; i < len; i++ ) {
+               Sizzle( selector, contexts[i], results );
+       }
+       return results;
+}
+
+function select( selector, context, results, seed ) {
+       var i, tokens, token, type, find,
+               match = tokenize( selector );
+
+       if ( !seed ) {
+               // Try to minimize operations if there is only one group
+               if ( match.length === 1 ) {
+
+                       // Take a shortcut and set the context if the root selector is an ID
+                       tokens = match[0] = match[0].slice( 0 );
+                       if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+                                       support.getById && context.nodeType === 9 && documentIsHTML &&
+                                       Expr.relative[ tokens[1].type ] ) {
+
+                               context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+                               if ( !context ) {
+                                       return results;
+                               }
+                               selector = selector.slice( tokens.shift().value.length );
+                       }
+
+                       // Fetch a seed set for right-to-left matching
+                       i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+                       while ( i-- ) {
+                               token = tokens[i];
+
+                               // Abort if we hit a combinator
+                               if ( Expr.relative[ (type = token.type) ] ) {
+                                       break;
+                               }
+                               if ( (find = Expr.find[ type ]) ) {
+                                       // Search, expanding context for leading sibling combinators
+                                       if ( (seed = find(
+                                               token.matches[0].replace( runescape, funescape ),
+                                               rsibling.test( tokens[0].type ) && context.parentNode || context
+                                       )) ) {
+
+                                               // If seed is empty or no tokens remain, we can return early
+                                               tokens.splice( i, 1 );
+                                               selector = seed.length && toSelector( tokens );
+                                               if ( !selector ) {
+                                                       push.apply( results, seed );
+                                                       return results;
+                                               }
+
+                                               break;
+                                       }
+                               }
+                       }
+               }
+       }
+
+       // Compile and execute a filtering function
+       // Provide `match` to avoid retokenization if we modified the selector above
+       compile( selector, match )(
+               seed,
+               context,
+               !documentIsHTML,
+               results,
+               rsibling.test( selector )
+       );
+       return results;
+}
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome<14
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+       // Should return 1, but returns 4 (following)
+       return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+       div.innerHTML = "<a href='#'></a>";
+       return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+       addHandle( "type|href|height|width", function( elem, name, isXML ) {
+               if ( !isXML ) {
+                       return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+               }
+       });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+       div.innerHTML = "<input/>";
+       div.firstChild.setAttribute( "value", "" );
+       return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+       addHandle( "value", function( elem, name, isXML ) {
+               if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+                       return elem.defaultValue;
+               }
+       });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+       return div.getAttribute("disabled") == null;
+}) ) {
+       addHandle( booleans, function( elem, name, isXML ) {
+               var val;
+               if ( !isXML ) {
+                       return (val = elem.getAttributeNode( name )) && val.specified ?
+                               val.value :
+                               elem[ name ] === true ? name.toLowerCase() : null;
+               }
+       });
+}
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})( window );
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+       var object = optionsCache[ options ] = {};
+       jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
+               object[ flag ] = true;
+       });
+       return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *     options: an optional list of space-separated options that will change how
+ *                     the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *     once:                   will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *     memory:                 will keep track of previous values and will call any callback added
+ *                                     after the list has been fired right away with the latest "memorized"
+ *                                     values (like a Deferred)
+ *
+ *     unique:                 will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *     stopOnFalse:    interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+       // Convert options from String-formatted to Object-formatted if needed
+       // (we check in cache first)
+       options = typeof options === "string" ?
+               ( optionsCache[ options ] || createOptions( options ) ) :
+               jQuery.extend( {}, options );
+
+       var // Last fire value (for non-forgettable lists)
+               memory,
+               // Flag to know if list was already fired
+               fired,
+               // Flag to know if list is currently firing
+               firing,
+               // First callback to fire (used internally by add and fireWith)
+               firingStart,
+               // End of the loop when firing
+               firingLength,
+               // Index of currently firing callback (modified by remove if needed)
+               firingIndex,
+               // Actual callback list
+               list = [],
+               // Stack of fire calls for repeatable lists
+               stack = !options.once && [],
+               // Fire callbacks
+               fire = function( data ) {
+                       memory = options.memory && data;
+                       fired = true;
+                       firingIndex = firingStart || 0;
+                       firingStart = 0;
+                       firingLength = list.length;
+                       firing = true;
+                       for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+                               if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+                                       memory = false; // To prevent further calls using add
+                                       break;
+                               }
+                       }
+                       firing = false;
+                       if ( list ) {
+                               if ( stack ) {
+                                       if ( stack.length ) {
+                                               fire( stack.shift() );
+                                       }
+                               } else if ( memory ) {
+                                       list = [];
+                               } else {
+                                       self.disable();
+                               }
+                       }
+               },
+               // Actual Callbacks object
+               self = {
+                       // Add a callback or a collection of callbacks to the list
+                       add: function() {
+                               if ( list ) {
+                                       // First, we save the current length
+                                       var start = list.length;
+                                       (function add( args ) {
+                                               jQuery.each( args, function( _, arg ) {
+                                                       var type = jQuery.type( arg );
+                                                       if ( type === "function" ) {
+                                                               if ( !options.unique || !self.has( arg ) ) {
+                                                                       list.push( arg );
+                                                               }
+                                                       } else if ( arg && arg.length && type !== "string" ) {
+                                                               // Inspect recursively
+                                                               add( arg );
+                                                       }
+                                               });
+                                       })( arguments );
+                                       // Do we need to add the callbacks to the
+                                       // current firing batch?
+                                       if ( firing ) {
+                                               firingLength = list.length;
+                                       // With memory, if we're not firing then
+                                       // we should call right away
+                                       } else if ( memory ) {
+                                               firingStart = start;
+                                               fire( memory );
+                                       }
+                               }
+                               return this;
+                       },
+                       // Remove a callback from the list
+                       remove: function() {
+                               if ( list ) {
+                                       jQuery.each( arguments, function( _, arg ) {
+                                               var index;
+                                               while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+                                                       list.splice( index, 1 );
+                                                       // Handle firing indexes
+                                                       if ( firing ) {
+                                                               if ( index <= firingLength ) {
+                                                                       firingLength--;
+                                                               }
+                                                               if ( index <= firingIndex ) {
+                                                                       firingIndex--;
+                                                               }
+                                                       }
+                                               }
+                                       });
+                               }
+                               return this;
+                       },
+                       // Check if a given callback is in the list.
+                       // If no argument is given, return whether or not list has callbacks attached.
+                       has: function( fn ) {
+                               return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+                       },
+                       // Remove all callbacks from the list
+                       empty: function() {
+                               list = [];
+                               firingLength = 0;
+                               return this;
+                       },
+                       // Have the list do nothing anymore
+                       disable: function() {
+                               list = stack = memory = undefined;
+                               return this;
+                       },
+                       // Is it disabled?
+                       disabled: function() {
+                               return !list;
+                       },
+                       // Lock the list in its current state
+                       lock: function() {
+                               stack = undefined;
+                               if ( !memory ) {
+                                       self.disable();
+                               }
+                               return this;
+                       },
+                       // Is it locked?
+                       locked: function() {
+                               return !stack;
+                       },
+                       // Call all callbacks with the given context and arguments
+                       fireWith: function( context, args ) {
+                               if ( list && ( !fired || stack ) ) {
+                                       args = args || [];
+                                       args = [ context, args.slice ? args.slice() : args ];
+                                       if ( firing ) {
+                                               stack.push( args );
+                                       } else {
+                                               fire( args );
+                                       }
+                               }
+                               return this;
+                       },
+                       // Call all the callbacks with the given arguments
+                       fire: function() {
+                               self.fireWith( this, arguments );
+                               return this;
+                       },
+                       // To know if the callbacks have already been called at least once
+                       fired: function() {
+                               return !!fired;
+                       }
+               };
+
+       return self;
+};
+jQuery.extend({
+
+       Deferred: function( func ) {
+               var tuples = [
+                               // action, add listener, listener list, final state
+                               [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+                               [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+                               [ "notify", "progress", jQuery.Callbacks("memory") ]
+                       ],
+                       state = "pending",
+                       promise = {
+                               state: function() {
+                                       return state;
+                               },
+                               always: function() {
+                                       deferred.done( arguments ).fail( arguments );
+                                       return this;
+                               },
+                               then: function( /* fnDone, fnFail, fnProgress */ ) {
+                                       var fns = arguments;
+                                       return jQuery.Deferred(function( newDefer ) {
+                                               jQuery.each( tuples, function( i, tuple ) {
+                                                       var action = tuple[ 0 ],
+                                                               fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+                                                       // deferred[ done | fail | progress ] for forwarding actions to newDefer
+                                                       deferred[ tuple[1] ](function() {
+                                                               var returned = fn && fn.apply( this, arguments );
+                                                               if ( returned && jQuery.isFunction( returned.promise ) ) {
+                                                                       returned.promise()
+                                                                               .done( newDefer.resolve )
+                                                                               .fail( newDefer.reject )
+                                                                               .progress( newDefer.notify );
+                                                               } else {
+                                                                       newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+                                                               }
+                                                       });
+                                               });
+                                               fns = null;
+                                       }).promise();
+                               },
+                               // Get a promise for this deferred
+                               // If obj is provided, the promise aspect is added to the object
+                               promise: function( obj ) {
+                                       return obj != null ? jQuery.extend( obj, promise ) : promise;
+                               }
+                       },
+                       deferred = {};
+
+               // Keep pipe for back-compat
+               promise.pipe = promise.then;
+
+               // Add list-specific methods
+               jQuery.each( tuples, function( i, tuple ) {
+                       var list = tuple[ 2 ],
+                               stateString = tuple[ 3 ];
+
+                       // promise[ done | fail | progress ] = list.add
+                       promise[ tuple[1] ] = list.add;
+
+                       // Handle state
+                       if ( stateString ) {
+                               list.add(function() {
+                                       // state = [ resolved | rejected ]
+                                       state = stateString;
+
+                               // [ reject_list | resolve_list ].disable; progress_list.lock
+                               }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+                       }
+
+                       // deferred[ resolve | reject | notify ]
+                       deferred[ tuple[0] ] = function() {
+                               deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+                               return this;
+                       };
+                       deferred[ tuple[0] + "With" ] = list.fireWith;
+               });
+
+               // Make the deferred a promise
+               promise.promise( deferred );
+
+               // Call given func if any
+               if ( func ) {
+                       func.call( deferred, deferred );
+               }
+
+               // All done!
+               return deferred;
+       },
+
+       // Deferred helper
+       when: function( subordinate /* , ..., subordinateN */ ) {
+               var i = 0,
+                       resolveValues = core_slice.call( arguments ),
+                       length = resolveValues.length,
+
+                       // the count of uncompleted subordinates
+                       remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+                       // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+                       deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+                       // Update function for both resolve and progress values
+                       updateFunc = function( i, contexts, values ) {
+                               return function( value ) {
+                                       contexts[ i ] = this;
+                                       values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+                                       if( values === progressValues ) {
+                                               deferred.notifyWith( contexts, values );
+                                       } else if ( !( --remaining ) ) {
+                                               deferred.resolveWith( contexts, values );
+                                       }
+                               };
+                       },
+
+                       progressValues, progressContexts, resolveContexts;
+
+               // add listeners to Deferred subordinates; treat others as resolved
+               if ( length > 1 ) {
+                       progressValues = new Array( length );
+                       progressContexts = new Array( length );
+                       resolveContexts = new Array( length );
+                       for ( ; i < length; i++ ) {
+                               if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+                                       resolveValues[ i ].promise()
+                                               .done( updateFunc( i, resolveContexts, resolveValues ) )
+                                               .fail( deferred.reject )
+                                               .progress( updateFunc( i, progressContexts, progressValues ) );
+                               } else {
+                                       --remaining;
+                               }
+                       }
+               }
+
+               // if we're not waiting on anything, resolve the master
+               if ( !remaining ) {
+                       deferred.resolveWith( resolveContexts, resolveValues );
+               }
+
+               return deferred.promise();
+       }
+});
+jQuery.support = (function( support ) {
+       var input = document.createElement("input"),
+               fragment = document.createDocumentFragment(),
+               div = document.createElement("div"),
+               select = document.createElement("select"),
+               opt = select.appendChild( document.createElement("option") );
+
+       // Finish early in limited environments
+       if ( !input.type ) {
+               return support;
+       }
+
+       input.type = "checkbox";
+
+       // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
+       // Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere)
+       support.checkOn = input.value !== "";
+
+       // Must access the parent to make an option select properly
+       // Support: IE9, IE10
+       support.optSelected = opt.selected;
+
+       // Will be defined later
+       support.reliableMarginRight = true;
+       support.boxSizingReliable = true;
+       support.pixelPosition = false;
+
+       // Make sure checked status is properly cloned
+       // Support: IE9, IE10
+       input.checked = true;
+       support.noCloneChecked = input.cloneNode( true ).checked;
+
+       // Make sure that the options inside disabled selects aren't marked as disabled
+       // (WebKit marks them as disabled)
+       select.disabled = true;
+       support.optDisabled = !opt.disabled;
+
+       // Check if an input maintains its value after becoming a radio
+       // Support: IE9, IE10
+       input = document.createElement("input");
+       input.value = "t";
+       input.type = "radio";
+       support.radioValue = input.value === "t";
+
+       // #11217 - WebKit loses check when the name is after the checked attribute
+       input.setAttribute( "checked", "t" );
+       input.setAttribute( "name", "t" );
+
+       fragment.appendChild( input );
+
+       // Support: Safari 5.1, Android 4.x, Android 2.3
+       // old WebKit doesn't clone checked state correctly in fragments
+       support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+       // Support: Firefox, Chrome, Safari
+       // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
+       support.focusinBubbles = "onfocusin" in window;
+
+       div.style.backgroundClip = "content-box";
+       div.cloneNode( true ).style.backgroundClip = "";
+       support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+       // Run tests that need a body at doc ready
+       jQuery(function() {
+               var container, marginDiv,
+                       // Support: Firefox, Android 2.3 (Prefixed box-sizing versions).
+                       divReset = "padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",
+                       body = document.getElementsByTagName("body")[ 0 ];
+
+               if ( !body ) {
+                       // Return for frameset docs that don't have a body
+                       return;
+               }
+
+               container = document.createElement("div");
+               container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
+
+               // Check box-sizing and margin behavior.
+               body.appendChild( container ).appendChild( div );
+               div.innerHTML = "";
+               // Support: Firefox, Android 2.3 (Prefixed box-sizing versions).
+               div.style.cssText = "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%";
+
+               // Workaround failing boxSizing test due to offsetWidth returning wrong value
+               // with some non-1 values of body zoom, ticket #13543
+               jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {
+                       support.boxSizing = div.offsetWidth === 4;
+               });
+
+               // Use window.getComputedStyle because jsdom on node.js will break without it.
+               if ( window.getComputedStyle ) {
+                       support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+                       support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+                       // Support: Android 2.3
+                       // Check if div with explicit width and no margin-right incorrectly
+                       // gets computed margin-right based on width of container. (#3333)
+                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                       marginDiv = div.appendChild( document.createElement("div") );
+                       marginDiv.style.cssText = div.style.cssText = divReset;
+                       marginDiv.style.marginRight = marginDiv.style.width = "0";
+                       div.style.width = "1px";
+
+                       support.reliableMarginRight =
+                               !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+               }
+
+               body.removeChild( container );
+       });
+
+       return support;
+})( {} );
+
+/*
+       Implementation Summary
+
+       1. Enforce API surface and semantic compatibility with 1.9.x branch
+       2. Improve the module's maintainability by reducing the storage
+               paths to a single mechanism.
+       3. Use the same single mechanism to support "private" and "user" data.
+       4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+       5. Avoid exposing implementation details on user objects (eg. expando properties)
+       6. Provide a clear path for implementation upgrade to WeakMap in 2014
+*/
+var data_user, data_priv,
+       rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+       rmultiDash = /([A-Z])/g;
+
+function Data() {
+       // Support: Android < 4,
+       // Old WebKit does not have Object.preventExtensions/freeze method,
+       // return new empty object instead with no [[set]] accessor
+       Object.defineProperty( this.cache = {}, 0, {
+               get: function() {
+                       return {};
+               }
+       });
+
+       this.expando = jQuery.expando + Math.random();
+}
+
+Data.uid = 1;
+
+Data.accepts = function( owner ) {
+       // Accepts only:
+       //  - Node
+       //    - Node.ELEMENT_NODE
+       //    - Node.DOCUMENT_NODE
+       //  - Object
+       //    - Any
+       return owner.nodeType ?
+               owner.nodeType === 1 || owner.nodeType === 9 : true;
+};
+
+Data.prototype = {
+       key: function( owner ) {
+               // We can accept data for non-element nodes in modern browsers,
+               // but we should not, see #8335.
+               // Always return the key for a frozen object.
+               if ( !Data.accepts( owner ) ) {
+                       return 0;
+               }
+
+               var descriptor = {},
+                       // Check if the owner object already has a cache key
+                       unlock = owner[ this.expando ];
+
+               // If not, create one
+               if ( !unlock ) {
+                       unlock = Data.uid++;
+
+                       // Secure it in a non-enumerable, non-writable property
+                       try {
+                               descriptor[ this.expando ] = { value: unlock };
+                               Object.defineProperties( owner, descriptor );
+
+                       // Support: Android < 4
+                       // Fallback to a less secure definition
+                       } catch ( e ) {
+                               descriptor[ this.expando ] = unlock;
+                               jQuery.extend( owner, descriptor );
+                       }
+               }
+
+               // Ensure the cache object
+               if ( !this.cache[ unlock ] ) {
+                       this.cache[ unlock ] = {};
+               }
+
+               return unlock;
+       },
+       set: function( owner, data, value ) {
+               var prop,
+                       // There may be an unlock assigned to this node,
+                       // if there is no entry for this "owner", create one inline
+                       // and set the unlock as though an owner entry had always existed
+                       unlock = this.key( owner ),
+                       cache = this.cache[ unlock ];
+
+               // Handle: [ owner, key, value ] args
+               if ( typeof data === "string" ) {
+                       cache[ data ] = value;
+
+               // Handle: [ owner, { properties } ] args
+               } else {
+                       // Fresh assignments by object are shallow copied
+                       if ( jQuery.isEmptyObject( cache ) ) {
+                               jQuery.extend( this.cache[ unlock ], data );
+                       // Otherwise, copy the properties one-by-one to the cache object
+                       } else {
+                               for ( prop in data ) {
+                                       cache[ prop ] = data[ prop ];
+                               }
+                       }
+               }
+               return cache;
+       },
+       get: function( owner, key ) {
+               // Either a valid cache is found, or will be created.
+               // New caches will be created and the unlock returned,
+               // allowing direct access to the newly created
+               // empty data object. A valid owner object must be provided.
+               var cache = this.cache[ this.key( owner ) ];
+
+               return key === undefined ?
+                       cache : cache[ key ];
+       },
+       access: function( owner, key, value ) {
+               var stored;
+               // In cases where either:
+               //
+               //   1. No key was specified
+               //   2. A string key was specified, but no value provided
+               //
+               // Take the "read" path and allow the get method to determine
+               // which value to return, respectively either:
+               //
+               //   1. The entire cache object
+               //   2. The data stored at the key
+               //
+               if ( key === undefined ||
+                               ((key && typeof key === "string") && value === undefined) ) {
+
+                       stored = this.get( owner, key );
+
+                       return stored !== undefined ?
+                               stored : this.get( owner, jQuery.camelCase(key) );
+               }
+
+               // [*]When the key is not a string, or both a key and value
+               // are specified, set or extend (existing objects) with either:
+               //
+               //   1. An object of properties
+               //   2. A key and value
+               //
+               this.set( owner, key, value );
+
+               // Since the "set" path can have two possible entry points
+               // return the expected data based on which path was taken[*]
+               return value !== undefined ? value : key;
+       },
+       remove: function( owner, key ) {
+               var i, name, camel,
+                       unlock = this.key( owner ),
+                       cache = this.cache[ unlock ];
+
+               if ( key === undefined ) {
+                       this.cache[ unlock ] = {};
+
+               } else {
+                       // Support array or space separated string of keys
+                       if ( jQuery.isArray( key ) ) {
+                               // If "name" is an array of keys...
+                               // When data is initially created, via ("key", "val") signature,
+                               // keys will be converted to camelCase.
+                               // Since there is no way to tell _how_ a key was added, remove
+                               // both plain key and camelCase key. #12786
+                               // This will only penalize the array argument path.
+                               name = key.concat( key.map( jQuery.camelCase ) );
+                       } else {
+                               camel = jQuery.camelCase( key );
+                               // Try the string as a key before any manipulation
+                               if ( key in cache ) {
+                                       name = [ key, camel ];
+                               } else {
+                                       // If a key with the spaces exists, use it.
+                                       // Otherwise, create an array by matching non-whitespace
+                                       name = camel;
+                                       name = name in cache ?
+                                               [ name ] : ( name.match( core_rnotwhite ) || [] );
+                               }
+                       }
+
+                       i = name.length;
+                       while ( i-- ) {
+                               delete cache[ name[ i ] ];
+                       }
+               }
+       },
+       hasData: function( owner ) {
+               return !jQuery.isEmptyObject(
+                       this.cache[ owner[ this.expando ] ] || {}
+               );
+       },
+       discard: function( owner ) {
+               if ( owner[ this.expando ] ) {
+                       delete this.cache[ owner[ this.expando ] ];
+               }
+       }
+};
+
+// These may be used throughout the jQuery core codebase
+data_user = new Data();
+data_priv = new Data();
+
+
+jQuery.extend({
+       acceptData: Data.accepts,
+
+       hasData: function( elem ) {
+               return data_user.hasData( elem ) || data_priv.hasData( elem );
+       },
+
+       data: function( elem, name, data ) {
+               return data_user.access( elem, name, data );
+       },
+
+       removeData: function( elem, name ) {
+               data_user.remove( elem, name );
+       },
+
+       // TODO: Now that all calls to _data and _removeData have been replaced
+       // with direct calls to data_priv methods, these can be deprecated.
+       _data: function( elem, name, data ) {
+               return data_priv.access( elem, name, data );
+       },
+
+       _removeData: function( elem, name ) {
+               data_priv.remove( elem, name );
+       }
+});
+
+jQuery.fn.extend({
+       data: function( key, value ) {
+               var attrs, name,
+                       elem = this[ 0 ],
+                       i = 0,
+                       data = null;
+
+               // Gets all values
+               if ( key === undefined ) {
+                       if ( this.length ) {
+                               data = data_user.get( elem );
+
+                               if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
+                                       attrs = elem.attributes;
+                                       for ( ; i < attrs.length; i++ ) {
+                                               name = attrs[ i ].name;
+
+                                               if ( name.indexOf( "data-" ) === 0 ) {
+                                                       name = jQuery.camelCase( name.slice(5) );
+                                                       dataAttr( elem, name, data[ name ] );
+                                               }
+                                       }
+                                       data_priv.set( elem, "hasDataAttrs", true );
+                               }
+                       }
+
+                       return data;
+               }
+
+               // Sets multiple values
+               if ( typeof key === "object" ) {
+                       return this.each(function() {
+                               data_user.set( this, key );
+                       });
+               }
+
+               return jQuery.access( this, function( value ) {
+                       var data,
+                               camelKey = jQuery.camelCase( key );
+
+                       // The calling jQuery object (element matches) is not empty
+                       // (and therefore has an element appears at this[ 0 ]) and the
+                       // `value` parameter was not undefined. An empty jQuery object
+                       // will result in `undefined` for elem = this[ 0 ] which will
+                       // throw an exception if an attempt to read a data cache is made.
+                       if ( elem && value === undefined ) {
+                               // Attempt to get data from the cache
+                               // with the key as-is
+                               data = data_user.get( elem, key );
+                               if ( data !== undefined ) {
+                                       return data;
+                               }
+
+                               // Attempt to get data from the cache
+                               // with the key camelized
+                               data = data_user.get( elem, camelKey );
+                               if ( data !== undefined ) {
+                                       return data;
+                               }
+
+                               // Attempt to "discover" the data in
+                               // HTML5 custom data-* attrs
+                               data = dataAttr( elem, camelKey, undefined );
+                               if ( data !== undefined ) {
+                                       return data;
+                               }
+
+                               // We tried really hard, but the data doesn't exist.
+                               return;
+                       }
+
+                       // Set the data...
+                       this.each(function() {
+                               // First, attempt to store a copy or reference of any
+                               // data that might've been store with a camelCased key.
+                               var data = data_user.get( this, camelKey );
+
+                               // For HTML5 data-* attribute interop, we have to
+                               // store property names with dashes in a camelCase form.
+                               // This might not apply to all properties...*
+                               data_user.set( this, camelKey, value );
+
+                               // *... In the case of properties that might _actually_
+                               // have dashes, we need to also store a copy of that
+                               // unchanged property.
+                               if ( key.indexOf("-") !== -1 && data !== undefined ) {
+                                       data_user.set( this, key, value );
+                               }
+                       });
+               }, null, value, arguments.length > 1, null, true );
+       },
+
+       removeData: function( key ) {
+               return this.each(function() {
+                       data_user.remove( this, key );
+               });
+       }
+});
+
+function dataAttr( elem, key, data ) {
+       var name;
+
+       // If nothing was found internally, try to fetch any
+       // data from the HTML5 data-* attribute
+       if ( data === undefined && elem.nodeType === 1 ) {
+               name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+               data = elem.getAttribute( name );
+
+               if ( typeof data === "string" ) {
+                       try {
+                               data = data === "true" ? true :
+                                       data === "false" ? false :
+                                       data === "null" ? null :
+                                       // Only convert to a number if it doesn't change the string
+                                       +data + "" === data ? +data :
+                                       rbrace.test( data ) ? JSON.parse( data ) :
+                                       data;
+                       } catch( e ) {}
+
+                       // Make sure we set the data so it isn't changed later
+                       data_user.set( elem, key, data );
+               } else {
+                       data = undefined;
+               }
+       }
+       return data;
+}
+jQuery.extend({
+       queue: function( elem, type, data ) {
+               var queue;
+
+               if ( elem ) {
+                       type = ( type || "fx" ) + "queue";
+                       queue = data_priv.get( elem, type );
+
+                       // Speed up dequeue by getting out quickly if this is just a lookup
+                       if ( data ) {
+                               if ( !queue || jQuery.isArray( data ) ) {
+                                       queue = data_priv.access( elem, type, jQuery.makeArray(data) );
+                               } else {
+                                       queue.push( data );
+                               }
+                       }
+                       return queue || [];
+               }
+       },
+
+       dequeue: function( elem, type ) {
+               type = type || "fx";
+
+               var queue = jQuery.queue( elem, type ),
+                       startLength = queue.length,
+                       fn = queue.shift(),
+                       hooks = jQuery._queueHooks( elem, type ),
+                       next = function() {
+                               jQuery.dequeue( elem, type );
+                       };
+
+               // If the fx queue is dequeued, always remove the progress sentinel
+               if ( fn === "inprogress" ) {
+                       fn = queue.shift();
+                       startLength--;
+               }
+
+               if ( fn ) {
+
+                       // Add a progress sentinel to prevent the fx queue from being
+                       // automatically dequeued
+                       if ( type === "fx" ) {
+                               queue.unshift( "inprogress" );
+                       }
+
+                       // clear up the last queue stop function
+                       delete hooks.stop;
+                       fn.call( elem, next, hooks );
+               }
+
+               if ( !startLength && hooks ) {
+                       hooks.empty.fire();
+               }
+       },
+
+       // not intended for public consumption - generates a queueHooks object, or returns the current one
+       _queueHooks: function( elem, type ) {
+               var key = type + "queueHooks";
+               return data_priv.get( elem, key ) || data_priv.access( elem, key, {
+                       empty: jQuery.Callbacks("once memory").add(function() {
+                               data_priv.remove( elem, [ type + "queue", key ] );
+                       })
+               });
+       }
+});
+
+jQuery.fn.extend({
+       queue: function( type, data ) {
+               var setter = 2;
+
+               if ( typeof type !== "string" ) {
+                       data = type;
+                       type = "fx";
+                       setter--;
+               }
+
+               if ( arguments.length < setter ) {
+                       return jQuery.queue( this[0], type );
+               }
+
+               return data === undefined ?
+                       this :
+                       this.each(function() {
+                               var queue = jQuery.queue( this, type, data );
+
+                               // ensure a hooks for this queue
+                               jQuery._queueHooks( this, type );
+
+                               if ( type === "fx" && queue[0] !== "inprogress" ) {
+                                       jQuery.dequeue( this, type );
+                               }
+                       });
+       },
+       dequeue: function( type ) {
+               return this.each(function() {
+                       jQuery.dequeue( this, type );
+               });
+       },
+       // Based off of the plugin by Clint Helfers, with permission.
+       // http://blindsignals.com/index.php/2009/07/jquery-delay/
+       delay: function( time, type ) {
+               time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+               type = type || "fx";
+
+               return this.queue( type, function( next, hooks ) {
+                       var timeout = setTimeout( next, time );
+                       hooks.stop = function() {
+                               clearTimeout( timeout );
+                       };
+               });
+       },
+       clearQueue: function( type ) {
+               return this.queue( type || "fx", [] );
+       },
+       // Get a promise resolved when queues of a certain type
+       // are emptied (fx is the type by default)
+       promise: function( type, obj ) {
+               var tmp,
+                       count = 1,
+                       defer = jQuery.Deferred(),
+                       elements = this,
+                       i = this.length,
+                       resolve = function() {
+                               if ( !( --count ) ) {
+                                       defer.resolveWith( elements, [ elements ] );
+                               }
+                       };
+
+               if ( typeof type !== "string" ) {
+                       obj = type;
+                       type = undefined;
+               }
+               type = type || "fx";
+
+               while( i-- ) {
+                       tmp = data_priv.get( elements[ i ], type + "queueHooks" );
+                       if ( tmp && tmp.empty ) {
+                               count++;
+                               tmp.empty.add( resolve );
+                       }
+               }
+               resolve();
+               return defer.promise( obj );
+       }
+});
+var nodeHook, boolHook,
+       rclass = /[\t\r\n\f]/g,
+       rreturn = /\r/g,
+       rfocusable = /^(?:input|select|textarea|button)$/i;
+
+jQuery.fn.extend({
+       attr: function( name, value ) {
+               return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+       },
+
+       removeAttr: function( name ) {
+               return this.each(function() {
+                       jQuery.removeAttr( this, name );
+               });
+       },
+
+       prop: function( name, value ) {
+               return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+       },
+
+       removeProp: function( name ) {
+               return this.each(function() {
+                       delete this[ jQuery.propFix[ name ] || name ];
+               });
+       },
+
+       addClass: function( value ) {
+               var classes, elem, cur, clazz, j,
+                       i = 0,
+                       len = this.length,
+                       proceed = typeof value === "string" && value;
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).addClass( value.call( this, j, this.className ) );
+                       });
+               }
+
+               if ( proceed ) {
+                       // The disjunction here is for better compressibility (see removeClass)
+                       classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+                       for ( ; i < len; i++ ) {
+                               elem = this[ i ];
+                               cur = elem.nodeType === 1 && ( elem.className ?
+                                       ( " " + elem.className + " " ).replace( rclass, " " ) :
+                                       " "
+                               );
+
+                               if ( cur ) {
+                                       j = 0;
+                                       while ( (clazz = classes[j++]) ) {
+                                               if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+                                                       cur += clazz + " ";
+                                               }
+                                       }
+                                       elem.className = jQuery.trim( cur );
+
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       removeClass: function( value ) {
+               var classes, elem, cur, clazz, j,
+                       i = 0,
+                       len = this.length,
+                       proceed = arguments.length === 0 || typeof value === "string" && value;
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).removeClass( value.call( this, j, this.className ) );
+                       });
+               }
+               if ( proceed ) {
+                       classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+                       for ( ; i < len; i++ ) {
+                               elem = this[ i ];
+                               // This expression is here for better compressibility (see addClass)
+                               cur = elem.nodeType === 1 && ( elem.className ?
+                                       ( " " + elem.className + " " ).replace( rclass, " " ) :
+                                       ""
+                               );
+
+                               if ( cur ) {
+                                       j = 0;
+                                       while ( (clazz = classes[j++]) ) {
+                                               // Remove *all* instances
+                                               while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+                                                       cur = cur.replace( " " + clazz + " ", " " );
+                                               }
+                                       }
+                                       elem.className = value ? jQuery.trim( cur ) : "";
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       toggleClass: function( value, stateVal ) {
+               var type = typeof value;
+
+               if ( typeof stateVal === "boolean" && type === "string" ) {
+                       return stateVal ? this.addClass( value ) : this.removeClass( value );
+               }
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( i ) {
+                               jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+                       });
+               }
+
+               return this.each(function() {
+                       if ( type === "string" ) {
+                               // toggle individual class names
+                               var className,
+                                       i = 0,
+                                       self = jQuery( this ),
+                                       classNames = value.match( core_rnotwhite ) || [];
+
+                               while ( (className = classNames[ i++ ]) ) {
+                                       // check each className given, space separated list
+                                       if ( self.hasClass( className ) ) {
+                                               self.removeClass( className );
+                                       } else {
+                                               self.addClass( className );
+                                       }
+                               }
+
+                       // Toggle whole class name
+                       } else if ( type === core_strundefined || type === "boolean" ) {
+                               if ( this.className ) {
+                                       // store className if set
+                                       data_priv.set( this, "__className__", this.className );
+                               }
+
+                               // If the element has a class name or if we're passed "false",
+                               // then remove the whole classname (if there was one, the above saved it).
+                               // Otherwise bring back whatever was previously saved (if anything),
+                               // falling back to the empty string if nothing was stored.
+                               this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";
+                       }
+               });
+       },
+
+       hasClass: function( selector ) {
+               var className = " " + selector + " ",
+                       i = 0,
+                       l = this.length;
+               for ( ; i < l; i++ ) {
+                       if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+                               return true;
+                       }
+               }
+
+               return false;
+       },
+
+       val: function( value ) {
+               var hooks, ret, isFunction,
+                       elem = this[0];
+
+               if ( !arguments.length ) {
+                       if ( elem ) {
+                               hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+                                       return ret;
+                               }
+
+                               ret = elem.value;
+
+                               return typeof ret === "string" ?
+                                       // handle most common string cases
+                                       ret.replace(rreturn, "") :
+                                       // handle cases where value is null/undef or number
+                                       ret == null ? "" : ret;
+                       }
+
+                       return;
+               }
+
+               isFunction = jQuery.isFunction( value );
+
+               return this.each(function( i ) {
+                       var val;
+
+                       if ( this.nodeType !== 1 ) {
+                               return;
+                       }
+
+                       if ( isFunction ) {
+                               val = value.call( this, i, jQuery( this ).val() );
+                       } else {
+                               val = value;
+                       }
+
+                       // Treat null/undefined as ""; convert numbers to string
+                       if ( val == null ) {
+                               val = "";
+                       } else if ( typeof val === "number" ) {
+                               val += "";
+                       } else if ( jQuery.isArray( val ) ) {
+                               val = jQuery.map(val, function ( value ) {
+                                       return value == null ? "" : value + "";
+                               });
+                       }
+
+                       hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+                       // If set returns undefined, fall back to normal setting
+                       if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+                               this.value = val;
+                       }
+               });
+       }
+});
+
+jQuery.extend({
+       valHooks: {
+               option: {
+                       get: function( elem ) {
+                               // attributes.value is undefined in Blackberry 4.7 but
+                               // uses .value. See #6932
+                               var val = elem.attributes.value;
+                               return !val || val.specified ? elem.value : elem.text;
+                       }
+               },
+               select: {
+                       get: function( elem ) {
+                               var value, option,
+                                       options = elem.options,
+                                       index = elem.selectedIndex,
+                                       one = elem.type === "select-one" || index < 0,
+                                       values = one ? null : [],
+                                       max = one ? index + 1 : options.length,
+                                       i = index < 0 ?
+                                               max :
+                                               one ? index : 0;
+
+                               // Loop through all the selected options
+                               for ( ; i < max; i++ ) {
+                                       option = options[ i ];
+
+                                       // IE6-9 doesn't update selected after form reset (#2551)
+                                       if ( ( option.selected || i === index ) &&
+                                                       // Don't return options that are disabled or in a disabled optgroup
+                                                       ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
+                                                       ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+                                               // Get the specific value for the option
+                                               value = jQuery( option ).val();
+
+                                               // We don't need an array for one selects
+                                               if ( one ) {
+                                                       return value;
+                                               }
+
+                                               // Multi-Selects return an array
+                                               values.push( value );
+                                       }
+                               }
+
+                               return values;
+                       },
+
+                       set: function( elem, value ) {
+                               var optionSet, option,
+                                       options = elem.options,
+                                       values = jQuery.makeArray( value ),
+                                       i = options.length;
+
+                               while ( i-- ) {
+                                       option = options[ i ];
+                                       if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {
+                                               optionSet = true;
+                                       }
+                               }
+
+                               // force browsers to behave consistently when non-matching value is set
+                               if ( !optionSet ) {
+                                       elem.selectedIndex = -1;
+                               }
+                               return values;
+                       }
+               }
+       },
+
+       attr: function( elem, name, value ) {
+               var hooks, ret,
+                       nType = elem.nodeType;
+
+               // don't get/set attributes on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                       return;
+               }
+
+               // Fallback to prop when attributes are not supported
+               if ( typeof elem.getAttribute === core_strundefined ) {
+                       return jQuery.prop( elem, name, value );
+               }
+
+               // All attributes are lowercase
+               // Grab necessary hook if one is defined
+               if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+                       name = name.toLowerCase();
+                       hooks = jQuery.attrHooks[ name ] ||
+                               ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+               }
+
+               if ( value !== undefined ) {
+
+                       if ( value === null ) {
+                               jQuery.removeAttr( elem, name );
+
+                       } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+                               return ret;
+
+                       } else {
+                               elem.setAttribute( name, value + "" );
+                               return value;
+                       }
+
+               } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+                       return ret;
+
+               } else {
+                       ret = jQuery.find.attr( elem, name );
+
+                       // Non-existent attributes return null, we normalize to undefined
+                       return ret == null ?
+                               undefined :
+                               ret;
+               }
+       },
+
+       removeAttr: function( elem, value ) {
+               var name, propName,
+                       i = 0,
+                       attrNames = value && value.match( core_rnotwhite );
+
+               if ( attrNames && elem.nodeType === 1 ) {
+                       while ( (name = attrNames[i++]) ) {
+                               propName = jQuery.propFix[ name ] || name;
+
+                               // Boolean attributes get special treatment (#10870)
+                               if ( jQuery.expr.match.bool.test( name ) ) {
+                                       // Set corresponding property to false
+                                       elem[ propName ] = false;
+                               }
+
+                               elem.removeAttribute( name );
+                       }
+               }
+       },
+
+       attrHooks: {
+               type: {
+                       set: function( elem, value ) {
+                               if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+                                       // Setting the type on a radio button after the value resets the value in IE6-9
+                                       // Reset value to default in case type is set after value during creation
+                                       var val = elem.value;
+                                       elem.setAttribute( "type", value );
+                                       if ( val ) {
+                                               elem.value = val;
+                                       }
+                                       return value;
+                               }
+                       }
+               }
+       },
+
+       propFix: {
+               "for": "htmlFor",
+               "class": "className"
+       },
+
+       prop: function( elem, name, value ) {
+               var ret, hooks, notxml,
+                       nType = elem.nodeType;
+
+               // don't get/set properties on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                       return;
+               }
+
+               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+               if ( notxml ) {
+                       // Fix name and attach hooks
+                       name = jQuery.propFix[ name ] || name;
+                       hooks = jQuery.propHooks[ name ];
+               }
+
+               if ( value !== undefined ) {
+                       return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+                               ret :
+                               ( elem[ name ] = value );
+
+               } else {
+                       return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+                               ret :
+                               elem[ name ];
+               }
+       },
+
+       propHooks: {
+               tabIndex: {
+                       get: function( elem ) {
+                               return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
+                                       elem.tabIndex :
+                                       -1;
+                       }
+               }
+       }
+});
+
+// Hooks for boolean attributes
+boolHook = {
+       set: function( elem, value, name ) {
+               if ( value === false ) {
+                       // Remove boolean attributes when set to false
+                       jQuery.removeAttr( elem, name );
+               } else {
+                       elem.setAttribute( name, name );
+               }
+               return name;
+       }
+};
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+       var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;
+
+       jQuery.expr.attrHandle[ name ] = function( elem, name, isXML ) {
+               var fn = jQuery.expr.attrHandle[ name ],
+                       ret = isXML ?
+                               undefined :
+                               /* jshint eqeqeq: false */
+                               // Temporarily disable this handler to check existence
+                               (jQuery.expr.attrHandle[ name ] = undefined) !=
+                                       getter( elem, name, isXML ) ?
+
+                                       name.toLowerCase() :
+                                       null;
+
+               // Restore handler
+               jQuery.expr.attrHandle[ name ] = fn;
+
+               return ret;
+       };
+});
+
+// Support: IE9+
+// Selectedness for an option in an optgroup can be inaccurate
+if ( !jQuery.support.optSelected ) {
+       jQuery.propHooks.selected = {
+               get: function( elem ) {
+                       var parent = elem.parentNode;
+                       if ( parent && parent.parentNode ) {
+                               parent.parentNode.selectedIndex;
+                       }
+                       return null;
+               }
+       };
+}
+
+jQuery.each([
+       "tabIndex",
+       "readOnly",
+       "maxLength",
+       "cellSpacing",
+       "cellPadding",
+       "rowSpan",
+       "colSpan",
+       "useMap",
+       "frameBorder",
+       "contentEditable"
+], function() {
+       jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+       jQuery.valHooks[ this ] = {
+               set: function( elem, value ) {
+                       if ( jQuery.isArray( value ) ) {
+                               return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+                       }
+               }
+       };
+       if ( !jQuery.support.checkOn ) {
+               jQuery.valHooks[ this ].get = function( elem ) {
+                       // Support: Webkit
+                       // "" is returned instead of "on" if a value isn't specified
+                       return elem.getAttribute("value") === null ? "on" : elem.value;
+               };
+       }
+});
+var rkeyEvent = /^key/,
+       rmouseEvent = /^(?:mouse|contextmenu)|click/,
+       rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+       rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+       return true;
+}
+
+function returnFalse() {
+       return false;
+}
+
+function safeActiveElement() {
+       try {
+               return document.activeElement;
+       } catch ( err ) { }
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+       global: {},
+
+       add: function( elem, types, handler, data, selector ) {
+
+               var handleObjIn, eventHandle, tmp,
+                       events, t, handleObj,
+                       special, handlers, type, namespaces, origType,
+                       elemData = data_priv.get( elem );
+
+               // Don't attach events to noData or text/comment nodes (but allow plain objects)
+               if ( !elemData ) {
+                       return;
+               }
+
+               // Caller can pass in an object of custom data in lieu of the handler
+               if ( handler.handler ) {
+                       handleObjIn = handler;
+                       handler = handleObjIn.handler;
+                       selector = handleObjIn.selector;
+               }
+
+               // Make sure that the handler has a unique ID, used to find/remove it later
+               if ( !handler.guid ) {
+                       handler.guid = jQuery.guid++;
+               }
+
+               // Init the element's event structure and main handler, if this is the first
+               if ( !(events = elemData.events) ) {
+                       events = elemData.events = {};
+               }
+               if ( !(eventHandle = elemData.handle) ) {
+                       eventHandle = elemData.handle = function( e ) {
+                               // Discard the second event of a jQuery.event.trigger() and
+                               // when an event is called after a page has unloaded
+                               return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
+                                       jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+                                       undefined;
+                       };
+                       // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+                       eventHandle.elem = elem;
+               }
+
+               // Handle multiple events separated by a space
+               types = ( types || "" ).match( core_rnotwhite ) || [""];
+               t = types.length;
+               while ( t-- ) {
+                       tmp = rtypenamespace.exec( types[t] ) || [];
+                       type = origType = tmp[1];
+                       namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+                       // There *must* be a type, no attaching namespace-only handlers
+                       if ( !type ) {
+                               continue;
+                       }
+
+                       // If event changes its type, use the special event handlers for the changed type
+                       special = jQuery.event.special[ type ] || {};
+
+                       // If selector defined, determine special event api type, otherwise given type
+                       type = ( selector ? special.delegateType : special.bindType ) || type;
+
+                       // Update special based on newly reset type
+                       special = jQuery.event.special[ type ] || {};
+
+                       // handleObj is passed to all event handlers
+                       handleObj = jQuery.extend({
+                               type: type,
+                               origType: origType,
+                               data: data,
+                               handler: handler,
+                               guid: handler.guid,
+                               selector: selector,
+                               needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+                               namespace: namespaces.join(".")
+                       }, handleObjIn );
+
+                       // Init the event handler queue if we're the first
+                       if ( !(handlers = events[ type ]) ) {
+                               handlers = events[ type ] = [];
+                               handlers.delegateCount = 0;
+
+                               // Only use addEventListener if the special events handler returns false
+                               if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+                                       if ( elem.addEventListener ) {
+                                               elem.addEventListener( type, eventHandle, false );
+                                       }
+                               }
+                       }
+
+                       if ( special.add ) {
+                               special.add.call( elem, handleObj );
+
+                               if ( !handleObj.handler.guid ) {
+                                       handleObj.handler.guid = handler.guid;
+                               }
+                       }
+
+                       // Add to the element's handler list, delegates in front
+                       if ( selector ) {
+                               handlers.splice( handlers.delegateCount++, 0, handleObj );
+                       } else {
+                               handlers.push( handleObj );
+                       }
+
+                       // Keep track of which events have ever been used, for event optimization
+                       jQuery.event.global[ type ] = true;
+               }
+
+               // Nullify elem to prevent memory leaks in IE
+               elem = null;
+       },
+
+       // Detach an event or set of events from an element
+       remove: function( elem, types, handler, selector, mappedTypes ) {
+
+               var j, origCount, tmp,
+                       events, t, handleObj,
+                       special, handlers, type, namespaces, origType,
+                       elemData = data_priv.hasData( elem ) && data_priv.get( elem );
+
+               if ( !elemData || !(events = elemData.events) ) {
+                       return;
+               }
+
+               // Once for each type.namespace in types; type may be omitted
+               types = ( types || "" ).match( core_rnotwhite ) || [""];
+               t = types.length;
+               while ( t-- ) {
+                       tmp = rtypenamespace.exec( types[t] ) || [];
+                       type = origType = tmp[1];
+                       namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+                       // Unbind all events (on this namespace, if provided) for the element
+                       if ( !type ) {
+                               for ( type in events ) {
+                                       jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+                               }
+                               continue;
+                       }
+
+                       special = jQuery.event.special[ type ] || {};
+                       type = ( selector ? special.delegateType : special.bindType ) || type;
+                       handlers = events[ type ] || [];
+                       tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+                       // Remove matching events
+                       origCount = j = handlers.length;
+                       while ( j-- ) {
+                               handleObj = handlers[ j ];
+
+                               if ( ( mappedTypes || origType === handleObj.origType ) &&
+                                       ( !handler || handler.guid === handleObj.guid ) &&
+                                       ( !tmp || tmp.test( handleObj.namespace ) ) &&
+                                       ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+                                       handlers.splice( j, 1 );
+
+                                       if ( handleObj.selector ) {
+                                               handlers.delegateCount--;
+                                       }
+                                       if ( special.remove ) {
+                                               special.remove.call( elem, handleObj );
+                                       }
+                               }
+                       }
+
+                       // Remove generic event handler if we removed something and no more handlers exist
+                       // (avoids potential for endless recursion during removal of special event handlers)
+                       if ( origCount && !handlers.length ) {
+                               if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+                                       jQuery.removeEvent( elem, type, elemData.handle );
+                               }
+
+                               delete events[ type ];
+                       }
+               }
+
+               // Remove the expando if it's no longer used
+               if ( jQuery.isEmptyObject( events ) ) {
+                       delete elemData.handle;
+                       data_priv.remove( elem, "events" );
+               }
+       },
+
+       trigger: function( event, data, elem, onlyHandlers ) {
+
+               var i, cur, tmp, bubbleType, ontype, handle, special,
+                       eventPath = [ elem || document ],
+                       type = core_hasOwn.call( event, "type" ) ? event.type : event,
+                       namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+               cur = tmp = elem = elem || document;
+
+               // Don't do events on text and comment nodes
+               if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+                       return;
+               }
+
+               // focus/blur morphs to focusin/out; ensure we're not firing them right now
+               if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+                       return;
+               }
+
+               if ( type.indexOf(".") >= 0 ) {
+                       // Namespaced trigger; create a regexp to match event type in handle()
+                       namespaces = type.split(".");
+                       type = namespaces.shift();
+                       namespaces.sort();
+               }
+               ontype = type.indexOf(":") < 0 && "on" + type;
+
+               // Caller can pass in a jQuery.Event object, Object, or just an event type string
+               event = event[ jQuery.expando ] ?
+                       event :
+                       new jQuery.Event( type, typeof event === "object" && event );
+
+               // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+               event.isTrigger = onlyHandlers ? 2 : 3;
+               event.namespace = namespaces.join(".");
+               event.namespace_re = event.namespace ?
+                       new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+                       null;
+
+               // Clean up the event in case it is being reused
+               event.result = undefined;
+               if ( !event.target ) {
+                       event.target = elem;
+               }
+
+               // Clone any incoming data and prepend the event, creating the handler arg list
+               data = data == null ?
+                       [ event ] :
+                       jQuery.makeArray( data, [ event ] );
+
+               // Allow special events to draw outside the lines
+               special = jQuery.event.special[ type ] || {};
+               if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+                       return;
+               }
+
+               // Determine event propagation path in advance, per W3C events spec (#9951)
+               // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+               if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+                       bubbleType = special.delegateType || type;
+                       if ( !rfocusMorph.test( bubbleType + type ) ) {
+                               cur = cur.parentNode;
+                       }
+                       for ( ; cur; cur = cur.parentNode ) {
+                               eventPath.push( cur );
+                               tmp = cur;
+                       }
+
+                       // Only add window if we got to document (e.g., not plain obj or detached DOM)
+                       if ( tmp === (elem.ownerDocument || document) ) {
+                               eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+                       }
+               }
+
+               // Fire handlers on the event path
+               i = 0;
+               while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+                       event.type = i > 1 ?
+                               bubbleType :
+                               special.bindType || type;
+
+                       // jQuery handler
+                       handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
+                       if ( handle ) {
+                               handle.apply( cur, data );
+                       }
+
+                       // Native handler
+                       handle = ontype && cur[ ontype ];
+                       if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
+                               event.preventDefault();
+                       }
+               }
+               event.type = type;
+
+               // If nobody prevented the default action, do it now
+               if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+                       if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
+                               jQuery.acceptData( elem ) ) {
+
+                               // Call a native DOM method on the target with the same name name as the event.
+                               // Don't do default actions on window, that's where global variables be (#6170)
+                               if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
+
+                                       // Don't re-trigger an onFOO event when we call its FOO() method
+                                       tmp = elem[ ontype ];
+
+                                       if ( tmp ) {
+                                               elem[ ontype ] = null;
+                                       }
+
+                                       // Prevent re-triggering of the same event, since we already bubbled it above
+                                       jQuery.event.triggered = type;
+                                       elem[ type ]();
+                                       jQuery.event.triggered = undefined;
+
+                                       if ( tmp ) {
+                                               elem[ ontype ] = tmp;
+                                       }
+                               }
+                       }
+               }
+
+               return event.result;
+       },
+
+       dispatch: function( event ) {
+
+               // Make a writable jQuery.Event from the native event object
+               event = jQuery.event.fix( event );
+
+               var i, j, ret, matched, handleObj,
+                       handlerQueue = [],
+                       args = core_slice.call( arguments ),
+                       handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
+                       special = jQuery.event.special[ event.type ] || {};
+
+               // Use the fix-ed jQuery.Event rather than the (read-only) native event
+               args[0] = event;
+               event.delegateTarget = this;
+
+               // Call the preDispatch hook for the mapped type, and let it bail if desired
+               if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+                       return;
+               }
+
+               // Determine handlers
+               handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+               // Run delegates first; they may want to stop propagation beneath us
+               i = 0;
+               while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+                       event.currentTarget = matched.elem;
+
+                       j = 0;
+                       while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+                               // Triggered event must either 1) have no namespace, or
+                               // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+                               if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+                                       event.handleObj = handleObj;
+                                       event.data = handleObj.data;
+
+                                       ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+                                                       .apply( matched.elem, args );
+
+                                       if ( ret !== undefined ) {
+                                               if ( (event.result = ret) === false ) {
+                                                       event.preventDefault();
+                                                       event.stopPropagation();
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               // Call the postDispatch hook for the mapped type
+               if ( special.postDispatch ) {
+                       special.postDispatch.call( this, event );
+               }
+
+               return event.result;
+       },
+
+       handlers: function( event, handlers ) {
+               var i, matches, sel, handleObj,
+                       handlerQueue = [],
+                       delegateCount = handlers.delegateCount,
+                       cur = event.target;
+
+               // Find delegate handlers
+               // Black-hole SVG <use> instance trees (#13180)
+               // Avoid non-left-click bubbling in Firefox (#3861)
+               if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+                       for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+                               // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+                               if ( cur.disabled !== true || event.type !== "click" ) {
+                                       matches = [];
+                                       for ( i = 0; i < delegateCount; i++ ) {
+                                               handleObj = handlers[ i ];
+
+                                               // Don't conflict with Object.prototype properties (#13203)
+                                               sel = handleObj.selector + " ";
+
+                                               if ( matches[ sel ] === undefined ) {
+                                                       matches[ sel ] = handleObj.needsContext ?
+                                                               jQuery( sel, this ).index( cur ) >= 0 :
+                                                               jQuery.find( sel, this, null, [ cur ] ).length;
+                                               }
+                                               if ( matches[ sel ] ) {
+                                                       matches.push( handleObj );
+                                               }
+                                       }
+                                       if ( matches.length ) {
+                                               handlerQueue.push({ elem: cur, handlers: matches });
+                                       }
+                               }
+                       }
+               }
+
+               // Add the remaining (directly-bound) handlers
+               if ( delegateCount < handlers.length ) {
+                       handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+               }
+
+               return handlerQueue;
+       },
+
+       // Includes some event props shared by KeyEvent and MouseEvent
+       props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+       fixHooks: {},
+
+       keyHooks: {
+               props: "char charCode key keyCode".split(" "),
+               filter: function( event, original ) {
+
+                       // Add which for key events
+                       if ( event.which == null ) {
+                               event.which = original.charCode != null ? original.charCode : original.keyCode;
+                       }
+
+                       return event;
+               }
+       },
+
+       mouseHooks: {
+               props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+               filter: function( event, original ) {
+                       var eventDoc, doc, body,
+                               button = original.button;
+
+                       // Calculate pageX/Y if missing and clientX/Y available
+                       if ( event.pageX == null && original.clientX != null ) {
+                               eventDoc = event.target.ownerDocument || document;
+                               doc = eventDoc.documentElement;
+                               body = eventDoc.body;
+
+                               event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+                               event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+                       }
+
+                       // Add which for click: 1 === left; 2 === middle; 3 === right
+                       // Note: button is not normalized, so don't use it
+                       if ( !event.which && button !== undefined ) {
+                               event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+                       }
+
+                       return event;
+               }
+       },
+
+       fix: function( event ) {
+               if ( event[ jQuery.expando ] ) {
+                       return event;
+               }
+
+               // Create a writable copy of the event object and normalize some properties
+               var i, prop, copy,
+                       type = event.type,
+                       originalEvent = event,
+                       fixHook = this.fixHooks[ type ];
+
+               if ( !fixHook ) {
+                       this.fixHooks[ type ] = fixHook =
+                               rmouseEvent.test( type ) ? this.mouseHooks :
+                               rkeyEvent.test( type ) ? this.keyHooks :
+                               {};
+               }
+               copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+               event = new jQuery.Event( originalEvent );
+
+               i = copy.length;
+               while ( i-- ) {
+                       prop = copy[ i ];
+                       event[ prop ] = originalEvent[ prop ];
+               }
+
+               // Support: Cordova 2.5 (WebKit) (#13255)
+               // All events should have a target; Cordova deviceready doesn't
+               if ( !event.target ) {
+                       event.target = document;
+               }
+
+               // Support: Safari 6.0+, Chrome < 28
+               // Target should not be a text node (#504, #13143)
+               if ( event.target.nodeType === 3 ) {
+                       event.target = event.target.parentNode;
+               }
+
+               return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+       },
+
+       special: {
+               load: {
+                       // Prevent triggered image.load events from bubbling to window.load
+                       noBubble: true
+               },
+               focus: {
+                       // Fire native event if possible so blur/focus sequence is correct
+                       trigger: function() {
+                               if ( this !== safeActiveElement() && this.focus ) {
+                                       this.focus();
+                                       return false;
+                               }
+                       },
+                       delegateType: "focusin"
+               },
+               blur: {
+                       trigger: function() {
+                               if ( this === safeActiveElement() && this.blur ) {
+                                       this.blur();
+                                       return false;
+                               }
+                       },
+                       delegateType: "focusout"
+               },
+               click: {
+                       // For checkbox, fire native event so checked state will be right
+                       trigger: function() {
+                               if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
+                                       this.click();
+                                       return false;
+                               }
+                       },
+
+                       // For cross-browser consistency, don't fire native .click() on links
+                       _default: function( event ) {
+                               return jQuery.nodeName( event.target, "a" );
+                       }
+               },
+
+               beforeunload: {
+                       postDispatch: function( event ) {
+
+                               // Support: Firefox 20+
+                               // Firefox doesn't alert if the returnValue field is not set.
+                               if ( event.result !== undefined ) {
+                                       event.originalEvent.returnValue = event.result;
+                               }
+                       }
+               }
+       },
+
+       simulate: function( type, elem, event, bubble ) {
+               // Piggyback on a donor event to simulate a different one.
+               // Fake originalEvent to avoid donor's stopPropagation, but if the
+               // simulated event prevents default then we do the same on the donor.
+               var e = jQuery.extend(
+                       new jQuery.Event(),
+                       event,
+                       {
+                               type: type,
+                               isSimulated: true,
+                               originalEvent: {}
+                       }
+               );
+               if ( bubble ) {
+                       jQuery.event.trigger( e, null, elem );
+               } else {
+                       jQuery.event.dispatch.call( elem, e );
+               }
+               if ( e.isDefaultPrevented() ) {
+                       event.preventDefault();
+               }
+       }
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+       if ( elem.removeEventListener ) {
+               elem.removeEventListener( type, handle, false );
+       }
+};
+
+jQuery.Event = function( src, props ) {
+       // Allow instantiation without the 'new' keyword
+       if ( !(this instanceof jQuery.Event) ) {
+               return new jQuery.Event( src, props );
+       }
+
+       // Event object
+       if ( src && src.type ) {
+               this.originalEvent = src;
+               this.type = src.type;
+
+               // Events bubbling up the document may have been marked as prevented
+               // by a handler lower down the tree; reflect the correct value.
+               this.isDefaultPrevented = ( src.defaultPrevented ||
+                       src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+       // Event type
+       } else {
+               this.type = src;
+       }
+
+       // Put explicitly provided properties onto the event object
+       if ( props ) {
+               jQuery.extend( this, props );
+       }
+
+       // Create a timestamp if incoming event doesn't have one
+       this.timeStamp = src && src.timeStamp || jQuery.now();
+
+       // Mark it as fixed
+       this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+       isDefaultPrevented: returnFalse,
+       isPropagationStopped: returnFalse,
+       isImmediatePropagationStopped: returnFalse,
+
+       preventDefault: function() {
+               var e = this.originalEvent;
+
+               this.isDefaultPrevented = returnTrue;
+
+               if ( e && e.preventDefault ) {
+                       e.preventDefault();
+               }
+       },
+       stopPropagation: function() {
+               var e = this.originalEvent;
+
+               this.isPropagationStopped = returnTrue;
+
+               if ( e && e.stopPropagation ) {
+                       e.stopPropagation();
+               }
+       },
+       stopImmediatePropagation: function() {
+               this.isImmediatePropagationStopped = returnTrue;
+               this.stopPropagation();
+       }
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// Support: Chrome 15+
+jQuery.each({
+       mouseenter: "mouseover",
+       mouseleave: "mouseout"
+}, function( orig, fix ) {
+       jQuery.event.special[ orig ] = {
+               delegateType: fix,
+               bindType: fix,
+
+               handle: function( event ) {
+                       var ret,
+                               target = this,
+                               related = event.relatedTarget,
+                               handleObj = event.handleObj;
+
+                       // For mousenter/leave call the handler if related is outside the target.
+                       // NB: No relatedTarget if the mouse left/entered the browser window
+                       if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+                               event.type = handleObj.origType;
+                               ret = handleObj.handler.apply( this, arguments );
+                               event.type = fix;
+                       }
+                       return ret;
+               }
+       };
+});
+
+// Create "bubbling" focus and blur events
+// Support: Firefox, Chrome, Safari
+if ( !jQuery.support.focusinBubbles ) {
+       jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+               // Attach a single capturing handler while someone wants focusin/focusout
+               var attaches = 0,
+                       handler = function( event ) {
+                               jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+                       };
+
+               jQuery.event.special[ fix ] = {
+                       setup: function() {
+                               if ( attaches++ === 0 ) {
+                                       document.addEventListener( orig, handler, true );
+                               }
+                       },
+                       teardown: function() {
+                               if ( --attaches === 0 ) {
+                                       document.removeEventListener( orig, handler, true );
+                               }
+                       }
+               };
+       });
+}
+
+jQuery.fn.extend({
+
+       on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+               var origFn, type;
+
+               // Types can be a map of types/handlers
+               if ( typeof types === "object" ) {
+                       // ( types-Object, selector, data )
+                       if ( typeof selector !== "string" ) {
+                               // ( types-Object, data )
+                               data = data || selector;
+                               selector = undefined;
+                       }
+                       for ( type in types ) {
+                               this.on( type, selector, data, types[ type ], one );
+                       }
+                       return this;
+               }
+
+               if ( data == null && fn == null ) {
+                       // ( types, fn )
+                       fn = selector;
+                       data = selector = undefined;
+               } else if ( fn == null ) {
+                       if ( typeof selector === "string" ) {
+                               // ( types, selector, fn )
+                               fn = data;
+                               data = undefined;
+                       } else {
+                               // ( types, data, fn )
+                               fn = data;
+                               data = selector;
+                               selector = undefined;
+                       }
+               }
+               if ( fn === false ) {
+                       fn = returnFalse;
+               } else if ( !fn ) {
+                       return this;
+               }
+
+               if ( one === 1 ) {
+                       origFn = fn;
+                       fn = function( event ) {
+                               // Can use an empty set, since event contains the info
+                               jQuery().off( event );
+                               return origFn.apply( this, arguments );
+                       };
+                       // Use same guid so caller can remove using origFn
+                       fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+               }
+               return this.each( function() {
+                       jQuery.event.add( this, types, fn, data, selector );
+               });
+       },
+       one: function( types, selector, data, fn ) {
+               return this.on( types, selector, data, fn, 1 );
+       },
+       off: function( types, selector, fn ) {
+               var handleObj, type;
+               if ( types && types.preventDefault && types.handleObj ) {
+                       // ( event )  dispatched jQuery.Event
+                       handleObj = types.handleObj;
+                       jQuery( types.delegateTarget ).off(
+                               handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+                               handleObj.selector,
+                               handleObj.handler
+                       );
+                       return this;
+               }
+               if ( typeof types === "object" ) {
+                       // ( types-object [, selector] )
+                       for ( type in types ) {
+                               this.off( type, selector, types[ type ] );
+                       }
+                       return this;
+               }
+               if ( selector === false || typeof selector === "function" ) {
+                       // ( types [, fn] )
+                       fn = selector;
+                       selector = undefined;
+               }
+               if ( fn === false ) {
+                       fn = returnFalse;
+               }
+               return this.each(function() {
+                       jQuery.event.remove( this, types, fn, selector );
+               });
+       },
+
+       trigger: function( type, data ) {
+               return this.each(function() {
+                       jQuery.event.trigger( type, data, this );
+               });
+       },
+       triggerHandler: function( type, data ) {
+               var elem = this[0];
+               if ( elem ) {
+                       return jQuery.event.trigger( type, data, elem, true );
+               }
+       }
+});
+var isSimple = /^.[^:#\[\.,]*$/,
+       rparentsprev = /^(?:parents|prev(?:Until|All))/,
+       rneedsContext = jQuery.expr.match.needsContext,
+       // methods guaranteed to produce a unique set when starting from a unique set
+       guaranteedUnique = {
+               children: true,
+               contents: true,
+               next: true,
+               prev: true
+       };
+
+jQuery.fn.extend({
+       find: function( selector ) {
+               var i,
+                       ret = [],
+                       self = this,
+                       len = self.length;
+
+               if ( typeof selector !== "string" ) {
+                       return this.pushStack( jQuery( selector ).filter(function() {
+                               for ( i = 0; i < len; i++ ) {
+                                       if ( jQuery.contains( self[ i ], this ) ) {
+                                               return true;
+                                       }
+                               }
+                       }) );
+               }
+
+               for ( i = 0; i < len; i++ ) {
+                       jQuery.find( selector, self[ i ], ret );
+               }
+
+               // Needed because $( selector, context ) becomes $( context ).find( selector )
+               ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+               ret.selector = this.selector ? this.selector + " " + selector : selector;
+               return ret;
+       },
+
+       has: function( target ) {
+               var targets = jQuery( target, this ),
+                       l = targets.length;
+
+               return this.filter(function() {
+                       var i = 0;
+                       for ( ; i < l; i++ ) {
+                               if ( jQuery.contains( this, targets[i] ) ) {
+                                       return true;
+                               }
+                       }
+               });
+       },
+
+       not: function( selector ) {
+               return this.pushStack( winnow(this, selector || [], true) );
+       },
+
+       filter: function( selector ) {
+               return this.pushStack( winnow(this, selector || [], false) );
+       },
+
+       is: function( selector ) {
+               return !!winnow(
+                       this,
+
+                       // If this is a positional/relative selector, check membership in the returned set
+                       // so $("p:first").is("p:last") won't return true for a doc with two "p".
+                       typeof selector === "string" && rneedsContext.test( selector ) ?
+                               jQuery( selector ) :
+                               selector || [],
+                       false
+               ).length;
+       },
+
+       closest: function( selectors, context ) {
+               var cur,
+                       i = 0,
+                       l = this.length,
+                       matched = [],
+                       pos = ( rneedsContext.test( selectors ) || typeof selectors !== "string" ) ?
+                               jQuery( selectors, context || this.context ) :
+                               0;
+
+               for ( ; i < l; i++ ) {
+                       for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+                               // Always skip document fragments
+                               if ( cur.nodeType < 11 && (pos ?
+                                       pos.index(cur) > -1 :
+
+                                       // Don't pass non-elements to Sizzle
+                                       cur.nodeType === 1 &&
+                                               jQuery.find.matchesSelector(cur, selectors)) ) {
+
+                                       cur = matched.push( cur );
+                                       break;
+                               }
+                       }
+               }
+
+               return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
+       },
+
+       // Determine the position of an element within
+       // the matched set of elements
+       index: function( elem ) {
+
+               // No argument, return index in parent
+               if ( !elem ) {
+                       return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+               }
+
+               // index in selector
+               if ( typeof elem === "string" ) {
+                       return core_indexOf.call( jQuery( elem ), this[ 0 ] );
+               }
+
+               // Locate the position of the desired element
+               return core_indexOf.call( this,
+
+                       // If it receives a jQuery object, the first element is used
+                       elem.jquery ? elem[ 0 ] : elem
+               );
+       },
+
+       add: function( selector, context ) {
+               var set = typeof selector === "string" ?
+                               jQuery( selector, context ) :
+                               jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+                       all = jQuery.merge( this.get(), set );
+
+               return this.pushStack( jQuery.unique(all) );
+       },
+
+       addBack: function( selector ) {
+               return this.add( selector == null ?
+                       this.prevObject : this.prevObject.filter(selector)
+               );
+       }
+});
+
+function sibling( cur, dir ) {
+       while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
+
+       return cur;
+}
+
+jQuery.each({
+       parent: function( elem ) {
+               var parent = elem.parentNode;
+               return parent && parent.nodeType !== 11 ? parent : null;
+       },
+       parents: function( elem ) {
+               return jQuery.dir( elem, "parentNode" );
+       },
+       parentsUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "parentNode", until );
+       },
+       next: function( elem ) {
+               return sibling( elem, "nextSibling" );
+       },
+       prev: function( elem ) {
+               return sibling( elem, "previousSibling" );
+       },
+       nextAll: function( elem ) {
+               return jQuery.dir( elem, "nextSibling" );
+       },
+       prevAll: function( elem ) {
+               return jQuery.dir( elem, "previousSibling" );
+       },
+       nextUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "nextSibling", until );
+       },
+       prevUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "previousSibling", until );
+       },
+       siblings: function( elem ) {
+               return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+       },
+       children: function( elem ) {
+               return jQuery.sibling( elem.firstChild );
+       },
+       contents: function( elem ) {
+               return elem.contentDocument || jQuery.merge( [], elem.childNodes );
+       }
+}, function( name, fn ) {
+       jQuery.fn[ name ] = function( until, selector ) {
+               var matched = jQuery.map( this, fn, until );
+
+               if ( name.slice( -5 ) !== "Until" ) {
+                       selector = until;
+               }
+
+               if ( selector && typeof selector === "string" ) {
+                       matched = jQuery.filter( selector, matched );
+               }
+
+               if ( this.length > 1 ) {
+                       // Remove duplicates
+                       if ( !guaranteedUnique[ name ] ) {
+                               jQuery.unique( matched );
+                       }
+
+                       // Reverse order for parents* and prev-derivatives
+                       if ( rparentsprev.test( name ) ) {
+                               matched.reverse();
+                       }
+               }
+
+               return this.pushStack( matched );
+       };
+});
+
+jQuery.extend({
+       filter: function( expr, elems, not ) {
+               var elem = elems[ 0 ];
+
+               if ( not ) {
+                       expr = ":not(" + expr + ")";
+               }
+
+               return elems.length === 1 && elem.nodeType === 1 ?
+                       jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+                       jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+                               return elem.nodeType === 1;
+                       }));
+       },
+
+       dir: function( elem, dir, until ) {
+               var matched = [],
+                       truncate = until !== undefined;
+
+               while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
+                       if ( elem.nodeType === 1 ) {
+                               if ( truncate && jQuery( elem ).is( until ) ) {
+                                       break;
+                               }
+                               matched.push( elem );
+                       }
+               }
+               return matched;
+       },
+
+       sibling: function( n, elem ) {
+               var matched = [];
+
+               for ( ; n; n = n.nextSibling ) {
+                       if ( n.nodeType === 1 && n !== elem ) {
+                               matched.push( n );
+                       }
+               }
+
+               return matched;
+       }
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+       if ( jQuery.isFunction( qualifier ) ) {
+               return jQuery.grep( elements, function( elem, i ) {
+                       /* jshint -W018 */
+                       return !!qualifier.call( elem, i, elem ) !== not;
+               });
+
+       }
+
+       if ( qualifier.nodeType ) {
+               return jQuery.grep( elements, function( elem ) {
+                       return ( elem === qualifier ) !== not;
+               });
+
+       }
+
+       if ( typeof qualifier === "string" ) {
+               if ( isSimple.test( qualifier ) ) {
+                       return jQuery.filter( qualifier, elements, not );
+               }
+
+               qualifier = jQuery.filter( qualifier, elements );
+       }
+
+       return jQuery.grep( elements, function( elem ) {
+               return ( core_indexOf.call( qualifier, elem ) >= 0 ) !== not;
+       });
+}
+var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+       rtagName = /<([\w:]+)/,
+       rhtml = /<|&#?\w+;/,
+       rnoInnerhtml = /<(?:script|style|link)/i,
+       manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
+       // checked="checked" or checked
+       rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+       rscriptType = /^$|\/(?:java|ecma)script/i,
+       rscriptTypeMasked = /^true\/(.*)/,
+       rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+
+       // We have to close these tags to support XHTML (#13200)
+       wrapMap = {
+
+               // Support: IE 9
+               option: [ 1, "<select multiple='multiple'>", "</select>" ],
+
+               thead: [ 1, "<table>", "</table>" ],
+               col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
+               tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+               td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+               _default: [ 0, "", "" ]
+       };
+
+// Support: IE 9
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+jQuery.fn.extend({
+       text: function( value ) {
+               return jQuery.access( this, function( value ) {
+                       return value === undefined ?
+                               jQuery.text( this ) :
+                               this.empty().append( ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) );
+               }, null, value, arguments.length );
+       },
+
+       append: function() {
+               return this.domManip( arguments, function( elem ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+                               var target = manipulationTarget( this, elem );
+                               target.appendChild( elem );
+                       }
+               });
+       },
+
+       prepend: function() {
+               return this.domManip( arguments, function( elem ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+                               var target = manipulationTarget( this, elem );
+                               target.insertBefore( elem, target.firstChild );
+                       }
+               });
+       },
+
+       before: function() {
+               return this.domManip( arguments, function( elem ) {
+                       if ( this.parentNode ) {
+                               this.parentNode.insertBefore( elem, this );
+                       }
+               });
+       },
+
+       after: function() {
+               return this.domManip( arguments, function( elem ) {
+                       if ( this.parentNode ) {
+                               this.parentNode.insertBefore( elem, this.nextSibling );
+                       }
+               });
+       },
+
+       // keepData is for internal use only--do not document
+       remove: function( selector, keepData ) {
+               var elem,
+                       elems = selector ? jQuery.filter( selector, this ) : this,
+                       i = 0;
+
+               for ( ; (elem = elems[i]) != null; i++ ) {
+                       if ( !keepData && elem.nodeType === 1 ) {
+                               jQuery.cleanData( getAll( elem ) );
+                       }
+
+                       if ( elem.parentNode ) {
+                               if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+                                       setGlobalEval( getAll( elem, "script" ) );
+                               }
+                               elem.parentNode.removeChild( elem );
+                       }
+               }
+
+               return this;
+       },
+
+       empty: function() {
+               var elem,
+                       i = 0;
+
+               for ( ; (elem = this[i]) != null; i++ ) {
+                       if ( elem.nodeType === 1 ) {
+
+                               // Prevent memory leaks
+                               jQuery.cleanData( getAll( elem, false ) );
+
+                               // Remove any remaining nodes
+                               elem.textContent = "";
+                       }
+               }
+
+               return this;
+       },
+
+       clone: function( dataAndEvents, deepDataAndEvents ) {
+               dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+               deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+               return this.map( function () {
+                       return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+               });
+       },
+
+       html: function( value ) {
+               return jQuery.access( this, function( value ) {
+                       var elem = this[ 0 ] || {},
+                               i = 0,
+                               l = this.length;
+
+                       if ( value === undefined && elem.nodeType === 1 ) {
+                               return elem.innerHTML;
+                       }
+
+                       // See if we can take a shortcut and just use innerHTML
+                       if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+                               !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+                               value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+                               try {
+                                       for ( ; i < l; i++ ) {
+                                               elem = this[ i ] || {};
+
+                                               // Remove element nodes and prevent memory leaks
+                                               if ( elem.nodeType === 1 ) {
+                                                       jQuery.cleanData( getAll( elem, false ) );
+                                                       elem.innerHTML = value;
+                                               }
+                                       }
+
+                                       elem = 0;
+
+                               // If using innerHTML throws an exception, use the fallback method
+                               } catch( e ) {}
+                       }
+
+                       if ( elem ) {
+                               this.empty().append( value );
+                       }
+               }, null, value, arguments.length );
+       },
+
+       replaceWith: function() {
+               var
+                       // Snapshot the DOM in case .domManip sweeps something relevant into its fragment
+                       args = jQuery.map( this, function( elem ) {
+                               return [ elem.nextSibling, elem.parentNode ];
+                       }),
+                       i = 0;
+
+               // Make the changes, replacing each context element with the new content
+               this.domManip( arguments, function( elem ) {
+                       var next = args[ i++ ],
+                               parent = args[ i++ ];
+
+                       if ( parent ) {
+                               // Don't use the snapshot next if it has moved (#13810)
+                               if ( next && next.parentNode !== parent ) {
+                                       next = this.nextSibling;
+                               }
+                               jQuery( this ).remove();
+                               parent.insertBefore( elem, next );
+                       }
+               // Allow new content to include elements from the context set
+               }, true );
+
+               // Force removal if there was no new content (e.g., from empty arguments)
+               return i ? this : this.remove();
+       },
+
+       detach: function( selector ) {
+               return this.remove( selector, true );
+       },
+
+       domManip: function( args, callback, allowIntersection ) {
+
+               // Flatten any nested arrays
+               args = core_concat.apply( [], args );
+
+               var fragment, first, scripts, hasScripts, node, doc,
+                       i = 0,
+                       l = this.length,
+                       set = this,
+                       iNoClone = l - 1,
+                       value = args[ 0 ],
+                       isFunction = jQuery.isFunction( value );
+
+               // We can't cloneNode fragments that contain checked, in WebKit
+               if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
+                       return this.each(function( index ) {
+                               var self = set.eq( index );
+                               if ( isFunction ) {
+                                       args[ 0 ] = value.call( this, index, self.html() );
+                               }
+                               self.domManip( args, callback, allowIntersection );
+                       });
+               }
+
+               if ( l ) {
+                       fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );
+                       first = fragment.firstChild;
+
+                       if ( fragment.childNodes.length === 1 ) {
+                               fragment = first;
+                       }
+
+                       if ( first ) {
+                               scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+                               hasScripts = scripts.length;
+
+                               // Use the original fragment for the last item instead of the first because it can end up
+                               // being emptied incorrectly in certain situations (#8070).
+                               for ( ; i < l; i++ ) {
+                                       node = fragment;
+
+                                       if ( i !== iNoClone ) {
+                                               node = jQuery.clone( node, true, true );
+
+                                               // Keep references to cloned scripts for later restoration
+                                               if ( hasScripts ) {
+                                                       // Support: QtWebKit
+                                                       // jQuery.merge because core_push.apply(_, arraylike) throws
+                                                       jQuery.merge( scripts, getAll( node, "script" ) );
+                                               }
+                                       }
+
+                                       callback.call( this[ i ], node, i );
+                               }
+
+                               if ( hasScripts ) {
+                                       doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+                                       // Reenable scripts
+                                       jQuery.map( scripts, restoreScript );
+
+                                       // Evaluate executable scripts on first document insertion
+                                       for ( i = 0; i < hasScripts; i++ ) {
+                                               node = scripts[ i ];
+                                               if ( rscriptType.test( node.type || "" ) &&
+                                                       !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+                                                       if ( node.src ) {
+                                                               // Hope ajax is available...
+                                                               jQuery._evalUrl( node.src );
+                                                       } else {
+                                                               jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               return this;
+       }
+});
+
+jQuery.each({
+       appendTo: "append",
+       prependTo: "prepend",
+       insertBefore: "before",
+       insertAfter: "after",
+       replaceAll: "replaceWith"
+}, function( name, original ) {
+       jQuery.fn[ name ] = function( selector ) {
+               var elems,
+                       ret = [],
+                       insert = jQuery( selector ),
+                       last = insert.length - 1,
+                       i = 0;
+
+               for ( ; i <= last; i++ ) {
+                       elems = i === last ? this : this.clone( true );
+                       jQuery( insert[ i ] )[ original ]( elems );
+
+                       // Support: QtWebKit
+                       // .get() because core_push.apply(_, arraylike) throws
+                       core_push.apply( ret, elems.get() );
+               }
+
+               return this.pushStack( ret );
+       };
+});
+
+jQuery.extend({
+       clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+               var i, l, srcElements, destElements,
+                       clone = elem.cloneNode( true ),
+                       inPage = jQuery.contains( elem.ownerDocument, elem );
+
+               // Support: IE >= 9
+               // Fix Cloning issues
+               if ( !jQuery.support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) {
+
+                       // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+                       destElements = getAll( clone );
+                       srcElements = getAll( elem );
+
+                       for ( i = 0, l = srcElements.length; i < l; i++ ) {
+                               fixInput( srcElements[ i ], destElements[ i ] );
+                       }
+               }
+
+               // Copy the events from the original to the clone
+               if ( dataAndEvents ) {
+                       if ( deepDataAndEvents ) {
+                               srcElements = srcElements || getAll( elem );
+                               destElements = destElements || getAll( clone );
+
+                               for ( i = 0, l = srcElements.length; i < l; i++ ) {
+                                       cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+                               }
+                       } else {
+                               cloneCopyEvent( elem, clone );
+                       }
+               }
+
+               // Preserve script evaluation history
+               destElements = getAll( clone, "script" );
+               if ( destElements.length > 0 ) {
+                       setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+               }
+
+               // Return the cloned set
+               return clone;
+       },
+
+       buildFragment: function( elems, context, scripts, selection ) {
+               var elem, tmp, tag, wrap, contains, j,
+                       i = 0,
+                       l = elems.length,
+                       fragment = context.createDocumentFragment(),
+                       nodes = [];
+
+               for ( ; i < l; i++ ) {
+                       elem = elems[ i ];
+
+                       if ( elem || elem === 0 ) {
+
+                               // Add nodes directly
+                               if ( jQuery.type( elem ) === "object" ) {
+                                       // Support: QtWebKit
+                                       // jQuery.merge because core_push.apply(_, arraylike) throws
+                                       jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+                               // Convert non-html into a text node
+                               } else if ( !rhtml.test( elem ) ) {
+                                       nodes.push( context.createTextNode( elem ) );
+
+                               // Convert html into DOM nodes
+                               } else {
+                                       tmp = tmp || fragment.appendChild( context.createElement("div") );
+
+                                       // Deserialize a standard representation
+                                       tag = ( rtagName.exec( elem ) || ["", ""] )[ 1 ].toLowerCase();
+                                       wrap = wrapMap[ tag ] || wrapMap._default;
+                                       tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];
+
+                                       // Descend through wrappers to the right content
+                                       j = wrap[ 0 ];
+                                       while ( j-- ) {
+                                               tmp = tmp.lastChild;
+                                       }
+
+                                       // Support: QtWebKit
+                                       // jQuery.merge because core_push.apply(_, arraylike) throws
+                                       jQuery.merge( nodes, tmp.childNodes );
+
+                                       // Remember the top-level container
+                                       tmp = fragment.firstChild;
+
+                                       // Fixes #12346
+                                       // Support: Webkit, IE
+                                       tmp.textContent = "";
+                               }
+                       }
+               }
+
+               // Remove wrapper from fragment
+               fragment.textContent = "";
+
+               i = 0;
+               while ( (elem = nodes[ i++ ]) ) {
+
+                       // #4087 - If origin and destination elements are the same, and this is
+                       // that element, do not do anything
+                       if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+                               continue;
+                       }
+
+                       contains = jQuery.contains( elem.ownerDocument, elem );
+
+                       // Append to fragment
+                       tmp = getAll( fragment.appendChild( elem ), "script" );
+
+                       // Preserve script evaluation history
+                       if ( contains ) {
+                               setGlobalEval( tmp );
+                       }
+
+                       // Capture executables
+                       if ( scripts ) {
+                               j = 0;
+                               while ( (elem = tmp[ j++ ]) ) {
+                                       if ( rscriptType.test( elem.type || "" ) ) {
+                                               scripts.push( elem );
+                                       }
+                               }
+                       }
+               }
+
+               return fragment;
+       },
+
+       cleanData: function( elems ) {
+               var data, elem, events, type, key, j,
+                       special = jQuery.event.special,
+                       i = 0;
+
+               for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
+                       if ( Data.accepts( elem ) ) {
+                               key = elem[ data_priv.expando ];
+
+                               if ( key && (data = data_priv.cache[ key ]) ) {
+                                       events = Object.keys( data.events || {} );
+                                       if ( events.length ) {
+                                               for ( j = 0; (type = events[j]) !== undefined; j++ ) {
+                                                       if ( special[ type ] ) {
+                                                               jQuery.event.remove( elem, type );
+
+                                                       // This is a shortcut to avoid jQuery.event.remove's overhead
+                                                       } else {
+                                                               jQuery.removeEvent( elem, type, data.handle );
+                                                       }
+                                               }
+                                       }
+                                       if ( data_priv.cache[ key ] ) {
+                                               // Discard any remaining `private` data
+                                               delete data_priv.cache[ key ];
+                                       }
+                               }
+                       }
+                       // Discard any remaining `user` data
+                       delete data_user.cache[ elem[ data_user.expando ] ];
+               }
+       },
+
+       _evalUrl: function( url ) {
+               return jQuery.ajax({
+                       url: url,
+                       type: "GET",
+                       dataType: "script",
+                       async: false,
+                       global: false,
+                       "throws": true
+               });
+       }
+});
+
+// Support: 1.x compatibility
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+       return jQuery.nodeName( elem, "table" ) &&
+               jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ?
+
+               elem.getElementsByTagName("tbody")[0] ||
+                       elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+               elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+       elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
+       return elem;
+}
+function restoreScript( elem ) {
+       var match = rscriptTypeMasked.exec( elem.type );
+
+       if ( match ) {
+               elem.type = match[ 1 ];
+       } else {
+               elem.removeAttribute("type");
+       }
+
+       return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+       var l = elems.length,
+               i = 0;
+
+       for ( ; i < l; i++ ) {
+               data_priv.set(
+                       elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )
+               );
+       }
+}
+
+function cloneCopyEvent( src, dest ) {
+       var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+
+       if ( dest.nodeType !== 1 ) {
+               return;
+       }
+
+       // 1. Copy private data: events, handlers, etc.
+       if ( data_priv.hasData( src ) ) {
+               pdataOld = data_priv.access( src );
+               pdataCur = data_priv.set( dest, pdataOld );
+               events = pdataOld.events;
+
+               if ( events ) {
+                       delete pdataCur.handle;
+                       pdataCur.events = {};
+
+                       for ( type in events ) {
+                               for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+                                       jQuery.event.add( dest, type, events[ type ][ i ] );
+                               }
+                       }
+               }
+       }
+
+       // 2. Copy user data
+       if ( data_user.hasData( src ) ) {
+               udataOld = data_user.access( src );
+               udataCur = jQuery.extend( {}, udataOld );
+
+               data_user.set( dest, udataCur );
+       }
+}
+
+
+function getAll( context, tag ) {
+       var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :
+                       context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
+                       [];
+
+       return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+               jQuery.merge( [ context ], ret ) :
+               ret;
+}
+
+// Support: IE >= 9
+function fixInput( src, dest ) {
+       var nodeName = dest.nodeName.toLowerCase();
+
+       // Fails to persist the checked state of a cloned checkbox or radio button.
+       if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
+               dest.checked = src.checked;
+
+       // Fails to return the selected option to the default selected state when cloning options
+       } else if ( nodeName === "input" || nodeName === "textarea" ) {
+               dest.defaultValue = src.defaultValue;
+       }
+}
+jQuery.fn.extend({
+       wrapAll: function( html ) {
+               var wrap;
+
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function( i ) {
+                               jQuery( this ).wrapAll( html.call(this, i) );
+                       });
+               }
+
+               if ( this[ 0 ] ) {
+
+                       // The elements to wrap the target around
+                       wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+                       if ( this[ 0 ].parentNode ) {
+                               wrap.insertBefore( this[ 0 ] );
+                       }
+
+                       wrap.map(function() {
+                               var elem = this;
+
+                               while ( elem.firstElementChild ) {
+                                       elem = elem.firstElementChild;
+                               }
+
+                               return elem;
+                       }).append( this );
+               }
+
+               return this;
+       },
+
+       wrapInner: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function( i ) {
+                               jQuery( this ).wrapInner( html.call(this, i) );
+                       });
+               }
+
+               return this.each(function() {
+                       var self = jQuery( this ),
+                               contents = self.contents();
+
+                       if ( contents.length ) {
+                               contents.wrapAll( html );
+
+                       } else {
+                               self.append( html );
+                       }
+               });
+       },
+
+       wrap: function( html ) {
+               var isFunction = jQuery.isFunction( html );
+
+               return this.each(function( i ) {
+                       jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+               });
+       },
+
+       unwrap: function() {
+               return this.parent().each(function() {
+                       if ( !jQuery.nodeName( this, "body" ) ) {
+                               jQuery( this ).replaceWith( this.childNodes );
+                       }
+               }).end();
+       }
+});
+var curCSS, iframe,
+       // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+       // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+       rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+       rmargin = /^margin/,
+       rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
+       rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
+       rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
+       elemdisplay = { BODY: "block" },
+
+       cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+       cssNormalTransform = {
+               letterSpacing: 0,
+               fontWeight: 400
+       },
+
+       cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+       cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+       // shortcut for names that are not vendor prefixed
+       if ( name in style ) {
+               return name;
+       }
+
+       // check for vendor prefixed names
+       var capName = name.charAt(0).toUpperCase() + name.slice(1),
+               origName = name,
+               i = cssPrefixes.length;
+
+       while ( i-- ) {
+               name = cssPrefixes[ i ] + capName;
+               if ( name in style ) {
+                       return name;
+               }
+       }
+
+       return origName;
+}
+
+function isHidden( elem, el ) {
+       // isHidden might be called from jQuery#filter function;
+       // in that case, element will be second argument
+       elem = el || elem;
+       return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+}
+
+// NOTE: we've included the "window" in window.getComputedStyle
+// because jsdom on node.js will break without it.
+function getStyles( elem ) {
+       return window.getComputedStyle( elem, null );
+}
+
+function showHide( elements, show ) {
+       var display, elem, hidden,
+               values = [],
+               index = 0,
+               length = elements.length;
+
+       for ( ; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
+
+               values[ index ] = data_priv.get( elem, "olddisplay" );
+               display = elem.style.display;
+               if ( show ) {
+                       // Reset the inline display of this element to learn if it is
+                       // being hidden by cascaded rules or not
+                       if ( !values[ index ] && display === "none" ) {
+                               elem.style.display = "";
+                       }
+
+                       // Set elements which have been overridden with display: none
+                       // in a stylesheet to whatever the default browser style is
+                       // for such an element
+                       if ( elem.style.display === "" && isHidden( elem ) ) {
+                               values[ index ] = data_priv.access( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+                       }
+               } else {
+
+                       if ( !values[ index ] ) {
+                               hidden = isHidden( elem );
+
+                               if ( display && display !== "none" || !hidden ) {
+                                       data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css(elem, "display") );
+                               }
+                       }
+               }
+       }
+
+       // Set the display of most of the elements in a second loop
+       // to avoid the constant reflow
+       for ( index = 0; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
+               if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+                       elem.style.display = show ? values[ index ] || "" : "none";
+               }
+       }
+
+       return elements;
+}
+
+jQuery.fn.extend({
+       css: function( name, value ) {
+               return jQuery.access( this, function( elem, name, value ) {
+                       var styles, len,
+                               map = {},
+                               i = 0;
+
+                       if ( jQuery.isArray( name ) ) {
+                               styles = getStyles( elem );
+                               len = name.length;
+
+                               for ( ; i < len; i++ ) {
+                                       map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+                               }
+
+                               return map;
+                       }
+
+                       return value !== undefined ?
+                               jQuery.style( elem, name, value ) :
+                               jQuery.css( elem, name );
+               }, name, value, arguments.length > 1 );
+       },
+       show: function() {
+               return showHide( this, true );
+       },
+       hide: function() {
+               return showHide( this );
+       },
+       toggle: function( state ) {
+               if ( typeof state === "boolean" ) {
+                       return state ? this.show() : this.hide();
+               }
+
+               return this.each(function() {
+                       if ( isHidden( this ) ) {
+                               jQuery( this ).show();
+                       } else {
+                               jQuery( this ).hide();
+                       }
+               });
+       }
+});
+
+jQuery.extend({
+       // Add in style property hooks for overriding the default
+       // behavior of getting and setting a style property
+       cssHooks: {
+               opacity: {
+                       get: function( elem, computed ) {
+                               if ( computed ) {
+                                       // We should always get a number back from opacity
+                                       var ret = curCSS( elem, "opacity" );
+                                       return ret === "" ? "1" : ret;
+                               }
+                       }
+               }
+       },
+
+       // Don't automatically add "px" to these possibly-unitless properties
+       cssNumber: {
+               "columnCount": true,
+               "fillOpacity": true,
+               "fontWeight": true,
+               "lineHeight": true,
+               "opacity": true,
+               "order": true,
+               "orphans": true,
+               "widows": true,
+               "zIndex": true,
+               "zoom": true
+       },
+
+       // Add in properties whose names you wish to fix before
+       // setting or getting the value
+       cssProps: {
+               // normalize float css property
+               "float": "cssFloat"
+       },
+
+       // Get and set the style property on a DOM Node
+       style: function( elem, name, value, extra ) {
+               // Don't set styles on text and comment nodes
+               if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+                       return;
+               }
+
+               // Make sure that we're working with the right name
+               var ret, type, hooks,
+                       origName = jQuery.camelCase( name ),
+                       style = elem.style;
+
+               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+               // gets hook for the prefixed version
+               // followed by the unprefixed version
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+               // Check if we're setting a value
+               if ( value !== undefined ) {
+                       type = typeof value;
+
+                       // convert relative number strings (+= or -=) to relative numbers. #7345
+                       if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+                               value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+                               // Fixes bug #9237
+                               type = "number";
+                       }
+
+                       // Make sure that NaN and null values aren't set. See: #7116
+                       if ( value == null || type === "number" && isNaN( value ) ) {
+                               return;
+                       }
+
+                       // If a number was passed in, add 'px' to the (except for certain CSS properties)
+                       if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+                               value += "px";
+                       }
+
+                       // Fixes #8908, it can be done more correctly by specifying setters in cssHooks,
+                       // but it would mean to define eight (for every problematic property) identical functions
+                       if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
+                               style[ name ] = "inherit";
+                       }
+
+                       // If a hook was provided, use that value, otherwise just set the specified value
+                       if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+                               style[ name ] = value;
+                       }
+
+               } else {
+                       // If a hook was provided get the non-computed value from there
+                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+                               return ret;
+                       }
+
+                       // Otherwise just get the value from the style object
+                       return style[ name ];
+               }
+       },
+
+       css: function( elem, name, extra, styles ) {
+               var val, num, hooks,
+                       origName = jQuery.camelCase( name );
+
+               // Make sure that we're working with the right name
+               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+               // gets hook for the prefixed version
+               // followed by the unprefixed version
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+               // If a hook was provided get the computed value from there
+               if ( hooks && "get" in hooks ) {
+                       val = hooks.get( elem, true, extra );
+               }
+
+               // Otherwise, if a way to get the computed value exists, use that
+               if ( val === undefined ) {
+                       val = curCSS( elem, name, styles );
+               }
+
+               //convert "normal" to computed value
+               if ( val === "normal" && name in cssNormalTransform ) {
+                       val = cssNormalTransform[ name ];
+               }
+
+               // Return, converting to number if forced or a qualifier was provided and val looks numeric
+               if ( extra === "" || extra ) {
+                       num = parseFloat( val );
+                       return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+               }
+               return val;
+       }
+});
+
+curCSS = function( elem, name, _computed ) {
+       var width, minWidth, maxWidth,
+               computed = _computed || getStyles( elem ),
+
+               // Support: IE9
+               // getPropertyValue is only needed for .css('filter') in IE9, see #12537
+               ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
+               style = elem.style;
+
+       if ( computed ) {
+
+               if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+                       ret = jQuery.style( elem, name );
+               }
+
+               // Support: Safari 5.1
+               // A tribute to the "awesome hack by Dean Edwards"
+               // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+               // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+               if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+                       // Remember the original values
+                       width = style.width;
+                       minWidth = style.minWidth;
+                       maxWidth = style.maxWidth;
+
+                       // Put in the new values to get a computed value out
+                       style.minWidth = style.maxWidth = style.width = ret;
+                       ret = computed.width;
+
+                       // Revert the changed values
+                       style.width = width;
+                       style.minWidth = minWidth;
+                       style.maxWidth = maxWidth;
+               }
+       }
+
+       return ret;
+};
+
+
+function setPositiveNumber( elem, value, subtract ) {
+       var matches = rnumsplit.exec( value );
+       return matches ?
+               // Guard against undefined "subtract", e.g., when used as in cssHooks
+               Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+               value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+       var i = extra === ( isBorderBox ? "border" : "content" ) ?
+               // If we already have the right measurement, avoid augmentation
+               4 :
+               // Otherwise initialize for horizontal or vertical properties
+               name === "width" ? 1 : 0,
+
+               val = 0;
+
+       for ( ; i < 4; i += 2 ) {
+               // both box models exclude margin, so add it if we want it
+               if ( extra === "margin" ) {
+                       val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+               }
+
+               if ( isBorderBox ) {
+                       // border-box includes padding, so remove it if we want content
+                       if ( extra === "content" ) {
+                               val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+                       }
+
+                       // at this point, extra isn't border nor margin, so remove border
+                       if ( extra !== "margin" ) {
+                               val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+                       }
+               } else {
+                       // at this point, extra isn't content, so add padding
+                       val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+                       // at this point, extra isn't content nor padding, so add border
+                       if ( extra !== "padding" ) {
+                               val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+                       }
+               }
+       }
+
+       return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+       // Start with offset property, which is equivalent to the border-box value
+       var valueIsBorderBox = true,
+               val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+               styles = getStyles( elem ),
+               isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+       // some non-html elements return undefined for offsetWidth, so check for null/undefined
+       // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+       // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+       if ( val <= 0 || val == null ) {
+               // Fall back to computed then uncomputed css if necessary
+               val = curCSS( elem, name, styles );
+               if ( val < 0 || val == null ) {
+                       val = elem.style[ name ];
+               }
+
+               // Computed unit is not pixels. Stop here and return.
+               if ( rnumnonpx.test(val) ) {
+                       return val;
+               }
+
+               // we need the check for style in case a browser which returns unreliable values
+               // for getComputedStyle silently falls back to the reliable elem.style
+               valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
+
+               // Normalize "", auto, and prepare for extra
+               val = parseFloat( val ) || 0;
+       }
+
+       // use the active box-sizing model to add/subtract irrelevant styles
+       return ( val +
+               augmentWidthOrHeight(
+                       elem,
+                       name,
+                       extra || ( isBorderBox ? "border" : "content" ),
+                       valueIsBorderBox,
+                       styles
+               )
+       ) + "px";
+}
+
+// Try to determine the default display value of an element
+function css_defaultDisplay( nodeName ) {
+       var doc = document,
+               display = elemdisplay[ nodeName ];
+
+       if ( !display ) {
+               display = actualDisplay( nodeName, doc );
+
+               // If the simple way fails, read from inside an iframe
+               if ( display === "none" || !display ) {
+                       // Use the already-created iframe if possible
+                       iframe = ( iframe ||
+                               jQuery("<iframe frameborder='0' width='0' height='0'/>")
+                               .css( "cssText", "display:block !important" )
+                       ).appendTo( doc.documentElement );
+
+                       // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+                       doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
+                       doc.write("<!doctype html><html><body>");
+                       doc.close();
+
+                       display = actualDisplay( nodeName, doc );
+                       iframe.detach();
+               }
+
+               // Store the correct default display
+               elemdisplay[ nodeName ] = display;
+       }
+
+       return display;
+}
+
+// Called ONLY from within css_defaultDisplay
+function actualDisplay( name, doc ) {
+       var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+               display = jQuery.css( elem[0], "display" );
+       elem.remove();
+       return display;
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+       jQuery.cssHooks[ name ] = {
+               get: function( elem, computed, extra ) {
+                       if ( computed ) {
+                               // certain elements can have dimension info if we invisibly show them
+                               // however, it must have a current display style that would benefit from this
+                               return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
+                                       jQuery.swap( elem, cssShow, function() {
+                                               return getWidthOrHeight( elem, name, extra );
+                                       }) :
+                                       getWidthOrHeight( elem, name, extra );
+                       }
+               },
+
+               set: function( elem, value, extra ) {
+                       var styles = extra && getStyles( elem );
+                       return setPositiveNumber( elem, value, extra ?
+                               augmentWidthOrHeight(
+                                       elem,
+                                       name,
+                                       extra,
+                                       jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+                                       styles
+                               ) : 0
+                       );
+               }
+       };
+});
+
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
+jQuery(function() {
+       // Support: Android 2.3
+       if ( !jQuery.support.reliableMarginRight ) {
+               jQuery.cssHooks.marginRight = {
+                       get: function( elem, computed ) {
+                               if ( computed ) {
+                                       // Support: Android 2.3
+                                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                                       // Work around by temporarily setting element display to inline-block
+                                       return jQuery.swap( elem, { "display": "inline-block" },
+                                               curCSS, [ elem, "marginRight" ] );
+                               }
+                       }
+               };
+       }
+
+       // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+       // getComputedStyle returns percent when specified for top/left/bottom/right
+       // rather than make the css module depend on the offset module, we just check for it here
+       if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
+               jQuery.each( [ "top", "left" ], function( i, prop ) {
+                       jQuery.cssHooks[ prop ] = {
+                               get: function( elem, computed ) {
+                                       if ( computed ) {
+                                               computed = curCSS( elem, prop );
+                                               // if curCSS returns percentage, fallback to offset
+                                               return rnumnonpx.test( computed ) ?
+                                                       jQuery( elem ).position()[ prop ] + "px" :
+                                                       computed;
+                                       }
+                               }
+                       };
+               });
+       }
+
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.hidden = function( elem ) {
+               // Support: Opera <= 12.12
+               // Opera reports offsetWidths and offsetHeights less than zero on some elements
+               return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
+       };
+
+       jQuery.expr.filters.visible = function( elem ) {
+               return !jQuery.expr.filters.hidden( elem );
+       };
+}
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+       margin: "",
+       padding: "",
+       border: "Width"
+}, function( prefix, suffix ) {
+       jQuery.cssHooks[ prefix + suffix ] = {
+               expand: function( value ) {
+                       var i = 0,
+                               expanded = {},
+
+                               // assumes a single number if not a string
+                               parts = typeof value === "string" ? value.split(" ") : [ value ];
+
+                       for ( ; i < 4; i++ ) {
+                               expanded[ prefix + cssExpand[ i ] + suffix ] =
+                                       parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+                       }
+
+                       return expanded;
+               }
+       };
+
+       if ( !rmargin.test( prefix ) ) {
+               jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+       }
+});
+var r20 = /%20/g,
+       rbracket = /\[\]$/,
+       rCRLF = /\r?\n/g,
+       rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+       rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+jQuery.fn.extend({
+       serialize: function() {
+               return jQuery.param( this.serializeArray() );
+       },
+       serializeArray: function() {
+               return this.map(function(){
+                       // Can add propHook for "elements" to filter or add form elements
+                       var elements = jQuery.prop( this, "elements" );
+                       return elements ? jQuery.makeArray( elements ) : this;
+               })
+               .filter(function(){
+                       var type = this.type;
+                       // Use .is(":disabled") so that fieldset[disabled] works
+                       return this.name && !jQuery( this ).is( ":disabled" ) &&
+                               rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+                               ( this.checked || !manipulation_rcheckableType.test( type ) );
+               })
+               .map(function( i, elem ){
+                       var val = jQuery( this ).val();
+
+                       return val == null ?
+                               null :
+                               jQuery.isArray( val ) ?
+                                       jQuery.map( val, function( val ){
+                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+                                       }) :
+                                       { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+               }).get();
+       }
+});
+
+//Serialize an array of form elements or a set of
+//key/values into a query string
+jQuery.param = function( a, traditional ) {
+       var prefix,
+               s = [],
+               add = function( key, value ) {
+                       // If value is a function, invoke it and return its value
+                       value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+                       s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+               };
+
+       // Set traditional to true for jQuery <= 1.3.2 behavior.
+       if ( traditional === undefined ) {
+               traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+       }
+
+       // If an array was passed in, assume that it is an array of form elements.
+       if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+               // Serialize the form elements
+               jQuery.each( a, function() {
+                       add( this.name, this.value );
+               });
+
+       } else {
+               // If traditional, encode the "old" way (the way 1.3.2 or older
+               // did it), otherwise encode params recursively.
+               for ( prefix in a ) {
+                       buildParams( prefix, a[ prefix ], traditional, add );
+               }
+       }
+
+       // Return the resulting serialization
+       return s.join( "&" ).replace( r20, "+" );
+};
+
+function buildParams( prefix, obj, traditional, add ) {
+       var name;
+
+       if ( jQuery.isArray( obj ) ) {
+               // Serialize array item.
+               jQuery.each( obj, function( i, v ) {
+                       if ( traditional || rbracket.test( prefix ) ) {
+                               // Treat each array item as a scalar.
+                               add( prefix, v );
+
+                       } else {
+                               // Item is non-scalar (array or object), encode its numeric index.
+                               buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+                       }
+               });
+
+       } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+               // Serialize object item.
+               for ( name in obj ) {
+                       buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+               }
+
+       } else {
+               // Serialize scalar item.
+               add( prefix, obj );
+       }
+}
+jQuery.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( i, name ) {
+
+       // Handle event binding
+       jQuery.fn[ name ] = function( data, fn ) {
+               return arguments.length > 0 ?
+                       this.on( name, null, data, fn ) :
+                       this.trigger( name );
+       };
+});
+
+jQuery.fn.extend({
+       hover: function( fnOver, fnOut ) {
+               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+       },
+
+       bind: function( types, data, fn ) {
+               return this.on( types, null, data, fn );
+       },
+       unbind: function( types, fn ) {
+               return this.off( types, null, fn );
+       },
+
+       delegate: function( selector, types, data, fn ) {
+               return this.on( types, selector, data, fn );
+       },
+       undelegate: function( selector, types, fn ) {
+               // ( namespace ) or ( selector, types [, fn] )
+               return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+       }
+});
+var
+       // Document location
+       ajaxLocParts,
+       ajaxLocation,
+
+       ajax_nonce = jQuery.now(),
+
+       ajax_rquery = /\?/,
+       rhash = /#.*$/,
+       rts = /([?&])_=[^&]*/,
+       rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+       // #7653, #8125, #8152: local protocol detection
+       rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+       rnoContent = /^(?:GET|HEAD)$/,
+       rprotocol = /^\/\//,
+       rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
+
+       // Keep a copy of the old load method
+       _load = jQuery.fn.load,
+
+       /* Prefilters
+        * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+        * 2) These are called:
+        *    - BEFORE asking for a transport
+        *    - AFTER param serialization (s.data is a string if s.processData is true)
+        * 3) key is the dataType
+        * 4) the catchall symbol "*" can be used
+        * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+        */
+       prefilters = {},
+
+       /* Transports bindings
+        * 1) key is the dataType
+        * 2) the catchall symbol "*" can be used
+        * 3) selection will start with transport dataType and THEN go to "*" if needed
+        */
+       transports = {},
+
+       // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+       allTypes = "*/".concat("*");
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+       ajaxLocation = location.href;
+} catch( e ) {
+       // Use the href attribute of an A element
+       // since IE will modify it given document.location
+       ajaxLocation = document.createElement( "a" );
+       ajaxLocation.href = "";
+       ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+       // dataTypeExpression is optional and defaults to "*"
+       return function( dataTypeExpression, func ) {
+
+               if ( typeof dataTypeExpression !== "string" ) {
+                       func = dataTypeExpression;
+                       dataTypeExpression = "*";
+               }
+
+               var dataType,
+                       i = 0,
+                       dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
+
+               if ( jQuery.isFunction( func ) ) {
+                       // For each dataType in the dataTypeExpression
+                       while ( (dataType = dataTypes[i++]) ) {
+                               // Prepend if requested
+                               if ( dataType[0] === "+" ) {
+                                       dataType = dataType.slice( 1 ) || "*";
+                                       (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+                               // Otherwise append
+                               } else {
+                                       (structure[ dataType ] = structure[ dataType ] || []).push( func );
+                               }
+                       }
+               }
+       };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+       var inspected = {},
+               seekingTransport = ( structure === transports );
+
+       function inspect( dataType ) {
+               var selected;
+               inspected[ dataType ] = true;
+               jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+                       var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+                       if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+                               options.dataTypes.unshift( dataTypeOrTransport );
+                               inspect( dataTypeOrTransport );
+                               return false;
+                       } else if ( seekingTransport ) {
+                               return !( selected = dataTypeOrTransport );
+                       }
+               });
+               return selected;
+       }
+
+       return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+       var key, deep,
+               flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+       for ( key in src ) {
+               if ( src[ key ] !== undefined ) {
+                       ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
+               }
+       }
+       if ( deep ) {
+               jQuery.extend( true, target, deep );
+       }
+
+       return target;
+}
+
+jQuery.fn.load = function( url, params, callback ) {
+       if ( typeof url !== "string" && _load ) {
+               return _load.apply( this, arguments );
+       }
+
+       var selector, type, response,
+               self = this,
+               off = url.indexOf(" ");
+
+       if ( off >= 0 ) {
+               selector = url.slice( off );
+               url = url.slice( 0, off );
+       }
+
+       // If it's a function
+       if ( jQuery.isFunction( params ) ) {
+
+               // We assume that it's the callback
+               callback = params;
+               params = undefined;
+
+       // Otherwise, build a param string
+       } else if ( params && typeof params === "object" ) {
+               type = "POST";
+       }
+
+       // If we have elements to modify, make the request
+       if ( self.length > 0 ) {
+               jQuery.ajax({
+                       url: url,
+
+                       // if "type" variable is undefined, then "GET" method will be used
+                       type: type,
+                       dataType: "html",
+                       data: params
+               }).done(function( responseText ) {
+
+                       // Save response for use in complete callback
+                       response = arguments;
+
+                       self.html( selector ?
+
+                               // If a selector was specified, locate the right elements in a dummy div
+                               // Exclude scripts to avoid IE 'Permission Denied' errors
+                               jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+                               // Otherwise use the full result
+                               responseText );
+
+               }).complete( callback && function( jqXHR, status ) {
+                       self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+               });
+       }
+
+       return this;
+};
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
+       jQuery.fn[ type ] = function( fn ){
+               return this.on( type, fn );
+       };
+});
+
+jQuery.extend({
+
+       // Counter for holding the number of active queries
+       active: 0,
+
+       // Last-Modified header cache for next request
+       lastModified: {},
+       etag: {},
+
+       ajaxSettings: {
+               url: ajaxLocation,
+               type: "GET",
+               isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+               global: true,
+               processData: true,
+               async: true,
+               contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+               /*
+               timeout: 0,
+               data: null,
+               dataType: null,
+               username: null,
+               password: null,
+               cache: null,
+               throws: false,
+               traditional: false,
+               headers: {},
+               */
+
+               accepts: {
+                       "*": allTypes,
+                       text: "text/plain",
+                       html: "text/html",
+                       xml: "application/xml, text/xml",
+                       json: "application/json, text/javascript"
+               },
+
+               contents: {
+                       xml: /xml/,
+                       html: /html/,
+                       json: /json/
+               },
+
+               responseFields: {
+                       xml: "responseXML",
+                       text: "responseText",
+                       json: "responseJSON"
+               },
+
+               // Data converters
+               // Keys separate source (or catchall "*") and destination types with a single space
+               converters: {
+
+                       // Convert anything to text
+                       "* text": String,
+
+                       // Text to html (true = no transformation)
+                       "text html": true,
+
+                       // Evaluate text as a json expression
+                       "text json": jQuery.parseJSON,
+
+                       // Parse text as xml
+                       "text xml": jQuery.parseXML
+               },
+
+               // For options that shouldn't be deep extended:
+               // you can add your own custom options here if
+               // and when you create one that shouldn't be
+               // deep extended (see ajaxExtend)
+               flatOptions: {
+                       url: true,
+                       context: true
+               }
+       },
+
+       // Creates a full fledged settings object into target
+       // with both ajaxSettings and settings fields.
+       // If target is omitted, writes into ajaxSettings.
+       ajaxSetup: function( target, settings ) {
+               return settings ?
+
+                       // Building a settings object
+                       ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+                       // Extending ajaxSettings
+                       ajaxExtend( jQuery.ajaxSettings, target );
+       },
+
+       ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+       ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+       // Main method
+       ajax: function( url, options ) {
+
+               // If url is an object, simulate pre-1.5 signature
+               if ( typeof url === "object" ) {
+                       options = url;
+                       url = undefined;
+               }
+
+               // Force options to be an object
+               options = options || {};
+
+               var transport,
+                       // URL without anti-cache param
+                       cacheURL,
+                       // Response headers
+                       responseHeadersString,
+                       responseHeaders,
+                       // timeout handle
+                       timeoutTimer,
+                       // Cross-domain detection vars
+                       parts,
+                       // To know if global events are to be dispatched
+                       fireGlobals,
+                       // Loop variable
+                       i,
+                       // Create the final options object
+                       s = jQuery.ajaxSetup( {}, options ),
+                       // Callbacks context
+                       callbackContext = s.context || s,
+                       // Context for global events is callbackContext if it is a DOM node or jQuery collection
+                       globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
+                               jQuery( callbackContext ) :
+                               jQuery.event,
+                       // Deferreds
+                       deferred = jQuery.Deferred(),
+                       completeDeferred = jQuery.Callbacks("once memory"),
+                       // Status-dependent callbacks
+                       statusCode = s.statusCode || {},
+                       // Headers (they are sent all at once)
+                       requestHeaders = {},
+                       requestHeadersNames = {},
+                       // The jqXHR state
+                       state = 0,
+                       // Default abort message
+                       strAbort = "canceled",
+                       // Fake xhr
+                       jqXHR = {
+                               readyState: 0,
+
+                               // Builds headers hashtable if needed
+                               getResponseHeader: function( key ) {
+                                       var match;
+                                       if ( state === 2 ) {
+                                               if ( !responseHeaders ) {
+                                                       responseHeaders = {};
+                                                       while ( (match = rheaders.exec( responseHeadersString )) ) {
+                                                               responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+                                                       }
+                                               }
+                                               match = responseHeaders[ key.toLowerCase() ];
+                                       }
+                                       return match == null ? null : match;
+                               },
+
+                               // Raw string
+                               getAllResponseHeaders: function() {
+                                       return state === 2 ? responseHeadersString : null;
+                               },
+
+                               // Caches the header
+                               setRequestHeader: function( name, value ) {
+                                       var lname = name.toLowerCase();
+                                       if ( !state ) {
+                                               name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+                                               requestHeaders[ name ] = value;
+                                       }
+                                       return this;
+                               },
+
+                               // Overrides response content-type header
+                               overrideMimeType: function( type ) {
+                                       if ( !state ) {
+                                               s.mimeType = type;
+                                       }
+                                       return this;
+                               },
+
+                               // Status-dependent callbacks
+                               statusCode: function( map ) {
+                                       var code;
+                                       if ( map ) {
+                                               if ( state < 2 ) {
+                                                       for ( code in map ) {
+                                                               // Lazy-add the new callback in a way that preserves old ones
+                                                               statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+                                                       }
+                                               } else {
+                                                       // Execute the appropriate callbacks
+                                                       jqXHR.always( map[ jqXHR.status ] );
+                                               }
+                                       }
+                                       return this;
+                               },
+
+                               // Cancel the request
+                               abort: function( statusText ) {
+                                       var finalText = statusText || strAbort;
+                                       if ( transport ) {
+                                               transport.abort( finalText );
+                                       }
+                                       done( 0, finalText );
+                                       return this;
+                               }
+                       };
+
+               // Attach deferreds
+               deferred.promise( jqXHR ).complete = completeDeferred.add;
+               jqXHR.success = jqXHR.done;
+               jqXHR.error = jqXHR.fail;
+
+               // Remove hash character (#7531: and string promotion)
+               // Add protocol if not provided (prefilters might expect it)
+               // Handle falsy url in the settings object (#10093: consistency with old signature)
+               // We also use the url parameter if available
+               s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )
+                       .replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+               // Alias method option to type as per ticket #12004
+               s.type = options.method || options.type || s.method || s.type;
+
+               // Extract dataTypes list
+               s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
+
+               // A cross-domain request is in order when we have a protocol:host:port mismatch
+               if ( s.crossDomain == null ) {
+                       parts = rurl.exec( s.url.toLowerCase() );
+                       s.crossDomain = !!( parts &&
+                               ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+                                       ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+                                               ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
+                       );
+               }
+
+               // Convert data if not already a string
+               if ( s.data && s.processData && typeof s.data !== "string" ) {
+                       s.data = jQuery.param( s.data, s.traditional );
+               }
+
+               // Apply prefilters
+               inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+               // If request was aborted inside a prefilter, stop there
+               if ( state === 2 ) {
+                       return jqXHR;
+               }
+
+               // We can fire global events as of now if asked to
+               fireGlobals = s.global;
+
+               // Watch for a new set of requests
+               if ( fireGlobals && jQuery.active++ === 0 ) {
+                       jQuery.event.trigger("ajaxStart");
+               }
+
+               // Uppercase the type
+               s.type = s.type.toUpperCase();
+
+               // Determine if request has content
+               s.hasContent = !rnoContent.test( s.type );
+
+               // Save the URL in case we're toying with the If-Modified-Since
+               // and/or If-None-Match header later on
+               cacheURL = s.url;
+
+               // More options handling for requests with no content
+               if ( !s.hasContent ) {
+
+                       // If data is available, append data to url
+                       if ( s.data ) {
+                               cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+                               // #9682: remove data so that it's not used in an eventual retry
+                               delete s.data;
+                       }
+
+                       // Add anti-cache in url if needed
+                       if ( s.cache === false ) {
+                               s.url = rts.test( cacheURL ) ?
+
+                                       // If there is already a '_' parameter, set its value
+                                       cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
+
+                                       // Otherwise add one to the end
+                                       cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
+                       }
+               }
+
+               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+               if ( s.ifModified ) {
+                       if ( jQuery.lastModified[ cacheURL ] ) {
+                               jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+                       }
+                       if ( jQuery.etag[ cacheURL ] ) {
+                               jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+                       }
+               }
+
+               // Set the correct header, if data is being sent
+               if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+                       jqXHR.setRequestHeader( "Content-Type", s.contentType );
+               }
+
+               // Set the Accepts header for the server, depending on the dataType
+               jqXHR.setRequestHeader(
+                       "Accept",
+                       s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+                               s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+                               s.accepts[ "*" ]
+               );
+
+               // Check for headers option
+               for ( i in s.headers ) {
+                       jqXHR.setRequestHeader( i, s.headers[ i ] );
+               }
+
+               // Allow custom headers/mimetypes and early abort
+               if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+                       // Abort if not done already and return
+                       return jqXHR.abort();
+               }
+
+               // aborting is no longer a cancellation
+               strAbort = "abort";
+
+               // Install callbacks on deferreds
+               for ( i in { success: 1, error: 1, complete: 1 } ) {
+                       jqXHR[ i ]( s[ i ] );
+               }
+
+               // Get transport
+               transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+               // If no transport, we auto-abort
+               if ( !transport ) {
+                       done( -1, "No Transport" );
+               } else {
+                       jqXHR.readyState = 1;
+
+                       // Send global event
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+                       }
+                       // Timeout
+                       if ( s.async && s.timeout > 0 ) {
+                               timeoutTimer = setTimeout(function() {
+                                       jqXHR.abort("timeout");
+                               }, s.timeout );
+                       }
+
+                       try {
+                               state = 1;
+                               transport.send( requestHeaders, done );
+                       } catch ( e ) {
+                               // Propagate exception as error if not done
+                               if ( state < 2 ) {
+                                       done( -1, e );
+                               // Simply rethrow otherwise
+                               } else {
+                                       throw e;
+                               }
+                       }
+               }
+
+               // Callback for when everything is done
+               function done( status, nativeStatusText, responses, headers ) {
+                       var isSuccess, success, error, response, modified,
+                               statusText = nativeStatusText;
+
+                       // Called once
+                       if ( state === 2 ) {
+                               return;
+                       }
+
+                       // State is "done" now
+                       state = 2;
+
+                       // Clear timeout if it exists
+                       if ( timeoutTimer ) {
+                               clearTimeout( timeoutTimer );
+                       }
+
+                       // Dereference transport for early garbage collection
+                       // (no matter how long the jqXHR object will be used)
+                       transport = undefined;
+
+                       // Cache response headers
+                       responseHeadersString = headers || "";
+
+                       // Set readyState
+                       jqXHR.readyState = status > 0 ? 4 : 0;
+
+                       // Determine if successful
+                       isSuccess = status >= 200 && status < 300 || status === 304;
+
+                       // Get response data
+                       if ( responses ) {
+                               response = ajaxHandleResponses( s, jqXHR, responses );
+                       }
+
+                       // Convert no matter what (that way responseXXX fields are always set)
+                       response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+                       // If successful, handle type chaining
+                       if ( isSuccess ) {
+
+                               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+                               if ( s.ifModified ) {
+                                       modified = jqXHR.getResponseHeader("Last-Modified");
+                                       if ( modified ) {
+                                               jQuery.lastModified[ cacheURL ] = modified;
+                                       }
+                                       modified = jqXHR.getResponseHeader("etag");
+                                       if ( modified ) {
+                                               jQuery.etag[ cacheURL ] = modified;
+                                       }
+                               }
+
+                               // if no content
+                               if ( status === 204 || s.type === "HEAD" ) {
+                                       statusText = "nocontent";
+
+                               // if not modified
+                               } else if ( status === 304 ) {
+                                       statusText = "notmodified";
+
+                               // If we have data, let's convert it
+                               } else {
+                                       statusText = response.state;
+                                       success = response.data;
+                                       error = response.error;
+                                       isSuccess = !error;
+                               }
+                       } else {
+                               // We extract error from statusText
+                               // then normalize statusText and status for non-aborts
+                               error = statusText;
+                               if ( status || !statusText ) {
+                                       statusText = "error";
+                                       if ( status < 0 ) {
+                                               status = 0;
+                                       }
+                               }
+                       }
+
+                       // Set data for the fake xhr object
+                       jqXHR.status = status;
+                       jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+                       // Success/Error
+                       if ( isSuccess ) {
+                               deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+                       } else {
+                               deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+                       }
+
+                       // Status-dependent callbacks
+                       jqXHR.statusCode( statusCode );
+                       statusCode = undefined;
+
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+                                       [ jqXHR, s, isSuccess ? success : error ] );
+                       }
+
+                       // Complete
+                       completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+                               // Handle the global AJAX counter
+                               if ( !( --jQuery.active ) ) {
+                                       jQuery.event.trigger("ajaxStop");
+                               }
+                       }
+               }
+
+               return jqXHR;
+       },
+
+       getJSON: function( url, data, callback ) {
+               return jQuery.get( url, data, callback, "json" );
+       },
+
+       getScript: function( url, callback ) {
+               return jQuery.get( url, undefined, callback, "script" );
+       }
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+       jQuery[ method ] = function( url, data, callback, type ) {
+               // shift arguments if data argument was omitted
+               if ( jQuery.isFunction( data ) ) {
+                       type = type || callback;
+                       callback = data;
+                       data = undefined;
+               }
+
+               return jQuery.ajax({
+                       url: url,
+                       type: method,
+                       dataType: type,
+                       data: data,
+                       success: callback
+               });
+       };
+});
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+       var ct, type, finalDataType, firstDataType,
+               contents = s.contents,
+               dataTypes = s.dataTypes;
+
+       // Remove auto dataType and get content-type in the process
+       while( dataTypes[ 0 ] === "*" ) {
+               dataTypes.shift();
+               if ( ct === undefined ) {
+                       ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+               }
+       }
+
+       // Check if we're dealing with a known content-type
+       if ( ct ) {
+               for ( type in contents ) {
+                       if ( contents[ type ] && contents[ type ].test( ct ) ) {
+                               dataTypes.unshift( type );
+                               break;
+                       }
+               }
+       }
+
+       // Check to see if we have a response for the expected dataType
+       if ( dataTypes[ 0 ] in responses ) {
+               finalDataType = dataTypes[ 0 ];
+       } else {
+               // Try convertible dataTypes
+               for ( type in responses ) {
+                       if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+                               finalDataType = type;
+                               break;
+                       }
+                       if ( !firstDataType ) {
+                               firstDataType = type;
+                       }
+               }
+               // Or just use first one
+               finalDataType = finalDataType || firstDataType;
+       }
+
+       // If we found a dataType
+       // We add the dataType to the list if needed
+       // and return the corresponding response
+       if ( finalDataType ) {
+               if ( finalDataType !== dataTypes[ 0 ] ) {
+                       dataTypes.unshift( finalDataType );
+               }
+               return responses[ finalDataType ];
+       }
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+       var conv2, current, conv, tmp, prev,
+               converters = {},
+               // Work with a copy of dataTypes in case we need to modify it for conversion
+               dataTypes = s.dataTypes.slice();
+
+       // Create converters map with lowercased keys
+       if ( dataTypes[ 1 ] ) {
+               for ( conv in s.converters ) {
+                       converters[ conv.toLowerCase() ] = s.converters[ conv ];
+               }
+       }
+
+       current = dataTypes.shift();
+
+       // Convert to each sequential dataType
+       while ( current ) {
+
+               if ( s.responseFields[ current ] ) {
+                       jqXHR[ s.responseFields[ current ] ] = response;
+               }
+
+               // Apply the dataFilter if provided
+               if ( !prev && isSuccess && s.dataFilter ) {
+                       response = s.dataFilter( response, s.dataType );
+               }
+
+               prev = current;
+               current = dataTypes.shift();
+
+               if ( current ) {
+
+               // There's only work to do if current dataType is non-auto
+                       if ( current === "*" ) {
+
+                               current = prev;
+
+                       // Convert response if prev dataType is non-auto and differs from current
+                       } else if ( prev !== "*" && prev !== current ) {
+
+                               // Seek a direct converter
+                               conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+                               // If none found, seek a pair
+                               if ( !conv ) {
+                                       for ( conv2 in converters ) {
+
+                                               // If conv2 outputs current
+                                               tmp = conv2.split( " " );
+                                               if ( tmp[ 1 ] === current ) {
+
+                                                       // If prev can be converted to accepted input
+                                                       conv = converters[ prev + " " + tmp[ 0 ] ] ||
+                                                               converters[ "* " + tmp[ 0 ] ];
+                                                       if ( conv ) {
+                                                               // Condense equivalence converters
+                                                               if ( conv === true ) {
+                                                                       conv = converters[ conv2 ];
+
+                                                               // Otherwise, insert the intermediate dataType
+                                                               } else if ( converters[ conv2 ] !== true ) {
+                                                                       current = tmp[ 0 ];
+                                                                       dataTypes.unshift( tmp[ 1 ] );
+                                                               }
+                                                               break;
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               // Apply converter (if not an equivalence)
+                               if ( conv !== true ) {
+
+                                       // Unless errors are allowed to bubble, catch and return them
+                                       if ( conv && s[ "throws" ] ) {
+                                               response = conv( response );
+                                       } else {
+                                               try {
+                                                       response = conv( response );
+                                               } catch ( e ) {
+                                                       return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return { state: "success", data: response };
+}
+// Install script dataType
+jQuery.ajaxSetup({
+       accepts: {
+               script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+       },
+       contents: {
+               script: /(?:java|ecma)script/
+       },
+       converters: {
+               "text script": function( text ) {
+                       jQuery.globalEval( text );
+                       return text;
+               }
+       }
+});
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+       if ( s.cache === undefined ) {
+               s.cache = false;
+       }
+       if ( s.crossDomain ) {
+               s.type = "GET";
+       }
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+       // This transport only deals with cross domain requests
+       if ( s.crossDomain ) {
+               var script, callback;
+               return {
+                       send: function( _, complete ) {
+                               script = jQuery("<script>").prop({
+                                       async: true,
+                                       charset: s.scriptCharset,
+                                       src: s.url
+                               }).on(
+                                       "load error",
+                                       callback = function( evt ) {
+                                               script.remove();
+                                               callback = null;
+                                               if ( evt ) {
+                                                       complete( evt.type === "error" ? 404 : 200, evt.type );
+                                               }
+                                       }
+                               );
+                               document.head.appendChild( script[ 0 ] );
+                       },
+                       abort: function() {
+                               if ( callback ) {
+                                       callback();
+                               }
+                       }
+               };
+       }
+});
+var oldCallbacks = [],
+       rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+       jsonp: "callback",
+       jsonpCallback: function() {
+               var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
+               this[ callback ] = true;
+               return callback;
+       }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+       var callbackName, overwritten, responseContainer,
+               jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+                       "url" :
+                       typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+               );
+
+       // Handle iff the expected data type is "jsonp" or we have a parameter to set
+       if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+               // Get callback name, remembering preexisting value associated with it
+               callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+                       s.jsonpCallback() :
+                       s.jsonpCallback;
+
+               // Insert callback into url or form data
+               if ( jsonProp ) {
+                       s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+               } else if ( s.jsonp !== false ) {
+                       s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+               }
+
+               // Use data converter to retrieve json after script execution
+               s.converters["script json"] = function() {
+                       if ( !responseContainer ) {
+                               jQuery.error( callbackName + " was not called" );
+                       }
+                       return responseContainer[ 0 ];
+               };
+
+               // force json dataType
+               s.dataTypes[ 0 ] = "json";
+
+               // Install callback
+               overwritten = window[ callbackName ];
+               window[ callbackName ] = function() {
+                       responseContainer = arguments;
+               };
+
+               // Clean-up function (fires after converters)
+               jqXHR.always(function() {
+                       // Restore preexisting value
+                       window[ callbackName ] = overwritten;
+
+                       // Save back as free
+                       if ( s[ callbackName ] ) {
+                               // make sure that re-using the options doesn't screw things around
+                               s.jsonpCallback = originalSettings.jsonpCallback;
+
+                               // save the callback name for future use
+                               oldCallbacks.push( callbackName );
+                       }
+
+                       // Call if it was a function and we have a response
+                       if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+                               overwritten( responseContainer[ 0 ] );
+                       }
+
+                       responseContainer = overwritten = undefined;
+               });
+
+               // Delegate to script
+               return "script";
+       }
+});
+jQuery.ajaxSettings.xhr = function() {
+       try {
+               return new XMLHttpRequest();
+       } catch( e ) {}
+};
+
+var xhrSupported = jQuery.ajaxSettings.xhr(),
+       xhrSuccessStatus = {
+               // file protocol always yields status code 0, assume 200
+               0: 200,
+               // Support: IE9
+               // #1450: sometimes IE returns 1223 when it should be 204
+               1223: 204
+       },
+       // Support: IE9
+       // We need to keep track of outbound xhr and abort them manually
+       // because IE is not smart enough to do it all by itself
+       xhrId = 0,
+       xhrCallbacks = {};
+
+if ( window.ActiveXObject ) {
+       jQuery( window ).on( "unload", function() {
+               for( var key in xhrCallbacks ) {
+                       xhrCallbacks[ key ]();
+               }
+               xhrCallbacks = undefined;
+       });
+}
+
+jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+jQuery.support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport(function( options ) {
+       var callback;
+       // Cross domain only allowed if supported through XMLHttpRequest
+       if ( jQuery.support.cors || xhrSupported && !options.crossDomain ) {
+               return {
+                       send: function( headers, complete ) {
+                               var i, id,
+                                       xhr = options.xhr();
+                               xhr.open( options.type, options.url, options.async, options.username, options.password );
+                               // Apply custom fields if provided
+                               if ( options.xhrFields ) {
+                                       for ( i in options.xhrFields ) {
+                                               xhr[ i ] = options.xhrFields[ i ];
+                                       }
+                               }
+                               // Override mime type if needed
+                               if ( options.mimeType && xhr.overrideMimeType ) {
+                                       xhr.overrideMimeType( options.mimeType );
+                               }
+                               // X-Requested-With header
+                               // For cross-domain requests, seeing as conditions for a preflight are
+                               // akin to a jigsaw puzzle, we simply never set it to be sure.
+                               // (it can always be set on a per-request basis or even using ajaxSetup)
+                               // For same-domain requests, won't change header if already provided.
+                               if ( !options.crossDomain && !headers["X-Requested-With"] ) {
+                                       headers["X-Requested-With"] = "XMLHttpRequest";
+                               }
+                               // Set headers
+                               for ( i in headers ) {
+                                       xhr.setRequestHeader( i, headers[ i ] );
+                               }
+                               // Callback
+                               callback = function( type ) {
+                                       return function() {
+                                               if ( callback ) {
+                                                       delete xhrCallbacks[ id ];
+                                                       callback = xhr.onload = xhr.onerror = null;
+                                                       if ( type === "abort" ) {
+                                                               xhr.abort();
+                                                       } else if ( type === "error" ) {
+                                                               complete(
+                                                                       // file protocol always yields status 0, assume 404
+                                                                       xhr.status || 404,
+                                                                       xhr.statusText
+                                                               );
+                                                       } else {
+                                                               complete(
+                                                                       xhrSuccessStatus[ xhr.status ] || xhr.status,
+                                                                       xhr.statusText,
+                                                                       // Support: IE9
+                                                                       // #11426: When requesting binary data, IE9 will throw an exception
+                                                                       // on any attempt to access responseText
+                                                                       typeof xhr.responseText === "string" ? {
+                                                                               text: xhr.responseText
+                                                                       } : undefined,
+                                                                       xhr.getAllResponseHeaders()
+                                                               );
+                                                       }
+                                               }
+                                       };
+                               };
+                               // Listen to events
+                               xhr.onload = callback();
+                               xhr.onerror = callback("error");
+                               // Create the abort callback
+                               callback = xhrCallbacks[( id = xhrId++ )] = callback("abort");
+                               // Do send the request
+                               // This may raise an exception which is actually
+                               // handled in jQuery.ajax (so no try/catch here)
+                               xhr.send( options.hasContent && options.data || null );
+                       },
+                       abort: function() {
+                               if ( callback ) {
+                                       callback();
+                               }
+                       }
+               };
+       }
+});
+var fxNow, timerId,
+       rfxtypes = /^(?:toggle|show|hide)$/,
+       rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+       rrun = /queueHooks$/,
+       animationPrefilters = [ defaultPrefilter ],
+       tweeners = {
+               "*": [function( prop, value ) {
+                       var tween = this.createTween( prop, value ),
+                               target = tween.cur(),
+                               parts = rfxnum.exec( value ),
+                               unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+                               // Starting value computation is required for potential unit mismatches
+                               start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+                                       rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+                               scale = 1,
+                               maxIterations = 20;
+
+                       if ( start && start[ 3 ] !== unit ) {
+                               // Trust units reported by jQuery.css
+                               unit = unit || start[ 3 ];
+
+                               // Make sure we update the tween properties later on
+                               parts = parts || [];
+
+                               // Iteratively approximate from a nonzero starting point
+                               start = +target || 1;
+
+                               do {
+                                       // If previous iteration zeroed out, double until we get *something*
+                                       // Use a string for doubling factor so we don't accidentally see scale as unchanged below
+                                       scale = scale || ".5";
+
+                                       // Adjust and apply
+                                       start = start / scale;
+                                       jQuery.style( tween.elem, prop, start + unit );
+
+                               // Update scale, tolerating zero or NaN from tween.cur()
+                               // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+                               } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+                       }
+
+                       // Update tween properties
+                       if ( parts ) {
+                               start = tween.start = +start || +target || 0;
+                               tween.unit = unit;
+                               // If a +=/-= token was provided, we're doing a relative animation
+                               tween.end = parts[ 1 ] ?
+                                       start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+                                       +parts[ 2 ];
+                       }
+
+                       return tween;
+               }]
+       };
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+       setTimeout(function() {
+               fxNow = undefined;
+       });
+       return ( fxNow = jQuery.now() );
+}
+
+function createTween( value, prop, animation ) {
+       var tween,
+               collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+               index = 0,
+               length = collection.length;
+       for ( ; index < length; index++ ) {
+               if ( (tween = collection[ index ].call( animation, prop, value )) ) {
+
+                       // we're done with this property
+                       return tween;
+               }
+       }
+}
+
+function Animation( elem, properties, options ) {
+       var result,
+               stopped,
+               index = 0,
+               length = animationPrefilters.length,
+               deferred = jQuery.Deferred().always( function() {
+                       // don't match elem in the :animated selector
+                       delete tick.elem;
+               }),
+               tick = function() {
+                       if ( stopped ) {
+                               return false;
+                       }
+                       var currentTime = fxNow || createFxNow(),
+                               remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+                               // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+                               temp = remaining / animation.duration || 0,
+                               percent = 1 - temp,
+                               index = 0,
+                               length = animation.tweens.length;
+
+                       for ( ; index < length ; index++ ) {
+                               animation.tweens[ index ].run( percent );
+                       }
+
+                       deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+                       if ( percent < 1 && length ) {
+                               return remaining;
+                       } else {
+                               deferred.resolveWith( elem, [ animation ] );
+                               return false;
+                       }
+               },
+               animation = deferred.promise({
+                       elem: elem,
+                       props: jQuery.extend( {}, properties ),
+                       opts: jQuery.extend( true, { specialEasing: {} }, options ),
+                       originalProperties: properties,
+                       originalOptions: options,
+                       startTime: fxNow || createFxNow(),
+                       duration: options.duration,
+                       tweens: [],
+                       createTween: function( prop, end ) {
+                               var tween = jQuery.Tween( elem, animation.opts, prop, end,
+                                               animation.opts.specialEasing[ prop ] || animation.opts.easing );
+                               animation.tweens.push( tween );
+                               return tween;
+                       },
+                       stop: function( gotoEnd ) {
+                               var index = 0,
+                                       // if we are going to the end, we want to run all the tweens
+                                       // otherwise we skip this part
+                                       length = gotoEnd ? animation.tweens.length : 0;
+                               if ( stopped ) {
+                                       return this;
+                               }
+                               stopped = true;
+                               for ( ; index < length ; index++ ) {
+                                       animation.tweens[ index ].run( 1 );
+                               }
+
+                               // resolve when we played the last frame
+                               // otherwise, reject
+                               if ( gotoEnd ) {
+                                       deferred.resolveWith( elem, [ animation, gotoEnd ] );
+                               } else {
+                                       deferred.rejectWith( elem, [ animation, gotoEnd ] );
+                               }
+                               return this;
+                       }
+               }),
+               props = animation.props;
+
+       propFilter( props, animation.opts.specialEasing );
+
+       for ( ; index < length ; index++ ) {
+               result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+               if ( result ) {
+                       return result;
+               }
+       }
+
+       jQuery.map( props, createTween, animation );
+
+       if ( jQuery.isFunction( animation.opts.start ) ) {
+               animation.opts.start.call( elem, animation );
+       }
+
+       jQuery.fx.timer(
+               jQuery.extend( tick, {
+                       elem: elem,
+                       anim: animation,
+                       queue: animation.opts.queue
+               })
+       );
+
+       // attach callbacks from options
+       return animation.progress( animation.opts.progress )
+               .done( animation.opts.done, animation.opts.complete )
+               .fail( animation.opts.fail )
+               .always( animation.opts.always );
+}
+
+function propFilter( props, specialEasing ) {
+       var index, name, easing, value, hooks;
+
+       // camelCase, specialEasing and expand cssHook pass
+       for ( index in props ) {
+               name = jQuery.camelCase( index );
+               easing = specialEasing[ name ];
+               value = props[ index ];
+               if ( jQuery.isArray( value ) ) {
+                       easing = value[ 1 ];
+                       value = props[ index ] = value[ 0 ];
+               }
+
+               if ( index !== name ) {
+                       props[ name ] = value;
+                       delete props[ index ];
+               }
+
+               hooks = jQuery.cssHooks[ name ];
+               if ( hooks && "expand" in hooks ) {
+                       value = hooks.expand( value );
+                       delete props[ name ];
+
+                       // not quite $.extend, this wont overwrite keys already present.
+                       // also - reusing 'index' from above because we have the correct "name"
+                       for ( index in value ) {
+                               if ( !( index in props ) ) {
+                                       props[ index ] = value[ index ];
+                                       specialEasing[ index ] = easing;
+                               }
+                       }
+               } else {
+                       specialEasing[ name ] = easing;
+               }
+       }
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+       tweener: function( props, callback ) {
+               if ( jQuery.isFunction( props ) ) {
+                       callback = props;
+                       props = [ "*" ];
+               } else {
+                       props = props.split(" ");
+               }
+
+               var prop,
+                       index = 0,
+                       length = props.length;
+
+               for ( ; index < length ; index++ ) {
+                       prop = props[ index ];
+                       tweeners[ prop ] = tweeners[ prop ] || [];
+                       tweeners[ prop ].unshift( callback );
+               }
+       },
+
+       prefilter: function( callback, prepend ) {
+               if ( prepend ) {
+                       animationPrefilters.unshift( callback );
+               } else {
+                       animationPrefilters.push( callback );
+               }
+       }
+});
+
+function defaultPrefilter( elem, props, opts ) {
+       /* jshint validthis: true */
+       var prop, value, toggle, tween, hooks, oldfire,
+               anim = this,
+               orig = {},
+               style = elem.style,
+               hidden = elem.nodeType && isHidden( elem ),
+               dataShow = data_priv.get( elem, "fxshow" );
+
+       // handle queue: false promises
+       if ( !opts.queue ) {
+               hooks = jQuery._queueHooks( elem, "fx" );
+               if ( hooks.unqueued == null ) {
+                       hooks.unqueued = 0;
+                       oldfire = hooks.empty.fire;
+                       hooks.empty.fire = function() {
+                               if ( !hooks.unqueued ) {
+                                       oldfire();
+                               }
+                       };
+               }
+               hooks.unqueued++;
+
+               anim.always(function() {
+                       // doing this makes sure that the complete handler will be called
+                       // before this completes
+                       anim.always(function() {
+                               hooks.unqueued--;
+                               if ( !jQuery.queue( elem, "fx" ).length ) {
+                                       hooks.empty.fire();
+                               }
+                       });
+               });
+       }
+
+       // height/width overflow pass
+       if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+               // Make sure that nothing sneaks out
+               // Record all 3 overflow attributes because IE9-10 do not
+               // change the overflow attribute when overflowX and
+               // overflowY are set to the same value
+               opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+               // Set display property to inline-block for height/width
+               // animations on inline elements that are having width/height animated
+               if ( jQuery.css( elem, "display" ) === "inline" &&
+                               jQuery.css( elem, "float" ) === "none" ) {
+
+                       style.display = "inline-block";
+               }
+       }
+
+       if ( opts.overflow ) {
+               style.overflow = "hidden";
+               anim.always(function() {
+                       style.overflow = opts.overflow[ 0 ];
+                       style.overflowX = opts.overflow[ 1 ];
+                       style.overflowY = opts.overflow[ 2 ];
+               });
+       }
+
+
+       // show/hide pass
+       for ( prop in props ) {
+               value = props[ prop ];
+               if ( rfxtypes.exec( value ) ) {
+                       delete props[ prop ];
+                       toggle = toggle || value === "toggle";
+                       if ( value === ( hidden ? "hide" : "show" ) ) {
+
+                               // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
+                               if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+                                       hidden = true;
+                               } else {
+                                       continue;
+                               }
+                       }
+                       orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+               }
+       }
+
+       if ( !jQuery.isEmptyObject( orig ) ) {
+               if ( dataShow ) {
+                       if ( "hidden" in dataShow ) {
+                               hidden = dataShow.hidden;
+                       }
+               } else {
+                       dataShow = data_priv.access( elem, "fxshow", {} );
+               }
+
+               // store state if its toggle - enables .stop().toggle() to "reverse"
+               if ( toggle ) {
+                       dataShow.hidden = !hidden;
+               }
+               if ( hidden ) {
+                       jQuery( elem ).show();
+               } else {
+                       anim.done(function() {
+                               jQuery( elem ).hide();
+                       });
+               }
+               anim.done(function() {
+                       var prop;
+
+                       data_priv.remove( elem, "fxshow" );
+                       for ( prop in orig ) {
+                               jQuery.style( elem, prop, orig[ prop ] );
+                       }
+               });
+               for ( prop in orig ) {
+                       tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+                       if ( !( prop in dataShow ) ) {
+                               dataShow[ prop ] = tween.start;
+                               if ( hidden ) {
+                                       tween.end = tween.start;
+                                       tween.start = prop === "width" || prop === "height" ? 1 : 0;
+                               }
+                       }
+               }
+       }
+}
+
+function Tween( elem, options, prop, end, easing ) {
+       return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+       constructor: Tween,
+       init: function( elem, options, prop, end, easing, unit ) {
+               this.elem = elem;
+               this.prop = prop;
+               this.easing = easing || "swing";
+               this.options = options;
+               this.start = this.now = this.cur();
+               this.end = end;
+               this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+       },
+       cur: function() {
+               var hooks = Tween.propHooks[ this.prop ];
+
+               return hooks && hooks.get ?
+                       hooks.get( this ) :
+                       Tween.propHooks._default.get( this );
+       },
+       run: function( percent ) {
+               var eased,
+                       hooks = Tween.propHooks[ this.prop ];
+
+               if ( this.options.duration ) {
+                       this.pos = eased = jQuery.easing[ this.easing ](
+                               percent, this.options.duration * percent, 0, 1, this.options.duration
+                       );
+               } else {
+                       this.pos = eased = percent;
+               }
+               this.now = ( this.end - this.start ) * eased + this.start;
+
+               if ( this.options.step ) {
+                       this.options.step.call( this.elem, this.now, this );
+               }
+
+               if ( hooks && hooks.set ) {
+                       hooks.set( this );
+               } else {
+                       Tween.propHooks._default.set( this );
+               }
+               return this;
+       }
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+       _default: {
+               get: function( tween ) {
+                       var result;
+
+                       if ( tween.elem[ tween.prop ] != null &&
+                               (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+                               return tween.elem[ tween.prop ];
+                       }
+
+                       // passing an empty string as a 3rd parameter to .css will automatically
+                       // attempt a parseFloat and fallback to a string if the parse fails
+                       // so, simple values such as "10px" are parsed to Float.
+                       // complex values such as "rotate(1rad)" are returned as is.
+                       result = jQuery.css( tween.elem, tween.prop, "" );
+                       // Empty strings, null, undefined and "auto" are converted to 0.
+                       return !result || result === "auto" ? 0 : result;
+               },
+               set: function( tween ) {
+                       // use step hook for back compat - use cssHook if its there - use .style if its
+                       // available and use plain properties where available
+                       if ( jQuery.fx.step[ tween.prop ] ) {
+                               jQuery.fx.step[ tween.prop ]( tween );
+                       } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+                               jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+                       } else {
+                               tween.elem[ tween.prop ] = tween.now;
+                       }
+               }
+       }
+};
+
+// Support: IE9
+// Panic based approach to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+       set: function( tween ) {
+               if ( tween.elem.nodeType && tween.elem.parentNode ) {
+                       tween.elem[ tween.prop ] = tween.now;
+               }
+       }
+};
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+       var cssFn = jQuery.fn[ name ];
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return speed == null || typeof speed === "boolean" ?
+                       cssFn.apply( this, arguments ) :
+                       this.animate( genFx( name, true ), speed, easing, callback );
+       };
+});
+
+jQuery.fn.extend({
+       fadeTo: function( speed, to, easing, callback ) {
+
+               // show any hidden elements after setting opacity to 0
+               return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+                       // animate to the value specified
+                       .end().animate({ opacity: to }, speed, easing, callback );
+       },
+       animate: function( prop, speed, easing, callback ) {
+               var empty = jQuery.isEmptyObject( prop ),
+                       optall = jQuery.speed( speed, easing, callback ),
+                       doAnimation = function() {
+                               // Operate on a copy of prop so per-property easing won't be lost
+                               var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+                               // Empty animations, or finishing resolves immediately
+                               if ( empty || data_priv.get( this, "finish" ) ) {
+                                       anim.stop( true );
+                               }
+                       };
+                       doAnimation.finish = doAnimation;
+
+               return empty || optall.queue === false ?
+                       this.each( doAnimation ) :
+                       this.queue( optall.queue, doAnimation );
+       },
+       stop: function( type, clearQueue, gotoEnd ) {
+               var stopQueue = function( hooks ) {
+                       var stop = hooks.stop;
+                       delete hooks.stop;
+                       stop( gotoEnd );
+               };
+
+               if ( typeof type !== "string" ) {
+                       gotoEnd = clearQueue;
+                       clearQueue = type;
+                       type = undefined;
+               }
+               if ( clearQueue && type !== false ) {
+                       this.queue( type || "fx", [] );
+               }
+
+               return this.each(function() {
+                       var dequeue = true,
+                               index = type != null && type + "queueHooks",
+                               timers = jQuery.timers,
+                               data = data_priv.get( this );
+
+                       if ( index ) {
+                               if ( data[ index ] && data[ index ].stop ) {
+                                       stopQueue( data[ index ] );
+                               }
+                       } else {
+                               for ( index in data ) {
+                                       if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+                                               stopQueue( data[ index ] );
+                                       }
+                               }
+                       }
+
+                       for ( index = timers.length; index--; ) {
+                               if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+                                       timers[ index ].anim.stop( gotoEnd );
+                                       dequeue = false;
+                                       timers.splice( index, 1 );
+                               }
+                       }
+
+                       // start the next in the queue if the last step wasn't forced
+                       // timers currently will call their complete callbacks, which will dequeue
+                       // but only if they were gotoEnd
+                       if ( dequeue || !gotoEnd ) {
+                               jQuery.dequeue( this, type );
+                       }
+               });
+       },
+       finish: function( type ) {
+               if ( type !== false ) {
+                       type = type || "fx";
+               }
+               return this.each(function() {
+                       var index,
+                               data = data_priv.get( this ),
+                               queue = data[ type + "queue" ],
+                               hooks = data[ type + "queueHooks" ],
+                               timers = jQuery.timers,
+                               length = queue ? queue.length : 0;
+
+                       // enable finishing flag on private data
+                       data.finish = true;
+
+                       // empty the queue first
+                       jQuery.queue( this, type, [] );
+
+                       if ( hooks && hooks.stop ) {
+                               hooks.stop.call( this, true );
+                       }
+
+                       // look for any active animations, and finish them
+                       for ( index = timers.length; index--; ) {
+                               if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+                                       timers[ index ].anim.stop( true );
+                                       timers.splice( index, 1 );
+                               }
+                       }
+
+                       // look for any animations in the old queue and finish them
+                       for ( index = 0; index < length; index++ ) {
+                               if ( queue[ index ] && queue[ index ].finish ) {
+                                       queue[ index ].finish.call( this );
+                               }
+                       }
+
+                       // turn off finishing flag
+                       delete data.finish;
+               });
+       }
+});
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+       var which,
+               attrs = { height: type },
+               i = 0;
+
+       // if we include width, step value is 1 to do all cssExpand values,
+       // if we don't include width, step value is 2 to skip over Left and Right
+       includeWidth = includeWidth? 1 : 0;
+       for( ; i < 4 ; i += 2 - includeWidth ) {
+               which = cssExpand[ i ];
+               attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+       }
+
+       if ( includeWidth ) {
+               attrs.opacity = attrs.width = type;
+       }
+
+       return attrs;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+       slideDown: genFx("show"),
+       slideUp: genFx("hide"),
+       slideToggle: genFx("toggle"),
+       fadeIn: { opacity: "show" },
+       fadeOut: { opacity: "hide" },
+       fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return this.animate( props, speed, easing, callback );
+       };
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+       var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+               complete: fn || !fn && easing ||
+                       jQuery.isFunction( speed ) && speed,
+               duration: speed,
+               easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+       };
+
+       opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+               opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+       // normalize opt.queue - true/undefined/null -> "fx"
+       if ( opt.queue == null || opt.queue === true ) {
+               opt.queue = "fx";
+       }
+
+       // Queueing
+       opt.old = opt.complete;
+
+       opt.complete = function() {
+               if ( jQuery.isFunction( opt.old ) ) {
+                       opt.old.call( this );
+               }
+
+               if ( opt.queue ) {
+                       jQuery.dequeue( this, opt.queue );
+               }
+       };
+
+       return opt;
+};
+
+jQuery.easing = {
+       linear: function( p ) {
+               return p;
+       },
+       swing: function( p ) {
+               return 0.5 - Math.cos( p*Math.PI ) / 2;
+       }
+};
+
+jQuery.timers = [];
+jQuery.fx = Tween.prototype.init;
+jQuery.fx.tick = function() {
+       var timer,
+               timers = jQuery.timers,
+               i = 0;
+
+       fxNow = jQuery.now();
+
+       for ( ; i < timers.length; i++ ) {
+               timer = timers[ i ];
+               // Checks the timer has not already been removed
+               if ( !timer() && timers[ i ] === timer ) {
+                       timers.splice( i--, 1 );
+               }
+       }
+
+       if ( !timers.length ) {
+               jQuery.fx.stop();
+       }
+       fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+       if ( timer() && jQuery.timers.push( timer ) ) {
+               jQuery.fx.start();
+       }
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+       if ( !timerId ) {
+               timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+       }
+};
+
+jQuery.fx.stop = function() {
+       clearInterval( timerId );
+       timerId = null;
+};
+
+jQuery.fx.speeds = {
+       slow: 600,
+       fast: 200,
+       // Default speed
+       _default: 400
+};
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.animated = function( elem ) {
+               return jQuery.grep(jQuery.timers, function( fn ) {
+                       return elem === fn.elem;
+               }).length;
+       };
+}
+jQuery.fn.offset = function( options ) {
+       if ( arguments.length ) {
+               return options === undefined ?
+                       this :
+                       this.each(function( i ) {
+                               jQuery.offset.setOffset( this, options, i );
+                       });
+       }
+
+       var docElem, win,
+               elem = this[ 0 ],
+               box = { top: 0, left: 0 },
+               doc = elem && elem.ownerDocument;
+
+       if ( !doc ) {
+               return;
+       }
+
+       docElem = doc.documentElement;
+
+       // Make sure it's not a disconnected DOM node
+       if ( !jQuery.contains( docElem, elem ) ) {
+               return box;
+       }
+
+       // If we don't have gBCR, just use 0,0 rather than error
+       // BlackBerry 5, iOS 3 (original iPhone)
+       if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
+               box = elem.getBoundingClientRect();
+       }
+       win = getWindow( doc );
+       return {
+               top: box.top + win.pageYOffset - docElem.clientTop,
+               left: box.left + win.pageXOffset - docElem.clientLeft
+       };
+};
+
+jQuery.offset = {
+
+       setOffset: function( elem, options, i ) {
+               var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+                       position = jQuery.css( elem, "position" ),
+                       curElem = jQuery( elem ),
+                       props = {};
+
+               // Set position first, in-case top/left are set even on static elem
+               if ( position === "static" ) {
+                       elem.style.position = "relative";
+               }
+
+               curOffset = curElem.offset();
+               curCSSTop = jQuery.css( elem, "top" );
+               curCSSLeft = jQuery.css( elem, "left" );
+               calculatePosition = ( position === "absolute" || position === "fixed" ) && ( curCSSTop + curCSSLeft ).indexOf("auto") > -1;
+
+               // Need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+               if ( calculatePosition ) {
+                       curPosition = curElem.position();
+                       curTop = curPosition.top;
+                       curLeft = curPosition.left;
+
+               } else {
+                       curTop = parseFloat( curCSSTop ) || 0;
+                       curLeft = parseFloat( curCSSLeft ) || 0;
+               }
+
+               if ( jQuery.isFunction( options ) ) {
+                       options = options.call( elem, i, curOffset );
+               }
+
+               if ( options.top != null ) {
+                       props.top = ( options.top - curOffset.top ) + curTop;
+               }
+               if ( options.left != null ) {
+                       props.left = ( options.left - curOffset.left ) + curLeft;
+               }
+
+               if ( "using" in options ) {
+                       options.using.call( elem, props );
+
+               } else {
+                       curElem.css( props );
+               }
+       }
+};
+
+
+jQuery.fn.extend({
+
+       position: function() {
+               if ( !this[ 0 ] ) {
+                       return;
+               }
+
+               var offsetParent, offset,
+                       elem = this[ 0 ],
+                       parentOffset = { top: 0, left: 0 };
+
+               // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
+               if ( jQuery.css( elem, "position" ) === "fixed" ) {
+                       // We assume that getBoundingClientRect is available when computed position is fixed
+                       offset = elem.getBoundingClientRect();
+
+               } else {
+                       // Get *real* offsetParent
+                       offsetParent = this.offsetParent();
+
+                       // Get correct offsets
+                       offset = this.offset();
+                       if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+                               parentOffset = offsetParent.offset();
+                       }
+
+                       // Add offsetParent borders
+                       parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+                       parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+               }
+
+               // Subtract parent offsets and element margins
+               return {
+                       top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+                       left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+               };
+       },
+
+       offsetParent: function() {
+               return this.map(function() {
+                       var offsetParent = this.offsetParent || docElem;
+
+                       while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
+                               offsetParent = offsetParent.offsetParent;
+                       }
+
+                       return offsetParent || docElem;
+               });
+       }
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+       var top = "pageYOffset" === prop;
+
+       jQuery.fn[ method ] = function( val ) {
+               return jQuery.access( this, function( elem, method, val ) {
+                       var win = getWindow( elem );
+
+                       if ( val === undefined ) {
+                               return win ? win[ prop ] : elem[ method ];
+                       }
+
+                       if ( win ) {
+                               win.scrollTo(
+                                       !top ? val : window.pageXOffset,
+                                       top ? val : window.pageYOffset
+                               );
+
+                       } else {
+                               elem[ method ] = val;
+                       }
+               }, method, val, arguments.length, null );
+       };
+});
+
+function getWindow( elem ) {
+       return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
+}
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+       jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+               // margin is only for outerHeight, outerWidth
+               jQuery.fn[ funcName ] = function( margin, value ) {
+                       var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+                               extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+                       return jQuery.access( this, function( elem, type, value ) {
+                               var doc;
+
+                               if ( jQuery.isWindow( elem ) ) {
+                                       // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+                                       // isn't a whole lot we can do. See pull request at this URL for discussion:
+                                       // https://github.com/jquery/jquery/pull/764
+                                       return elem.document.documentElement[ "client" + name ];
+                               }
+
+                               // Get document width or height
+                               if ( elem.nodeType === 9 ) {
+                                       doc = elem.documentElement;
+
+                                       // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+                                       // whichever is greatest
+                                       return Math.max(
+                                               elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+                                               elem.body[ "offset" + name ], doc[ "offset" + name ],
+                                               doc[ "client" + name ]
+                                       );
+                               }
+
+                               return value === undefined ?
+                                       // Get width or height on the element, requesting but not forcing parseFloat
+                                       jQuery.css( elem, type, extra ) :
+
+                                       // Set width or height on the element
+                                       jQuery.style( elem, type, value, extra );
+                       }, type, chainable ? margin : undefined, chainable, null );
+               };
+       });
+});
+// Limit scope pollution from any deprecated API
+// (function() {
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+       return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+// })();
+if ( typeof module === "object" && module && typeof module.exports === "object" ) {
+       // Expose jQuery as module.exports in loaders that implement the Node
+       // module pattern (including browserify). Do not create the global, since
+       // the user will be storing it themselves locally, and globals are frowned
+       // upon in the Node module world.
+       module.exports = jQuery;
+} else {
+       // Register as a named AMD module, since jQuery can be concatenated with other
+       // files that may use define, but not via a proper concatenation script that
+       // understands anonymous AMD modules. A named AMD is safest and most robust
+       // way to register. Lowercase jquery is used because AMD module names are
+       // derived from file names, and jQuery is normally delivered in a lowercase
+       // file name. Do this after creating the global so that if an AMD module wants
+       // to call noConflict to hide this version of jQuery, it will work.
+       if ( typeof define === "function" && define.amd ) {
+               define( "jquery", [], function () { return jQuery; } );
+       }
+}
+
+// If there is a window object, that at least has a document property,
+// define jQuery and $ identifiers
+if ( typeof window === "object" && typeof window.document === "object" ) {
+       window.jQuery = window.$ = jQuery;
+}
+
+})( window );
deleted file mode 120000 (symlink)
index 73331ffca2af04bb80fd744d48c9768a807a91a2..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1 +0,0 @@
-jquery-2.0.3.min.js
\ No newline at end of file
new file mode 100644 (file)
index 0000000000000000000000000000000000000000..2be209dd2233ed75612f4afcb6cf8816926a1738
--- /dev/null
@@ -0,0 +1,6 @@
+/*! jQuery v2.0.3 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery-2.0.3.min.map
+*/
+(function(e,undefined){var t,n,r=typeof undefined,i=e.location,o=e.document,s=o.documentElement,a=e.jQuery,u=e.$,l={},c=[],p="2.0.3",f=c.concat,h=c.push,d=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,x=function(e,n){return new x.fn.init(e,n,t)},b=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^-ms-/,N=/-([\da-z])/gi,E=function(e,t){return t.toUpperCase()},S=function(){o.removeEventListener("DOMContentLoaded",S,!1),e.removeEventListener("load",S,!1),x.ready()};x.fn=x.prototype={jquery:p,constructor:x,init:function(e,t,n){var r,i;if(!e)return this;if("string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:T.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:o,!0)),C.test(r[1])&&x.isPlainObject(t))for(r in t)x.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=o.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?n.ready(e):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return d.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for("boolean"==typeof s&&(l=s,s=arguments[1]||{},a=2),"object"==typeof s||x.isFunction(s)||(s={}),u===a&&(s=this,--a);u>a;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(x.isPlainObject(r)||(i=x.isArray(r)))?(i?(i=!1,o=n&&x.isArray(n)?n:[]):o=n&&x.isPlainObject(n)?n:{},s[t]=x.extend(l,o,r)):r!==undefined&&(s[t]=r));return s},x.extend({expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=a),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){(e===!0?--x.readyWait:x.isReady)||(x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(o,[x]),x.fn.trigger&&x(o).trigger("ready").off("ready")))},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if("object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(t){return!1}return!0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:JSON.parse,parseXML:function(e){var t,n;if(!e||"string"!=typeof e)return null;try{n=new DOMParser,t=n.parseFromString(e,"text/xml")}catch(r){t=undefined}return(!t||t.getElementsByTagName("parsererror").length)&&x.error("Invalid XML: "+e),t},noop:function(){},globalEval:function(e){var t,n=eval;e=x.trim(e),e&&(1===e.indexOf("use strict")?(t=o.createElement("script"),t.text=e,o.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(k,"ms-").replace(N,E)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,s=j(e);if(n){if(s){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(s){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:function(e){return null==e?"":v.call(e)},makeArray:function(e,t){var n=t||[];return null!=e&&(j(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:g.call(t,e,n)},merge:function(e,t){var n=t.length,r=e.length,i=0;if("number"==typeof n)for(;n>i;i++)e[r++]=t[i];else while(t[i]!==undefined)e[r++]=t[i++];return e.length=r,e},grep:function(e,t,n){var r,i=[],o=0,s=e.length;for(n=!!n;s>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,s=j(e),a=[];if(s)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(a[a.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(a[a.length]=r);return f.apply([],a)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(n=e[t],t=e,e=n),x.isFunction(e)?(r=d.call(arguments,2),i=function(){return e.apply(t||this,r.concat(d.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):undefined},access:function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if("object"===x.type(n)){i=!0;for(a in n)x.access(e,t,a,n[a],!0,o,s)}else if(r!==undefined&&(i=!0,x.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(x(e),n)})),t))for(;u>a;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o},now:Date.now,swap:function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i}}),x.ready.promise=function(t){return n||(n=x.Deferred(),"complete"===o.readyState?setTimeout(x.ready):(o.addEventListener("DOMContentLoaded",S,!1),e.addEventListener("load",S,!1))),n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function j(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}t=x(o),function(e,undefined){var t,n,r,i,o,s,a,u,l,c,p,f,h,d,g,m,y,v="sizzle"+-new Date,b=e.document,w=0,T=0,C=st(),k=st(),N=st(),E=!1,S=function(e,t){return e===t?(E=!0,0):0},j=typeof undefined,D=1<<31,A={}.hasOwnProperty,L=[],q=L.pop,H=L.push,O=L.push,F=L.slice,P=L.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",W="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",$=W.replace("w","w#"),B="\\["+M+"*("+W+")"+M+"*(?:([*^$|!~]?=)"+M+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+$+")|)|)"+M+"*\\]",I=":("+W+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+B.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=RegExp("^"+M+"*,"+M+"*"),X=RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=RegExp(M+"*[+~]"),Y=RegExp("="+M+"*([^\\]'\"]*)"+M+"*\\]","g"),V=RegExp(I),G=RegExp("^"+$+"$"),J={ID:RegExp("^#("+W+")"),CLASS:RegExp("^\\.("+W+")"),TAG:RegExp("^("+W.replace("w","w*")+")"),ATTR:RegExp("^"+B),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:RegExp("^(?:"+R+")$","i"),needsContext:RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Q=/^[^{]+\{\s*\[native \w/,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Z=/^(?:input|select|textarea|button)$/i,et=/^h\d$/i,tt=/'|\\/g,nt=RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),rt=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{O.apply(L=F.call(b.childNodes),b.childNodes),L[b.childNodes.length].nodeType}catch(it){O={apply:L.length?function(e,t){H.apply(e,F.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function ot(e,t,r,i){var o,s,a,u,l,f,g,m,x,w;if((t?t.ownerDocument||t:b)!==p&&c(t),t=t||p,r=r||[],!e||"string"!=typeof e)return r;if(1!==(u=t.nodeType)&&9!==u)return[];if(h&&!i){if(o=K.exec(e))if(a=o[1]){if(9===u){if(s=t.getElementById(a),!s||!s.parentNode)return r;if(s.id===a)return r.push(s),r}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(a))&&y(t,s)&&s.id===a)return r.push(s),r}else{if(o[2])return O.apply(r,t.getElementsByTagName(e)),r;if((a=o[3])&&n.getElementsByClassName&&t.getElementsByClassName)return O.apply(r,t.getElementsByClassName(a)),r}if(n.qsa&&(!d||!d.test(e))){if(m=g=v,x=t,w=9===u&&e,1===u&&"object"!==t.nodeName.toLowerCase()){f=gt(e),(g=t.getAttribute("id"))?m=g.replace(tt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",l=f.length;while(l--)f[l]=m+mt(f[l]);x=U.test(e)&&t.parentNode||t,w=f.join(",")}if(w)try{return O.apply(r,x.querySelectorAll(w)),r}catch(T){}finally{g||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,r,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>i.cacheLength&&delete t[e.shift()],t[n]=r}return t}function at(e){return e[v]=!0,e}function ut(e){var t=p.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function lt(e,t){var n=e.split("|"),r=e.length;while(r--)i.attrHandle[n[r]]=t}function ct(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return at(function(t){return t=+t,at(function(n,r){var i,o=e([],n.length,t),s=o.length;while(s--)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}s=ot.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},n=ot.support={},c=ot.setDocument=function(e){var t=e?e.ownerDocument||e:b,r=t.defaultView;return t!==p&&9===t.nodeType&&t.documentElement?(p=t,f=t.documentElement,h=!s(t),r&&r.attachEvent&&r!==r.top&&r.attachEvent("onbeforeunload",function(){c()}),n.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ut(function(e){return e.appendChild(t.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),n.getById=ut(function(e){return f.appendChild(e).id=v,!t.getElementsByName||!t.getElementsByName(v).length}),n.getById?(i.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){return e.getAttribute("id")===t}}):(delete i.find.ID,i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=n.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==j?t.getElementsByTagName(e):undefined}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.CLASS=n.getElementsByClassName&&function(e,t){return typeof t.getElementsByClassName!==j&&h?t.getElementsByClassName(e):undefined},g=[],d=[],(n.qsa=Q.test(t.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||d.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll(":checked").length||d.push(":checked")}),ut(function(e){var n=t.createElement("input");n.setAttribute("type","hidden"),e.appendChild(n).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&d.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||d.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),d.push(",.*:")})),(n.matchesSelector=Q.test(m=f.webkitMatchesSelector||f.mozMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&ut(function(e){n.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",I)}),d=d.length&&RegExp(d.join("|")),g=g.length&&RegExp(g.join("|")),y=Q.test(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},S=f.compareDocumentPosition?function(e,r){if(e===r)return E=!0,0;var i=r.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(r);return i?1&i||!n.sortDetached&&r.compareDocumentPosition(e)===i?e===t||y(b,e)?-1:r===t||y(b,r)?1:l?P.call(l,e)-P.call(l,r):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,n){var r,i=0,o=e.parentNode,s=n.parentNode,a=[e],u=[n];if(e===n)return E=!0,0;if(!o||!s)return e===t?-1:n===t?1:o?-1:s?1:l?P.call(l,e)-P.call(l,n):0;if(o===s)return ct(e,n);r=e;while(r=r.parentNode)a.unshift(r);r=n;while(r=r.parentNode)u.unshift(r);while(a[i]===u[i])i++;return i?ct(a[i],u[i]):a[i]===b?-1:u[i]===b?1:0},t):p},ot.matches=function(e,t){return ot(e,null,null,t)},ot.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Y,"='$1']"),!(!n.matchesSelector||!h||g&&g.test(t)||d&&d.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return ot(t,p,null,[e]).length>0},ot.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},ot.attr=function(e,t){(e.ownerDocument||e)!==p&&c(e);var r=i.attrHandle[t.toLowerCase()],o=r&&A.call(i.attrHandle,t.toLowerCase())?r(e,t,!h):undefined;return o===undefined?n.attributes||!h?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null:o},ot.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},ot.uniqueSort=function(e){var t,r=[],i=0,o=0;if(E=!n.detectDuplicates,l=!n.sortStable&&e.slice(0),e.sort(S),E){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return e},o=ot.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=ot.selectors={cacheLength:50,createPseudo:at,match:J,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(nt,rt),e[3]=(e[4]||e[5]||"").replace(nt,rt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ot.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ot.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return J.CHILD.test(e[0])?null:(e[3]&&e[4]!==undefined?e[2]=e[4]:n&&V.test(n)&&(t=gt(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(nt,rt).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+" "];return t||(t=RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&C(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=ot.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,h,d,g=o!==s?"nextSibling":"previousSibling",m=t.parentNode,y=a&&t.nodeName.toLowerCase(),x=!u&&!a;if(m){if(o){while(g){p=t;while(p=p[g])if(a?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&x){c=m[v]||(m[v]={}),l=c[e]||[],h=l[0]===w&&l[1],f=l[0]===w&&l[2],p=h&&m.childNodes[h];while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[w,h,f];break}}else if(x&&(l=(t[v]||(t[v]={}))[e])&&l[0]===w)f=l[1];else while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if((a?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(x&&((p[v]||(p[v]={}))[e]=[w,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||ot.error("unsupported pseudo: "+e);return r[v]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?at(function(e,n){var i,o=r(e,t),s=o.length;while(s--)i=P.call(e,o[s]),e[i]=!(n[i]=o[s])}):function(e){return r(e,0,n)}):r}},pseudos:{not:at(function(e){var t=[],n=[],r=a(e.replace(z,"$1"));return r[v]?at(function(e,t,n,i){var o,s=r(e,null,i,[]),a=e.length;while(a--)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:at(function(e){return function(t){return ot(e,t).length>0}}),contains:at(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:at(function(e){return G.test(e||"")||ot.error("unsupported lang: "+e),e=e.replace(nt,rt).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return et.test(e.nodeName)},input:function(e){return Z.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},i.pseudos.nth=i.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[t]=pt(t);for(t in{submit:!0,reset:!0})i.pseudos[t]=ft(t);function dt(){}dt.prototype=i.filters=i.pseudos,i.setFilters=new dt;function gt(e,t){var n,r,o,s,a,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);a=e,u=[],l=i.preFilter;while(a){(!n||(r=_.exec(a)))&&(r&&(a=a.slice(r[0].length)||a),u.push(o=[])),n=!1,(r=X.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(z," ")}),a=a.slice(n.length));for(s in i.filter)!(r=J[s].exec(a))||l[s]&&!(r=l[s](r))||(n=r.shift(),o.push({value:n,type:s,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?ot.error(e):k(e,u).slice(0)}function mt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function yt(e,t,n){var i=t.dir,o=n&&"parentNode"===i,s=T++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,a){var u,l,c,p=w+" "+s;if(a){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,a))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[v]||(t[v]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,a)||r,l[1]===!0)return!0}}function vt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,s=[],a=0,u=e.length,l=null!=t;for(;u>a;a++)(o=e[a])&&(!n||n(o,r,i))&&(s.push(o),l&&t.push(a));return s}function bt(e,t,n,r,i,o){return r&&!r[v]&&(r=bt(r)),i&&!i[v]&&(i=bt(i,o)),at(function(o,s,a,u){var l,c,p,f=[],h=[],d=s.length,g=o||Ct(t||"*",a.nodeType?[a]:a,[]),m=!e||!o&&t?g:xt(g,f,e,a,u),y=n?i||(o?e:d||r)?[]:s:m;if(n&&n(m,y,a,u),r){l=xt(y,h),r(l,[],a,u),c=l.length;while(c--)(p=l[c])&&(y[h[c]]=!(m[h[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?P.call(o,p):f[c])>-1&&(o[l]=!(s[l]=p))}}else y=xt(y===s?y.splice(d,y.length):y),i?i(null,s,y,u):O.apply(s,y)})}function wt(e){var t,n,r,o=e.length,s=i.relative[e[0].type],a=s||i.relative[" "],l=s?1:0,c=yt(function(e){return e===t},a,!0),p=yt(function(e){return P.call(t,e)>-1},a,!0),f=[function(e,n,r){return!s&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>l;l++)if(n=i.relative[e[l].type])f=[yt(vt(f),n)];else{if(n=i.filter[e[l].type].apply(null,e[l].matches),n[v]){for(r=++l;o>r;r++)if(i.relative[e[r].type])break;return bt(l>1&&vt(f),l>1&&mt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&wt(e.slice(l,r)),o>r&&wt(e=e.slice(r)),o>r&&mt(e))}f.push(n)}return vt(f)}function Tt(e,t){var n=0,o=t.length>0,s=e.length>0,a=function(a,l,c,f,h){var d,g,m,y=[],v=0,x="0",b=a&&[],T=null!=h,C=u,k=a||s&&i.find.TAG("*",h&&l.parentNode||l),N=w+=null==C?1:Math.random()||.1;for(T&&(u=l!==p&&l,r=n);null!=(d=k[x]);x++){if(s&&d){g=0;while(m=e[g++])if(m(d,l,c)){f.push(d);break}T&&(w=N,r=++n)}o&&((d=!m&&d)&&v--,a&&b.push(d))}if(v+=x,o&&x!==v){g=0;while(m=t[g++])m(b,y,l,c);if(a){if(v>0)while(x--)b[x]||y[x]||(y[x]=q.call(f));y=xt(y)}O.apply(f,y),T&&!a&&y.length>0&&v+t.length>1&&ot.uniqueSort(f)}return T&&(w=N,u=C),b};return o?at(a):a}a=ot.compile=function(e,t){var n,r=[],i=[],o=N[e+" "];if(!o){t||(t=gt(e)),n=t.length;while(n--)o=wt(t[n]),o[v]?r.push(o):i.push(o);o=N(e,Tt(i,r))}return o};function Ct(e,t,n){var r=0,i=t.length;for(;i>r;r++)ot(e,t[r],n);return n}function kt(e,t,r,o){var s,u,l,c,p,f=gt(e);if(!o&&1===f.length){if(u=f[0]=f[0].slice(0),u.length>2&&"ID"===(l=u[0]).type&&n.getById&&9===t.nodeType&&h&&i.relative[u[1].type]){if(t=(i.find.ID(l.matches[0].replace(nt,rt),t)||[])[0],!t)return r;e=e.slice(u.shift().value.length)}s=J.needsContext.test(e)?0:u.length;while(s--){if(l=u[s],i.relative[c=l.type])break;if((p=i.find[c])&&(o=p(l.matches[0].replace(nt,rt),U.test(u[0].type)&&t.parentNode||t))){if(u.splice(s,1),e=o.length&&mt(u),!e)return O.apply(r,o),r;break}}}return a(e,f)(o,t,!h,r,U.test(e)),r}n.sortStable=v.split("").sort(S).join("")===v,n.detectDuplicates=E,c(),n.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(p.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||lt("type|href|height|width",function(e,t,n){return n?undefined:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||lt("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?undefined:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||lt(R,function(e,t,n){var r;return n?undefined:(r=e.getAttributeNode(t))&&r.specified?r.value:e[t]===!0?t.toLowerCase():null}),x.find=ot,x.expr=ot.selectors,x.expr[":"]=x.expr.pseudos,x.unique=ot.uniqueSort,x.text=ot.getText,x.isXMLDoc=ot.isXML,x.contains=ot.contains}(e);var D={};function A(e){var t=D[e]={};return x.each(e.match(w)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?D[e]||A(e):x.extend({},e);var t,n,r,i,o,s,a=[],u=!e.once&&[],l=function(p){for(t=e.memory&&p,n=!0,s=i||0,i=0,o=a.length,r=!0;a&&o>s;s++)if(a[s].apply(p[0],p[1])===!1&&e.stopOnFalse){t=!1;break}r=!1,a&&(u?u.length&&l(u.shift()):t?a=[]:c.disable())},c={add:function(){if(a){var n=a.length;(function s(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==r&&s(n)})})(arguments),r?o=a.length:t&&(i=n,l(t))}return this},remove:function(){return a&&x.each(arguments,function(e,t){var n;while((n=x.inArray(t,a,n))>-1)a.splice(n,1),r&&(o>=n&&o--,s>=n&&s--)}),this},has:function(e){return e?x.inArray(e,a)>-1:!(!a||!a.length)},empty:function(){return a=[],o=0,this},disable:function(){return a=u=t=undefined,this},disabled:function(){return!a},lock:function(){return u=undefined,t||c.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!a||n&&!u||(t=t||[],t=[e,t.slice?t.slice():t],r?u.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!n}};return c},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var s=o[0],a=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=d.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),s=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?d.call(arguments):r,n===a?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},a,u,l;if(r>1)for(a=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(s(t,l,n)).fail(o.reject).progress(s(t,u,a)):--i;return i||o.resolveWith(l,n),o.promise()}}),x.support=function(t){var n=o.createElement("input"),r=o.createDocumentFragment(),i=o.createElement("div"),s=o.createElement("select"),a=s.appendChild(o.createElement("option"));return n.type?(n.type="checkbox",t.checkOn=""!==n.value,t.optSelected=a.selected,t.reliableMarginRight=!0,t.boxSizingReliable=!0,t.pixelPosition=!1,n.checked=!0,t.noCloneChecked=n.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!a.disabled,n=o.createElement("input"),n.value="t",n.type="radio",t.radioValue="t"===n.value,n.setAttribute("checked","t"),n.setAttribute("name","t"),r.appendChild(n),t.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,t.focusinBubbles="onfocusin"in e,i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===i.style.backgroundClip,x(function(){var n,r,s="padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",a=o.getElementsByTagName("body")[0];a&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",a.appendChild(n).appendChild(i),i.innerHTML="",i.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%",x.swap(a,null!=a.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===i.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(i,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(i,null)||{width:"4px"}).width,r=i.appendChild(o.createElement("div")),r.style.cssText=i.style.cssText=s,r.style.marginRight=r.style.width="0",i.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),a.removeChild(n))}),t):t}({});var L,q,H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,O=/([A-Z])/g;function F(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=x.expando+Math.random()}F.uid=1,F.accepts=function(e){return e.nodeType?1===e.nodeType||9===e.nodeType:!0},F.prototype={key:function(e){if(!F.accepts(e))return 0;var t={},n=e[this.expando];if(!n){n=F.uid++;try{t[this.expando]={value:n},Object.defineProperties(e,t)}catch(r){t[this.expando]=n,x.extend(e,t)}}return this.cache[n]||(this.cache[n]={}),n},set:function(e,t,n){var r,i=this.key(e),o=this.cache[i];if("string"==typeof t)o[t]=n;else if(x.isEmptyObject(o))x.extend(this.cache[i],t);else for(r in t)o[r]=t[r];return o},get:function(e,t){var n=this.cache[this.key(e)];return t===undefined?n:n[t]},access:function(e,t,n){var r;return t===undefined||t&&"string"==typeof t&&n===undefined?(r=this.get(e,t),r!==undefined?r:this.get(e,x.camelCase(t))):(this.set(e,t,n),n!==undefined?n:t)},remove:function(e,t){var n,r,i,o=this.key(e),s=this.cache[o];if(t===undefined)this.cache[o]={};else{x.isArray(t)?r=t.concat(t.map(x.camelCase)):(i=x.camelCase(t),t in s?r=[t,i]:(r=i,r=r in s?[r]:r.match(w)||[])),n=r.length;while(n--)delete s[r[n]]}},hasData:function(e){return!x.isEmptyObject(this.cache[e[this.expando]]||{})},discard:function(e){e[this.expando]&&delete this.cache[e[this.expando]]}},L=new F,q=new F,x.extend({acceptData:F.accepts,hasData:function(e){return L.hasData(e)||q.hasData(e)},data:function(e,t,n){return L.access(e,t,n)},removeData:function(e,t){L.remove(e,t)},_data:function(e,t,n){return q.access(e,t,n)},_removeData:function(e,t){q.remove(e,t)}}),x.fn.extend({data:function(e,t){var n,r,i=this[0],o=0,s=null;if(e===undefined){if(this.length&&(s=L.get(i),1===i.nodeType&&!q.get(i,"hasDataAttrs"))){for(n=i.attributes;n.length>o;o++)r=n[o].name,0===r.indexOf("data-")&&(r=x.camelCase(r.slice(5)),P(i,r,s[r]));q.set(i,"hasDataAttrs",!0)}return s}return"object"==typeof e?this.each(function(){L.set(this,e)}):x.access(this,function(t){var n,r=x.camelCase(e);if(i&&t===undefined){if(n=L.get(i,e),n!==undefined)return n;if(n=L.get(i,r),n!==undefined)return n;if(n=P(i,r,undefined),n!==undefined)return n}else this.each(function(){var n=L.get(this,r);L.set(this,r,t),-1!==e.indexOf("-")&&n!==undefined&&L.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){L.remove(this,e)})}});function P(e,t,n){var r;if(n===undefined&&1===e.nodeType)if(r="data-"+t.replace(O,"-$1").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:H.test(n)?JSON.parse(n):n}catch(i){}L.set(e,t,n)}else n=undefined;return n}x.extend({queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=q.get(e,t),n&&(!r||x.isArray(n)?r=q.access(e,t,x.makeArray(n)):r.push(n)),r||[]):undefined},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),s=function(){x.dequeue(e,t)
+};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return q.get(e,n)||q.access(e,n,{empty:x.Callbacks("once memory").add(function(){q.remove(e,[t+"queue",n])})})}}),x.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),n>arguments.length?x.queue(this[0],e):t===undefined?this:this.each(function(){var n=x.queue(this,e,t);x._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=x.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=undefined),e=e||"fx";while(s--)n=q.get(o[s],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var R,M,W=/[\t\r\n\f]/g,$=/\r/g,B=/^(?:input|select|textarea|button)$/i;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[x.propFix[e]||e]})},addClass:function(e){var t,n,r,i,o,s=0,a=this.length,u="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,s=0,a=this.length,u=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,i=0,o=x(this),s=e.match(w)||[];while(t=s[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===r||"boolean"===n)&&(this.className&&q.set(this,"__className__",this.className),this.className=this.className||e===!1?"":q.get(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(W," ").indexOf(t)>=0)return!0;return!1},val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=x.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,x(this).val()):e,null==i?i="":"number"==typeof i?i+="":x.isArray(i)&&(i=x.map(i,function(e){return null==e?"":e+""})),t=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&t.set(this,i,"value")!==undefined||(this.value=i))});if(i)return t=x.valHooks[i.type]||x.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&(n=t.get(i,"value"))!==undefined?n:(n=i.value,"string"==typeof n?n.replace($,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,s=o?null:[],a=o?i+1:r.length,u=0>i?a:o?i:0;for(;a>u;u++)if(n=r[u],!(!n.selected&&u!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),s=i.length;while(s--)r=i[s],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,t,n){var i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===r?x.prop(e,t,n):(1===s&&x.isXMLDoc(e)||(t=t.toLowerCase(),i=x.attrHooks[t]||(x.expr.match.bool.test(t)?M:R)),n===undefined?i&&"get"in i&&null!==(o=i.get(e,t))?o:(o=x.find.attr(e,t),null==o?undefined:o):null!==n?i&&"set"in i&&(o=i.set(e,n,t))!==undefined?o:(e.setAttribute(t,n+""),n):(x.removeAttr(e,t),undefined))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return o=1!==s||!x.isXMLDoc(e),o&&(t=x.propFix[t]||t,i=x.propHooks[t]),n!==undefined?i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){return e.hasAttribute("tabindex")||B.test(e.nodeName)||e.href?e.tabIndex:-1}}}}),M={set:function(e,t,n){return t===!1?x.removeAttr(e,n):e.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,t){var n=x.expr.attrHandle[t]||x.find.attr;x.expr.attrHandle[t]=function(e,t,r){var i=x.expr.attrHandle[t],o=r?undefined:(x.expr.attrHandle[t]=undefined)!=n(e,t,r)?t.toLowerCase():null;return x.expr.attrHandle[t]=i,o}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,t){return x.isArray(t)?e.checked=x.inArray(x(e).val(),t)>=0:undefined}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var I=/^key/,z=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,X=/^([^.]*)(?:\.(.+)|)$/;function U(){return!0}function Y(){return!1}function V(){try{return o.activeElement}catch(e){}}x.event={global:{},add:function(e,t,n,i,o){var s,a,u,l,c,p,f,h,d,g,m,y=q.get(e);if(y){n.handler&&(s=n,n=s.handler,o=s.selector),n.guid||(n.guid=x.guid++),(l=y.events)||(l=y.events={}),(a=y.handle)||(a=y.handle=function(e){return typeof x===r||e&&x.event.triggered===e.type?undefined:x.event.dispatch.apply(a.elem,arguments)},a.elem=e),t=(t||"").match(w)||[""],c=t.length;while(c--)u=X.exec(t[c])||[],d=m=u[1],g=(u[2]||"").split(".").sort(),d&&(f=x.event.special[d]||{},d=(o?f.delegateType:f.bindType)||d,f=x.event.special[d]||{},p=x.extend({type:d,origType:m,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:g.join(".")},s),(h=l[d])||(h=l[d]=[],h.delegateCount=0,f.setup&&f.setup.call(e,i,g,a)!==!1||e.addEventListener&&e.addEventListener(d,a,!1)),f.add&&(f.add.call(e,p),p.handler.guid||(p.handler.guid=n.guid)),o?h.splice(h.delegateCount++,0,p):h.push(p),x.event.global[d]=!0);e=null}},remove:function(e,t,n,r,i){var o,s,a,u,l,c,p,f,h,d,g,m=q.hasData(e)&&q.get(e);if(m&&(u=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(a=X.exec(t[l])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){p=x.event.special[h]||{},h=(r?p.delegateType:p.bindType)||h,f=u[h]||[],a=a[2]&&RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=f.length;while(o--)c=f[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(f.splice(o,1),c.selector&&f.delegateCount--,p.remove&&p.remove.call(e,c));s&&!f.length&&(p.teardown&&p.teardown.call(e,d,m.handle)!==!1||x.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)x.event.remove(e,h+t[l],n,r,!0);x.isEmptyObject(u)&&(delete m.handle,q.remove(e,"events"))}},trigger:function(t,n,r,i){var s,a,u,l,c,p,f,h=[r||o],d=y.call(t,"type")?t.type:t,g=y.call(t,"namespace")?t.namespace.split("."):[];if(a=u=r=r||o,3!==r.nodeType&&8!==r.nodeType&&!_.test(d+x.event.triggered)&&(d.indexOf(".")>=0&&(g=d.split("."),d=g.shift(),g.sort()),c=0>d.indexOf(":")&&"on"+d,t=t[x.expando]?t:new x.Event(d,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=g.join("."),t.namespace_re=t.namespace?RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=undefined,t.target||(t.target=r),n=null==n?[t]:x.makeArray(n,[t]),f=x.event.special[d]||{},i||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!i&&!f.noBubble&&!x.isWindow(r)){for(l=f.delegateType||d,_.test(l+d)||(a=a.parentNode);a;a=a.parentNode)h.push(a),u=a;u===(r.ownerDocument||o)&&h.push(u.defaultView||u.parentWindow||e)}s=0;while((a=h[s++])&&!t.isPropagationStopped())t.type=s>1?l:f.bindType||d,p=(q.get(a,"events")||{})[t.type]&&q.get(a,"handle"),p&&p.apply(a,n),p=c&&a[c],p&&x.acceptData(a)&&p.apply&&p.apply(a,n)===!1&&t.preventDefault();return t.type=d,i||t.isDefaultPrevented()||f._default&&f._default.apply(h.pop(),n)!==!1||!x.acceptData(r)||c&&x.isFunction(r[d])&&!x.isWindow(r)&&(u=r[c],u&&(r[c]=null),x.event.triggered=d,r[d](),x.event.triggered=undefined,u&&(r[c]=u)),t.result}},dispatch:function(e){e=x.event.fix(e);var t,n,r,i,o,s=[],a=d.call(arguments),u=(q.get(this,"events")||{})[e.type]||[],l=x.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),t=0;while((i=s[t++])&&!e.isPropagationStopped()){e.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(o.namespace))&&(e.handleObj=o,e.data=o.data,r=((x.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),r!==undefined&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!==this;u=u.parentNode||this)if(u.disabled!==!0||"click"!==e.type){for(r=[],n=0;a>n;n++)o=t[n],i=o.selector+" ",r[i]===undefined&&(r[i]=o.needsContext?x(i,this).index(u)>=0:x.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return t.length>a&&s.push({elem:this,handlers:t.slice(a)}),s},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,s=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||o,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||s===undefined||(e.which=1&s?1:2&s?3:4&s?2:0),e}},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,s=e,a=this.fixHooks[i];a||(this.fixHooks[i]=a=z.test(i)?this.mouseHooks:I.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new x.Event(s),t=r.length;while(t--)n=r[t],e[n]=s[n];return e.target||(e.target=o),3===e.target.nodeType&&(e.target=e.target.parentNode),a.filter?a.filter(e,s):e},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==V()&&this.focus?(this.focus(),!1):undefined},delegateType:"focusin"},blur:{trigger:function(){return this===V()&&this.blur?(this.blur(),!1):undefined},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&x.nodeName(this,"input")?(this.click(),!1):undefined},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)},x.Event=function(e,t){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.getPreventDefault&&e.getPreventDefault()?U:Y):this.type=e,t&&x.extend(this,t),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,undefined):new x.Event(e,t)},x.Event.prototype={isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=U,e&&e.preventDefault&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=U,e&&e.stopPropagation&&e.stopPropagation()},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=U,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,t,n,r,i){var o,s;if("object"==typeof e){"string"!=typeof t&&(n=n||t,t=undefined);for(s in e)this.on(s,t,n,e[s],i);return this}if(null==n&&null==r?(r=t,n=t=undefined):null==r&&("string"==typeof t?(r=n,n=undefined):(r=n,n=t,t=undefined)),r===!1)r=Y;else if(!r)return this;return 1===i&&(o=r,r=function(e){return x().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=x.guid++)),this.each(function(){x.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,x(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||"function"==typeof t)&&(n=t,t=undefined),n===!1&&(n=Y),this.each(function(){x.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?x.event.trigger(e,t,n,!0):undefined}});var G=/^.[^:#\[\.,]*$/,J=/^(?:parents|prev(?:Until|All))/,Q=x.expr.match.needsContext,K={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t=x(e,this),n=t.length;return this.filter(function(){var e=0;for(;n>e;e++)if(x.contains(this,t[e]))return!0})},not:function(e){return this.pushStack(et(this,e||[],!0))},filter:function(e){return this.pushStack(et(this,e||[],!1))},is:function(e){return!!et(this,"string"==typeof e&&Q.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],s=Q.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(s?s.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?g.call(x(e),this[0]):g.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function Z(e,t){while((e=e[t])&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return Z(e,"nextSibling")},prev:function(e){return Z(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return e.contentDocument||x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(K[e]||x.unique(i),J.test(e)&&i.reverse()),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,t,n){var r=[],i=n!==undefined;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&x(e).is(n))break;r.push(e)}return r},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function et(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(G.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return g.call(t,e)>=0!==n})}var tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,nt=/<([\w:]+)/,rt=/<|&#?\w+;/,it=/<(?:script|style|link)/i,ot=/^(?:checkbox|radio)$/i,st=/checked\s*(?:[^=]|=\s*.checked.)/i,at=/^$|\/(?:java|ecma)script/i,ut=/^true\/(.*)/,lt=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ct={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ct.optgroup=ct.option,ct.tbody=ct.tfoot=ct.colgroup=ct.caption=ct.thead,ct.th=ct.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===undefined?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(mt(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&dt(mt(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++)1===e.nodeType&&(x.cleanData(mt(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!it.test(e)&&!ct[(nt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(tt,"<$1></$2>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(x.cleanData(mt(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=f.apply([],e);var r,i,o,s,a,u,l=0,c=this.length,p=this,h=c-1,d=e[0],g=x.isFunction(d);if(g||!(1>=c||"string"!=typeof d||x.support.checkClone)&&st.test(d))return this.each(function(r){var i=p.eq(r);g&&(e[0]=d.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(r=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),i=r.firstChild,1===r.childNodes.length&&(r=i),i)){for(o=x.map(mt(r,"script"),ft),s=o.length;c>l;l++)a=r,l!==h&&(a=x.clone(a,!0,!0),s&&x.merge(o,mt(a,"script"))),t.call(this[l],a,l);if(s)for(u=o[o.length-1].ownerDocument,x.map(o,ht),l=0;s>l;l++)a=o[l],at.test(a.type||"")&&!q.access(a,"globalEval")&&x.contains(u,a)&&(a.src?x._evalUrl(a.src):x.globalEval(a.textContent.replace(lt,"")))}return this}}),x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=[],i=x(e),o=i.length-1,s=0;for(;o>=s;s++)n=s===o?this:this.clone(!0),x(i[s])[t](n),h.apply(r,n.get());return this.pushStack(r)}}),x.extend({clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=x.contains(e.ownerDocument,e);if(!(x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(s=mt(a),o=mt(e),r=0,i=o.length;i>r;r++)yt(o[r],s[r]);if(t)if(n)for(o=o||mt(e),s=s||mt(a),r=0,i=o.length;i>r;r++)gt(o[r],s[r]);else gt(e,a);return s=mt(a,"script"),s.length>0&&dt(s,!u&&mt(e,"script")),a},buildFragment:function(e,t,n,r){var i,o,s,a,u,l,c=0,p=e.length,f=t.createDocumentFragment(),h=[];for(;p>c;c++)if(i=e[c],i||0===i)if("object"===x.type(i))x.merge(h,i.nodeType?[i]:i);else if(rt.test(i)){o=o||f.appendChild(t.createElement("div")),s=(nt.exec(i)||["",""])[1].toLowerCase(),a=ct[s]||ct._default,o.innerHTML=a[1]+i.replace(tt,"<$1></$2>")+a[2],l=a[0];while(l--)o=o.lastChild;x.merge(h,o.childNodes),o=f.firstChild,o.textContent=""}else h.push(t.createTextNode(i));f.textContent="",c=0;while(i=h[c++])if((!r||-1===x.inArray(i,r))&&(u=x.contains(i.ownerDocument,i),o=mt(f.appendChild(i),"script"),u&&dt(o),n)){l=0;while(i=o[l++])at.test(i.type||"")&&n.push(i)}return f},cleanData:function(e){var t,n,r,i,o,s,a=x.event.special,u=0;for(;(n=e[u])!==undefined;u++){if(F.accepts(n)&&(o=n[q.expando],o&&(t=q.cache[o]))){if(r=Object.keys(t.events||{}),r.length)for(s=0;(i=r[s])!==undefined;s++)a[i]?x.event.remove(n,i):x.removeEvent(n,i,t.handle);q.cache[o]&&delete q.cache[o]}delete L.cache[n[L.expando]]}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}});function pt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function ft(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function ht(e){var t=ut.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function dt(e,t){var n=e.length,r=0;for(;n>r;r++)q.set(e[r],"globalEval",!t||q.get(t[r],"globalEval"))}function gt(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(q.hasData(e)&&(o=q.access(e),s=q.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)x.event.add(t,i,l[i][n])}L.hasData(e)&&(a=L.access(e),u=x.extend({},a),L.set(t,u))}}function mt(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||"*"):e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x.nodeName(e,t)?x.merge([e],n):n}function yt(e,t){var n=t.nodeName.toLowerCase();"input"===n&&ot.test(e.type)?t.checked=e.checked:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}x.fn.extend({wrapAll:function(e){var t;return x.isFunction(e)?this.each(function(t){x(this).wrapAll(e.call(this,t))}):(this[0]&&(t=x(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var vt,xt,bt=/^(none|table(?!-c[ea]).+)/,wt=/^margin/,Tt=RegExp("^("+b+")(.*)$","i"),Ct=RegExp("^("+b+")(?!px)[a-z%]+$","i"),kt=RegExp("^([+-])=("+b+")","i"),Nt={BODY:"block"},Et={position:"absolute",visibility:"hidden",display:"block"},St={letterSpacing:0,fontWeight:400},jt=["Top","Right","Bottom","Left"],Dt=["Webkit","O","Moz","ms"];function At(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Dt.length;while(i--)if(t=Dt[i]+n,t in e)return t;return r}function Lt(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function qt(t){return e.getComputedStyle(t,null)}function Ht(e,t){var n,r,i,o=[],s=0,a=e.length;for(;a>s;s++)r=e[s],r.style&&(o[s]=q.get(r,"olddisplay"),n=r.style.display,t?(o[s]||"none"!==n||(r.style.display=""),""===r.style.display&&Lt(r)&&(o[s]=q.access(r,"olddisplay",Rt(r.nodeName)))):o[s]||(i=Lt(r),(n&&"none"!==n||!i)&&q.set(r,"olddisplay",i?n:x.css(r,"display"))));for(s=0;a>s;s++)r=e[s],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[s]||"":"none"));return e}x.fn.extend({css:function(e,t){return x.access(this,function(e,t,n){var r,i,o={},s=0;if(x.isArray(t)){for(r=qt(e),i=t.length;i>s;s++)o[t[s]]=x.css(e,t[s],!1,r);return o}return n!==undefined?x.style(e,t,n):x.css(e,t)},e,t,arguments.length>1)},show:function(){return Ht(this,!0)},hide:function(){return Ht(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Lt(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=vt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=x.camelCase(t),u=e.style;return t=x.cssProps[a]||(x.cssProps[a]=At(u,a)),s=x.cssHooks[t]||x.cssHooks[a],n===undefined?s&&"get"in s&&(i=s.get(e,!1,r))!==undefined?i:u[t]:(o=typeof n,"string"===o&&(i=kt.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(x.css(e,t)),o="number"),null==n||"number"===o&&isNaN(n)||("number"!==o||x.cssNumber[a]||(n+="px"),x.support.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&(n=s.set(e,n,r))===undefined||(u[t]=n)),undefined)}},css:function(e,t,n,r){var i,o,s,a=x.camelCase(t);return t=x.cssProps[a]||(x.cssProps[a]=At(e.style,a)),s=x.cssHooks[t]||x.cssHooks[a],s&&"get"in s&&(i=s.get(e,!0,n)),i===undefined&&(i=vt(e,t,r)),"normal"===i&&t in St&&(i=St[t]),""===n||n?(o=parseFloat(i),n===!0||x.isNumeric(o)?o||0:i):i}}),vt=function(e,t,n){var r,i,o,s=n||qt(e),a=s?s.getPropertyValue(t)||s[t]:undefined,u=e.style;return s&&(""!==a||x.contains(e.ownerDocument,e)||(a=x.style(e,t)),Ct.test(a)&&wt.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=s.width,u.width=r,u.minWidth=i,u.maxWidth=o)),a};function Ot(e,t,n){var r=Tt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Ft(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;for(;4>o;o+=2)"margin"===n&&(s+=x.css(e,n+jt[o],!0,i)),r?("content"===n&&(s-=x.css(e,"padding"+jt[o],!0,i)),"margin"!==n&&(s-=x.css(e,"border"+jt[o]+"Width",!0,i))):(s+=x.css(e,"padding"+jt[o],!0,i),"padding"!==n&&(s+=x.css(e,"border"+jt[o]+"Width",!0,i)));return s}function Pt(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=qt(e),s=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=vt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Ct.test(i))return i;r=s&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+Ft(e,t,n||(s?"border":"content"),r,o)+"px"}function Rt(e){var t=o,n=Nt[e];return n||(n=Mt(e,t),"none"!==n&&n||(xt=(xt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(xt[0].contentWindow||xt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=Mt(e,t),xt.detach()),Nt[e]=n),n}function Mt(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,t){x.cssHooks[t]={get:function(e,n,r){return n?0===e.offsetWidth&&bt.test(x.css(e,"display"))?x.swap(e,Et,function(){return Pt(e,t,r)}):Pt(e,t,r):undefined},set:function(e,n,r){var i=r&&qt(e);return Ot(e,n,r?Ft(e,t,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,t){return t?x.swap(e,{display:"inline-block"},vt,[e,"marginRight"]):undefined}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,t){x.cssHooks[t]={get:function(e,n){return n?(n=vt(e,t),Ct.test(n)?x(e).position()[t]+"px":n):undefined}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+jt[r]+t]=o[r]||o[r-2]||o[0];return i}},wt.test(e)||(x.cssHooks[e+t].set=Ot)});var Wt=/%20/g,$t=/\[\]$/,Bt=/\r?\n/g,It=/^(?:submit|button|image|reset|file)$/i,zt=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&zt.test(this.nodeName)&&!It.test(e)&&(this.checked||!ot.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(Bt,"\r\n")}}):{name:t.name,value:n.replace(Bt,"\r\n")}}).get()}}),x.param=function(e,t){var n,r=[],i=function(e,t){t=x.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(t===undefined&&(t=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){i(this.name,this.value)});else for(n in e)_t(n,e[n],t,i);return r.join("&").replace(Wt,"+")};function _t(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||$t.test(e)?r(e,i):_t(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)_t(e+"["+i+"]",t[i],n,r)}x.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(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)
+},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var Xt,Ut,Yt=x.now(),Vt=/\?/,Gt=/#.*$/,Jt=/([?&])_=[^&]*/,Qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Kt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Zt=/^(?:GET|HEAD)$/,en=/^\/\//,tn=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,nn=x.fn.load,rn={},on={},sn="*/".concat("*");try{Ut=i.href}catch(an){Ut=o.createElement("a"),Ut.href="",Ut=Ut.href}Xt=tn.exec(Ut.toLowerCase())||[];function un(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function ln(e,t,n,r){var i={},o=e===on;function s(a){var u;return i[a]=!0,x.each(e[a]||[],function(e,a){var l=a(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):undefined:(t.dataTypes.unshift(l),s(l),!1)}),u}return s(t.dataTypes[0])||!i["*"]&&s("*")}function cn(e,t){var n,r,i=x.ajaxSettings.flatOptions||{};for(n in t)t[n]!==undefined&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,t,n){if("string"!=typeof e&&nn)return nn.apply(this,arguments);var r,i,o,s=this,a=e.indexOf(" ");return a>=0&&(r=e.slice(a),e=e.slice(0,a)),x.isFunction(t)?(n=t,t=undefined):t&&"object"==typeof t&&(i="POST"),s.length>0&&x.ajax({url:e,type:i,dataType:"html",data:t}).done(function(e){o=arguments,s.html(r?x("<div>").append(x.parseHTML(e)).find(r):e)}).complete(n&&function(e,t){s.each(n,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ut,type:"GET",isLocal:Kt.test(Xt[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":sn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?cn(cn(e,x.ajaxSettings),t):cn(x.ajaxSettings,e)},ajaxPrefilter:un(rn),ajaxTransport:un(on),ajax:function(e,t){"object"==typeof e&&(t=e,e=undefined),t=t||{};var n,r,i,o,s,a,u,l,c=x.ajaxSetup({},t),p=c.context||c,f=c.context&&(p.nodeType||p.jquery)?x(p):x.event,h=x.Deferred(),d=x.Callbacks("once memory"),g=c.statusCode||{},m={},y={},v=0,b="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===v){if(!o){o={};while(t=Qt.exec(i))o[t[1].toLowerCase()]=t[2]}t=o[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===v?i:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return v||(e=y[n]=y[n]||e,m[e]=t),this},overrideMimeType:function(e){return v||(c.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>v)for(t in e)g[t]=[g[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||b;return n&&n.abort(t),k(0,t),this}};if(h.promise(T).complete=d.add,T.success=T.done,T.error=T.fail,c.url=((e||c.url||Ut)+"").replace(Gt,"").replace(en,Xt[1]+"//"),c.type=t.method||t.type||c.method||c.type,c.dataTypes=x.trim(c.dataType||"*").toLowerCase().match(w)||[""],null==c.crossDomain&&(a=tn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===Xt[1]&&a[2]===Xt[2]&&(a[3]||("http:"===a[1]?"80":"443"))===(Xt[3]||("http:"===Xt[1]?"80":"443")))),c.data&&c.processData&&"string"!=typeof c.data&&(c.data=x.param(c.data,c.traditional)),ln(rn,c,t,T),2===v)return T;u=c.global,u&&0===x.active++&&x.event.trigger("ajaxStart"),c.type=c.type.toUpperCase(),c.hasContent=!Zt.test(c.type),r=c.url,c.hasContent||(c.data&&(r=c.url+=(Vt.test(r)?"&":"?")+c.data,delete c.data),c.cache===!1&&(c.url=Jt.test(r)?r.replace(Jt,"$1_="+Yt++):r+(Vt.test(r)?"&":"?")+"_="+Yt++)),c.ifModified&&(x.lastModified[r]&&T.setRequestHeader("If-Modified-Since",x.lastModified[r]),x.etag[r]&&T.setRequestHeader("If-None-Match",x.etag[r])),(c.data&&c.hasContent&&c.contentType!==!1||t.contentType)&&T.setRequestHeader("Content-Type",c.contentType),T.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+("*"!==c.dataTypes[0]?", "+sn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)T.setRequestHeader(l,c.headers[l]);if(c.beforeSend&&(c.beforeSend.call(p,T,c)===!1||2===v))return T.abort();b="abort";for(l in{success:1,error:1,complete:1})T[l](c[l]);if(n=ln(on,c,t,T)){T.readyState=1,u&&f.trigger("ajaxSend",[T,c]),c.async&&c.timeout>0&&(s=setTimeout(function(){T.abort("timeout")},c.timeout));try{v=1,n.send(m,k)}catch(C){if(!(2>v))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,t,o,a){var l,m,y,b,w,C=t;2!==v&&(v=2,s&&clearTimeout(s),n=undefined,i=a||"",T.readyState=e>0?4:0,l=e>=200&&300>e||304===e,o&&(b=pn(c,T,o)),b=fn(c,b,T,l),l?(c.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(x.lastModified[r]=w),w=T.getResponseHeader("etag"),w&&(x.etag[r]=w)),204===e||"HEAD"===c.type?C="nocontent":304===e?C="notmodified":(C=b.state,m=b.data,y=b.error,l=!y)):(y=C,(e||!C)&&(C="error",0>e&&(e=0))),T.status=e,T.statusText=(t||C)+"",l?h.resolveWith(p,[m,C,T]):h.rejectWith(p,[T,C,y]),T.statusCode(g),g=undefined,u&&f.trigger(l?"ajaxSuccess":"ajaxError",[T,c,l?m:y]),d.fireWith(p,[T,C]),u&&(f.trigger("ajaxComplete",[T,c]),--x.active||x.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,t){return x.get(e,undefined,t,"script")}}),x.each(["get","post"],function(e,t){x[t]=function(e,n,r,i){return x.isFunction(n)&&(i=i||r,r=n,n=undefined),x.ajax({url:e,type:t,dataType:i,data:n,success:r})}});function pn(e,t,n){var r,i,o,s,a=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),r===undefined&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in a)if(a[i]&&a[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}s||(s=i)}o=o||s}return o?(o!==u[0]&&u.unshift(o),n[o]):undefined}function fn(e,t,n,r){var i,o,s,a,u,l={},c=e.dataTypes.slice();if(c[1])for(s in e.converters)l[s.toLowerCase()]=e.converters[s];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(s=l[u+" "+o]||l["* "+o],!s)for(i in l)if(a=i.split(" "),a[1]===o&&(s=l[u+" "+a[0]]||l["* "+a[0]])){s===!0?s=l[i]:l[i]!==!0&&(o=a[0],c.unshift(a[1]));break}if(s!==!0)if(s&&e["throws"])t=s(t);else try{t=s(t)}catch(p){return{state:"parsererror",error:s?p:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===undefined&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),x.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,i){t=x("<script>").prop({async:!0,charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&i("error"===e.type?404:200,e.type)}),o.head.appendChild(t[0])},abort:function(){n&&n()}}}});var hn=[],dn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=hn.pop()||x.expando+"_"+Yt++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,s,a=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&!(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");return a||"jsonp"===t.dataTypes[0]?(i=t.jsonpCallback=x.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(Vt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return s||x.error(i+" was not called"),s[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){s=arguments},r.always(function(){e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,hn.push(i)),s&&x.isFunction(o)&&o(s[0]),s=o=undefined}),"script"):undefined}),x.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(e){}};var gn=x.ajaxSettings.xhr(),mn={0:200,1223:204},yn=0,vn={};e.ActiveXObject&&x(e).on("unload",function(){for(var e in vn)vn[e]();vn=undefined}),x.support.cors=!!gn&&"withCredentials"in gn,x.support.ajax=gn=!!gn,x.ajaxTransport(function(e){var t;return x.support.cors||gn&&!e.crossDomain?{send:function(n,r){var i,o,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(i in e.xhrFields)s[i]=e.xhrFields[i];e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||n["X-Requested-With"]||(n["X-Requested-With"]="XMLHttpRequest");for(i in n)s.setRequestHeader(i,n[i]);t=function(e){return function(){t&&(delete vn[o],t=s.onload=s.onerror=null,"abort"===e?s.abort():"error"===e?r(s.status||404,s.statusText):r(mn[s.status]||s.status,s.statusText,"string"==typeof s.responseText?{text:s.responseText}:undefined,s.getAllResponseHeaders()))}},s.onload=t(),s.onerror=t("error"),t=vn[o=yn++]=t("abort"),s.send(e.hasContent&&e.data||null)},abort:function(){t&&t()}}:undefined});var xn,bn,wn=/^(?:toggle|show|hide)$/,Tn=RegExp("^(?:([+-])=|)("+b+")([a-z%]*)$","i"),Cn=/queueHooks$/,kn=[An],Nn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Tn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),s=(x.cssNumber[e]||"px"!==o&&+r)&&Tn.exec(x.css(n.elem,e)),a=1,u=20;if(s&&s[3]!==o){o=o||s[3],i=i||[],s=+r||1;do a=a||".5",s/=a,x.style(n.elem,e,s+o);while(a!==(a=n.cur()/r)&&1!==a&&--u)}return i&&(s=n.start=+s||+r||0,n.unit=o,n.end=i[1]?s+(i[1]+1)*i[2]:+i[2]),n}]};function En(){return setTimeout(function(){xn=undefined}),xn=x.now()}function Sn(e,t,n){var r,i=(Nn[t]||[]).concat(Nn["*"]),o=0,s=i.length;for(;s>o;o++)if(r=i[o].call(n,t,e))return r}function jn(e,t,n){var r,i,o=0,s=kn.length,a=x.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=xn||En(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,s=0,u=l.tweens.length;for(;u>s;s++)l.tweens[s].run(o);return a.notifyWith(e,[l,o,n]),1>o&&u?n:(a.resolveWith(e,[l]),!1)},l=a.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:xn||En(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?a.resolveWith(e,[l,t]):a.rejectWith(e,[l,t]),this}}),c=l.props;for(Dn(c,l.opts.specialEasing);s>o;o++)if(r=kn[o].call(l,e,c,l.opts))return r;return x.map(c,Sn,l),x.isFunction(l.opts.start)&&l.opts.start.call(e,l),x.fx.timer(x.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function Dn(e,t){var n,r,i,o,s;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),s=x.cssHooks[r],s&&"expand"in s){o=s.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(jn,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Nn[n]=Nn[n]||[],Nn[n].unshift(t)},prefilter:function(e,t){t?kn.unshift(e):kn.push(e)}});function An(e,t,n){var r,i,o,s,a,u,l=this,c={},p=e.style,f=e.nodeType&&Lt(e),h=q.get(e,"fxshow");n.queue||(a=x._queueHooks(e,"fx"),null==a.unqueued&&(a.unqueued=0,u=a.empty.fire,a.empty.fire=function(){a.unqueued||u()}),a.unqueued++,l.always(function(){l.always(function(){a.unqueued--,x.queue(e,"fx").length||a.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(p.display="inline-block")),n.overflow&&(p.overflow="hidden",l.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],wn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show")){if("show"!==i||!h||h[r]===undefined)continue;f=!0}c[r]=h&&h[r]||x.style(e,r)}if(!x.isEmptyObject(c)){h?"hidden"in h&&(f=h.hidden):h=q.access(e,"fxshow",{}),o&&(h.hidden=!f),f?x(e).show():l.done(function(){x(e).hide()}),l.done(function(){var t;q.remove(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)s=Sn(f?h[r]:0,r,l),r in h||(h[r]=s.start,f&&(s.end=s.start,s.start="width"===r||"height"===r?1:0))}}function Ln(e,t,n,r,i){return new Ln.prototype.init(e,t,n,r,i)}x.Tween=Ln,Ln.prototype={constructor:Ln,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=Ln.propHooks[this.prop];return e&&e.get?e.get(this):Ln.propHooks._default.get(this)},run:function(e){var t,n=Ln.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ln.propHooks._default.set(this),this}},Ln.prototype.init.prototype=Ln.prototype,Ln.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Ln.propHooks.scrollTop=Ln.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(qn(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Lt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),s=function(){var t=jn(this,x.extend({},e),o);(i||q.get(this,"finish"))&&t.stop(!0)};return s.finish=s,i||o.queue===!1?this.each(s):this.queue(o.queue,s)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=undefined),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=x.timers,s=q.get(this);if(i)s[i]&&s[i].stop&&r(s[i]);else for(i in s)s[i]&&s[i].stop&&Cn.test(i)&&r(s[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));(t||!n)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=q.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,s=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;s>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function qn(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=jt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:qn("show"),slideUp:qn("hide"),slideToggle:qn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=Ln.prototype.init,x.fx.tick=function(){var e,t=x.timers,n=0;for(xn=x.now();t.length>n;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||x.fx.stop(),xn=undefined},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){bn||(bn=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(bn),bn=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===undefined?this:this.each(function(t){x.offset.setOffset(this,e,t)});var t,n,i=this[0],o={top:0,left:0},s=i&&i.ownerDocument;if(s)return t=s.documentElement,x.contains(t,i)?(typeof i.getBoundingClientRect!==r&&(o=i.getBoundingClientRect()),n=Hn(s),{top:o.top+n.pageYOffset-t.clientTop,left:o.left+n.pageXOffset-t.clientLeft}):o},x.offset={setOffset:function(e,t,n){var r,i,o,s,a,u,l,c=x.css(e,"position"),p=x(e),f={};"static"===c&&(e.style.position="relative"),a=p.offset(),o=x.css(e,"top"),u=x.css(e,"left"),l=("absolute"===c||"fixed"===c)&&(o+u).indexOf("auto")>-1,l?(r=p.position(),s=r.top,i=r.left):(s=parseFloat(o)||0,i=parseFloat(u)||0),x.isFunction(t)&&(t=t.call(e,n,a)),null!=t.top&&(f.top=t.top-a.top+s),null!=t.left&&(f.left=t.left-a.left+i),"using"in t?t.using.call(e,f):p.css(f)}},x.fn.extend({position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return"fixed"===x.css(n,"position")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(r=e.offset()),r.top+=x.css(e[0],"borderTopWidth",!0),r.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-r.top-x.css(n,"marginTop",!0),left:t.left-r.left-x.css(n,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,n){var r="pageYOffset"===n;x.fn[t]=function(i){return x.access(this,function(t,i,o){var s=Hn(t);return o===undefined?s?s[n]:t[i]:(s?s.scrollTo(r?e.pageXOffset:o,r?o:e.pageYOffset):t[i]=o,undefined)},t,i,arguments.length,null)}});function Hn(e){return x.isWindow(e)?e:9===e.nodeType&&e.defaultView}x.each({Height:"height",Width:"width"},function(e,t){x.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){x.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),s=n||(r===!0||i===!0?"margin":"border");return x.access(this,function(t,n,r){var i;return x.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):r===undefined?x.css(t,n,s):x.style(t,n,r,s)},t,o?r:undefined,o,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}),"object"==typeof e&&"object"==typeof e.document&&(e.jQuery=e.$=x)})(window);
index aa2a90f..7420606 120000 (symlink)
@@ -1 +1 @@
-jquery-html5storage-1.0
\ No newline at end of file
+jquery-html5storage-1.0/
\ No newline at end of file
index 308befe..29a3c46 120000 (symlink)
@@ -1 +1 @@
-jquery-ui-slider-1.10.3
\ No newline at end of file
+jquery-ui-slider-1.10.3/
\ No newline at end of file
index 69d2863..da162c3 120000 (symlink)
@@ -1 +1 @@
-jquery-validate-1.11.1
\ No newline at end of file
+jquery-validate-1.11.1/
\ No newline at end of file
index 70887c7..b8873cd 120000 (symlink)
@@ -1 +1 @@
-markerclusterer-2.0.16
\ No newline at end of file
+markerclusterer-2.0.16/
\ No newline at end of file
index a73c9dd..e32f3be 120000 (symlink)
@@ -1 +1 @@
-mustache-7035bf3e5f
\ No newline at end of file
+mustache-7035bf3e5f/
\ No newline at end of file
index e518ae0..5b6f2f6 120000 (symlink)
@@ -1 +1 @@
-slickgrid-2.1
\ No newline at end of file
+slickgrid-2.1/
\ No newline at end of file
index 3745e8f..eeb4f9c 120000 (symlink)
@@ -1 +1 @@
-smartwizard-1636c86
\ No newline at end of file
+smartwizard-1636c86/
\ No newline at end of file
index 09c7cd5..4a26259 120000 (symlink)
@@ -1 +1 @@
-spin-1.3.0
\ No newline at end of file
+spin-1.3.0/
\ No newline at end of file
diff --git a/third-party/syntaxhighlighter b/third-party/syntaxhighlighter
deleted file mode 120000 (symlink)
index f14a567..0000000
+++ /dev/null
@@ -1 +0,0 @@
-syntaxhighlighter_3.0.83
\ No newline at end of file
index c09963d..d518987 120000 (symlink)
@@ -1 +1 @@
-timepicker-addon-1.2
\ No newline at end of file
+timepicker-addon-1.2/
\ No newline at end of file
diff --git a/to-be-integrated/third-party/codemirror b/to-be-integrated/third-party/codemirror
deleted file mode 120000 (symlink)
index bd8c3e7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-codemirror-3.15
\ No newline at end of file
index bee1fe4..a3da52a 100644 (file)
@@ -52,7 +52,7 @@ class ThirdPartyFinder(BaseFinder):
         # PREFIX : EXTENSIONS
 # third party stuff is not expected to provide templates,
 #        ''   : ('.html',),
-        'js' : ('.js',),
+        'js' : ('.js','.map',),
         'css': ('.css',),
         'img': ('.png', '.ico',),
         'fonts' : ('.svg', '.eot', '.ttf', '.woff'),
deleted file mode 120000 (symlink)
index 579c87b54b0314beb77fb6bbd36781c1726471c5..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1 +0,0 @@
-../apache/unfold.wsgi
\ No newline at end of file
new file mode 100644 (file)
index 0000000000000000000000000000000000000000..4af2e9f91a1398900f9f20bca571dddf0d01b95f
--- /dev/null
@@ -0,0 +1,12 @@
+import os
+import sys
+
+path = '/var/myslice-f4f'
+if path not in sys.path:
+    sys.path.append(path)
+
+os.environ['DJANGO_SETTINGS_MODULE'] = 'myslice.settings'
+
+import django.core.handlers.wsgi
+application = django.core.handlers.wsgi.WSGIHandler()
+