From 882bf0d409ff4b3109ae95dbb7a0906c13830708 Mon Sep 17 00:00:00 2001 From: Ignace Date: Sat, 18 Jul 2026 21:16:07 +0200 Subject: [PATCH] removed a few labels and unused files --- FlaskHandlerExamples.py | 79 - README.md | 2 - SecretServices.py | 315 --- Services.py | 272 --- __pycache__/AccessControl.cpython-313.pyc | Bin 2415 -> 0 bytes __pycache__/Config.cpython-313.pyc | Bin 395 -> 0 bytes __pycache__/FlowerServices.cpython-313.pyc | Bin 14459 -> 0 bytes __pycache__/Log.cpython-313.pyc | Bin 1195 -> 0 bytes __pycache__/flower_vase.cpython-313.pyc | Bin 10103 -> 0 bytes __pycache__/flowers.cpython-313.pyc | Bin 769 -> 0 bytes apache.conf | 9 - client/Daisy.py | 17 - client/test | 7 - dumpl.py | 54 - flower_vase.py | 10 +- import.py | 28 - static/Clouds.jpg | Bin 232112 -> 0 bytes static/Edit-icon.png | Bin 3792 -> 0 bytes static/MochiKit/Async.js | 682 ------- static/MochiKit/Base.js | 1489 -------------- static/MochiKit/Color.js | 863 --------- static/MochiKit/DOM.js | 1256 ------------ static/MochiKit/DateTime.js | 222 --- static/MochiKit/DragAndDrop.js | 793 -------- static/MochiKit/Format.js | 304 --- static/MochiKit/Iter.js | 844 -------- static/MochiKit/Logging.js | 315 --- static/MochiKit/LoggingPane.js | 353 ---- static/MochiKit/MochiKit.js | 188 -- static/MochiKit/MockDOM.js | 115 -- static/MochiKit/Position.js | 236 --- static/MochiKit/Selector.js | 415 ---- static/MochiKit/Signal.js | 897 --------- static/MochiKit/Sortable.js | 589 ------ static/MochiKit/Style.js | 594 ------ static/MochiKit/Test.js | 162 -- static/MochiKit/Visual.js | 2026 -------------------- static/MochiKit/__package__.js | 18 - static/arrow.gif | Bin 462 -> 0 bytes static/arrowsub.gif | Bin 462 -> 0 bytes static/arrowsub.png | Bin 86 -> 0 bytes static/file-icons.png | Bin 42702 -> 0 bytes static/font-awesome.css | 1338 ------------- static/geomarkers.js | 22 - static/grids-responsive-min.css | 7 - static/grids-responsive-min.css.1 | 7 - static/hsep.png | Bin 164 -> 0 bytes static/icon_minus.gif | Bin 89 -> 0 bytes static/icon_plus.gif | Bin 92 -> 0 bytes static/jquery-min.js | 4 - static/logo.png | Bin 1935569 -> 0 bytes static/mainbk.png | Bin 290 -> 0 bytes static/marketing.css | 281 --- static/menu.css | 224 --- static/menu.js | 384 ---- static/pure-min.css | 11 - static/styles.css | 113 -- static/testjs.html | 135 -- templates/common.html | 4 +- templates/create.html | 10 +- templates/edit.html | 2 +- templates/index.html | 8 +- templates/list.html | 5 +- templates/rehush.html | 6 +- templates/show.html | 4 +- test.py | 39 - test.sql | 33 - test_fernet.py | 29 - 68 files changed, 24 insertions(+), 15796 deletions(-) delete mode 100644 FlaskHandlerExamples.py delete mode 100644 SecretServices.py delete mode 100644 Services.py delete mode 100644 __pycache__/AccessControl.cpython-313.pyc delete mode 100644 __pycache__/Config.cpython-313.pyc delete mode 100644 __pycache__/FlowerServices.cpython-313.pyc delete mode 100644 __pycache__/Log.cpython-313.pyc delete mode 100644 __pycache__/flower_vase.cpython-313.pyc delete mode 100644 __pycache__/flowers.cpython-313.pyc delete mode 100644 apache.conf delete mode 100644 client/Daisy.py delete mode 100644 client/test delete mode 100644 dumpl.py delete mode 100644 import.py delete mode 100644 static/Clouds.jpg delete mode 100644 static/Edit-icon.png delete mode 100644 static/MochiKit/Async.js delete mode 100644 static/MochiKit/Base.js delete mode 100644 static/MochiKit/Color.js delete mode 100644 static/MochiKit/DOM.js delete mode 100644 static/MochiKit/DateTime.js delete mode 100644 static/MochiKit/DragAndDrop.js delete mode 100644 static/MochiKit/Format.js delete mode 100644 static/MochiKit/Iter.js delete mode 100644 static/MochiKit/Logging.js delete mode 100644 static/MochiKit/LoggingPane.js delete mode 100644 static/MochiKit/MochiKit.js delete mode 100644 static/MochiKit/MockDOM.js delete mode 100644 static/MochiKit/Position.js delete mode 100644 static/MochiKit/Selector.js delete mode 100644 static/MochiKit/Signal.js delete mode 100644 static/MochiKit/Sortable.js delete mode 100644 static/MochiKit/Style.js delete mode 100644 static/MochiKit/Test.js delete mode 100644 static/MochiKit/Visual.js delete mode 100644 static/MochiKit/__package__.js delete mode 100644 static/arrow.gif delete mode 100644 static/arrowsub.gif delete mode 100644 static/arrowsub.png delete mode 100644 static/file-icons.png delete mode 100644 static/font-awesome.css delete mode 100644 static/geomarkers.js delete mode 100644 static/grids-responsive-min.css delete mode 100644 static/grids-responsive-min.css.1 delete mode 100644 static/hsep.png delete mode 100755 static/icon_minus.gif delete mode 100755 static/icon_plus.gif delete mode 100644 static/jquery-min.js delete mode 100644 static/logo.png delete mode 100644 static/mainbk.png delete mode 100644 static/marketing.css delete mode 100644 static/menu.css delete mode 100755 static/menu.js delete mode 100644 static/pure-min.css delete mode 100644 static/styles.css delete mode 100644 static/testjs.html delete mode 100644 test.py delete mode 100644 test.sql delete mode 100644 test_fernet.py diff --git a/FlaskHandlerExamples.py b/FlaskHandlerExamples.py deleted file mode 100644 index d045579..0000000 --- a/FlaskHandlerExamples.py +++ /dev/null @@ -1,79 +0,0 @@ -@app.route('/loadconfig' , methods=['GET']) -def loadconfig(): - user=None - mode='text' - try: - user = request.args.get('userId') - mode = request.args.get('mode') - except HTTPException as err: - print("http error: {0}".format(err)) - except: - print('some error', sys.exc_info()[0]) - cfg=Dashboard(userId=user) - resp = make_response(json.dumps({'plugs':cfg.plugs.listAsText()})) - resp.headers['Content-type'] = 'application/json; charset=utf-8' - return resp - -@app.route('/loadPlugin' , methods=['GET']) -def loadPlugin(): - try: - plname = request.args.get('plugin') - params = request.args.get('parameters') - ClassType = getattr(Plugin, plname) - p = ClassType(params) - resp = make_response(json.dumps({'plugin':p.asHtml()})) - except HTTPException as err: - print("http error: {0}".format(err)) - resp = make_response(json.dumps({'plugin':err})) - except: - print('some error', sys.exc_info()[0]) - resp = make_response(json.dumps({'plugin':'System error loading plugin'})) - resp.headers['Content-type'] = 'application/json; charset=utf-8' - return resp - -@app.route('/saveplugs' , methods=['POST']) -def saveplugs(): - user=request.form['userId'] - mode=request.form['mode'] - plugs=request.form['plugs'] - cfg=Dashboard(userId=user) - cfg.updatePlugs(plugs) - cfg.save() - resp = make_response(json.dumps({'plugs':cfg.plugs.listAsText()})) - resp.headers['Content-type'] = 'application/json; charset=utf-8' - return resp - -@app.route('/json', methods=['GET']) -def myjson(): - user=request.form['userId'] - resp = make_response(json.dumps({'plugs':'user'})) - resp.headers['Content-type'] = 'application/json; charset=utf-8' - return resp - -@app.route('/upload', methods=['GET']) -def upload(): - resp = make_response('function upload') - resp.headers['Content-type'] = 'text/plain; charset=utf-8' - if request.method == 'GET': - try: - f = request.args.get('user') - print(f) - except HTTPException as err: - print("http error: {0}".format(err)) - except: - print('some error', sys.exc_info()[0]) - return resp - -@app.route('/echo' , methods=['GET']) -def echo(): - text=None - try: - text = request.args.get('text') - except HTTPException as err: - print("http error: {0}".format(err)) - except: - print('some error', sys.exc_info()[0]) - resp = make_response(text) - resp.headers['Content-type'] = 'text/plain; charset=utf-8' - return resp - diff --git a/README.md b/README.md index 1e8f357..c07c637 100644 --- a/README.md +++ b/README.md @@ -138,5 +138,3 @@ The rewrite removes the immediately exploitable SQL interpolation and browser-co - rate-limit state is local to one host. Use a strong unique password made only of Base64-compatible characters, bind Waitress to localhost, and expose it only through an authenticated HTTPS reverse proxy. Set stable provisioning and Flask secrets before deployment. - -The old `Services.py`, `SecretServices.py`, and ad-hoc root-level scripts are retained as historical migration references. Do not run them against production data without reviewing them first. diff --git a/SecretServices.py b/SecretServices.py deleted file mode 100644 index f18c470..0000000 --- a/SecretServices.py +++ /dev/null @@ -1,315 +0,0 @@ -#################### -# -# file is replaced by FlowerServices.py -# -1= # intentional python syntax error -# -##################### - -from Crypto.Cipher import AES -from Crypto.Hash import MD5 -import base64 -from Log import Log -from Config import * -import pymysql as mdb - -#encryption stuff -SECRET='HSPh1O5vc6YY2Xt8jUxlTp' -BLOCK_SIZE = 32 -PADDING='_' -# one-liner to sufficiently pad the text to be encrypted -pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING - -def md5(message): - hash = MD5.new() - hash.update(message.encode('utf-8')) - return hash.hexdigest() - - -class Flower(): - - def __init__(self, user, pwd): - self.db = 'Flowers' - self.db_username = user + '_' - self.db_password = md5(pwd) - - self.customer_table = self.db_username - self.cipher = AES.new(pad(SECRET + pwd)) - - def encode(self, s): - return str(base64.b64encode(self.cipher.encrypt(pad(s))).decode("utf-8")) - - def decode(self, e): - return str(self.cipher.decrypt(base64.b64decode(e)).decode("utf-8")).rstrip(PADDING) - - def add(self, organization, myname, myid, secret, deleted=0, timestamp=None): - ''' POST a new flower - ''' - if len(organization)>MINFIELDLEN and len(myid)>MINFIELDLEN and len(secret)>MINFIELDLEN: - sql = "INSERT INTO {} (organization ,myID ,myName ,mySecret, deleted) VALUES ('{}', '{}', '{}', '{}', {})".format(self.customer_table, organization, self.encode(myid), self.encode(myname), self.encode(secret), deleted) - if timestamp is not None: - sql = "INSERT INTO {} (organization ,myID ,myName ,mySecret, deleted, dateCreated) VALUES ('{}', '{}', '{}', '{}', {}, '{}')".format(self.customer_table, organization, self.encode(myid), self.encode(myname), self.encode(secret), deleted, timestamp) - result, data = self.do_db_commit(sql) - Log.debug(result) - if result==1: - return {'organization': organization, 'dateCreated': 'STORED', 'myID': myid, 'myName': myname,'mySecret': secret} - return {'organization': organization, 'dateCreated': 'FAILED', 'myID': myid, 'myName': myname,'mySecret': secret} - - - def all(self, isdeleted=0): - ''' GET flowers list - ''' - #sql = "SELECT organization, myID, myName, dateCreated FROM %s " % (self.customer_table) - sql = """ - select uniqueflowers.organization, uniqueflowers.myID, uniqueflowers.dateCreated from {0} as uniqueflowers - inner join ( - select organization, max(dateCreated) as lastCreated from {0} group by organization order by dateCreated DESC) allflowers - on allflowers.organization=uniqueflowers.organization and lastCreated=uniqueflowers.dateCreated where uniqueflowers.deleted={1} - """.format(self.customer_table, isdeleted) - result, data = self.do_db_allrows(sql) - #Log.debug(sql_result) - all_flowers=[] - if result==1: - for row in data: - all_flowers.append({'organization': str(row[0]), 'myID': self.decode(row[1]), 'dateCreated': str(row[2])}) - return all_flowers - - - - def one(self, organization, datetimestamp ): - ''' flower for user, org and datetime - ''' - result = -1 - secret = ':-(' - sql = "SELECT mySecret, myID, myName FROM %s where organization='%s' and dateCreated='%s' order by dateCreated DESC limit 1" % (self.customer_table, organization, datetimestamp) - result, data = self.do_db_1row(sql) - if result == 1: - return {'organization': organization, 'dateCreated': datetimestamp, 'myID': self.decode(data[1]), 'myName': self.decode(data[2]),'mySecret': self.decode(data[0])} - return {'organization': organization, 'dateCreated': datetimestamp, 'myID': '', 'myName': '','mySecret': '-- Not found --'} - - - def deactivate(self, organization, datetimestamp ): - ''' flower for user, org and datetime - ''' - result = -1 - secret = ':-(' - sql = "update {} set deleted=1 where organization='{}' and dateCreated='{}' ".format(self.customer_table, organization, datetimestamp) - result, data = self.do_db_commit(sql) - if result == 1: - secret = '- DELETED -' - return {'organization': organization, 'dateCreated': datetimestamp, 'myID': '', 'myName': '','mySecret': secret} - - def empty(self): - ''' empty flower - ''' - return {'organization': '', 'dateCreated': '', 'myID': '', 'myName': '','mySecret': ''} - - - def numberOfEntries(self): - ''' GET login info, check if its valid - ''' - sql = "SELECT count(*) FROM {};".format(self.customer_table) - result, data = self.do_db_1row(sql) - if result == 1: - return(data[0]) - return -1 - - - def update_pwd(self, new_pwd): - newcipher = AES.new(pad(SECRET + new_pwd)) - - def new_encode(s): - return str(base64.b64encode(newcipher.encrypt(pad(s))).decode("utf-8")) - - end_result = "ERROR updating hushes\n" - sql = """ - select myID, myName, mySecret, organization, dateCreated from {0}""".format(self.customer_table) - result, data = self.do_db_allrows(sql) - # Log.debug(sql_result) - if result == 1: - # convert all hushes - sql = "" - for row in data: - sql += "update {} set myID='{}', myName='{}', mySecret='{}' where organization='{}' and dateCreated='{}';\n".\ - format(self.customer_table, - new_encode(self.decode(row[0])), - new_encode(self.decode(row[1])), - new_encode(self.decode(row[2])),row[3], row[4]) - - result, data = self.do_db_commit(sql) - if result == 1: - end_result = "ERROR updating user-password\n" - # update the password of the user - sql = "SET PASSWORD FOR '{}'@'localhost' = PASSWORD('{}'); ".format(self.db_username, md5(new_pwd)) - result, data = self.do_db_commit(sql) - if result == 1: - end_result = "SUCCESSFULLY updated, now login again\n" - return end_result - - - def do_db_commit(self, sql): - Log.debug('INSc: '+sql) - result = 0 - data = '' - con = None - try: - con = mdb.connect(host='localhost', passwd=self.db_password, user=self.db_username, db=self.db); - cur = con.cursor() - if ";\n" in sql: - for s in sql.split(";\n"): - if len(s)>1: - cur.execute(s) - else: - cur.execute(sql) - cur.close() - con.commit() - result = 1 - except mdb.Error as e: - m = "Error %d: %s" % (e.args[0],e.args[1]) - data = {'message': m} - Log.debug(m) - result = -1 - finally: - if con: - con.close() - return result, data - - - def do_db_1row(self, sql): - Log.debug('1row sql: '+sql) - result = 0 - con = None - try: - con = mdb.connect(host='localhost', passwd=self.db_password, user=self.db_username, db=self.db); - cur = con.cursor() - cur.execute(sql) - data = cur.fetchone() - if data: - result = 1 - except mdb.Error as e: - m = "Error %d: %s" % (e.args[0],e.args[1]) - data = {'message': m} - Log.debug(m) - result = -1 - finally: - if con: - con.close() - return result, data - - def do_db_allrows(self, sql): - Log.debug('all rows sql: '+sql) - result = 0 - con = None - try: - con = mdb.connect(host='localhost', passwd=self.db_password, user=self.db_username, db=self.db); - cur = con.cursor() - cur.execute(sql) - data = cur.fetchall() - if data: - result = 1 - except mdb.Error as e: - m = "Error %d: %s" % (e.args[0],e.args[1]) - data = {'message': m} - Log.debug(m) - result = -1 - finally: - if con: - con.close() - return result, data - - -class SuperFlower(Flower): - - def __init__(self, customer, pwd): - super().__init__(customer, pwd) - self.customer_name = customer + '_' - self.customer_pwd = pwd - - self.db_username = 'flower' - self.db_password = md5('flower') - - def createNewTable(self): - # create new table and user - sql = """ - CREATE TABLE `{}` ( - `organization` varchar(80) NOT NULL, - `myID` varchar(129) NOT NULL, - `myName` varchar(129) NOT NULL, - `mySecret` varchar(65) NOT NULL, - `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `deleted` int(11) DEFAULT '0', - PRIMARY KEY (`organization`,`dateCreated`) - ) ENGINE=InnoDB DEFAULT CHARSET=latin1;""".format(self.customer_table) - result, data = self.do_db_1row(sql) - if result < 0: - Log.info("SQL ERROR:") - Log.info(data) - return 0 - - sql = """create user {}@localhost identified by '{}';""".format(self.customer_name, md5(self.customer_pwd)) - result, data = self.do_db_1row(sql) - if result < 0: - Log.info("SQL ERROR:") - Log.info(data) - return 0 - - sql = """grant select,update,insert on Flowers.{} to {}@localhost;""".format(self.customer_table, self.customer_name) - result, data = self.do_db_1row(sql) - if result < 0: - Log.info("SQL ERROR:") - Log.info(data) - return 0 - - self.flush_privs() - - return 1 - - def flush_privs(self): - sql = """flush privileges;""" - result, data = self.do_db_1row(sql) - if result < 0: - Log.info("SQL ERROR:") - Log.info(data) - return 0 - return 1 - - def migrate(self, old_customer_name): - OLDSECRET = 'HSPh1O5vc6YY2Xt8jUxlTpd*DZsjMMAH' - OLDCIPHER = AES.new(OLDSECRET) - old_DecodeAES = lambda e: str(OLDCIPHER.decrypt(base64.b64decode(e)).decode("utf-8")).rstrip(PADDING) - - def sql_datetime(datetime_type): - return datetime_type.strftime("%Y-%m-%d %H:%M:%S") - - end_result = "ERROR creting new table\n" - if self.createNewTable(): - - - end_result = "ERROR updating hushes\n" - sql = """ - select myID, myName, mySecret, organization, dateCreated, deleted from {0}""".format(old_customer_name) - # 0 1 2 3 4 5 - result, data = self.do_db_allrows(sql) - # Log.debug(sql_result) - if result == 1: - # convert all hushes - sql = "" - for row in data: - #sql += "insert {} set organization='{}', myID='{}', myName='{}', mySecret='{}', deleted={}, dateCreated='{}' where organization='{}' and dateCreated='{}';\n". \ - sql += "INSERT INTO {} (organization ,myID ,myName ,mySecret, deleted, dateCreated) VALUES ('{}', '{}', '{}', '{}', {}, '{}') ;\n".\ - format(self.customer_table, - row[3], - self.encode(row[0]), - self.encode(row[1]), - self.encode(old_DecodeAES(row[2])), - row[5], - sql_datetime(row[4])) - result, data = self.do_db_commit(sql) - if result == 1: - end_result = "SUCCESSFULLY updated, now login again\n" - return end_result - - - -if __name__ == '__main__': - print("this is a library, sorry dude") diff --git a/Services.py b/Services.py deleted file mode 100644 index 5f347a3..0000000 --- a/Services.py +++ /dev/null @@ -1,272 +0,0 @@ -#################### -# -# file is replaced by SecretServices.py -# -1= # intentional python syntax error -# -#################### - - -from Crypto.Cipher import AES -from Crypto.Hash import MD5 -import base64 -import os, time, re, sys -from Log import Log -from Config import * -import json -import pymysql as mdb -import datetime -import hashlib - - - -#encryption stuff -SECRET='HSPh1O5vc6YY2Xt8jUxlTpd*DZsjMMAH' -BLOCK_SIZE = 32 -PADDING='_' -# one-liner to sufficiently pad the text to be encrypted -pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING -# one-liners to encrypt/encode and decrypt/decode a string -# encrypt with AES, encode with base64 -CIPHER = AES.new(SECRET) -EncodeAES = lambda s: str(base64.b64encode(CIPHER.encrypt(pad(s))).decode("utf-8")) -DecodeAES = lambda e: str(CIPHER.decrypt(base64.b64decode(e)).decode("utf-8")).rstrip(PADDING) - -def md5(message): - hash = MD5.new() - hash.update(message.encode('utf-8')) - return hash.hexdigest() - - - -class Flower(): - - def __init__(self, user, pwd): - self.database = 'Flowers' - self.table = user - self.username = user - self.password = md5(pwd) - - - def add(self, organization, myname, myid, secret): - ''' POST a new flower - ''' - if len(organization)>MINFIELDLEN and len(myid)>MINFIELDLEN and len(secret)>MINFIELDLEN: - sql = "INSERT INTO {} (organization ,myID ,myName ,mySecret, deleted) VALUES ('{}', '{}', '{}', '{}', 0)".format(self.table, organization, myid, myname, EncodeAES(secret)) - result, data = self.do_db_commit(sql) - Log.debug(result) - if result==1: - return {'organization': organization, 'dateCreated': 'STORED', 'myID': myid, 'myName': myname,'mySecret': secret} - return {'organization': organization, 'dateCreated': 'FAILED', 'myID': myid, 'myName': myname,'mySecret': secret} - - - def all(self, isdeleted=0): - ''' GET flowers list - ''' - #sql = "SELECT organization, myID, myName, dateCreated FROM %s " % (self.table) - sql = """ - select uniqueflowers.organization, uniqueflowers.myID, uniqueflowers.dateCreated from {0} as uniqueflowers - inner join ( - select organization, max(dateCreated) as lastCreated from {0} group by organization order by dateCreated DESC) allflowers - on allflowers.organization=uniqueflowers.organization and lastCreated=uniqueflowers.dateCreated where uniqueflowers.deleted={1} - """.format(self.table, isdeleted) - result, data = self.do_db_allrows(sql) - #Log.debug(sql_result) - all_flowers=[] - if result==1: - for row in data: - all_flowers.append({'organization': str(row[0]), 'myID': str(row[1]), 'dateCreated': str(row[2])}) - return all_flowers - - - - def one(self, organization, datetimestamp ): - ''' flower for user, org and datetime - ''' - result = -1 - secret = ':-(' - sql = "SELECT mySecret, myID, myName FROM %s where organization='%s' and dateCreated='%s' order by dateCreated DESC limit 1" % (self.table, organization, datetimestamp) - result, data = self.do_db_1row(sql) - if result == 1: - secret = DecodeAES(data[0]) - return {'organization': organization, 'dateCreated': datetimestamp, 'myID': data[1], 'myName': data[2],'mySecret': secret} - - def deactivate(self, organization, datetimestamp ): - ''' flower for user, org and datetime - ''' - result = -1 - secret = ':-(' - sql = "update %s set deleted=1 where organization='%s' and dateCreated='%s' " % (self.table, organization, datetimestamp) - result, data = self.do_db_commit(sql) - if result == 1: - secret = '- DELETED -' - return {'organization': organization, 'dateCreated': datetimestamp, 'myID': '', 'myName': '','mySecret': secret} - - def empty(self): - ''' empty flower - ''' - return {'organization': '', 'dateCreated': '', 'myID': '', 'myName': '','mySecret': ''} - - - - - - - - - def numberOfEntries(self): - ''' GET login info, check if its valid - ''' - sql = "SELECT count(*) FROM {};".format(self.table) - result, data = self.do_db_1row(sql) - if result == 1: - return(data[0]) - return -1 - - def do_db_commit(self, sql): - Log.debug('INSc: '+sql) - result = 0 - data = '' - con = None - try: - con = mdb.connect(host='localhost', passwd=self.password, user=self.username, db=self.database); - cur = con.cursor() - cur.execute(sql) - con.commit() - cur.close() - result = 1 - except mdb.Error as e: - m = "Error %d: %s" % (e.args[0],e.args[1]) - data = {'message': m} - Log.debug(m) - result = -1 - finally: - if con: - con.close() - return result, data - - - def do_db_1row(self, sql): - Log.debug('1row sql: '+sql) - result = 0 - con = None - try: - con = mdb.connect(host='localhost', passwd=self.password, user=self.username, db=self.database); - cur = con.cursor() - cur.execute(sql) - data = cur.fetchone() - if data: - result = 1 - except mdb.Error as e: - m = "Error %d: %s" % (e.args[0],e.args[1]) - data = {'message': m} - Log.debug(m) - result = -1 - finally: - if con: - con.close() - return result, data - - def do_db_allrows(self, sql): - Log.debug('all rows sql: '+sql) - result = 0 - con = None - try: - con = mdb.connect(host='localhost', passwd=self.password, user=self.username, db=self.database); - cur = con.cursor() - cur.execute(sql) - data = cur.fetchall() - if data: - result = 1 - except mdb.Error as e: - m = "Error %d: %s" % (e.args[0],e.args[1]) - data = {'message': m} - Log.debug(m) - result = -1 - finally: - if con: - con.close() - return result, data - - -class SuperFlower(Flower): - - def __init__(self, user, pwd): - self.database = 'Flowers' - self.table = user - self.table_hush = pwd - self.username = 'flower' - self.password = md5('flower') - - def createNewTable(self): - # create new table and user - sql = """ - CREATE TABLE `{0}` ( - `organization` varchar(50) NOT NULL, - `myID` varchar(50) NOT NULL, - `myName` varchar(50) NOT NULL, - `mySecret` varchar(50) NOT NULL, - `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `deleted` int(11) DEFAULT '0', - PRIMARY KEY (`organization`,`dateCreated`) - ) ENGINE=InnoDB DEFAULT CHARSET=latin1;""".format(self.table) - result, data = self.do_db_1row(sql) - if result < 0: - Log.info("SQL ERROR:") - Log.info(data) - return 0 - - sql = """create user {0}@localhost identified by '{1}';""".format(self.table, md5(self.table_hush)) - result, data = self.do_db_1row(sql) - if result < 0: - Log.info("SQL ERROR:") - Log.info(data) - return 0 - - sql = """grant select,update,insert on Flowers.{0} to {0}@localhost;""".format(self.table) - result, data = self.do_db_1row(sql) - if result < 0: - Log.info("SQL ERROR:") - Log.info(data) - return 0 - - sql = """flush privileges;""" - result, data = self.do_db_1row(sql) - if result < 0: - Log.info("SQL ERROR:") - Log.info(data) - return 0 - - return 1 - - - def re_hush(self, new_hush): - - - end_result = "Starting Rehush\n" - sql = """ - select mySecret, organization, dateCreated from {0}""".format(self.table) - result, data = self.do_db_allrows(sql) - # Log.debug(sql_result) - if result == 1: - # convert all hushes - sql = "" - for row in data: - old_hush = DecodeAES(row[0]) - sql += "update {} set mySecret='{}' where organization='{}' and dateCreated='{}';\n".format(self.table, md5(old_hush), row[1], row[2]) - result, data = self.do_db_commit(sql) - if result == 1: - end_result = "Finished Rehush\n" - end_result = "Starting update user password\n" - # update the password of the user - sql = "SET PASSWORD FOR '{}'@'localhost' = PASSWORD(md5(secret));\n".format(self.table) - sql += "flush privileges;" - result, data = self.do_db_commit(sql) - if result == 1: - end_result = "Finished update user password\n" - - - - -if __name__ == '__main__': - print("this is a library, sorry dude") diff --git a/__pycache__/AccessControl.cpython-313.pyc b/__pycache__/AccessControl.cpython-313.pyc deleted file mode 100644 index b4c14bf6689bf3f53a72e1aa997a46d61c8988f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2415 zcmbtV%}*Og6rcU@dW}E81``vLvfvO{L?9nR4d-AL-Y}0|v5N2o^ICr&}&(zIz&NK$QL!dlDA0iqBA~2X6 zMVMFE!w7p64!A&f$6m#Q#k?SUiEt^C(JgCRfQ1=%8@d~v;NZXe7-k=#G@WxO=_>nV zl6oGXvBr4cO808^dBSlSg+0q0hYK~CQDm}d8rh+w=xR-w^fz@^O9xzStZ{(TjZTcykd%Y|&xpbTBk&L)nQ}&@0=kA+A1t;;;3TcC%yN`rYDB00mVyy>B$RR56UsJXL_4P1iW}>4Rg-cEyCiPgtv`ZT@Da2tJyl$31=4PiI1vTylY}ppbdv}rBXg&q6TVQ?vc#`BC{hdHO$4n3 z9$DE#cuOzjNL$YML{}T1plbOd5lwx*?#q^P#G{)wUa;u5N|ea(=&jqHUO6bmDz1tO}dVH&oolGeIy#GUZLj@Gxp?xC%Cq8cAA$A_!& z6Xp1cr}0ydXR2dYei^&6@%{(pv1B=(+z?~6_UNLxT)OzpP}SdG_V;gv zqYrPd9j$~1)=zCE{9&~tUM?lixW}tf~hyur+hX*#p1OHeQzE4KFCw$ybzLtqY z-b|zPVHzQNElwT&3<|Up#$*9$)N+6TY3+bCF2yNq18Fn+k*09RgJ5T`MeB%4u?l|< z@U8)R@}BfwOxn;65>%;>^d6k0Xm*k6N~aF!#UG%ir-breS)9f+AYqNtHpEBU^oTb; z>!@c?%Ic<}XQf;bOLsrNEPF7m5==jg@P?Ty5&=xJnoW4{T#$L(MNK}Vq-C=h+8Ggm z&lPNZ1m-Qejsgq6LA|_rteLi+C7}jf8e>|#mI~}1s)ZwqLM_@=jrLcf{fm>e){d1M zOLtd|&DMchTjy%;1OHb7 z#B((Aj?-n=OuY z+nduS_u6a{TGv5>Hi=#b9e^V@)_5MAH}I9F`CpAJj~b1PpO#tN2LUnt0>aMU+@|1> zMGSyOn0`zhATg@ZJYuK>gaPP)m+ahZseuqoJ7(R#8?;w}fd{C&zX1x0D;m{(kVOBXBRTU){K!=cq|C74*lTY<>( z)cvVdz8V`W#|GE?*0oCD1hkCM(P}X9ESP8%e;{$`4EN+r%iDriW}LH3%RbuKOl?+& z&eo!;v&HOOf$9NO{di6*G%T&EnlrFv7YtK3i>g|`2zYW39-_=SR8&@lKpV~( zdFP@reMIXCp$M#RI8L>_AVhq#eu|6uEEs6rTXA4J9K$eMsN*>b|B70FL+vkli8=WK I0dp4r3nELxasU7T diff --git a/__pycache__/Config.cpython-313.pyc b/__pycache__/Config.cpython-313.pyc deleted file mode 100644 index 26e30180b69624f2cb6a7a434ae1826ef12f05e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 395 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 Q7Uxg&Tfw}kmme(tH<9j8D*ylh diff --git a/__pycache__/Log.cpython-313.pyc b/__pycache__/Log.cpython-313.pyc deleted file mode 100644 index cd1d1861111e1e6a9e0bf47c2ff3e1a49785b825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1195 zcmcgr&ubGw6n^_FNz;uFC`4?gp^q5`e#}%^oN@?dF>sIQH>>#X zgFy=lex3Jd_MkEdT#S&7DJ#V2j!M5ytgl~#FRe(+@jl~ZHsuw#6ay$k`3ykb&`G?H z`u}P`rK>Nk53=i+J=JHf{Bf2GF6=91A=%q{y%B6W?7DG*8_8T;sHO7!l2C&U#~1O% zrQ&>PaZYHP%nKc%RT}}v>E7I(m7>r#nCFN4vPklv>6jsUu8``S^fnAJm0!o@yyyCM z)ydZzHh;u%qGUXea?WgQ3DxuKfk==?NW-1{7MdsUV>rDtdzcw}^WbguQ)cSk_fMfnWFB-pPMw6NwwWs&29iNTuh*Nzb+-Nzzxy R9>Ul!H7#X-0-EmmzX34B<>3GT diff --git a/__pycache__/flower_vase.cpython-313.pyc b/__pycache__/flower_vase.cpython-313.pyc deleted file mode 100644 index 7e135f3072206a19626497e1b6252015d18227e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10103 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 BnXLc- diff --git a/__pycache__/flowers.cpython-313.pyc b/__pycache__/flowers.cpython-313.pyc deleted file mode 100644 index 818c1c36143754d5e3031f3734a3b191041869aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 769 zcmYjO&ugmtUn#^gv2XTus%GXptWcpvDWKF_84YVxoa$U0_&NVRxAYaft^! z*`yZ_?ZtS|qc`vV6;%^)ViOZj-iZ7IzM)_{n|behZ{C~zzBltoB!pmn`0Sc*1%!U{ zV725Wm_GqI(;f{yLXBp=k;=~Kn&j|kNCy{wteu#j3TREkxtTznjt zC>O*6nr7)eqG?QS+E&{%*ab=q(;e_3bce*DrZu2k4NOPW9mnN56?Q$*v3n$88kXK9 zi8ddf3yu%(zu$H|7HU$W4~PbxbPYNs*zQd*6ZA8*aTqvAObXM>=A`ht^s2P~@)%#5 zV*hs>JI1kh`EU5zG`v13&7polwWphwrd7wmWGcIT8@{A@coC?HOlpzF&|tV@y90(D zn-2Ek0VXYoohl74pZ2-#l7*lJAIcwt$vuxVWFj3}9}$f}j)oWiyw|f^!!Ef`qY!fG zZVt>$6a?V}MNiO`zcLm!X6p#A?T^2Tn?EAagZgCm7Y=bjZ>sOZpSC8YFE~5%BOF`Y F{12-fv5o)$ diff --git a/apache.conf b/apache.conf deleted file mode 100644 index 5d2793d..0000000 --- a/apache.conf +++ /dev/null @@ -1,9 +0,0 @@ - WSGIDaemonProcess flowers user=www-data group=www-data threads=5 - WSGIScriptAlias /flowers /usr/share/projects/Flowers/flowers.wsgi - - - WSGIProcessGroup flowers - WSGIApplicationGroup %{GLOBAL} - Order deny,allow - Allow from all - diff --git a/client/Daisy.py b/client/Daisy.py deleted file mode 100644 index 9fceb62..0000000 --- a/client/Daisy.py +++ /dev/null @@ -1,17 +0,0 @@ - - -import kivy -kivy.require('1.0.6') # replace with your current kivy version ! - -from kivy.app import App -from kivy.uix.label import Label - - -class MyApp(App): - - def build(self): - return Label(text='Hello world') - - -if __name__ == '__main__': - MyApp().run() \ No newline at end of file diff --git a/client/test b/client/test deleted file mode 100644 index 7609ebe..0000000 --- a/client/test +++ /dev/null @@ -1,7 +0,0 @@ -import requests - -r = requests.post('http://0.0.0.0:8080/app', data = {'name':'piet', 'password': 'piet', 'action': 'list'}) -#r = requests.post('http://0.0.0.0:8080/app', data = {'name':'ignace', 'password': 'white', 'action': 'one', 'dateCreated': '2018-05-30 21:18:00', 'organization': 'https://mijntele2.tele2.nl/'}) -#r = requests.post('http://0.0.0.0:8080/app', data = {'name':'ignace', 'password': 'white', 'action': 'save'}) -#r = requests.post('http://0.0.0.0:8080/app', data = {'name':'ignace', 'password': 'white', 'action': 'list'}) -# print(r.text) \ No newline at end of file diff --git a/dumpl.py b/dumpl.py deleted file mode 100644 index 6368300..0000000 --- a/dumpl.py +++ /dev/null @@ -1,54 +0,0 @@ -# from flask import Flask -from Config import * -import sys -import datetime -from SecretServices import Flower,SuperFlower -from AccessControl import Access -import json -# from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash, json, make_response -# from werkzeug.exceptions import HTTPException - - -newuser = 'ignace' -newhush = 'black' - -# login db with generic user -# f = SuperFlower(newuser, newhush) -# if f.createNewTable(): - # login as new user - # u = Flower(newuser, newhush) -# add one line -#u.add('Demo organisation', 'Demo name', 'Demo login', 'Demo hush') -# read one line - -#create user -# login db with generic user -# f = SuperFlower(newuser, newhush) -# if f.createNewTable(): -# # login as new user -# u = Flower(newuser, newhush) -# # add one line -# u.add('Demo organisation', 'Demo name', 'Demo login', 'Demo hush') - - - - -# retrieve all flowers -# u = Flower(newuser, newhush) -# flowers=u.all() -# print(flowers) - - -# retrieve one flowers -# u = Flower(newuser, newhush) -# flower=u.one('ah', '2003-03-17 17:30:27') -# print(flower) - - -# dump all flowers with pwds -u = Flower(newuser, newhush) -flowers=u.all() -for f in flowers: - flower = u.one(f['organization'], f['dateCreated']) - print('"{}","{}","{}","{}","{}",'.format(flower['organization'],flower['dateCreated'],flower['myID'],flower['myName'],flower['mySecret'])) - diff --git a/flower_vase.py b/flower_vase.py index 907509e..a71ca37 100644 --- a/flower_vase.py +++ b/flower_vase.py @@ -122,7 +122,7 @@ def _vault_from_session() -> Flower | None: return None -def _login_page(name="Welcome back", password="Enter your vault password", status=200): +def _login_page(name="Welcome back", password="Enter your bouquet password", status=200): return render_template( "index.html", name_suggestion=name, pwd_suggestion=password ), status @@ -145,7 +145,7 @@ def application(): "list.html", flowers=vault.all(), filter=selected_filter ) except StorageError: - flash("The vault database could not complete that request.", "error") + flash("The bouquet database could not complete that request.", "error") return redirect(url_for("flower_vase.index")) access = Access() @@ -207,7 +207,7 @@ def application(): if action == "rehush": return render_template("rehush.html") except StorageError: - flash("The vault database could not complete that request.", "error") + flash("The bouquet database could not complete that request.", "error") return redirect(url_for("flower_vase.index")) abort(400, description="Unknown action") @@ -254,10 +254,10 @@ def create(): Flower(username, password).add( "Demo organisation", "Demo name", "Demo login", "Demo secret" ) - flash("Your vault is ready. Sign in to continue.", "success") + flash("Your bouquet is ready. Sign in to continue.", "success") return redirect(url_for("flower_vase.index")) return render_template( - "create.html", message="The vault could not be created. Check the server log." + "create.html", message="The bouquet could not be created. Check the server log." ), 500 diff --git a/import.py b/import.py deleted file mode 100644 index b1f1921..0000000 --- a/import.py +++ /dev/null @@ -1,28 +0,0 @@ -from Config import * -import sys -import datetime -from FlowerServices import Flower,SuperFlower -from AccessControl import Access - -file1 = open('pins.csv', 'r') -Lines = file1.readlines() - -newuser = 'janine' -newhush = 'demaat196' - -# create user in the db. -f = SuperFlower(newuser, newhush) -if f.createNewTable(): - # login as new user - u = Flower(newuser, newhush) - - count = 0 - # Strips the newline character - for line in Lines: - count += 1 - line=line.strip() - print(line) - (org, date, id, name, pwd) = line.split('","',5) - org = org[1:] - pwd = pwd[:-2] - u.add(org, name, id, pwd, 0, date) diff --git a/static/Clouds.jpg b/static/Clouds.jpg deleted file mode 100644 index 26048b906ba8f2aa1b66bdb49f0188e72ee01ea5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232112 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

)B#4&+zXSCRW}HVHm8S#rVHTRk zP_+sq6(qWjj1D>s{6VNK1y`JrI>i2jhfD&}QpCWdg@&Zc4Y4{?-N=p8X%?zW1TeBk zX{DF|D*ZMX_N%gqDNBRo_kUkc=O1rFw!UWZ<& zMk#4)rh^)CY)I%Fd#t((70+FTfnRX3Ep9W1SFdqZt*Nn*bZWj#(COECj2@MhBCBi~h>)X-U#` zjM(x%SK!iLZS^~I+ZUI|{Ey-8zskJyN2i~wjp5{5@y)5W;|EXa81!LpfwRT>_4E(u z&Edu5emkUYW!cx+fMqaeuMoaU(UTB8}Sb!i91ousavqYvb0+ zJYem|O!Xfb<$Oz{mU<^oKU}<@Gs14Lj-1yk9uJxE_Scnzyz5-AE`3_(g0-A=Q)Q`y zX2zq_@b^CDV~0_>aqa2(8(nszjpfpG^?o|m*q2svu9EBMJbh794yx?VITG*DSA(50 zJ9X9!wCUHx5^qXi%Tc8@k~gM!C5n15L7UUi(8794OP_y_C}leHysr*bL`am(z! zJL8>mW6RZg`Q_;Sy07)%=Nql{B$jy!V!rHP%AszausD_XGXk4Z{X&MHaRh|^;LwX~ ze3>jZY=r|Ma%`}g%GUKJP`JlZ5{F=GM35c8pa0YR?W6W_`FqHSVY~fq?ns zsW=7TKW+(Vb212LfdnfLoNDf^2eV8{+_UBvoMw(?&*{bM!1Fg@lL* z{RyltGAx?UAhhKQ)zxP`0LRh%e~nq*yJnGx2%Ny5jz5TB|J`Cc=RW>BoqXO^L>libw$3lEaTGL8h zHVLDuc_gaf8BjJ&l%oV1)K>HjSjD6z69uB&39%Z|oQig7Fd@$EBiO48`;YXGYz zvye=immLLHUafKlM)ja-YPFWESKEeKu&srVY0tA<@eX@wDiI$dN2h0hohDuC)&v7w4fA44@I`XQ4Df@X(|AUaC| zgY*nuNqUPX?nFGS0rFC~H6S&PLYYb+w3|!xEjl6#Mw9jxr0VR8S*D}}ptYzQ^eAl( zu!trkN|Jm6z@c;oM0H}+B*bZZgEd_Vs1lS50#k-oj3>bg7y9J1$Ql*k)(}&oB+jY& zA~-bFCuF%SV=y%tSwp0s839#@BMERyhQIwn1hT|Y`xYfPIDjdM6<|>@${`IdtQ#hi zazdR_Nl6uB+!`u>2>Vu4_$Dt6X6DeOJGp zpJC&9N)kCb%I&V{28!D{$em}h@`?>{Y`nIO1})FHg;yk#Yj%QOyX2{KQsywX*LY=C zI;pY@msYEVG1FU0Io6Iz6`2Hg3ensvSnb&cq)u(OlT6n=oQo*CTns|G6-b^ zGvh67sa1a%gL>s-v&H;rTo6&-0=lR||E)Ja0UpMFYQ?LTosSvp57a{avazDCw7?>`t?_3B#Fn|hx=>ALlN>*}>#Qi&WMn4i3p3llqe zovd+c7n$4`HLks~-WMTwco2srwJ z3HpiAC5vDG)co>#E~o6Dm(d=*2pF9f^eGv%2{1{Az|&3EFcPzZJ$WXuRZ1bFoPyI_ z!xS0_i6+fx!-m`$(}bKk5vT9!P3dutrHm=_C=oPh(n}=Fir^a3iFv3OiRJe%yplybHedET1g!3*GVz$uN}Im zJoVDYKHnMj5KgZ`mS&Xy0CipVt_udbwCa|c;A(G8Dz=u4X~#`ypB#fr(?{I`qoUp} zWX`pYZT>&D3syYuBf@uBP;XeV3_!%ZhpC4KL_RSt;6TsZw7SxKaTQ$v924N zdmK9F9iy^}>*!^te~WgoX2zZMx9nj^-i#X8MIH>aYRIuFU;%d)B32Ze+EEN-(3D${ zRO%_dzDq;1QiNvKnk3nhor$glW1DWZZbwsx%JDyxqjIxYy#mXd$ke-Jm59|@QP9$k zUFc;DJH1N~t(qWx+4p2r{Xsde?dnKsq>^>&Tp%u*)&RxCutyz8v$7z{$Wtp)MLD)n z^bqG&Y3G3qe9e(q1+R|zS7h7d^l=<|eD{^M*HF()juq$a*@LWe)*AP@_BVrE-gO(d za>=e-`g!)NjGbJ)Q4niXh07sLAgTy}RFsenvr;V%3kk1aNlVoV@N%2L9n$(?i!`nD z7^EwZIVlx(hTVJe8(VGtkNMFf~i1W#~}YQR-+L{fKF>I9y~=1~Wolg4BcR z30UEUl*_4c(Tc(DEa0o2Lc%(LCYZxQQnF0xryS)05V{wFI3=dsk<`ybYXEj@kO7i3 z;3_qYfrxHdqkm3%65I$D>8pB@C6WO+EJ3*}LAApmO4%G1pLTdG5|_Foidk|ELUoLm zqF50qN^;A>Qlc|yqaUEbg(ZsqA1pAcayV@cAjr`u(<9uD6q1K!0860|Iuh#nW36C@ z)P-X-Cggt%xEc*M>XSgsrDXk0EIEacSY6HXS%l}%5wb;8n<}wTzfzUE_)4R!?zPuN zIWwmP>zoi(Z09aXO6~EbD0n$nSiOE_ynFXhFFJQ0SNOlrZ}EAzFRosW2~)y??A(>@48k9Ioq=|g;U{@YL}@adi#MhbnPmd zR(LX-($Y<9r(NYhVRY-+7&C>@UB+>0*4ZptUBr#pkvo@PMvgIBPG+VMi?w@UI5~4fmqVCQ6x$T2UNj1Je>;2-!)^!^87iR9i?-xE6Dix zPAWPv;QW`ut*OF0bJjUn`CljFUaLz{2dZ_hHB)A+3xcI~pk z%c|6mYsB$exz5((*`}CK%r}fJo}nrek6ZDrT0ji?Q2(M2IkdZR5Z z)2S0l5P{dIX{_y89cL2iI+$(Nn948fgLjW6eE&-I6&$JgJ@RZ%CBN2*so z?~_Z84SI{y%-QnY_U)@WP8j!ec)nGehGxd6TJ}7Bs~)Et9UWBJAk$5IF&vWBtA6Ac zTSvT+IR%07Ae`H(DTSL~{<2n~`w%t;T`7WEAXER<{P8G1Wc;?^h~!nGWSTmzqoN0s zDByIPU@0izYa{3wO*vhqBYK*#7&iu?WE+vME@cfxw`dCNP`@tp>ve z={yWx6urW!2O)~I(9^a}81$*FaFN2g#uS++UQ$!C&wWw$1d*|xj8qi*PH!5%XcoOv^{?ws;MKLrKR<_Y&EYgYHfAD zX{bCq{A(*eb2X^+=}zo36}(lvbkUs*HtDLYIKcZCh32h$Ty^Sn=DF8{^1cSYi`ntxO=Ceaua#?_yo=yPqVMXBcb)OM?b zQJWth@(#*-xs%hxaO?5mZcwE3$17fElX%3PIdZkb>9YBU)}9MbW?xwnGvlQkop}ZY$DxG#J@5$TjhkSz%gr)$}r3RrCd`N=%JvtAf_!ILsO(>mbEtvs-4O zbL{brN-LKB3TCuNpXGdd;N0j~`OlO5d0txTcIUS{%fYw9Jx(JC>3U-F_C7!3mda04 zjp?Z!`aCyFLNRMt_B43vu+Db1j>W1&Nc%8aTWZ$8I_a)Z8C%kjv((14rO1Z#Qe~*L zppdWvv*;x}kSPBECYnvPvRLQYtkV_8Yfp)9(zZ{>|NZ$F5;E#Z1Q5M*_>o|jvph;=-v*Kk#WeUX2jPFYn$l& z3cA-lPd84yy-y!veNJ`LUA462=G<#X=v1y-1gf{dsJV=Ruvz}Z8EjqB!8!IUNW+Yh zoRE;?sT>fAT=C_p<-EL zKIjItyL#}4LG{53AGsJ3o;n3OUc#*kNu0F)p`;`z+Q~-no5!dzMPdesV9@T#V$nab zV%6)4<_A;K@w}C2PlJb1)^zl>Y^7@Fsfz0z9ygInHD#1y>v8rU5#=jZY|l4w-r&_Ym3VAafgw@@-3qGv$sZepN@7TZ;uJ9aBEqy$FJj}^Io|(qaQ`_dOqAJ zF>7)?%@pd6Rko}$8THoTK8PoWN z(79XsPdFy9KqzfNAyxYgFhP@q<={mn$kcM1fW%BthVZy1u)PL>Y;q82UWSA;+F9qR ziyBLF$)*&Za2VE<&K?;ZIOu}2q{b~bP%uP^@+1OYasL1YnbAcVDs)8TAUNoQTmJy? zCF%lFj-ss=9YQ?|Mg;(*7LHiKLUM|=>?Dl|$TJDTa|XPStvL(rnpdfuUhClo&C?$Fe1A;6*|_tJwZ3E@hlo$cc*|t z*FsNTGRLudj(W!V0CH=}(M3yab`8#W~ z2ZQwUOCa57NT=l$w>Adi6)pEiyH=cnSJWpX8Zz(zr6#G^;?=4vDd!ikhe_ zP3XBb13OT(A?rf1$-Bp#n$?dx$k3t=lCtx*{9?9X*RvSC9ty5en_7{jykwtnYQ~hq z3MF+?(&WQh-6d>}oL}3Isc6Sl5t>@n14?ua2S!yjoEan}tz-Pdluxp9ge8lO0B**3)S@ zy2nicw(HQ#EmaFz!PrEf{F2souk1or7o>{aL)8BO$t+T!C4HYxg8_Y(N&naU`8Y@H z@%ec|&jE=mdbVG}1E0AS~l)IHN3S`+9CN!BCSp$&QvroD-n zAEF`=Qfc~zEd+xVq9lo=i5N7N;L{;x5~i^E4=WD0h8SD@>opQ%)xC7-@?5Ft!o@m$ zPlxhPUbWicv&-KvOzB#_UuxMoj;yE6snhO067R^@{P<^|xsOjjuSfb#KjX(!mbHxb z=~~~^HJatykbp0+5!8bpwX%WX6Cewx`su^teph{#RkOl7 ze;jl7eJ6?Xt8G)0jprR_PThW5gBaeb+ZDcrh0o=2BAzFeW!%#`a>cKo`ORzXyCc69 z!>7rAS7((js$(azTzR^h;N9ciji#XMI&r+#4MDvao<<%;1y_ zwkm~=NXSu~atQlK6H~zG#J*vRC!U~jSXe;Od%&_G+w?L{VPsNUeMJ;TQ4BbdXelxY zw(v?(3|1VOXqtS!4a{UNFhEDCEhd13n;Q|JRH~FoRUz6`5zruI2BP8MVwBrR!&+@7 zN~42ppXd!!Sw&+6m!RMZV44icfsy?#qBUKzNJAtS01jk)587$;GfaYIU{8a?1t}zj zXo(F49-^c?P6{Bif*~)_2BMcTMs#hmT2lGsRi;&)6CXmu4W?Muh<#*PHCZ7Py$sgW zw7YN`GgS3D;tN{DRudGe+1rA~W7GKdot16D!@tK^``^cWT5DD9<(@A3diZ_cgWD@l`$E3r;k6MJEbtFF&bGOzDJEo)0BmI=1ID8Mu} zdz2P3yF!gvlD_19LlWt-c`P!jRgh}ULQA;NY?4_5wP-RIOUn|qb{Lee)DZ8+N-QOO zU_xzUNR_0i!gBD*Vr@n`u#yCeu7Vj^dX9os=tP||K{NY;(@sbK9>A>j;MtTuav@EXfP3>meJI5;K*JZ8B<@%bhiR2Rt8M zsFt0*fU&hC+!YT`1*F!M1)-MpWrSFq8x!g{8QLG{EV*}ST&@j3@_g-1(zrJnvGIQ= z@jG^GY4G}}wGb;qtdh4$GQmFsMG|-%0W4&e1(G^()U--b z8AYU_2>cDS7<8rdV_72DINYDklEnwJc;Hl;9Tw7$g{DMley93j(= zomvxq<}GeVru;v&l8#Pxx9E#_RQ1SCm#c?o$F$l@gRJR`!aQ#l+ia+pBW^S5`agjD zdv5P3QrN1?XPds}I`Q+b);!)9Ql`HlykqnmZ-+3@6>tkX9@!t))Q~rb$JhGBJ&bR#w)HXvTXM z1UW82h2V5oFOg=J4Mbipr*|wWdfq;imP}gIjqR-@8ib@o`={I$HI_lQaACr31!7gp z5lITuT7a~)O#;-~-hvX@qRP<4Id;)8l{_zzZ(O#pc8uEj&ox(Ln{aiGRpa?Rl$A_L zsO4TConG|i@On9NwevngebRbk%hM%wI2>isqV|;sI@EnH#L4CD>gDwwCKtKncaHrs z8q{^_uRw1d6otW*+L>^RRyrz(i>8Z8J0-vkRdq;-3i^>XSZvqYA4t2ONqE{E-bVffnf+4HAT8;Uyv(>#Vux z4P)N;t5rvF!?&l0)_hK?UeLHawdj%c{{S1|szs5;*J&Q*6xJV8g>wrh={`@*+V;qQHLhPH z=4_Wgp{c_cw;J>NteMl$d%gbv2CK+P^*Qx1(tf_b;e2&eli?nItJBPVKaZ(GI67mu zRb%L9Ry#E*=wi0p?ZO0yLOM>636-fl^%04sazh#=kS3JDENNLI6*&TOOIlRTGODj4 z(|XzT$MU{5wv(jkjCnh(wcToH*6TO% zoje_WMdM=Q2B%ogYJd0|YT4gK&m-@q^6p+VCENO#wW#f`oI^2baCx2`dmWh0g_`hp zX-!OLq24*Uv{P*_BU#1ynrY{2wwt1t6?_-U{B^u*xnIU`d${jjKKOaPkapKJy3Zz@ z!>op^K4g`tb%E4UNHvHcrm+TfsS@T*3=QNFVWuc0`w7Ivdyb3vq>Lz@*x*8uHkO|u zD5eOUJeu$@m;8!UGc<{UDYv1h&AMu#X~5G!ui#D!!6>y#8w08>1^!8*;{q??^&u#O zEkeWUYARi&Xv1{qjOoO`b4=6cg2gDp;L5=<$l@o+tvDs*M6uN&!Ip!;Dm$a}3j|Bf zU~ya(bB3U=<02vbM@|dXt^!uCAq{5(g2SOiNC1*~^#X6uRvWLOYVb{T1w&rMi;e~> z0(}PrqmpY!9F~Laa2gJ>$rDgVO{DS%L{9>QdJ{KI5M2x(1i@)oxg^;&XU7Hg+ZjN`b)=*TOoTyz~SpBupYw)Qc4#UtJDKOa|% zCxee)N28t|zR!hsYI+>K-ER(GKjLj%)o?SWEXNJ}E83mW9;ZoGJr98R8Q8C6bNYQ3 zJikNu&yClv9a2Y+uAYe>Rp9Hb6r3$}<~pyrRY92B%kwS&0F6$OisE7lPyn2-L>jPn zbR&kDQ-#_(8*8p43te^LqE5{^o$|q^&rfM4HluhXm!YE3hxXgRYeju-q{yp*Cm@>Z zvPjKCx^h^Tt;r^eIV0gxfohe}SXwJ42pU345h4+9L_k%MD*&YH=rLj#hF3zETLX;R zRe$8p7}}R<$|SXBz?)r1QmPd_E3RPDj(2rY9rF)#4Z#}|TU(jGG+6gr83@cY%2@~0vA*k;pb=paF*knr4 zT(Fa}B$siKCA7rGJ8Xvo#rZ$vnmY2!-4<@yA zX>w{Z`Tqbb#@RShdO61qqlxQji<$8;3tQ?xGcI-}M2bY!R>aC5&Y0GkRldJ&!ya#w~Pc@zcp`Qa+>LtzQ1#FnRuw>E-u6 z0!pc)#naIv-SKuO2gqyUIa&D_*0~bj(605BxCThje77SXi zQaWl#n_yR0JdoAhqyn(nX%((b^~9Qjx!$)jX`CNunq_@xwPTZZm2M42Yt7&BYVW!; z>TYz-HLu53zsvssCRd`nX~7E5Ux!JO)f(>8DiADk?eG@L_C5`63i5o9hWk?oNz*>8 ztK!xn@>Z;Q-bZJTcwD@cy3LsR-^p~=+MT+=-{<)A_a7B?2fjRYockKaL8JmCxqX?4hJNwX-lq|mSe!+_LJ&|xK4 z&q7#hBs>~kfUpvufSMA;kmN97eMZEmP}YeqjI?NMP7kPzHvLTD*ed6eM*WQF)V0vi z3C0kq_^P0-8}=oR&l6I%S~>Mwjdtrx{X#V5y?PqfY-4IhO)y-F)vax*MXh?BHM=yI zP|+jP*YVb_w*5|e?KyLQUdjCh&nwjNJUj2FZBfswj@<2fJ}={rzsmVBevY5b+o$4o zR<4v>obOQ1Uhl*FW6`Zv+@5~AcAULxYf%(A1*Go3p@mQ3m~nJx_=5 zZAUihXR6mR^*$!FpyOR$mbTG^)uzn0!*;g}++oFa4jG`%`QQp2lwcVpVlXR5Ahli7 zkyg62r(^~_4H_{m1+6=2M7S}nF3DLzCT~dU#QmIPAPY&QjCRpJLslk~sRZmzKjXnB zYV8gto$IJ!UbpC2%WB)JENex!K}ZQ~3YXl=PA<3gDq_3PD@nYLjS2NCQ`|_Mv4T|} zad0ez)v!qy;AIYLJcvYyXs^`EO)GH2D*MVBrDz1Y-bgRJ4yjm=m8)YUQ)YxAl8$|_ z#8)oFnW)Q;ezRfCWf%}%HB+>ps#mY7(2jMc>t+m?n_77_6E5t*BUge!>|F^L+#p^4 zf=Ap+0X3%2P{h9cN+g$O$b(kmK;b)zV|D0gIQ)%MEsUcdE%NnLZplkM9J$!}k3UVX z7FEgHn&s5jnQt2X(9zM(%wxMs-%(9c&L{(NifwEj4+RIMrd9v;4rSF3~MzZg|r+?k(dFU|74f5yE{ zr1(92cJp_`g==lXJ4)o}Umtr{xhXSiUW^{NrSNqX%j9jX*RaUt zUp4aHBD#I3^l@DJeEqyT)pn(m(XTz_Z7f+!kO*U+4 zeTgkh-;R-JMfAX?7S-%2pJql3ZT6E`$mk!^c3*LDC5GP;dFom*#pL`)+@x0wXGb3= z@_!qIWm$b6}*qH?%B97mh!UnzH!-6P3T@QYGiWn`75lT3)lL987x zBMY7b07z_iqnrmXhT_Htl$D9(tuBa5r6@yQo}|4K7eHov&STg zM+K)?CFOPY0_gGRt%eqv`t8)a5z4oVTDzCjjEwg9t|f3YqhpHNtlS+KYoo!o#}&wX zVfA`?J|fQzWasYbIBBcmEmtiWy|+GZU&Z*#-74~qH>RgJ^)!ApTh}WlFV`ENJ$fD= z!P8Q~j=q}dImdlG6%f(OTgOI^2~~!ybyvq#!JRnK`1pi_TgB7Hl+iOIeSaHUxoS&V z#`?S^NNE~~5$xkU7AoT1Ntib)E-NT`EeW?lwIWRR(l{s_o3uyr>TV5ls=(R;tl^oYTS~Gi zR;B1`=xbIr)mY>zYT+X(jh;<}_b@uT-b)s$L@gOX+a-kCOad)tX(jA{2zxysNq4}a zw#h+>lQbDO5=xaAhKpk03YEz%UN{AeacXRJZ%l?Iu%AcXCP9OXSN@*Q(}AqgtLt9g_V;Biba1{jg8} z)cHS^rR(HfZLe*ok3;nzDfs;FUR+Tpqr;t6yR8_po1_eAmhTJ%1nl6x8p}*IsVEZ=dpfYioRD^v@NCxi;dy0<-ibu&!s9zBA;Xj`_ikrnM{Cx6jf402%tUdG8h1-Ppe%)%KyZ!_lvJeH$-(Ldx|uh1LCOYH}KJaNx)5jf(`Bav*3in%6V-y#jNMB^JL;aCn$|0x`WrQ)1vOb=5q0QYEyFD?oA?WA zl(JfJjeaq{Q0m7gmGJ86*7cOeb&TG1@V_tr09jLOzit(qb!(^8^>Oyc9=>nOep}%8 z{C4YV+e;@`%whcxe;xZgJ^bMLBcqS%S|j?HhXTmuk%B!4P?0Py(pVuP7;QF3 z66!iI)qPCbi?@Pn66-t*9z@`p{7iZlvx-udNXt^8@ZXO)lGd@&PaSf?)q!eB`vt2HwipLRC`~$P zr7+a#)umNJ3r;mvU3vkHsE`)DgqF2|P3b&2Ejs;-IZ8p>Wtq-@tHr4C2qHqGi5@h6g4 zDWkUpuv(~-Ct_t5u`OYHPbQK+;NsTWoS<6Tm7Ym8tqgfkCF&;%*hLy=Wb7<6Zv%y! zSs<1xOTVCE4#<`EzG`{HobM8Sd z<%N~p!zh@yCWAZHMkglSGH4Z4AQ-yd0V!Pp(f1=Hs$Sy7DjnG29mEYc!U8fw8dE5f zMF~POb)v|H)~a$^aN-dm)R66xg`MdloZB=f$m=d$zA9$*Jnt{SmGn0&Haw3bz;@}A zrm;F>Eup#!_>MgP^)^Y4Ov{{Y$5SDEf! zr``B>kB#=_@mjnMn;&d5>U&3%(!P)2za3Y<^5_2mLyyzw_5Aq9)>GgptJ@en7q_R? zll*tFHCG5{(Tl@}&-lIGH9MVqss2q)*}S;?Zv*b^U5Y1@w7D7Qm)rOrE2V0^5#;W@ zQak%G2NPm1<4+-{2EQFHQ0q9^cvZ5Lpw6_aczw76EHrkXYhGz4v>!U}?TDUQIZg%OX%*4v% z#rdy$Qod5!-XA6CFL=Kn3Cl|YV2LsiuEygZg%?*6Xi7aD@?P=)UQ;s zyl==ht(LCE#c}(Z`OI_e@*g2)?%rDWJ-ocVITSY>9bDd*#Q2|j{{Y40#p@k8=U->y z>RPI#@%7WyCOYfqMU_`AoUrTaz8h;=(to**o%wro-kHZ5c6j;EC>nQbY{PE7KH*z+ z(VVHmvXTjN5=oZCF_tYsrKyR?ttPq>HjpGW0zeXmI6RkG3|JE&0GT1&Kz9jLfYVHq zNu2tEQe;=p1fqW4M@aidP`0B`1+ErCq+W!XIyp6{yFeSx3lc3}NTacSqpKO&2ui53 zD@YXAM!79m@2>vU1~2PPbltqNu%pPMyWpa7TSVcVBQ`vrnfzx@nO^JBHy(#xewfAQ zUyA-?_%7d#wY-f9-&1@>QSbTvb>aGazvJT_bL@Kc{5#G0 zYJJ}xtL>~d%yrb~%e490e=+z^$b4e%+fM5G*CuD$QP;-2U4Aypzu{MB=~X9JDb00h z_)jNu?RxEBs)Dvgy(*u;`E{TDt9@ezb{Wli_tR=V+bC#QsI;tfEM}pjSc|u*C?Yw? z0on%({D}=lN>*^5L}4VkMWm)l3b?^6!d#9rIp7FtM@DFbvD7uA$LdE*whKT@sOq{; z+?oFX^xit;F{J*YHBLD!X)XTajOgJ>lskP%2yBrwx#}i}M9IV!nKU?HY$fPS!@?9? z@EF)?bI>)K7Cp#eJhMdF_alVx$3;J=0JDTm5VK4aQ$XG)x6pNiVAd2uk{B!Mik%$& zNtCv03Z=eK0&02viLBKu0PvTe{X|tx0O=B1uc&HteWgFggDuGPJS})R-`8Ga(XNS5 zj5@T}Hn6+BA_gXm&PW^R-gC)_f(ST{brq?86 zMQLPp)uUU3H9A(e7&E5}x1$qCg6-iqbEwz(#87p!Cx zB*b6U)%pUTj-3hK$@B)b?fCde#ckO~CQN9p1q({;kX5}~WE8LnnnIy8M!BzsX_gx< zQEQslW|>R5CU%x-AyBPN^wiFmO*sVFG-aZ2AuXmb)Hmp8GrV*J&chjI*rYglB#T-R zCnu5RD#@&7x%K%~Wnz`lPa;g4TPvIX-6Ku0nONjAkdqDe_6 zwWJx;s2Fh5$g-!9N>xlWty2BDT4x~L&$5tZRlgVguc{)>1)MXgqw}z%pl8j&V zQvFL)i^%Zvj;5t&9yae9%F!RGy=Ji48n zd|erZ$yy`V(MJ$r(mJ*4T!lF4*5PEzXsrJLLNQ(5*YO&|(_zHOTZ&HNvZ{43*@28BC;KsFw_8a4X)X{0+6I%GIfYafvG$nx4EvW_; zJ3MLqMVFiBe0SWdOxCexzB}dq6>CkTcjM^e*DufhL&bWwIb5^o{O-Ix^NuKIqg-i3 z5Wus~B9->+mmC89F48#c`2PTk+2%j}r6z60`T5$*%J8q_UF+DQ#%FSlxv|XDa&-{e zaqa*^f+Zftfu#mWi7yCQ4x<2S%&_XalQPlL-L6>;boh<=8*4??!C8>YucUM1YkjXU zc{;lExi$HY^^3W3I44dYm9lMio8iy5ou8rTao4Bu8(y7?>EcXv`tQT+UjFK)-cJqX z>h?#AsoQ6JeN8dt^*7ipW(%MWLOm)RHYxMcdbc1!TI3Wr4(t zDHTalexR_sGHIM%y4htK4!v3%G}mf^mKqp!ZqgP)!~ z&A*Rn+5Xg0asIWt!=Gp4RBN}kYBT9s^n4fQAN7oBx0B&j_t!DZ`yQS?&K-QU@g4`^ zKO^QVKeXtoa@0(Q(w{x@vk?{{AbMY-c6 z7BV78!3h#LjPxkbCU7ru1mz1^fiPY|m?hy>QIuLLYTM+5{RDP$Vlyqza_# zE=y6b+!05hz9^G`y6d`<~@q|>M(QH zY+~U!U>e(0SG%BUSBe@*V4t!mqTpIb)&Gqe8AsY1Z!jy>JP(jmp_GOS{KuurAGd&}nsRjtn&##sgYQ zP(ZAtRY>cs5<=MJlYUPVIyzeT_b2c@unrxFLzj-wp*6`wTz_jm-btF6Ba4)4PJLe?`m{K~K zZE}cXn(wbuV5?^Sgbi1zog&s`5+Fz&IZp(1R7$Fo$&}G!f;iO@YgfQwXss_HiBEz@ zRq7fVSKNxAlKXLjX)dUiqV<#^&%07Jtg-u5;B{d=N%C6D4Z0R^GOc-@Pl-HqHz;{t zUy9!b<2B}g@wRsEY2elK+)0M9rD*mhx*2J=i>K|lk{{0ExXk zm3i%H#2WAII$ZqyOY?un{`7giBK|$U%`aZ3AD?+g(~a=>8*6Km=}WH_<=5f-ef*E~ zO_yC`eDSOPjj4aPbmeq0y5Fes{3@tg(~_36*A6G9)Ns@rbIeZ|AW*st8kVEzZBwg* zHJBf&D1vTsEjoNXuU*qddYWfXPs;fo+IICk-k+}5rzelKyZ1A-n9Qj1wmUg4VCu5g zy-ijl(D>bdcVe$jOmyqbeLZZGUqj1YjgGBXb>W$%>3H5#s#0;YT_t<}03WjnymdL) z=_}pw_eUo>?H-nmlCWaJ?bWcs*Hv~IZEI;`C2fI+Qtm+(w3KNo!%$h;!-mVPhwB0G>JSJ^qRVyTC6DGPEgITp00$ro2X-Qzxy+1(Jsj7m|u1gB2(5!7+ znQAY%0;R5aC8n){MC=J2;)$?2o9Xo8@s-^OD=jn{zUjzA<{avHTrM#aCox5w%aC*4=xcBncz17>U|D+mGk=M#}%s#+n-2y7E>(_Eih{m`53@>7;0P#2CIWD6|yI3q}L@# zXdtk-G^Hk_4Z2XjQqhLdXv`&9EjX{JQ;CQXA+R+uCYiAMnIg;dCUBN8ID$n{#3p5; zUW23XXX=JEp=7a|Yuu`V{{Ry)7ENdju_q#8n#Ms-!1KUiw76!5n=*raItapu$3jCK zzDl5y>&Prucj#C`^#Wbl^)$)1=ory7F`E+(G9wl42q`BiHvL64fjK0U6k2ZSa>sGZ>O<1lNP6;p|$>}I@GUE#o5Pp z8H(#aUAEiWzJ^<@FSonsXgRkfRU$kuN1UsPD-7xCc$=Nhb**|8yeR5m$0wWJb%Rk@ zpN*~Si@u>_5$||zIWb*1ch_QkGYz)ayP=v}{nY`4zVwy_D|93skrsASz^dZ%waSxn zvyV4zV9>@+(}E5y^^OfNj^H}q#=EPO6ur+EV`(;Gw;lR+Ns{PkH7paGe#b!?*H+%- z6*@lbffl=2B6ZsAh!eITlxD=R+p-YGTzfZU=_4%dvT#V1y$eyTlgTFZw^BISY)H-# zZG#{#@*}_0hO@Qjj)Kjo?1tq7T}UAL1^JntuKP7MYd?KR68Lz13ar$0f)U6sFj zmC226S4OSHRjroT8UP3r&hYh95XsvCD9Sn?e!r`1d{8SB5Nc_lmF2DLtBIC z+VVOolfjbcr2soArCDQ>Brh5|7N*qki(19KFdD2Srb!pt4M+CK;$E@Thfh)js9Kci zJTTRac59R&ZLZRKdF|)CK1cFDjl>2tpm+@)JHSW#j`G3rQH){Ng@ieIJUCK{?$Lsj=-=FL4{x9(btH7>}F@)3S9ekyJWAmSj`9B}B%G&MOIBrh5HvpU2R;G`PeCh|%(*G|&X-mXlv+mvM& zYGtWkZc%8)Hl#7tiM1q_GwcwmuFyq#$s$!GRz#t2O>0^bTC_7MUGhScu?UxFENL#| zguA^<7>1md9V<1#7Gkjd$suHs_C{H1CFn4xx6neh?zXom7QGEWEeb5MbG)53y@?YUmX`y z>hs*O;Opgo`0)4m?^FIsuc^{qdHR^anrB2vB*Wlf6Dt`bsfgs(vai(1(wP!CUs76_ zagl^XWJjn2DJFnvsb0lFGB_8Z4GY#plY)m%Q$V!4f59?2KG4#B;o}Hk^_-GNxpyvdI~6#N5{Dk`5|ha2@|y8h7|B<8c(kQNaG}+YFQs4ma||_ zq9B^{3`|pK$|}6T)hexw8EGn}^kJ#=!ITP9im$IEojN~`QJU0_n)yxO=Xq<{=y-8g zEu8C7-F?+xvB|x0?)e)h73gkrqV%1ADP@+&&`#cui}RAzWaHNklc`?!i|3}3PX{Z@ ztm)lfH@gX#^>o)xn|C~gYh4!cmFo+D)aBXWDrItS*kfNG%ll8Yn6pf;TgUP{%vjW} zo23$n*E8GMX+kx>kMb^K)Xn6|?Otn0&NPaAjpzAw3(41^qs;C`Fv{)Mu{@D%wxxhV z`!EGP>Lin!eWh}4K=V9{@@oScU2sVrMLV2j**vSiSTr$MNy(T!dy>>2!aO(c#x#Y1Mx9kLy^&z49kuPFK+TfxtM2-m? z!2?JMuR={wCbcG=8mSmOB-t=p&fE@$Y+_}x8V+ly z97S97V9i~r+_AvK%Vw_CBAl1kFFj2yVD&D8teT`e88Iz6&jNA1Eh{ENT4yAhD$WZQ zhpIA34y;T|tb36u0k8kj{V!9O?0q+p-JwV)Znc92*QX&%q9o3yy3tmmtywaewa{WF z3sTle6iyJPcTj{SR{{#Ck=s0VGF-d0J0VXCB1!9TlqWs``gtR;Mpd!}tnnj2y4gxgNDVDy|MUrm;1r+q5y4Q+KA1Edgb-?Osl|8&?hvy!VV=UZ=+Vb+uJi{GscqTIM}^_|-V;Zi@Knqc)V^!mAHt z@xEi>*3EWGsmf-jRi3$iDfwsOn{-;+>rU0xBk6p;kDv7UzApNmdLKepj>JPWF+6=m zoE#|tYS6Gmm7h)r8B%=%8o-e(G}&Nxd}el4#tilN?aSTrzC&KBe;!XJYqjb;UB4%? z&zv2n&C2&)x4`~Ov&6cqZKnN9ck|ayK9A6TH|O8pg7g0Ua#R(5JC=GIc4YD5E$en^VwIdvgShR1(z@0c|UurKy$m z`l2cAf~J`=rUj_B9e=#0n7vJO^Zmn}&fWvPfZez@k)wM+~8rRifdRqqewM zCYf7Mix^ss4zq`<)=X2>@iuq;QO>8QM=RXnT_V3iB`JLg1!*itAV+ZG1d0d(0Gfv+ zh=?XcNhW(WD=eCoiyW8It3HhDD>gjOFXA;@x+=eyILX_erHo!*mVeoQfZKMxen*E@ zI=j1<5}EAzeX_j&08gIBPt!JDTX2*d0^b7-NGTE-U|=0$v~Q@)9IgXW5m!mwru7F`sQZZkbFyT5GFxKlm|Xmmc4T=k`@5&K+{? zI>)c#e1f_;UR|e8W5)AUQf=Vnd2e2Yep6apglmNF18wq)}B2(a>}Ub`|T{5#))l~pFqUz z(d71JV9kP8UcW!y47zJ&=VEya4vl_)e+7$Ly^o2&;?VX=$rl%q7X1b?!j(yqPVI@| zU=xlqYSvq8c{0>`8m}nOJ0tRtB+F^r%gaKt1V4C@sQHYQf&P~0!~e7MeU4= zaqecKa_mh%V^Nytcb-L*yLy2Xzh-2Eb-F_dt)e`$+q<+=n*K~Um>dVI%*-&cHhxul zU>2^MXOgBlyqm^X=xPgICzHLl{f?4j7QC+~%6v1dj9TVfRhYTD>BdY}<9%L2nEe5( zUapJEIo9K&z7RDSY<hx6p9uw3s9` zhgF3g2U%sdlZU}V;lF`fIcV!TV;veiG?o@i*yF#))!L)f&89}*XvzY$tW`KZhac#V7k?MdZP4|;*U9Rg zYs+RbwO$i6FrYyq1_o1I+260iNO@L1Q=|i7?{?g%df`Rs>-LK zqs)voDCK!-R?Evz27OMS-0mz|y1!7SE>{3_nIt>DgM!mr8Dh}wB#Af`ruIN#(^gLb zi%f_mg=Yg9bM14%xXLyvxoBXomHfxedOR!as_t}6{{Z@q+{Zqj%>Mu(Wxs8<)pn~k z;QN0c$oU^%+U0eO9o+E_qQ)Ap`9Mn4MW(`a{fW;Df@=h>hOo+>dX_C6zNMx?g@QuM z+#;!FqdS2DO!Mw)0H&mlWE+PGa9SxKV4LVMXqixp8k9^5(r!Zqx@i!ff_*{1A+-7o zgG9+47PnBrq~Loi&~<(s89+pXwhLOo z{rDkp(4xWuKlI3rEE6M=Iy-$x;jA$yIl};L$SeAN*e0-I08on2hOO!gPrIrtJFTm~ zshbwPUkl9bOE@_7%eOr{?eg7}i8=bZdpWiImG)X>*P}D7c5L|u>Ye#WJzHa4_O+v- ztQ)O0Q?kj<3bh{JkL0RFmR|>&^4za)!ShpVy|1Cd$5~#re4Tc}aAC8(mo;KoJ*vEr z)LYJsCO9oBe3iQJSA{xuSI_RRY?$?Gbnftcny#j7YFDYQ)w2CeH7Ktc63=F(5;~ms zr>8&;O{<{6S))VBsM27Y*Jq$(P4#T(`2`)Cccq4Am!VC#!Gf>6`VK8`uV<)OM$M2? z22W>qBMG+%gDdQWYDDMRX&9K@&KQOlP_Qhy@0=PAZM%DLh&0i&1e>d={Q|aIbJU|Q zXHQc}m8m&c5s6zGa|MCZP0y*EYgzdl(?bKt^6xVTS^CAV7kzDK2!Dv70#s^C4qCrNqq+_6J#k+JS zlS(J`AiH?!uX2>9`h%(e)BRSePoVK)>y8N4)U!_j9eTDEZdX+{bTLa#=NK}I*BFYd zQmovoBARf6j5MDf%tNPNKJ95z%M!jigsA_2n0V zqgb+or#Bq>=UaBix$kEmjwj?G?m>Z75~^65IqR&? zZg;P#_+8HR?N*pP-N&bz`yYu89|N6NP61gTpqZ`x=W^T{1N;o;)(t>!yU1n6;?R^v*gH zE7P%8{eq_Ja^)GuwCR5CLl(3$Q`%_+i7T|uoDQR_66zpTLkgAz;E_fNCfe5{D6tl; zS*;Hr=DsO;TCGN=w@}X9bjMR)&Hn&5_@|Sr&)wr|*8c#Fo2vFczsKnxJL~iPO+N$q z3v0IC)T>n4=)Xwk{HwzM0ONN3#i`Y+K8+nGPB-UctH}Is$kPhTFQN(DYx%3m{9DZN zsJ32?8V`8AE6BE|SK9eEy5&^7TkLeTu*wKt&6vB8z8QiV!s^ct#?GK-8e zQ}t8sXfbN4%+ngJk$}eaZta#Wb@)2F?4`laug3ZPdUvI6v(V)oDbXg@OH6wDylrr& zCo5eeJ^TLEyB{8=ys8(FhnJA2wZyCvGrcb8dO+WqQZ zAr1X!T6Z%{G_7FEO{r)zRBNkrJU$HA)7kL+nNo7G(mf4Zt8i<|?CTtnb6Ux`Am!g2 z3{}qFeTuS9%cmu}a8qOpE}d6x8EaiS@9HC6nzzOnV@-bkK;Fd7kX6M-4Wyf~s`3?nYyCGY5x9&y`=7m;|VuXy~ z)K6>3oiF3jK&w*Ra6!krZ>Zp}H*M6jan7e+l(XtE2L}V>{fX! z9M`2?vW|G@R@v$)7uu^W65M06Z1puGKFvIBsVI=DS6zIZ8OHTr+J(*l+KrxM`u>Kb zXH%m6#Z#wUyLb;LT`K*^&xI)}C6+;+-{X`?TJOSSW2;}HGFw$Xyn&4tNVKmR0=ngU z0$pUP)kbI3lIq}0TD1K^YL)*0Vk=hwuIR*rNO$Nm1oz0|M3BJSLP-K?Qb~Cvh!7~3 zQVn}kM1!MG1Paw}k}Rh=HByy~kxI9L6}Mn0aodG}IDL)qM4rB)ELyArQc(ocNMWmA z|J40nr_gx~S~&pHxAZJ6seS=Eb>0{jz491Did|VH*CuEUgIbowLU$}lt27r|dID)* za!#FfOqz7pLNjS!*-?Pi2iStqVRm|sldUs?IML7(H>cQwsi`8;eTcLZtQMUU+Cg3T z_5`YIM0K*-foQvwNyDFPbw za>q?|c<~Wzp{thqG&(t42DbF6e%j>cQ#)+y&=V`!KB6^~)}Nyt40da)aFhyl_&wBw zio+w^(P>9383^` z5vAB9p~xeu6&1n(P}(4ul4}XJOIfv%8gBAX>CBKffJj!31k>&Wc6cCEnKZH6N~pkE zO4jWKs;86DhAn5Z^5qgIv2_uu*Rds+1X}3auHkeFC3P!4h8sBo5|T@hXn>AHU`UiW z1Z0vV6CyH6J2iJG8AXqc`On4{?=HKNm26p_&!28Ra_{iJ9@R=cNlM^)`l-u<x@$epJfwRW9X2jF?N3))_ z@=wu%13@S17-vDUkW|U55#%t2y$e-@p^1i{MhfI8Z4(+2agk`!fLK;@f{~gUBMn(_ z7As2Eos%rsX~sXSCJVVRtBSz(co2* zgAz+gyouFM>=>wdcw7>b23eXZL>korRZPg!vX$;yiZcVPVvsC5H6DPfXQ`#5pJ2dg z#t5&uH!K#KybD^}N0O-enX^=_>*hWY&(*DT=<;JT49$(o^!$G^>1E*OV{*B+d0%qh z&6@QZPRi{`C#&%~-rd!$SMf(Kt~bnm2a)A!(EDqc>Tr_ReZ~0RO?GFYb@-)qTJ@?; z7}Cx86|QHI0=`0g;4Ct~%AX*geT)PPz8^ zDZfETw$#f4U5MIMziXa_S!+%3xicZw+WfS+94()eqxi7Jsa|Ke;L=`f#!D8qrWRnUd+F zmI)K`pDYM;5xNa}>s_Vk|nO`6Sg}pkmck z$SgFyNYBKy*CG?n1uC?Vp`xfX+Les@g2zUcB-6H>WX)-+gCkRKVhD+H#uKQfm0qBZ z$s_>`LUvoVdy-`DE?BJ=a!C%+)P|wm^(4J}a!I$|j!OwPu1J(D3J)tKQ;*2;R>ado z2baixOZXnIkgM6R_})KrzaL*$9{zg#i|0QR@_bG2Rdw0Nq4fS=SzaFgRelfP{#MGZ zn^$dLPN!bJ(i!kSBk+GCT($oI@|^zwykEuh{!fLo#@kWQ9C+CcTX($_*~>6K-J5YI%K+!+4wGyEX86dwThgtMILRIl95*>O04^@u{b#lf2z)`|h3h=M>6 zkw6d?fPpkb*(BRqw9NXjoSo%yfByl*y+yJ(;2dO7;o=Xj6H{(Jtlwu{>OC$rPg_i_G> z^741_d>5bK+r`^$S5FQydb#UfPWi_psyD7UO=3Ed#J@pS2k6TLBT=A&vKs0du%ZQE zueg~{pc{0ENK(;YzlT*GOL zpru6!LHc`{Yw#wzkkU>w7!-5rM@cy$O(AL>vjD9U4Cr#unst^M4cZASyCsKO>)9?0 z*j}EE^=c&LU1f9av|G6vf}XA2u6;tqA4A~z3r?xl{{WH0sPD+zw`HpO$YIrZ-gn#n zG;O7jvrn`~nfVRpwK(=E^B25hv*vGPtgZDm{MWvl{DK!bFXlbn-Y4Wv*nFJ2`I+0- z@%}+msZF2trW^ClvGTZMafgjzU zs9}{i-H&mQGu6Hr*qT2fPbG^@d3Y>3&u^Hb5c-Q#ugNSL>C@!K8Jga={=}|94Sqvb zy##VBMR#|t$lUgxfcdwvgWp630BUl`^@~qxS zR+_ik&Jito8n1+AmA2yr7P)+dI5!n>Ur4b~zm7mTuUT!Ilw&(=Nr~{s?3!|GnAN8Yt?SY6sI?5EV_R<^QL7K>io!Bpwj zUgs}^7Mc3={AUXY=IK8jO39Jaw#dN)TRM|bRM@yPVQE|BgKGH;pkrFs`w5xBs{5qB zO>IP%U89C6Z6Rvwu&9lzW%M%MtGP7@is~t(NHmuO3Ar3Y>Oj;168aHNNg~!`8MOsc zlZ=9N`1bV*b=ymNnMuBKXp*XL+=WKXX%wL~v|*J^6|e~F50Yq|bAdrsl9g&#AXU_s zD9V5T*8N`X@_X^)bGtSpbxFq{)-=@QRyt_p3~N^(P&PKBQIM@h$s!e{Qec+Xpe-h( znk7gUaiwaK10teGH`S_srCP^Dbvl8KvIv`K66<;7fbR4JsyX_KTLev#MXW)F%T7fz znPQdq62UEJY2=whk}0gNqo~#2QZ4niO0?!A1~kV6VjX%BP4vh!k3Y!xy<42#slQXF zHx@Hr6{@NgQLEiJ;`2TeUfR0G3Uyeq@c#gnej%>k$yM2PJs&@=JpFw2@IN>B^*ma4 z>20OYvF_vRuP=OK=Ndhdyp*9YsG9_U(T=2W;ZAy!HMW-w9c6x__-~g@+ACfyRSg~= ztKIW`X1eQ)E>9J&L!(ZWT%gq7wJe#bj_r=gs>xwvU6!iPLqWHXxiuCHEgDOMAgj5~ z4M==F9UJkJ7B#Mwu{9?)mbOS@Rc|7ir-Cb1jsY!S{{Wz3#rH@PPpG3zlSOC(e{d05 z`jBQQI|3cTiQfc?Sdx{!Noh1n(CyREhLW@r)J)`thD8!6y@aCp;1W|H+guXG^dhyj zput(~x_v;#4Rtjlu->mysxrMJf|OLc3c+1SwPD)5xkI9zJe$)9usXE)?%d!o>(SBW zs~qnwO6yw_;Knv-$Q?K%ppYOD6kWi^X;Wn2Y*MWmXu$zO2nIx*NF}8L5b`XuwG-sj zs~J5;v@qMD8kLuw<@gl3{z&OMSDk)i{{Uou5ncMfvEx=Y(=qCgXUFT0H`nK{$8Fn)39tdS$*n)2YS9FP zeHR6UI`kMYK`&EQmIT>F>QT_vgG=@Tt#^kZiZokVa%URW>gi+HF|@`BhT8nQ(-LRY z&a8Lo`A6Fp;OBUCojGsky;ps`O;4V)YmaY|?`-uqIb!sh`7ix?4dhB|Y`H9I*3|NQ zb5QkCy&oIqFJ5qQ>xW6!Jq;fsw*LU-la=QkCr@X?^I=Olbsc%>uFpEwcxGoN)l<%e z9EYl%Iy8BWxM6u~+1E|-V#Dk&wR9bskm%0YQMOvnM8Fz{D-3~E7Rw9bIE20 zRX4v=Ej3K?0AUn*a*V%DG8=_89;Q*_|SZ?9~ICiK}P)M;D6FAkkg6VMu!qXwxu z^$=-#g(1}uOk_bf=nAE_D4OcQNS3ll)<`b4?Q#jxuWAzLSwKxG;LZF3`r{_03@u1x zLvT@8D{>8Kc?@Z)QW}k~Kq+cOm;V63hQI&U{ZjTl?;|GpV#!umt!-QZk*yq(#`LtA z#Yj2(N2YHPTHjqbEM%Q6rEHOX6p<^ zp`a_OghbV&sRFg2f*quAGP{x}bTqJ5zM-VtJP>2CkVkTChN`zjb**nN0(jK z$MS6HEuIS=xb}QKs?~#)jmKqmwqlUSVM)=*G3yq5)`Hl|xHPV3O;; z(5moQT{`dGmSV#zdOn_jn@k2Zitdt4D*6D{k_hWzG~_V{W>{eF_XUZ2BZ5I*OAvOF zgG;>9MXm_Do53a4(Slgga0v;LCt_HR?t-&VzDpHL1d%#ceMo9hCbUnJN!70_CTmIA zT#$3#u_lr0U05crsxk{0+M^REf=KRWq-N6YB#4$Eq4Xr*MVcyJpO3ZK7_hr_-N&)c z#-mkf`Wb0J&>#Ub*rl6-muI1CIJ&4=IOE z2;2`7=QO)$v#xBDYE929^&f#R3udn?XOZOVef{$NIX-KT>2%N zCP?YD&}pfWVA5ZxX~76ukR%}b(w;3H+r>(Amqr&?-6JABD z*~pwFv8*7*8+iMjUw5I4%Y6Ple-Gr8sc>-Xms#7U-g~QRtk0`{%{+gROD)SYc{8V@ zPcd4uo=$kyx6$Xr%QJavT|eGeT$#hH_H9onWLiqrVrxBgpkUXAc+6)BH#Sm;w; zPG=pyHToRuT)UcG8JOtKyVY3W+-HA1SAz8yrD^lku{jF_t=9GXmNd_1#rh0Y=Xo1* zCrIaBSDEKRX*`{$E`3)XuadQ8$le&8y?+zrEx+T!JzU2tTtD2h zv`N2LFJ{*AtgH1g>TO|7j#t7bRR$W;zm}@`85Xqh{O;!n&4=0FuX-|Fn)b>vb;8|VvLQAlaVlyD`{Phe6yD8Z)m z{{SOIuAONZt!rh-C03-Cs{oBu3HIbeN?r)HR{*~7Be;<}Pb387LH7evle#6W?{1=t zxQ3zIsUz-0iL@b|tskKn%Vx!r6_XHZ&Llo#+%(WHw7g0*4#RXE8{Q+V378JHv z8C;gU&p*praK=q$*Teo*srjq7TK-S3q3QX|a_#c#@Xh-(cxj&b^^xZE(_ewB)i;l! zukOE#%K6X3Z{q7$(zxXhKW(mEe6jOeyc_Dxk?Ec5&(|z_8Le}=obV;mQ>0N1Lz6qRI37nD=wmzMtc^F5H|ew0in1{{TZ3rtq19&t)G$NM1W*;2YK2 z3kfOYP;~Yr(vY)YG0{q>2A5MbG)xle$h52U1kphyhLB5BYha5nxJV|5Xm{-mRG!?B zC1E0RMK;)zBo@%ct6NA8@kbqbfJ#^x)Qz>YR5X_mfCy}gUccOu zt4Iw($dLf%Cj{>dm z%Mr>(NhY7MVuE@}8$!kh%QAv$z}`|t6(pO%GboM;Q*yx$-lL{M=aEM-#{pUJIR>DQ zK{=^-Ssx=X)1Cp55yv5aTGPYiaT9)njL^Nz)}ZQGmB>^r>`;`y+(Etr5m(iUKVVpK z1iXhLa}`$C(5iy6zJQh8)!>oV^UIK0-@CD7Jhv)wv1g%pT8cESo(OB9Z&z^!ajjG; zya99h7MFu?R&|-rCaW^FRkeRpCDC10i8E=OvcH#VxMMk1;aAJD{{T}rl{$9l`8%p* zobL@z(Ed{1roWp0jr4q_lb(hz0(~B)pO=_cIbI#7Z&OE=ORTs#*y*h;xp0wVTF&k< z)qvK%Hook<6<%9;8x=xBiPO7?V`7fFZf#`79dY>{YNX`Uf#vx>CEJ6n;g4hSe9WgZ zRw>ih*XAgea=g0iXS3w1U(jbG+2#44B(C3UJ9EpO>En4GTf2j_<<9iRoAPTM_1&Y% zkEzP?+^*d|RN`dCjr%%v?3NZaE7b9>(oxCAwH=?>OM@8csK1izn8>xuZzj~wLvk@# zZSz}MW$LxTpBJdRjNMy&2CN z)3=d!ucZr%}_G&^+sl2I(hSG-v(bc=Diqm>+=moVlKs6(EvKbbY*~uZ^xavfAPt=i2h|*aQ(NxKUwUW@$ z1tdyPo?wog!C`AwnU#j0P}PRtLM+*!%JyQHuE4d?OG+_Lty`x;#HVlYSd%1i|Iz(6 zv}e(HkFyf8gGu(sAfrl=*4o!r2OHDalX@>usnMzxDQ%Lc5AFiN-XJ}Z$P{;un44aHq$)eT3qV#RJB6X%8p}If z5@BtbG|C<1Qmbhq(z!BMTyP<(WJ0t7Uwi@|bVi4=Nv2yiKnI)WXj`)S8|U$x92-0e z+v;@o#&MhQ`%wEYR9nYY;MD1ybNOBkchk1ZCZ|ImH|BmJuWE}gbG-WFjpJW8=l&qI zCsdw&4&41~hhI0#`F|U?!@q5+&sRPBJok)btln2B)-8J<3GzENZB$L9&Ry}Y+;sg% z;H>YdH3x;ki?id!gPR+4J~lWl$63T5_VBdWu7CRyKG6 zOj=f{Vsa7xA2#fau|0XI@jFtT+Nhjsv-#_(8~*JedDTYUhc+aFR%R-F2X zYgITT)|8BeSZyQ(Nh6sAi#Xt6LVxlhPS^}kCn8r8MXgj9k*%wcD^&m;NZ~;&O^GtI z97u^-AeUc4O#4M9)#`>aiq|<3=+#uY1nAf32OH~ceF(a!lQUXcv#FmUwJqGF#f_U% z2)SY~z=1%Jl0r!*xI%4VOzh1vNsz^N1|(X@L!WEOpv}2PgO|y8z~X%G$t8PtK97U9 zE_L|t{g;HPAA;8ej2KXC4$)Cm4z^b3`e;W z=jsH%j0l|I)(EIysgg4S)TLsK(J_KSB>CjD0!Jj&fv-}E(zh_UAR;hGy%`S* znFh5siFd!#u=YuII_0W9p06 zwLz%#*4E76HEnWvemYimT~3_VdX7~l-0@YvYJkLD(pa5dHZsn2u3fdVYFFrC)$M#< zw{Q09ap}He(cP`nq0U!iQ)K@DC;mt`*W@OlbPQ@U-MMVXQIiI<*L19rswH)A-nDCP zcBs$^_G=uywXHmtSB`~Yb+0-WOnSO&pKqBxO?tC>W8B{+ zm1S<${mn*vCi?#X`*|%CtFcp;lFesbUOxJmu*&o_`87&W&c|JPzAv9x!-zRvTa~5! z`u41oSsg|{{UAeqOMJwJC=P7;}*PsCuF|Uw2nP==5xWf z60PC=3(Io5^lht0I~$i-E$(u??+jktGtFRuvcBO2$wkzPkJk7jh+U9K3Zbsk++ zVO4TG-4z;W`ATF&b?T+7mS(zcy+0ZE*ST_Ytw?(sukvdl75rzX$?m$Bi7GYfDt*<5 z(C4nR^_6t&*KD~)whPUB9v<5ylV=W_=GU>~?Vq8~8`otmCR@iwyEo53PMTU#V_LOl zi7WlGMWS6ynN+I3aagL>NtTHL3b-U)q(elFCJO_hDr&GwF01?*pzU6z6D^JfTF)$M zRa}0cTUO9y#it)as*dRxl_a14(*12{=zSSpM7=TeAkO;ziD4?TEoi@EDXPb@X>Ut< znN6v&E(7%IZFee~t*fb$y5Ff)tro*5*57i&2i_byKI9Uk?v^q>;}xr0JwmnYKJQa3 zpWP%@*dY&Sl6yl4TLlxjM4!3TSuec-hf{sMMnKEF)*|j)l2vTFf^Am18BJDrBNn-m zXf^_+*oKm~sMMS6B+l1u4hDU_Ng>f8Ebmp!3SoLC%`;;dgIW)lnPJ$ozj!+Vy106x5r226D~m!Kd=-+j`WT zt8jGZ=W9OisL{Q(FR7c(Hyu2qn`H?i1=@uNPN0HK3R(DJt#oCryAVzM`EP>}HomZe>GcO3V^dXiF-RAlB>PE~*2$T%sHBL3L4q#fNp>7$rUfC~aB3}az{>V;As==J z7LUBk5`OfSGpN4Iz~a=b^TDLcY&1pS{Fa5PuJ`(#IjmUxr}N(e{{SUwTU8uUw%dsm4oVYb@Td|&)91clVgiY1y~axJ7hHoC~#K3rD}o~AZbA|WJ#jb zIOJ6|9RR{hJeG_o6;31S06YrOG8IE`*fdV5@H()fMj-3{14V`OG_c?R#6c2XtaW0M znnFkcOqyG#43K73E;%$M5?HjFA|X7Ng}PQ1VaK2|hbSq7x1->+msUv9$*o1fEE3o< zYaE4dnjtn)pp*}mO+KtKxH)Bt)mg^?EhOaD2Hrkdn%r*d-0*YOtaI#UwTl_>YeqUe zdN*ttt>b;VRdSwv3~J0qy_S^)jcaY5LyWwZ9bw+?;d+{3->oWZ%jD-RShKgl*L5;MVI{j^3o^x>(C`+otU`Cpz4(Q^oln*1JwumswtgK2N*-@^ke*%(wX+ z%NR8wwS|2D0JffHO?r((`98f%)O$A7<##UR7nLru-SRH$v!Kou>E`(tc9wOK%Cc8U z^)-xYskRtna-PlYtT2&#Gy9U|n!)VXX82eM4e5t_nKg|2HG4Xl#St^I!iWhP z*FTZEf7Iz9wdU+?*29y2HL)*3qS0-@II_wnrZTza?IXL>FfC3WmGPw8y<;U?edlL=oq!(SsQ;dEtsZgSu4>Y|HfqYeH%*YPTK?f7;6 zDtS2C+yRf-nyEI6yI8$Fsac^ag!}(HP@zcTAKZsQW{a)kxEr{!JSM00AfM4 z(2*~4Dp@j=6rF`zlmFX>=^oO;1SCc?lnw!D*yx5K-5V_ zN`Dmr6~y1W_iuQP<2mlneV^BLW>;@hRH^nY&j}rImj>L&A7~t^im6H&J~!g8tY+rp zN{_>%n9YNYc^~a`hJLRj@HSu0bMaY}H73hBM~%DKDq?cA#n-N89xf?0)!j{6k8mSm zMpq0co9ryla{PD2#krD<+sYoV@1%UZ7Y&O-D)Oj$fue$23%PDsBq|PP>d$7Hqx`iX zd}j;`XV-Lwjy&P@DvsEe67oHH$7S%zBf zlVH2&vmwv=P6JmgW$;Q*$rqJ??;AgEaR2n3=CS{U{r&3}aJR(lsGL;P=xN)H@9`Tj zm{Un@0!7s1H<2?nkrU}*$XGiLS%4U;9$k5!h!1s`!ueUiOIrgSN$>9&JQn#ZT*X8| z5u`#yc6}uNotQjc&29$H&BMg{izBOgXGF<6eRglao9_rHXWJ zyFj6y5t{sGsZxh(=%W}7S>kvps0pl8Hg?rcsg5c0o>SOpeD&lmL>$dh@~-}Xlpfn$ zyin7rmSaw%ZY`mOA?sZ>ko)L*ekk@Y0Sn^W@E<qFJa z)nj6~?4XGGo2I{4&!Kl9hwo^e)+6%PZAPhJ(JWtJ#Z%XFyKkKh;5GUaN05&Vsf=18 z4V>F<0(^}4+A79cQD1j?Lh}}1H|PWh4DEevF=7zp9MzWkH^Ss%6I*b$7;39{~=J7Qj+A{wfJKX|nzt~Bf z$KJ`G_s*>b=A`NWdAyH5ovnSfMn14;)b=i4v;bj7a6xZd*x0%oG@ZHu2m%qATU_y)?(NXS(?d7ZH8W z!N{1@Krkl2YONHxap9u{R+El1m#8YNZ#w2Os?aR#?(X6D-0&HB;)AbAKL*;E;D+>0 zCK1>MuLXFzVn)P3v$P0vs<&$fgM!pWgq{^{@Du@S;NZvH1$SK>WlUKse08u6{M~CM zuGj87eR-8A zx`YLWDr{6-UcY)EkAOB-w%HD}*Zmm2{m|0=^Lk=MWc|l*(ITyR|IOcs*ZS-&ZA$tN z2G}HqdL|=OTVNK=d;$0hiNey8mxYwIZ-_wMuTSVHn04FFo;r>nrbuZ*p@}JDx%#QP zk##AXn0&>|y1u&{<^PNpNJR>@0n*D14c4OaW4sqmm3XG|+qv3}QpwNHO8Mt@b?i1p zrpEH0o{Ap8s;og=*lOyw8GHdCaw|^GqSuf&`QJAbAGnh>5Vv(=^`M{bKLmyG{S1D= zv?E4NxZ^`b*EaijSA;O)qsgf9e`l;}yMqj?;bE!n5w$$Jdm^N1x)-uz+`p7`GS9Nt zgKJXYXL(^Z*tCWsRVR-&m!z&=G_caM1PQsan=QpslK+-79}LD3K3gKP9-e$5ux0wr(nIIId0RfrVY$!(ChxqqMG7CVlzBCOBfuD%W)cpY z;Fde#9RR6%UXYLiDxOdV-gTnSGvEa2k^^+7wm`gSbVg=i3m^Q1WK5EI!jL?3i}Eai zLscCu{kaAE7eCs&jTRBt$FZ|%84*vZ7hpS+c?-_lcaqR zVtc77Jei6EE#h)S@7_`E7UQrv&>je9vpZMM5qvdQ(o?npomgg$*jBlV>C(WU!Tg?y zC!}Hu$qYJr47zX6azExFuE@_Tbha=U8%dX)xqK~9zTb2l@hjMg!@a#s{ z%=w`o?C0N)$~`SX2egvyvu{QJuKtJYhU3BT(?73zzTF0AE%jaW?mV-dcVGKf_UfVy zQ!F#9m(6Fzp>b)|t~$&0BbqXOPHK@loTU|@YSAG@O~r++A&~mP#$W$Gg8FkVv@FeQ zKI#~W1ezku7+fe((2po9h>Yp01CIA_K@*TnRjU(?^Z2Gj>RI>J=xG4J==3f#`jnj| zzIW}G$_{wTs$g5+LU~JLRz@YKAtbPj%HOB|J`48~6nM=9=OpT(Y+_xY7HneMXM>G8 zYZN;I46K@wOKO0}w}gUEJbqq&)p2 zmwM3a=Nsd3i7h;uAc|ljCu4>9o*l`-UJoSok$T`hua|VhAP`%!t z6PZ=7-%hYX=F<%J{E=ynce~u}@tyU?@BNe;aNEeC-a$#Q;p(OEUAV0imGGA{i*Mvs z-;&VpYO75-W07$4+}pBp$CJyRm3OIQ{cGVr&~_*CUhljADV~}O{Iz4-ioOYY^Yw7? zp=KoXIHW6yJE*s z|GlaixBYp|^yqy|_g$yx$@*)l0F~gHNj#!>;eM@@rQlP~@Y3EiN?kQ><8d|rGm%va z`OPLm&nMqCPCgUHK*zPivsq9t@;N@4f4qw}_ZD2>`!Gow!q;NBJg@$Sv_#ikb*u(Q zQT%JNA0XHO-;w zGM3VvI~IP6x2PuZ{I8ni0oljFv(=3k$vja;;$o|+ZNmqt8@?Hh15G^FBA=Va7O$}I zp605a`XECtaTy#8^DWfe`+x>tHyHBveoMh4$nu3FOPMXQu5Pj0qHZ{yq{k(eB5&?ai*<8-(tF|!awAkna_@oF zcgsrywlV`$9v^t$gs#>i7A$>=Dq~w+p>|ifS z-9PQc;z9&~L$gs02_h66iI8pG@T~Y z?x|jiJ<191{m2(BQQ1H#GO|9aq`*|ok_zSv=JK|R6LwB|1|F$M?Mqkv7!75Mxy>_4 zE=!izS7oOokiVy7Z2hj#Wjevm$<)fKuF)ZT!Wuu?p_@r=gjlYw`~I%LVQe)g*{~ht7vPy^aYX|suS5wydJ$knBCx1ybm9tq z35qpDc}SH2Ji5s00n*03jfqTCJJQ1aC+VkpA2v)T)4VJ273vdYoSYCxZ4*@xFD+$l zVH(@IsCyOt?r%}1yN}%Qb^gGY(Xi)Z!jF7;;&X)PprFD>-7LIbq?83l@|v`clgy@9 zc~>BhLZERj?;tfx<}o|aXPF?+S2VYg9{WhoP_e`jVn~Q~_{E!mpay;Hj;?-r0aX~b zw6@(XJ4Iafs8=M=K8^{ubV^EeZW;)$u=nm!hZ?*Z8U_^LGnHZNCy&ylulc2PQVizX zRV-TUrV5EB9=t*0Hwq-h-iFmpn94{8oMa378=1c}cKtnJ< zA{?CMR!~bT9$aA=5w7e@o>qN?YW6u_ya_3|?XLfIl#x3Pewj!)8FM4sr|5-Z%00xw^bKNqmk zg_Nbc1aiRw*@iIoasyMs{-ai8hCN$5VhwEmc_ue+i+mYlXfu(J$I{0;AX%!5VqM|V z>yYa&XbJsA)LryV? zziL{c%LkCKr|C*+AhOjU0SeBhn%&1pwE*OL{t+8n*AXi10eHS;3w4f}O|45&J)h;u z$rjyZ(DiiD0r^H_ACsB_@|K-+E3rAj>I|zzc>=HvXPw0Ew$;fMFJh+N$Vq?~Nu$52 z*A+=rfM(s+4xnuR|u}>TI4t$;JSYUQp*s#=QmKz|Wg^{nEsb42e;twcp}Qx>AyF zbL8nt88(!$AIK!}{$2a@tq}$D@=#2g^pD56uUI~IUVHhR7F;X62>f|H|FcrSbi=JS zZf{{Dt!eziFEb~<@kDMa592Hm?ZGFQq8`F`Si6iYCHL~vSA)!8pOsFVjOv!9vb)UI z=JL0k=;bp!VB^xlutRbMKs@xt2=={^qLbWsHx4iE3?F<7U~VB*$g}%8Ytv& zIe)V0pDLUoO}$x_SooBQ6r7WY^&iu%YF%;KqZF7~;fc+CQ9^Ixh-Q59`@5XbIW49%SA>eLdc)5-^J|QU|WRPpU0=mj*%hOlIw8odbslDi9d20eC6h(+-Pk* zJRl1Zu)PBcJ)85{!RnyU28%tJ3Fk?Fxk;E`m zTn0Q{N51QiV^LTvQBvAc6*1Q}69S8$|5Yxmd^x9x-vOV$kFbpYmN#pA82*px;7Z<7 z8`I*oKc%3+92Vn&iPg0vC25nVdyHXtJ<7Kt1(j)%^0_DExjA|&9?Ud{%dBBjR<6t4 z-N%%wO%JCgR=809(t19|ETRfF_r<2JlnFa@`j3E*w#XnodIz$>MMF zr?up7j*|ofon_IvQ#MkgiDKvgq4JNY{KdHtI!4}R1IZcY#uLpK(H==umDOdFiTfTd z|KTUZ;7kqSq8tQFVKzTW9o8`v#>}i#%)_BXNQIiIpZ230n5ibL7Mu0cIr^QW|E!;< zVN+Dv?NV?5!b$rt!@F@;l-R=);gkZJc$v?98O#y-5~n|UEh`#4rz1z!n@+gI&7&Ei{|w&wJcR?Cby{SbEs8Eh#`zFg&W2p`Y-*XkJZ)zxe2t_nL_@+P z^CX^yjGhGUa3q_#*a|i+b}Gm(!RZmG?uRH{;e84jIh%E|d*HN*eY*)3{v#HO{+vCz z@kZyQC3udx`7WNRH&7J(EGOGOfTVIyuj9x@fH=<5TGc`tU6qf7_dhfk$;phic^2$I z#?0xM;?M>?z#r~s&#^`F8|pdoc5Vl8_L z+kyL~`pZ-2Z}*|oi?)GE{$F(4Q6$>xu&0ALbShuvX*BLNnXX-u*kWP&|KgH!%jo{f zWy+ByiTZhbCP-?3tr`YNeT)4&`7E{efPYB67`3>0%s^yEu(&Wg#=81Sy z-ALUlVbdC4I#WhZ+N1`clNn@rq-A*`nCy|VpU5ziVn7T7H1Sotq{~O>)Nja15#{Su z2C_~x%JCRdlLV9K{N^<5C5G%|>a{R>9ejsN`Y;$?(^ohAVQ9OkNc0>_)X@+pa#3Vs zyxuo%B?4S&WQJW+X=GC9x5Z{KI&o(!wo#Tmt9FnyG9=CLNSJN#VxBU#>OLGBQ%;Pn zQ6H0zhWUbU4Pn<@0@w~?e#~p8Dm2uGzA(DOm->WcB%bz&xhgZ>JP!(~YQ#Zw9MrEk z-1TeLV!{Z7Jd%q;7*Bw)SjjoCl|N|q=32#3@C8**z1Jt>0<@>gfTXj@$b&~S7ZE7- z!OWFoL}6#9{^xp6{8vX?7JS23g!r2F$-cM^EtS5(KW|#wWF+;)^{=`I_TM3ZULUPS zb&yLo!8R$f>4xULeJaqF`HU+XT-o;Es!41*E(n-ZMo+Q&E@l7;WYOi;#r4PK+{| zp$`2|mqg*rInDAHKIVt3+*L#3VXod%uAAW>JwcHNDew<5XsMPXy^>M>aA9L-0qqGX zy6e8!<*%1QRAi}__CVhf7G!(h-eU{y%c|2i_>Z-w23p)&;R3c|vDI#8a9)w5ZlH79ke@qk*Vce`zX0uC)>9wV^oCG&8gCCUMNow%&-*-iu%`GJ-|7WZLYn#R zzv>j*4+%~Tl%DUYOgearC!UxstXqPt&c2bdNZw{+pF2kTk1@7n%lRrY=+5z`TQ_L4 zNhTNlW_m=zybrex;?Zg)k}}{*U1MVE#CXK6Hn;EMI=9o`frTL>R??3U-TRrcwGOaW z7s4S4ZJSxX234KZA`-aQti(vM;P}6q1*aPqe}TbJU>aW2F=e~ZNqHd(>7B-3%brDk zCd$i)h#HIF-F00Bqnc^$nZjDvE7Z{lwousD96K$VNW`D4Pklcv!wig1|NP35UCW5H zzWkW=hm+%NfsJmna?xXm9qsSw%rCCx!^2k<>h#h_BGkL80d|Cn5Au9S=s{P+J74=qY(&11TwL-=OODfh|p7XeOY%6dL@ z2Pp!HbK?48c}C5}9F~CrtWvGt1nX?7>yjBv@o(kyr&xw7Chi=8Glh6Hem{q&`>|Ts zOKNppY){oL(F%v3;7CHw6?0r)6MXDS6zW~)Qc#3y0`%{T^SSf5J|F?WBC8-k7!RQb z>0ohsi5u#@LyK0|sM)iy#3ra5LwleR-(k*VWZi?k95GFys61&$bq=|gB(l^ffWj@Q z1h@yg$eDfqSl#NqiED;uu&P4?Pp+ernPG?4_aOW~1E9n7%bk?#IZ70eA5YhzuC|1h zKiBX*m^`FIEcf8wIToUnlk}9MXnDR{9ftZgo!^w*T*0c65EwB{13Gv7>dkX+_}4vJ zC2a%5h7HS1Pl&t{Ls}>_t4A@B+JFAbg}$!BOLF9)_tulm|FV=??-JnkiD2d9Z`toi zgMtP$Q`>gF;Frt|cdg%*8;vb)i(*>N#^9PGnlfvDON`ulZyzL{hnw^|S0A2lyuN$; zKyAzNEEF6LdKN-$JCw_@p1B9KRA+9it{G_%F&MOCE9_arMX`CMyWH7CINqm`PDG!-K3)lPE<%918Ri@=UmV05oc!(zdrMvnI-a8M(;D z&DAXn>P`SM)zzz*_@7Xg0i%N^M(czAO*R**s&(E&Or}kBzA{})Nd3G`;Yd#~f3iL6 zInX8juwcU`{Tc-H+|Qo>maU7eK16EQANaz4OTx1BLvyUfH7$SY9y{v2iftf*NXCFGVKHpa)jlDxe^X7F@Kno2Ci37Ac?MZ^4A3Gyg} zp~xqlwgFU3RsNW?g=&^Z^t?D`f^L@up!|ud1uTx1%(dE1XSCb225XWMHFpZtw5XIA zWlC$oGLY{_OHS)moWo3XHaRrRQSv%K&USe&C%x@9{ z_V^#cOR143nLm}+*GtEy-yqjYvwDALmDE72D>(m5w^vl$d=$$NG5jGvZHs7J*kDgc zv~-pIrGb=87?DwN4BQAlbDOH?ST%yJ*im}gEkhnhQqwkn&=Wd|W2wKma>%}Uf0yI_ z>+M)8DPo=mpTwxF5j7f`CM()a52Qh8?~1}!`;N#g3S2Z>#o;zFPHUFzx=^#2r0scF z6rT18E6n?FxrDoVL+}}HgAdUh=7sH4$9AuA`LyRLIE!?d;9nA=s@6oVa3s^x`BgfV z=5_rU?6ub#J8&f(*IS{k3p?^=X=u^7)UnYM<9oWguz@XB)6?pP(s2L`2&uWorxk%f zL=F@QAZa<#rbK}tG75zaOtI^HqL835-m~{LOm|#84oR~-kU|;(?Q1Yx?cA3~5Rz>s zqqEAFAzY~hk!_vQNwS{jZh_@9LfabGV%;g%*Y``jZE;Xm(ZDC%Q>wE6KA&I5k&3u_ zjlA<*3$St`{ng|X;7-j^p;<{*r}sE}L(~t^GWAoUF}q{BI&vX3toS?bX_yiKDqfU> z_Z@qSe>t0wWo|6puueQRtd@ut?GMH$M9>a*jYY9HBDC~icjX`>fjz*0`YO~=K905Fgv-qCw#p_ zNT!vYUlbjui<-{1fmdL$dWcqFDn78cE%z3lufCBxb^a2(;AsEAwJ1j|keC0--m*+S9+L8=N)pQsW7;6Pg=e9B> zQUumYB8+VKgvWNUfm@WADYa$*ovPF`e3Db4f0|E_iVkhbZ*ihcQOvLHaZDLG8GlXK z(0M5b?Qp5|8vf3uUDcKN;{s5$oLv!<4B9LgqwttE(yDg_a8mxn*N_yZ%O=EJLc$9L zLk{UhbUFj{DTIkbW6ks^3m~_}PfL$dxj7r6?cy`|mZd6vjn-qf#Hfidvjq&F^K`$z zHP&i50_Kk~Dm)CsG8n0Qi%%^ECBndDwX83001gG?)rTsOWO) zW0$ECE7hz>Jwj%MSwabbCmMRR#BHHefj<@@c+5S`yh4>!#|h)T51g`?nG$wh&fRBt zfzjR}*oZy9=5Sk((pU4b+HXN6+Ez$&v=(W-JQ@0lytWf~XMXcxMDn)61~ocHd3 z1Uh|BLr>p|k4W=9iT2!S^o5&CItH$J=CzfFKO{3lTFhR$qG0PyV~?!P{5%U~J2kAg zH)oEpL$`#FUseHV_b9#!S$Ep0J1t6fF{j++ow-xwu4f=RmFphb=3I-)HFv7_=RsZ4 zYHbOd-e7_DcqYcF51-S6*-;Eif5eNBD0_U!ZAAK_Meed=o?PfKDfaV2|D%HPSkqY^ zX4b~Sipm&t>weDi2Q_HQY*>c~mnw{9ft|eDj3vHqHPbiIq2hGOJw$a|V<$T`a9X6o z*CGat`nfs&Am|Jm6unz_ z8}+7y@}+-x&0&Qwljm>;T8wb&b+4Pnen8y-L_3SwI4Yk195a37g)1VXeq=(KE1kS< zRom8ZNonshBQ%b56?6|9<(FwkHRXLc9jn{1FZDHjnET(#xB7o$8B1$hgQe`l5yYgS z|1=*40kqhABO2oPzvKuZcE#aC3Gn9ea(E>w8|kOBmSsPr z_IjMW!5%W$0uPJb;i5592K7zlT!AOBSW=Q$#@az*qVTFXFiwwFzTi;BBF?D0{+>X= z6Ddb@+~B|nw`}IwZYGqi;Xxf^=|yvG{WM3!)NR9jUQ0g;CVb$OI|<+0bWO2++u2|; zJAVQHBcL&F+|f;7K>k~dTH@42nxwn?}=98wIVrnRy|v< zxNC=a(=^7MVWua#W@Vzqt;f3TCS`py9Ac!T9-~%$#2#9CK7Lk;sBh7pU>9VW@}>}M zJRQkFQe2|$ohGH%$zOI4F~ZBKxW_z&4z&{BI+=Z<)G_!zLQOvx4eD`TX`zi zJ-w@vgzW-m9I$zVqnHN(bHLn{T>LQTYK~zY@bAl1W-mMTR(S_3jxc$DC|l^vpx_|pMA_D zNlamkEtYxf0NS@8R1090hKC+eQ+Ar=zX^RzMfwjy!R>HMFX!0Eu=Ap1!R@$FEQ}1S z{Gvk`aRVwkQMs#1zTs^^A3y z*CWm^bKj<(d~Sjd_xx}xWjf$h(pP-5^!Zi7X3pmmrB@q`pF`o?pJ-(i?i3!DTBc@i zXlEVD9DH}0x<0}kqqM}ERtvpa4bWm!>Rl!mW0e4SuZOj>ke|2VAb@JxIR=*bZI%Gd zUMybkoz)}_up=8o4XLpW%?MXuu-4|@6e7mR!Fz(am$}T1ehDH(c=J*`wr#|JPGa@$ zKBhGa529!l;pZ5O^jZlL0X6j(u8sLL>Qg6`AlGsjh(5K=}7VFoM~a znOA|;e(HP)1)qAP_!7oyqak;cq;d!GgC*^pC_F+mQ1t*KdY0#$uEnU;y^&LFFsHRe zy#g2}$0JB!3?Y0Lv%1=2-vqXVJ64yUlGe`-@v^l7EA&0oQE<%;!PEY9G|SWs=fdmE z2K7qUI;>u4qF_lj-xzms5M2Ni>OG`56xy>< z8_gf^yJTC@6zEaQkxLJLRkaOLnkm7M<-4?m;s5)HK7y11`c!lkjkj%HGzJZT;N`WH zJ-S*?2M^VYg8P$L*4gM^+&#>uf$Gm1+RCL%EP4zl3pRdNUrL?Wzcaatq`Pjn|DF zkMy>+fUN{&qYF#(G~xifrK+JMkAy;d*<8p1jeS--C)c|#fX(3HAB&hnl*;DsM zpAgUid~~F1@Dx_3M<*YzgOecnS7)@3Wnr(fBlfST>K1rFng+$a63>P)R>Y+mOUU6e zKkf?3#c|6^#qu%1v&>S~zsZrmtDpLdSVtE)Rp+0?gGt83S=DCPtlld9zK# z?JZ;-*vKk(o(L^fHwKK;nvc>fNn?|7tOVHeJqgeh|5ORph#N(l{X59GW9-^@VJR?k z@pjd3a7oeKO+0YFVyr^RG-j`dN_{5P_$yDt$D1DCr9_n%y{aaK%&k%kAO~P3>iN<( z1+cO8-&ym{xOI1X^Z{H7N`nl58qNF#LL8J)6*i&UN|qk$Otc`v#I45N2&z~77lZbc z)X=*pklm=?f=YVkh-JSE5wL45WGK2~TC;sL4xkQ1@FR!aJ^FZJAwRCUe;0Y|W8>7k z?^R$|!w)jsPQ||ZpAH9pMVv~%;t)aMol1RuEfws~B6+%RyP{U?*zF7_t>s??1eOnc z;IQMI*53TBvyd1m5?pM@D47Aaey%m}yN1=)NhLZt%2>=$$3hibLxJ zpk-N2wfLdcnmMwrfI3=X-b*ZmYr^STnz8(IxMCJdMiTclSdfAG(qqwQpCf? zza=XUuug>{n2P7S=bx&JA!a#LcOKmZa9HZvxX^8@xhW$rbU*j_#4SOVDw;TgaR`FWzIYCG= zvrCbQK77_$Gr$Vhn=R79^yY}vtnIgitI5`~zvouY%Uvz`pyX-VyZKB9XXaVV`x4{0 z?IPkd^1Um5WW@PBA%{0RRiOEM6?WuF6C2Za0KK@m?!>I%@kS?MJHYPPgxdPq{AdQe zpU0#GyO(=(CkzZc(Z1okT_ zMu^Y1N&k6rs0>Eh{H|30f_oFSQ5GWBX859=k3Y^Bw0#9u|EJ;6M=~o~J(VF!R?Wur ztZEUcvnI#yM@_;o+S(~L6TZ?iiPv<>3(e98_rr79`F5@mrW;Zpztewe$((*hD|FS&Y5JaA~Kk9BnNMTn{>iMwzx;)}e=+peZlb-b{7YlTC)h9ZxJp~L z`Qu^3thVOH$1|57DpD4en(at!%VHkbGp@~m$t?|0w1m=r*qp;(~_ zq!G1$`E^?z>sbxM9B+)v6MxlqQ=x+9_>K_;nnt7MJPsU7_NL{Iyu>4uj0Cx0T((vh zJ>7TDa^GgOOZT*0>JmQ;DclxqZu@eUwGpqo8C+LPajX{vM!J;326iY`oVe^V^2M-UHq*B#eN;RfG$A!$K|&}cc#DD0#r*Lr7aosxEJmum z-=b!yu8`*}kJ?4mnk8Nev{9W8-(z!_fct6FBPke*d^F^4ET60D;eECNdTUwLbgxgr z$W0OBHzT=J8wThOsKRkaTD$ERHiaW}BglY~1FrS1POmIiVKWWp#gDA_(y}NB&<|xK zj4!A>Q~CExO=o1X|JQlETEEQREQ-xB+gSV;w$cc^@4m$^;&GPYLmc8T*rUfD^IxH&lD1MOg8hF4 z+W0;zzNG6DR%|t>L)s%*0u?n|^-!EdJrnA|S5~d9G-Z*y#7o)8DoXM{f|;4_aEW9A z(kQL6zOk~Y6r8p-A8~^* zmjY3BWv|6B8hx~26%tYT#9##c_uN!!bYz+=Gh`MDY zljw?|eZApkeFAw znQa%}M|sEOw$^+ilk$LIx!|cT^d-qkHiHhIU@{!I-yO;56CekE%AaP;&Am@{JV#=> z3|ni78TEWaG}`C@3)})&zdT`)=4f#bsAyCS471~G#P`@Ne_4k|jy!m1smt2d+WXh3 ztJ2i8=M;?$iSpqvlXALl(5|o5{Ex-!8zSVFqJp`(h}eVY=BwJM+Nt^q`trc3jqj$D zO!d=!pAhcTrZ20V+YP627{PbV0spOi#x*{JU3=f;-myk}04y#8!`f!BV(=k!>a2zDuLI$Ic?^Y2%Ux-PS{UTI-m3lo0E8 z6UvxC%1Cf-Q$PtvR^v5AE^V=DYn|0T9_4QFq75@&9<{0a?V< zC0AhPg)Tq|>9(eAQ%pT5e>XxUe{|G4kuNF+3Z;g<+hC(A*rj+z$LG>7Y=*v#wzZ=a z>t(`E5?eNI6cRydnd(F~g>v1i(Q-{OR(^ysxZCWP7aJu0^POGMw7M&O{5=v;`vjHW zHG;<%Nv667zzF?x;zo-lKZEmUZ;iwTz4$+yW9VTWfc0Sdj$n$hy}MWpe2>Igv!leL zm(HZ0evc8vHsk{J?vw|8x&(uI=DqV`roc|yn5wTMT`{DV3|ny6pi5ORHX1kBcbmN7 z*3P46g+(H^Y#8-R#{m9+9^TK9A-m{S3kxA5?DQKJEkuFlS48Ed%rCKdk4Jb6a1a;b zQrCJ4zdsNyz#QiCxisc}Xe%JkzDKM8)2V9XSbH5ax*C_NzS>{gth^ zJ3PeC*8ud7(J1DSO_4}7i6N^d)1 zOb8DO$?sR9Hq73^KQck7@tv1M)pN8iI(eVYI~|hZ7CRK7cg(Osq|sKtpFi3u;?v+? z&f$#J(Mzx8QnMd`OK0jD&p~M_NzM7ugl!4TbX+S1{f5KJ|xzKB}nPNsoh85m81A#nHEf$w9lRg1$ z=F}imscIOZXZ4^F(pad*M-C~wVpn2y7!lQ)8p%?1((Oib)PzEUuX(GbtY*VgS94%> zfRbsFtdH4l&8W-wYn+wSA@eTosOdJ$TGDFB2PF~uvGI*&ZJ!bI*YdD6+X|k}0t$D1 z=l7fcX>Z>?digf<ry0}_X?k3C`J@ke&BtiL5F#eImkSzSw! zG=;x40hroS0{ut>14L}h=J2!hY8G}@=1?Uw+GGWELnmO(Vhj(X*KH35k#FZKVBN05 zXrsHe)GZ$Fq-WM+8C~-CsbQ!Ymg`Owp9sIUz7fNa86j5T(71)pB$m}@CimGb!{lBy zO}mq*%$}IeKyWCtE?MygU!Qx13Z3YRcueSvOVZGv|rVZ{n%mkPA_CV8l3R8>8?qQNK}c98R=-|DRizN3wu|GsnU!vAaS4zv(v+PRU6gKD zpZ*ZrXu3PdhIoPVd5>jHNy-5T`C$~0HdRiU&5DE`z2h@1;ZOE*M7=#`XqdOpFXT)+ zTP@`OW^rsm2CUn2|6Kizc;=PAWj=oW?B(5yut@Q5e;zpb%qeA|erAJts*=spQY79Iupg8VDbYzWGU<_u9gnkXQeT7Mk9o4kBB4 z`e_@nJQU1VNQvK2%{R8tDlV+z#JR0%SHEd zvn3PgN6R=UlCxJJb5catR9Izs8U+{PJZSu2hn1Bmvw6FbRiU`CJhM=axfxp{d2o|c z<`T6#!pHH_xhWLitW)e#-?bDP#uskKxe@4(!C6+D?di#~`h2(Dtu?I<-7w7hv6pH> zy;>&q<1a^km-nLH_69om7=7$gNv^PQy1Rl=D+~zC+zZby#-IbivoY8Y%aiiKAG`CC zT+bCtiH07tKQ%cu_^ZNjmv=1+G~MG9);#(6FHV@b-5B6$=IY!COJ`GP;VzKB_*h*} z1l^6S@=wa%vmn`!^Z`g_dY9PDn;@*GSk{R+fTB%R@5DcT_9|n=H0rkU7?(HZh=R2p zHE*^a;&~M^{B?-4{S67Qo8^hy`quO6Qecr;>sM<>giWVd>dx| zwGplQUSxmiDpT#~djXKrT_($XD!7`hb$X;S1Yt%|6!Lab(2nEJe8R#YQn7K5p@$}v zVbfZ|J+Z5+O;jtSJotSw0mk-{HFb1V)Pr{*7i;fD*ZRDp;SoJ5@`YS(w&!ypvAX{+ zQwo^UL}dQcD4m@3o{5P#AmaSPPH9tR(Ka;x`eD%uEpMdhiB*c%3GfkKw8iFD0b3)S5E1_4jXv6}(y=E#9bsC*8;S-NGtD+^D%L@V16;cY> z+z>?kdBUq5cnMmM&2DGos`nd*ujFE^3TH?=44T_f<@%n1msZGT3`@{3oq{cWTk5b5 z#o7Rfn$0_DG>LYV)@EJYq@(8{MS-(xvXg&7nV;&zw`Thp9RCJfm~9GD>VvKb(Z|DS z@IS0G{Ash9b+yn?a1QSJ@*#?)`%H%Nwmj> zZ&NBdh>-&}Vw~4D5*(o_l|Rc|vTwpoPuuZ@UgXWbN!Q3a+ynN);!{)T+p6toG~W00{ap-A!PU?!X7R6i#J|LrD-vi-BD6t)O@TVar*peu=jjk zouf*cjz4F>f?y8@fCQ_N%4d=e**gkaCu8Z;*bo}6tw#{o+lMiOY#tq2ku@MXfU)@= z9Soz-<+7$*L5OmcD#A3i(dMQweWGSt&S7jN{7d7iy?e_-sk^tI(|44P7R7MtS&)?4 zMK9|l0uR}U0Hj!pACn9-%4FW;R-)z zuTE{CU&!Y3Jz4xe00=?%zEp{LEN5LFFUnTVE6~k`SEr-NwVn($u7!C-b%w`0it^^V zkJz+gC)1KaInP2tH6(D;mQ3o^avEAzy$eiInT~{;FF?|uMP*mXD~S6@)`nYkr-Ft# zUykg}ENf34L@?2W{1xav!x%pSrz?|M&5n&)`(VRZ>s3}ViRzvOq}Rrup=rYV2!=oZ z()-#UMdNAH0I*GjEqZ}yo=CN&{{Y4enOjoiTh{UJ7`44G)UdiKY?%$|X<%`sV3U1t zMZH{^Eh^Ciz#?9#Qqu&a$r{NPZ6aq05-Tz(ByvQg5r`24u+xG|OqEx0H3xP8>Gu#F znQJxqe>$CO9@+KppXje zk+ou$+29K5yM+efmVsL|302uVbQ0;+x*1p<4|914)1yQ0Q_!jM()%FJCN9N+7G#*+ ziqsaAx!|A?1*j{2!l0gn(5sQrhigCtt4qg1D$B=076tBFhkTY8e{(VzjaUHg7?!U3 zk}lvz?1>VzifgXYiK!a*M=nq_$7O+*YkQoUTItij9GS$^@6J5|BHL2nnQ?92+_GL= z_Pb@H61FY`vDs zSrpov{RybwSCQ2)TItv11x||YPXJ>6;w6f%$RN>PR1wtL-|$0RyQwlM<#|=@Z_wNo z$7d#kJ913ay@88If2gDH=nGD^8d_IiVQo#Xm4Z#{zCMM7>$@;m8!MJ3x}364M@=y- z&1y#KtD%F6c=`ya`<|k-zUX47_fqOZS$*X!aJf8>Blb5VHRO4k``q+5%P+|P05J~oXVCcEc)r}eKX$&$WcobaeETtzMujL~jWWa%z|fUE3oznAye?O{0?dmt(`H*F zhKOmV^TA@%!U?4?X`DFp2Bav06q3xb)?xQHm9sXlMbAMJyJYf4DWKy$BM^`T@gh(4|R)jaB$2bI^qe z7m!gZOK{<}91_ZW0WYZ4nodzcWeIzYG8@5@;GkJFu{}#prhR!PG~in~1x6MC8$@?P ze!L3OOScFaCfTKFtOX)+F`v~p`vY{Us$Z)Fb?7SssA#a(L3t4vDf+A=DES0Fgs}a( z5h*Mr*s*G*z%?mPQB>kUNEf#RbU`69Ky?%_fgB>zIAnC$4Jh?03+QSP(`2k2zNM_l zO}0?pRHZXDW(a~(;D}^=hC+y*3sw{o8F)29m!XEB${N-hpfim%Q9QmvnCP#IY2ePa z>h0I@(vDZRS<6owLfGakitGn99(efN6$!K`MMuRHB1 zvn(3p^ZeS`yDP`BxyZda{C_v^G^B4h&$HO@wL_M2wbDn>c$^$7ZnbqF)J>oHCYbC= zmWMlz4KqYADp=1Xl}cyXipHsR1iH^arFmE;PPTxp#ix*3Bh*krgRHp~h4!03q1RM$ zLmO92hMX&DjE<~hZBxMMYf5&knN6!i-_U{GVtREZnEkr?j+g(_``RqQ^qwZvuQCf) z_WuBg3>~J!t(D&(TkE{MjwaQ#U=w=Zp_0py6wne)z^4oYhAy&tXk1r%uRLd=#3X=iu#$V zJw1DRBNeS%@)8U>n|TS22R7d=BT@}z{mIWkz~|rcPMGL3k!y!%%(}ewaBtP0Wmn02 zEzS!LwcU88KtC@0_sd^#(Qa%7c#27to|7Gyq>O<_R+ zY_dV7xL~x|EJ%en&@pOx6Xe>GSZb`a!fY3UQOJ!_U*syl@KB}M@dJZLQqfJ<0c%(i ze3pz0(Gz%Gu4HwA+wNL}uToYHgtVe^CVrl53kR|w8uiH|?e6w6lIt9DYf_Txg3|*< z77}xTum+1!;YkwUnZYyeSke0pWH$c*LL#tK27#+YKhU+4Oq!H7QChE|l9z6tf;2Mn z4e_2pmrRHdAS6igvQ21~ST!*u%Cbj7QJ+#c7&Swv>lhn?I%&x%LXbj72_!lVk|^}a zAsv50tMmd1&(uM;I5O6iScB&Ui*+cOX+-UX$U0)Lr?I44q0!^gt>-M~)owej@wBS$ z^)c@0hp)z^T)ZPTuUPHS>p0-&YjYibJSUK?$40yBR$o&!xcUzT(#t2Fy2`El-notn zL$96rKaqX%<_||axn7(*{zB1~bey@~oHp{UcMR97pSHb!kET_tmT>B~%j>)<%~NNV z{yh=vXuK?PV;hc+`7@25{-v!l*w^e#vUL?Y+)AKHN-*CeW|Ny8-7YEShoEo-SH0~qX4i8Re&+tm_`?{=AEO0Mu{ zOJ?T-3zzR$(bxaf``TGN{)f}C;@0}@59$kBsCAjwSwJ%_V{lZl* zVI*4Qui`DX7C9lM_oP${e?mIH>=q3*yfEtPvyK*?gLTg`OaWGP04Om9Rw_CR)`>kgY)8WTM3PL8Q`)63o)NyaoV} zl1aV=8sy4tMVtwBYf;IR-imTsTDwOfQ=4YVWdk>8T3XuAN(1Vs>k~ zGGl7qL8^_8R2pT&=F_^b)M0r0D`m;1Svz``tV_NLmTtp~OTCEE-UQa(q7=4~*0tN) z^<>JcxK_IK?et*Obk}Uk3~AG+$YqJOcF1BamlE>4{{Sbp(K$63wT-;rvq`hU92(}g znf;ixULH}Y8P%QZkp4yI+syJUdBOEQ zJY(nmd)J8Y@_RAmqFYPY3RCtp$-<~S>)nWLQLy(BJG)qmaT@St!j8UjmI_4urx(x}Rokoi>6b!%WgYa6&Tx zje!jgij`k-(Fb-3tyT*eqSokAEh?$~2t%t+sMe(zSp-csDyifa2V6o8B@Rt8X(aGw zp&bP2Jg6dSnB;93EdZ%5U|E$)#$7b|$prm)A!@4tQoY5K{{WE2gF>*PO#`Y6Ob!cE#KfyflJ-Vv<|L1__#I&el{P--w*uqDx!vQW`z zI7tSzAb4;%t!blYW0q#a9T$tmm`3t7@%vSz$48g3WTn=kxOU!EU*byLl$_TlReyf$|QuU0O$uTk|CpPyu7Aq)yMv}h1}%ReBOF`TDGQ)Sm~~+Y?NaYO5dXlHZHAlD_T;?nXwPHm?T?U ztHEnWPjIQNZbh|rBxJU($lwcF?3D-^)|9)P@IQt&TTHbF+<_GP%z&;bOL9QgkH7mC zGCu0$3N5mD7zyoyQ8wEolJA%#hqEw*m)z~hU?;YD92#qBRIk2Rb!%^^1y^vE)!t_g zo7$Qr$7b15i8=OKc;wJwdqejeOq=!KQ#*Q=rdN=aBa>PZ=_RS3Zc9?F#tTv*^Z=FI zY9^Z0zoAtcHe`fq3~fay%{YuMg@vxDctX6oD4!-%b%l^gz1b!fexjLo`jx3R+07 zwWfA(#{zA7hAXzrLZbpZ3L9|e#H|_ zdj&cvwoKu4YPU|Kq1UGVxCH91z&cjArd!M-C{O+$Gw?&$EOa4vXHOh4LG?sB}> zUuf&!^O|W%?lbF6>OLp(Pn@lj?09FV=flnP?eN>S&6`{wPnr1e)-4)yp}avYPb^Uo zEU`oAQ5wQ3w52eR={DX?NY0L-OgyHaKwqTZC3GBG6|h(*LH_`Okx|DXkjJL}B4@2%C|L zgs>>pjI*T@D?;F_P^_nsf|``F1`~M`rrd@t1cz*ntqDL=P8oE;inUj z)#P<>GJ)ODDm0+9;F$nV(3TDh7lY(+4tXJi1fi;?8rBM^8&UU8LlSK!qcn9T4Y>-| ziReIL0FQPEM^XV)bz!$W5GfY4%z}Q5Mq#WLH3XI|1Vr^@%^u7^ZV2da0gXXu=pvNC zD1PLrdJ{TndWwef2rLmCvcu#jI04}2pc4N8ky>f41T_1Nul-D8TB=%dRvpJu@|vtZ z4EnY1<=c63jYe(Oa%f7|UKFD=O4C=Cs?6SNQ>SfyQPQxCdTXz{hspCTx#a0N$2;D! zcY|2T>%L0CuKxfRw#p7Q+ncXT!t!gT>*{mrYovX5hviLC;NXn!YE;o!YipZ@?QMby1dvs(O$X-Hz$l=ACt z3d63dZcm0~yZT!!nvrI)?_EVh?|?c@u0W#Ba%d4J|JL=qZy{0O`}RIWuS-wJR;_1~ zo#nr0rKihQ;OBX6bm)6m>T_#Jc`<>-D_wp<^?<_Ko8uvb*OA=I8DHF1P-4cVKKRHr ztyPdE*6>BOZwN57uFpWRE51qtTXB+FuexN1xQ2(c5c|pr6Wo{TB$mgL0o@TU`5~d~ zWVJ2MNg=To9dpo>hh-T+(jDMn9qqhimMiadd;w`){Yt>6zo|&lEw*tbftB|3B+c4M zF}0lF)}*@eAX(7RYeb)*v!gvS1pcT%tHF~g@JO7p!M2jdO)JRE5HzI)YYPZbCk10P{(z_H zr2x?ANVCcobzI<@1WS%c69q%c75X2sEK2o;DCO`HG)L-iqIr~HOD15gtkB(Ty@Ld_yFV2I=VkvvHu3H?D5$I#NkNwR0vTww!V16@ff zk-$+FtgFaa-?FW;uab~%v%8TO@V=xMTSA4v7=}8mhsxv;MomhG)S4ea6|TLlEMU!z zO6u|VTe@30*xxnuz8}drRa|g+dg1Do?0DW}oNR7aqp!;JF=Kwtig_k+r9UpINqV1b zb8q=7$0ofQy*S^Q-IG|r{`9DnUaMYjnddbv9Xa8fT$TA7EZLg%bM|ek<|V|ye>3jw z*Yg&LMtuzISLANqSYA)F)baj7LhffP%cSYj{z8j~A?n_|uafx|oYkGV;f}gTjq=T` z@?CJu?V|a6sn78-=zX0Z8}nAQ_cJ|lhIaRSPm)%QoUbmDyMMT!Q#jVMd*_Us!>gvr z>wsll@~{m`s$T_Hh4&d+|JT#W-`J%eqml6Ig1;et?r?PUW7+O}XUqMxyP3zX9l7cB zK0lPVDD^zooOhR7UR7Zn%Zd5VQ-*F$XI*-Hm9rMsbF3u7Q^ z;uT$zMlD%zWQNG%U8S1FLvzXuMxJ0Ws?VqfS6{iPnfF5^UGP{nO6~9m$X9(uVRuNt zR=2MJ-l5(H12-&CctDx88~{f+G%QtFC8ZfMiy~S;X-^~qq`nG~YC7-|qBS6CuFzOk ztXP}U-k^oH#DQk+A)WR=+=DyV6o|Fpi#KL!egr#mI*+)?CuB)3!xcK(MujI17{sLG zf~ijJsAh5$D;m%ppCO>T*Z3OITFa9toyQS(e!#H%;D>`&4J%jb38J<=$sgQ~0Uv%v z8n6-fAc7v!Nc+B|SzB+RK+W6yibJtzh z6Q;a~B#$S_O+hO0_U&?S7_94Vf;B7@OMO|Pn#RsPhNB2peN8PEwkOb5u(sAQonEcV zGFCOK)w}sh91fao?&=s_6xrxzwA!0;XBLgy;d>N;&AW8h2ILgHU6zQkRUT*0e0uVA z**;F6KCzDGzdrdNkG7WE=zT6beE#^yoed+=u3iL^@=f#rPbh^h!OQMmvw@%_gc|iLP>3B;5u67-I+I#y zB3PJh%Qd47xcab&ku~ISOGhAdKSnIyz^a%Z!5D-(jw6y*5{AVH2*^?-lVCMo!>bbH zmYZ$xBxNj_sN3Y3(pf}&sZ_0N)SK#N3l3!tFCq~rAE_M-Wn$1xX*`IKSJV`T9FZ!= z42iTXno?&@B_{YC78;eviLfTa4xV@{CY(P<)CQ6mhw4B_sI{ULU@bx5A*84DHGdhD z+KjFY=?<^xDAiC}WEQB(EJ{!G9T8p8^(!@^$zvvwl1)IyXn90nR-Q`^ob@9OWdfp$ z^)#WwT!N)C#hEZa@J(8Et9%6i!myK6Ad9A3V&k7s#KLFZW!zE z{B^lUQU94A`ITN- zPnz~{@A=nf3E=BKY+l^f`DHNP2h@8De5#06Da!U|Pn3tw2JpwSc6p0#XC>=`*DmiX zw-R)aQq|-`k+GR^*{jTsPFI&n)}6jiI4?tbT|QRP5*LL#KmKoRaWaefpLE;gUe^Qb zi`mn!drR2P7~W-aWQ|+C-d7=cQS1C~$fsnj$;ZB1=Dpo}=O-L>_H--5!8f{pceIlK z0I(QZ>fWXT!>*q7{s6!K(DNzeJ0_X>tbTS>?x$+*TnwVC!PxttY-^X-d{*wnyPweU zcOJff9@5$0Sv=NbtIGK*_SR9ZTza*~;CZcDErY%0GtWC}=k@r1A7N6ZLCbl*hg?4oWZ)joE{m0a-N8Y*uQrRT6UF5XZ);OZo;1f#S z0bI-W1k$caXl)=x>?qPmbPG5H&tsCr&93ae4Pgq5RujWBh@6%J${ZzR{{TXXG5ZP% zpo_PuBJ7n6u_NsWXtl;nrK(TRk*W$0Q-VoUa|I&S)YTa@bvtQ4Qwv#kbRbE8g3@dL z2UAMh0E*TvT8nHlnZ2WlmA3i}fgQqA-3lxoQeJp1MD3B#9lCTSfmkq|W_^u7)hGf} z%VVis#%fI9k}TR7s#Us(IsFXkPjm}J+kgb^pJ4%B0OHlfEnLb!y2cY*a|L3D_dj4o zYoOGNY!$5D)L0VlJxV0Ibm&SY*peHONVS&;3KtX9t0-;t;R(XE*Fs3{p136wYvu|o zM|j{Rbjf*DY>*gj=1{d%t<#cZ)tbU2YW+!RtBe}D+)G;QjG0YoaahrAfJ(2BNlSF# z3O3qQFF}g9_VQ>US{XA_c7`*lvNfTdvduZz0|zhI6sfSD~Ws{{SNvHyT~agC@C_8MZ8IsbDnYpUtb-vDDW; zjM(_^n((cD<5`wSnsOP29{|>eZib{| zRi@pq17@`@H`#jG9Pzu;nsRB8{{RCSZR4cy*`A|Z*xt=7)W$bcbnH=vZ8K{bwIdm& zTFa5u8*0@iEpHt@HkPmGjCD+pV^d2KaIW&Stt$GNF|XaN76Te#x6V**a?ZTZBguAi zQ?ER+dU8FMlcqV_N$jy;)XlES;{9y&*vzNZ9o?N^aCl{VOOsKXRZWqSsjAsIm}VBT zw${c)r%l#OY>i6M?zB&#oL05h#a7NnXC6kxLw$Z!VGFug#T)V;wcO_AxRTv{T7UuP0mU-92z-#-zm0K zw}9dftHsr}*0TF&ryL{Nua$jug_t;8ca`aUU!7fxx35zj$4+b3TPG;WogML?Qd*kq_bgg}cht!>d2neiyA(q+Qr5!6wQ!K*MYExj(z{Uk z4J&ZMzVA^&NgZt8BY^n?8pc49r=hJ!+aQnaraDsfE`-heFYAV=UuPwyFI*0sO=*Ix zg`|-CUZV~*ua77x!+t!VSYK)hoF8u(7O_{XqyY8kjH1;eTWbwC<=d^G40~YINNe^g zi9bL>w$HI5cJwHjyGj(r+DNCr(6Axd&PXBI@G%bJBv+i~iteX zuiZ&xiw)M1#OH1eF;U$j#Wj4E9f`M~#%m3h?PpjRZ{6-P3)9cpzCMRo<*C=^^pjqz zP48`g62Yq1Wo}5j^z2&FIo9QNYTn{sLlwVfx_3K%fThvDcW(t6$2B~@>?SzIwzk=+ z7mMdxwp&t;{JC{rSC^`tk7ZHXS1zP{&y#NJHqqEN#d~yRYp8*;*5HuXfW)!6Zqi_Zjv-Bv5F&~56iF=|{=b>Pb zLn3brAVXfHHwFYsPat%4fdv_kgR0`OIWnPHqKeUu2U?d#B$>Aabs`dlk$Qeo5FJ?Hj=hUy_rw|&6$3a1&RVdRnOD1RyzMO&b zA`4C)c_dB#!hDAM3>1@&M;KH~GTAtPQqpZfYdA?XMNp7a_)kBfrKb_VYQvVe=s=bq z0YLUB){fs%)q@=YVclXF1ezC2l!n^iu<3mYk@Y2~0jRB55rPvf!V-d1{-B_6%4oI< z;ynjRyYw=x4qjIR38pm!+6J1^?eZ2DmAf-zO>B~^qbbgAF^5R~N|@f3RmwAsw6Bzt z_YYO<-kwEXTgjX=ty1#ZaD&ykS$Q6FpJJRddSh+w>(Lv=e4%X5u;6ynRT`Akn7vn6 z&iZQbUd-cd9vv`d^;?{;$<F(&Ko}2eGc{8VOuQn0R^4#fP{E{zI?EljFp7Zt(%e1EG3k;#& zEZInFeH$IDg7V)tUjG1tcSM@%dApBKHPz+5`orMiBUkn2R?k)NcX7w1r)S(y`kbtF zmD}<4ba*-Sb<#b}cTwnh>~?Qmi>ok}wnrR>G@rTDs1E&04u@`_G%L^4acED1#is1c zn?kWI3i%uw(QIJTMR2B8mD$kGt4$W!EX2Cr2{u=sV8e<{8cizE2B~1pDYbvVCTY!$ z1*wuv6=p$2R=%XL+D!~d?0l6}odN<{*FkDiTKazAmtAYngKAO?lXMo4^vsU4hV{TC z{i4uyP*mwRfHj8Pp=HfwfmMyvVG3r{W=R!TR93PKOs%t`98B!<1QFaxHe!)y)qy7C zf(1Citsy+8&{F%qQz%yPfvnm)<+h7VQ`rPXc1}kFTG~)zO|2wZyb31Z%1g0eC2rEc zr7vbA&MilIuzmjkv4T6}B0|_W$X8%bypE^t6pW?cp%d=JfrZ`Gh&tH?YE;fZR9VL) z$}M=yHH%QM&~X)<0@iyO4QDaN4O&CANtlwakD;t&-MRx(lCZBUcJ%~q>0l0>Z|GGC z>MFUQLc|0$amz; zhIH$t;mYb_#^rY__o!HBD>1ikj^Am|r%342XG|j&7Jf~e$3cqMp6%G?POe(p`;fnv z95D4h&Tl8k*Sd`-CZw^SFFosxZk-w0Rv$C+TK?Y0RC>6&^7mYeCub;6_>$Z=>PyL4 zbRl4Z(+i#g5imfaa%gCrV32cQ1kmZj_5(>Il$L{x5x}_iAPW&pqVRtT2Sx{1(6m^6 zvVg+ll2!$g8ch-s6=;vtP8_}i6{OVUkg9>A97jMJ6!Zq5x4A?~r}Yskn#6{*m62jm z#yv#ZFhJwb8XS@nB*`K$`@H~{Ca`%mS;!0^XhRTD=qgaiS*8Yl9P}b3E}0{^JBtUB zbwQ&8w?sHWD@OtjFdA^2@GN1VZx6P4Em%!Q9D=8YLPB^Ggq$%EQog2DqDaruc_gPj z2$o8rD3*~5O+ba=eF14itQ0{v9_5VFu6ZW84HTmT$r>SwANmpqZ9>aA2&kF*juTJR z29=o)BP6DrNi|?m!yyUaptL6WDxk|nhfPcpDd;{ynK+ypW-0-z$Vy3I=u0rtz|<{; zgFZreX3jLL^f6-nT)~`aqS(@a#-l4_)cj_uxFroI!v?giX~Get?F20?dmmSluuh#D zD4LU;t?E0H;L??qtZG2gn{12J$3-o}lNL9Qs_s>z+QDrj_qG1Z}pQG=Ic9po+q8&zmwqQ*Es7s*R7*^?KoK6sr$bDM;h1v)A?lI zL-tS0DNi79$YwOvGZiM|+3@#v)h2nnn)LHs%gBnR-{^6}?Bd_#C293HBRbQ<+U({_ zsHab3!}1ke94vL6J#W2Eur#VQ#j=pVY&8rL)!G0+rJuKIcgs4Ju}}i|7!D zMW({+1~DrWBowX~)|#|rRA{beTU~Dinp0|A1}$w}o!pUKZTps%wb?&F4XL-IBDZPF zB8BKS1y=wXJH`_O72Jg5O0|dzm)e<~DR3ZJB7o~v$r!%R@yro8f*4JDf(b!t)pLeL zFh>~O^d>4BoCsxR1~R-r!otoGCN9&Sf)RHi13Ox9X*07#S=s*Nkl*d-AUgw6vbDc+ zP-t!+;F{;?bYMuG$A)L=r(-Q1tm8~)< zF2oty=&=&9nn_rZJH`qj-RL%=@5v+YfH3>|5-#8rou5EMxKNhf3qd>dBv!U0qO9GG zEKK^4J2Yh0Y|v!ZNG8q#6t|ok2CN4Ic>)#5X)8;{MH;{CR4r_f!$)-TD-Bu&A9NBo zX&`;b5%&rwX7I(GRHv3&Q`~8bMEVF)Q|wI}altB4CYeqBN>K5BS3}v9dU&o~M~AaS zJmmFC^Hjec&5o>gc=Y>uW-ZpFbp6hZ%WnSw3u3bOIrP^q?)6>{Sm~y`n$8)VGO+Tz zmX-}j$6Y+{E6IJR@62Jr<#`iNhN_=a%EtC;jL*3@^RFG zEU_AW^NxXIS|b=BO{mCV9E~s(6tU1*kf3#?LW4Sk$NKt|Iz>h;`Y>%0YZ#`Cs2{m4 z8HgM@O|iypH1cI>IAt0MngY2i0XoWpSQn>K)fE%SYfv@RqQv&Glt_8#UyCSJd=RkL zr$8{$k}yCV2}tTMVpv&X%D6JrH}AnUVMO3q!B|YNcoxqA2!cZ>fQdz?0$Gt~20u`5 z@P2{^5Xj)ESTS5V1S9t-so8ph((W~2(bp)DOE~Bna6)-xj;N`^Nj5HYIQ>bfkS}s< zJpBj+pg~OffZaC$u+wQtVoZ&KDMR{$awphD0Lr;0#Za?N@CH!{v0sCX0{kpKMlD?w zg{n2|gF43P(ew)ptMN&MKVCu`%5&=tX+1( zo`GYe=-%v02@kR@VPd7ZP-qE-f-p!8I0_53j6<-sE4LCJP8lo}ZDA5sYDXGZVz2)I zQ#jVLz2||DTAqZ)ogw9ljq7ToE#rS5&g{nld1`fzzy4dcGII2E{*6ERfA}xvKcoND z`B`V|C@%MCND0NrjN>Nsh?Jp-0rf+FlM&#_I5loH}$Fb z^?Y6JzoEkN>&w-znfxNh3(K^ko?>sD2degT*UnI8^4GIk`6|nkIMll6rr9%%H<`(j z+Lv$`b$!qnV`^uqn++CGz(G-E>S>l%eWXk777bF{25f8DqS-kH^=j}*rFKCrZCk({ zT{gx86Kd>T9tkzB%n{YAAk?LJ$5ABQ@(>!l3D%2rbpfqb*~0^;S2-cA7C?oJ5K^>r zf+yTW`;Y>8>jZ?g$tasLHnF>x?l2II$GsKtrl2}^C@nWnwiAcs^O0@8L}K#umhz>PZDvMa9Mg&|V96^8AI zG7{XrNaAkICT`9Ggj&(a6e~;iAYITzt$#uq9f22k;8M0ptS5P8hX;J9>SbZ~v^bKl z4o4YV*rH71T2A85r@XNt+mS(85)H^C*}+Au`--h+cOw#2k)eg%)tSO4s^nQqw8Rz= zuLXrp@TC$8{X`nLEmFEHI(^cy)VvB6qXwCZSM(ws<01pJ@zAjv*vAYxyf5jf2YmJT{zin?PT-Q7J>D1oHYlAoOxplLx znuYtBY3TTM>`Hk#bz9}O-MDDPZ(d*aEn81Rw2n5r7T0AB^fO|ShT1}Hj8;6KKHaJg zyvH7^%+}#a>BlKr`94#%6+H??YleG{vN;m>$dMV7ER)ViQ?JxW?VPgkL?x73iO(#7 zLPX6t#Dh|l`V50aPDObW0JPv5CP+8_4FTODgY=`j=mbcaNjyOVKusyjBu#YaLqmN? zX-;5HkD&vH&>AiRAuFk@M-h--5}K1t?5cbiI0WG;$#@368J2@xMVeCJ)*%v04JAII zQNB!+y1}hjAE6*Xg=wW9P}PC@btOm^s~nLpWH^B$SwmJF0>fUQNioDDq9A#KRB`}T zcoKL6;FYjA3O~Sr)0}k;Rvvnh{RFh|7(#@{S<#Saq(nCj0i`6cax9JteyFZ;20i0i=s=VwlUB5@>F8w@ ziZiL1HHArr9U*5|MKHRVrZ)Q~HM|R3eDGQ^7XBmUV6A(ZcuIPqmYV`~1XsLbqa!t& zZJTFHC>9g9QoyBR#^eYY(46Fo(N_6Z0j!Vz)%jJy`zPh0$sG%cWkjT&a#%G}0Mt~2 zq(8XPV-~g7wC4sCXk45ttgeb|T}(GCZF_U{3_9I8$&;-qwIIN|+qp_&v5owXQozOR?{XyF(kuvj zKVU5@d>Lz1_q{S0bm_k%fweZK7@95q1iLB-*d zv=P=;y67Q|{fIJoG?3h25?hjG7PNf}3pPFxH8^HMRb+OY|g%SuY6tV6>sK zV$oOX6(Om~LK-9!Ydi^3W_%*<=xQY^_hFSmzMVr;JKH%Fhq5^`8QSfPNbhmzS*X>z z15n?%YQ*<0tbmvVj`t?xAz2C4%z-KN4Mv}+Q-qowN8RXVf^0>JZ_th;fmw-(?jwZm zWHWCjk{b{uH|knR+6kId3m}D-Rc2fa$tQ<>8*>B!Kd8KbM#-w9j}RJOk-RgMVBXD zW1nBH3(+?=I>##&_q!|nTowj;yt__WuT||`+WeN+@j3dsO0Aol<%TVB*MD`pQNLC- z+P3!Nsf=z>vTUV+*O}%~-hGbT{yB9XXLn?#k3{`&tS@ftog`+|%-~rkfEpZ;q?>$` zCPz+sfF&JE8YP~3kAQE`76)haEJUDj8(?&t^)&!bs3;Lt>|HWshUFTILi&|Ml0mM8 z7vT!im<0sn4T2dnfhjFmP|)c(B26x)LAY5Gmy(fF?T!kJB8QcuhCJvri~ALVkqSh?Gb#K|!X#euSAA7r7BRhrr^}f@J3=PKM_O zun1nDFz`k|+T>c&Sx{IsFjx{|3<#Ml8>bkM(}DVnHYM6e462Fh2s+QOY9*Wwli-m| zlR8fd5R;Ek)1^HSjZ;oC8i_U6lA}#BA+|^_V$pw8jGQL1CXsf>JdUh9BEmaBV3Had zMH(icS+GRph978Y4L_+vgxn4dK0bv>q`5NG3}7awkwMl#bX~rKqYhe zP;NnM7VvH`Rd6MvwBX7exWH;mlDNTo#gy#i|La^dBaKon|iT~F5 zRDQ+zV}eBEffObNPI9?c`Y_m#e1NEw{d==PcUa zM%Lr%X2#`vz9#kBr1NziiC&JMBM^>PmgR3hb9 zHI47p8%ed3z$SLItQI6IKBbxyGm*eebX=AKYxXQ{E|Z`59Ay64QeB|Vrqz)sO9oc6 zvdDxwlSJrC3$`9fU{w`|_UDjThMdOYJ?ql36EbV91pon(Jl+QyW5oY@E zGORDSksS`w1iSr578iF=%tWm(BFXnWf{@*l_GHkWtbu*T1pB|hkgq%$1>G!xJ2Wd( zYmOAFNd&t>1+4p-q)%f^u@#@FMWts1litS`3rpl;DaeDX&PXe{uc4EH+Xj}2WdWor zDcE3Aw1tHG%Lavb92&KG`j#Cv$)vDeU6(^z&N}>e+KzS79{%RAW(vnok*=G}DYcjma*o(+SU$XKwS z9^fcnfL6aN4LFxm=DV3)Q6Yf1oL z(c6Ps#$hB?V!8p+Z}%89K`lDhs9M$tha)H?ij{W4GD@mQ6U)G|aRk<%bYY^!q#!6n zLrs9RCL&WNiw%o9YOrT@tOaT~kO_g)g3bP=BEw6kQqc{fMGy->vT+2kAi{o_CWOBL5`N#Q2p%}P2+4s54^Kr!(pv3pS&Xix8oj{bIr_LfFWfr23hty~z)8)uyW@Yg~bA zAOF|+MQQ4O&mWf24}w61hg=mW&me?JXv3@MRS))~DcmoO=(dy(hj) z7}naa92u^Xy)PTdbWm{WJ9E?2@w}R~gNIzZPMuZqC3DHn^3yx{EkELFa?Patt3zzP zQ_jDb?QFBO<;z=W+uYOWipHa-%JY(=s^sH2{ciN~wfW!4rg}XbeV(U_<|#>>dga%e z?0#K%t2p|%?8@F_f%RKit**@9sFl;JY^)fqN?Uxzuc>kH$?wem=5ILE>t2SP ziX`P@tgfngAGms!l=3H@hHPq9pLuYM;$FQ+?C2Ox z?QDXU{DuaV+E|vYJb^20T!c*Rv2e}Mi|=M|Gq%)?V_MJdBvmHcKVZPl*TjlPaE(j1 zQcUf&4kOoe@)jt$3_4MtsDkY3A!(K*_P&IXb_t#qcnYBH$r?(Cf%fFAI;!eTM*x#; z2^W{97(m)!D33gLxj86Q#cLXNn=P)&_*g-y_kPBb zyMr0M8@EoP#i3wzsHFOqBUlurflX`vNHn5tl67gA0gd&yGD}_B>D_{EezEere%iK; zN-TV@%B4y+xjj5Q{YQhVa+qxOSmCa%byvd4&l-_8s$W5e86>%E*0S4NFR7ZauWICz zIZ#;2^}J((#^gKOvnYch6pX5l3bIWA%3N?QV4j2yBPFCS@JKQmQ|MT!{{XQ=Av%_<5d^TB7I5F7 z0WDyiNqVwkn#fp5lB4KVkvPdiD34sB(msSJ#{i``g#qQFZ_}vYqEtg9NpvE1T|EhD zMh$BwrD1}=kWy6^Je{jJVXa{$(04`&&#(~~L^&z=i3x|> z=tBwAwPC790jmS|FC=|Qp8{I;96D(ylB>v8fW#B(nRq~!jLh^b8$x75P+O-CWPwMZ zoB^u?sSFUJEL6yCz-aI%uR>~2;7NAE9b~IKm1R>9jI@2t5=5JcN&>PXGK)?Gn)d_~ z97>+6lPc0);-o*P0Ewn(Q%OOUIZJpnDZvQ}X9RHYzxsu2pQ$lvuTpAK_ZY2Kc?Ak& zv1xZs7~s=&EjSV(KTYF;YZEz!SjD(++meSxQENgM2n7q=j90M~*-r%-u$-DvO_|21 zndEVgB)!2vxq(_cQpjsq8-c;6Gr^O(Q5hy=3j%x&1+59=23QSAsMhI03>_hWrv$Kf zKB0^Bk*qqURmf?SRuOA9z^$Bc7-efrusW;9{{T>pU1HMeX@tr`A+`;NJwy&cpV}Q# zENcg|6a-`c(D_9We$Dw@IFL9J{RBuKpfzc{lR7H;l~SoemWzxUgF+f*HjJ+(mkbk1 zIN+(3)vIDT*xc#U<9R)~XFJPsyH}AY<&KlBO5cd#m5SF#+*a2HalLulDVB7V&cm;f z_Or>W`X$CYe5YZYk7jpisa%?7p1&#U>Q|i;w%WX_J4~3ox=x;st;zCovC?#JdQSl& z)@#ajZ6}5}FG#hW+@~zm{AJOj$h8z1vs#Zw#`EWsjpfpG>0WYqIr_SLwq9jpko9ZY zF1}|#^;+7VOyoUI>#IiDF=Kk^uEb{=ihDm|R;ymv{Xt6EZ1o1Teg51QEjsRjuxo1U zU*N)3c1V~nyVs#ZV;!6Nq6}}o5us50g2r`|^5Y0+CrkSyjG_4ph8T3ew3uR*mftZ| za%yv;*A4znHgudZ?CSBngx4W?YFBM9Cp#O}D?=MNOxdrovEuCR9)>ZWr_^M<@Yebnd;nArDTI!-Gb=Bk1S(18Hs(@}eyuG!mY2eg~ zz7O&Z%U%0Z!;{(ac|M&!Y2B-*!adSFJFi#7+uE~(k5TC7p}%@~Ow5Y(S22 z$$UwAv+T9C+mglYrQedpBd1Qu!HXM%%m6Pz(7v=*U?J(|zbVmUlfSEuVbE85Ao8T7pciD2((p zFgR{H791p}2#AkEQJoQPhE|;9ak8A5Vup=IwLN`_m3F`!3*43yOoWBWMHZXjF{qe< zSX?p|9IgmMO@4q$@Ib2i4kNNiF%INdyc2JeSOR@t1y+cT0)^yM04Ie#NOz`F#l`NohNAo=Kf92^vADOfRUC6mb~_ za3(9?X>JeE^0_1PC`hK>q;vN#X|%kM?q28S*PxEiw+I4KAS6 zG#Y%9#{(I^g*^r>KT=QzD@iCJ`dstWR-B17kTE`plA4YK$nZ-9jbtg&1d3#an-zrA zV6|v!00gA1YXim$P(sd{x1eB@g%0Rb)Ul^mjb7}&PIahPuR@J}vA3bIVp{bkM4}o~ zA~#MK)U~NYl4j62)Tb!1dq4lt`B9T{JjmC>)8OF8It9)UZvAJ;TZs*CI!Mf_LtzV&v z*;ReUUIRZTME?M*lv8;y*ah{A9C=$PM)l5*zj!W4V-$8+}E$B?WyW;v9^`Bs8p%$0=lrZ zsIKT{O1ozzDP+`r2`9Dm4Mzl)tlIW0AvM$iHwC8&v@jRAT1n@pAOfd$1v0;n3kZ%m z_iH7NYif*|V_Djss2bL78M8wxX9I`zn}j+8uwf?WBCw<|3C>4xq`cr@qq;J}wW7_; zBP&VU86X{{WQr5U1ruGo6r&5fsMK$2;b1*ZvvwQ->}f|p#5>+g2A6W{!z@yhw7D4( zDQK+%QpCwEI@(FF*uhOPp!+>_jyHvj=qXz~J^3U^GnRu;^?s)93UONk}XalGI+tmK#_A z6d9nN8K#NWSnDCr43^Vyuty7!zlgZxbYi(iN?YkU6{>`}D?(fJD6~Yr2T8V|$`GC) zva%PxM4DLvsY!Jb66CbtMOlXp8CDa|v7?xL@Q=IS47Q)}Y+|G=UIY-rR81C`ta3|AI*3|$$(qq| zk`XPgql(jL1%tQLbxJubG@6AZIw{AgVuy}BMF+_v?#Yv(AsM5$uTjy3FyI#9zu2MB zuqIK@0BDaxOyEe(SRjc&!;m6p4}ckisWm2v&IM9zqR|CZH~hH+f(u3z3piw;fY$Ip zF9ps78DheMMu?MB#|4a09)fTum<%B~BtE2qWCuVQD8T8=3HudNx7T=n<`1!KyBOB9 zZ`YC@#Nu!w!Sxn!B5MEv5+@}M4y?q>_YtrE()m{BgZ6m*xNR&8G*%u!8}tBC&`Oem zI3aW;3VQMpS`%imZkkZxFs)&x7|2YL)w%<7^eusl!&=)Rjccn-mpmM+antux!OttE zuTt$^lkj`sF$*P+?vFtx&s#ATU#$xI%}tM zPE6R`>Cs;&KF2%Da=JgXty3PYdop)Ta%gHTws2}jYfV;%E0C>oaowlMj7iI`TGw`; zFSjh?d32pSsq!f!7nfPutMaO2kn}$8%^qKIk5;EoM^4O1&c@|*Ey%_))z$O_s@{L}0<`mvOtjW8MHbE(B%>uW0xGL#!C0YM->9olhWgEY8zc>biE*QZfVZIyx!eYF7RcsACv_jE&vGwL9n(gRDn4ItmIQ!0+`rGgW4!6K2wCQA|3 zgE$k1C5?|yL1#^65;pje9u6`~$=8u)se6M^)-oxg;{$6>e?awTAUnTN&TW#G`k8dB3FMqE&+wHCn-dub+ zHr{M?k&9W`$0nJzE&!^qo=8^C-OJmP4MrEU^*04+t7oe#1G7%qUdJ07l^fa^ZO0bZ zUWZv6ZDQP=F`p%Zz$4TWVA7EKKw$_mn0S~bip-hPUW{L@k)7K5u#9Ri&w zNTRgUBu!`PF=&pZMW-QxQgy_Xq(tyKO(n=uU9;CDJc3v!CQxk}z)1~9ASF%(tv*QU zVlqH95m7Q&&#>T{3)FB2C<>D5VH9*XA`TdeA$<(df+HvlE)5%ST2Lu;N(3Ta3lN#X zpgLd`4Hm2l5g^p$O@bQ20B!!}aiH4da8gy|(hapT9#E550zkC-B*PYlvm_}-3rvHg z0;eW~Cc&faP*t2Yi6x2WCYA{3!J|kkGn1d#q$HfNXAg#DsrWslNhy)mXh31X3R$0H zMBvQ=7?VxFSV}!fnN47ggV=zG6@nAsBUmTYfJ!)GLsODLDZn|{BPFfKJ56f9a|lH=3M#5H6|cf>Uj!{F^cYhff(*gX#w|y5dj7GMZ~n`3pv>){X(M39pd@>Sb@Q$!`gn zyt-?pc}^j-7}lLUuGb5odaq}z;(5KijpfpGE%K|o4*}@C++Ih| zSvIEz=geN*xB07e>U5kr`?>s&JzBF?YH^JFIA50eldcbEUytV`v&oCeojYmdy^Hvx zo#oPW>DHxxBMqM0cF~y+BY&6r9p^4~xVCvR<+H5i%Jjo`k=^;K9$M`yyIqx~oGYxY(rN)>m9i9LN;58)-&9U{B+@4!Q)=}JP~1EM zLqf@=fVBpZYD-;78mnTL*x%5UYp+yf3#(iKYjmo;fjK;i`V>wr%O68&$F{GA4Byul z)gp1vYWfmGsU$S{WBAE6C>q4ufvoB#WEzy4OAC=mAbIEwNQTBl8$=3VsttnF$ddY! z3dziXPa;EUlQ?M#3cs+KL^B|}x)w9wcOr1vd5LT=ds>Lh%lGNFz z@Hj0@_PJ%6n(N)#V#cLsyMJ`FZgS1(k8!+XL^YzyoB}p?ZZ-ppcRTC??w)jqqj>^fZLX0GcBcK7uVcGPIp~n$~O* z7<4y}VT2?IlOd{W)C?SQEhVTeXH2zd#EQ}NVT($01SK` z2f;U?5Gf<1q*HG{aDkG77^IR#TY-?L3En;jIIqK&KPMttPsS!6lU5aR)p9z zWDPJROHJ3WP}Ye;B5| zaKLUCYbLe-)cI-Xe$n||35G2V`@vu}QY9^bicb(&(LzE4X=Bu}8flrsaNu_g{{Z+* zMTb?_)XE8d;ERq$Df<#tEEKg?lNL3mu0z>7?wa=*4XhS0ZOkMMNN+q5w4`9BtW_6u z;IXX_f@eu&Qo&fR=zgGer7on+GPbV7zJ@Wh-s$70;~L6+P=i+-I={NZ4ykTYFoXs&14lcyI;kQGRe%~MUMXf7frCN zV%E8jV@8yhq2{&dklmWT0jFi{TT&U#sPR0nkM92fUQYb><=-zmZ-ug)qqOPA)yKAu zjvrI3y64y7R_(uW!LL)m+UXtHXD*$1uY1DS_9S^anDtAqTSDzwJoVB#Yq7JQHl^yo zs*^HGM^!z8T56jDF3B;qp8<>>FCpN|1!7OuMQ;d?a%WoOj)J!eovS%3ELr;Q4^)>{rs!66UjZE|wSvtW4 zHPDJ5_(O{c`>-VI)HRgjsGKLsAg~0aa6(P2^#h{W{YWMRX~$ApaU_*pZDe#|+gf=c zsqOSEGN#Ctluzh56r6Lxk)+>Vh?-Jy!KlgA^cJ;ss3z1zF{OPvj2hCk#1xB1Y+zQO zNg#E%Qmt!Me%z9g4`)Mi27XrNwX;$=^!c5Xn>anPFaaS+h zNqe0!oeuNJ;?{O!2bOlU@GNRk0=_**K|k=sXi`f`-%^z)2?{>wL5D(u5|UEzI)YH( zH65@KVD5|#DR4~X769@_r5X`U0Z&rVX*uXjn|%Ws)6eK7CV+@WXb&YJ(Oi{5=N$?S zFQHX~wX)cQuc+!cO9pip1&IEH(MtV96Ce}xBW@gH1b|Xe`v?|G>LUa6CX22KogTza zK?P*W#i6dH1_@*XM6gWE6HuZFqirz8Z7fa%X@Stlm()VA@JNV>^ehQ}!Zlqa$iWgC zNu@X)6-gB^G!d$vO)zOeTGWEdGFr_XVG;ck(Sr66Xu#h@SWldpSeCkrI&sjnf>2)B}t#r zE}Vlw3c^si9a3QWa7^w6>`Ow==q3jG0<_Z-66y@#{$8M8|JC_xOmX_3w0=}95YzX3 z8CjuK4y?oE2=)~Su-Iy;xh*(rQ+yVWU3GZ=2JPv(RkidndXc_(tsldADNEOA`WXI^ z(){a=`kfoCu+EdMalGM5MSz?zGJ{NDUc3`aO`{=w(xC%Mw6zSHjH9W&V#A;CLqv5X z6ZIk{RQd!|nJpZzVZdat;3^5g71q!e4N|{W7`H>VB@Q-RvOy&BMX!%U>=Z|3{B;tM z#&qlInz?<(Td9DQh`rE~}({ABK`p&nHh;4&L<# zCsw+)W*M6dZm-c8#?-AGl8q~}Gt@Dr>vH9R)jOtuGjK&NC+I*o=n#^55T#_Y3Pty~ z!5nL<(gmuke&m|ck(NoVo(!iwsV@SNZA3R z*uJBo!+Jt380Wj_%Eq;um-P_ItmI5)>psPTqTf&48BLZlCsEG>f>7#O))J?v(0l^F zfpz_Ytv*Hy6>wT)5Qz$`12(Ql45H3?B})ZVg=&yPr0^@rcB+#j7~RY9eltZE3C`wk?xD0 znoW~6C_12^{fxDVcZ#&YC08V!+7Y%u5^?C!w4L4AeL{zzrm`fky$WO1Q!* zwEcmij)EzqL-6}k4QRO$F8|0#;RRvT&*4%>3D&$V+o}qx!ks3JUhLp0*YigfA zLX{RM&gve0>H0r{}!>r_|<2Do&1cV!cIwc|+P4yPE-|_+Ephg-7uwi{bgu6>n ze3TTxQiSq9qCp8{OoY)AO^twigc1elCr^e1)PIO9K2tIgkI>u;K`%lANE**jYEt0R z)A|`&B1vT(s5Ma%vB-(~J8&9=cAC}TGzUXOH$<)r1gVcgSfu2!X~(%WgCq-u?j{LL zF=>_;|JM0=gZ6m*u8clON^nhrV?uDrX?vmvlGc^n*kO_NKZyKpuO_y8p~L?G2b=BI zczb?azR$q;zaLWU)RZIV_1&*j<~q0dEvZUT&)KUr@c#gmd^+y?l&o8>4^PYKj~Ca6 z$?eqjxM$Mmt$6Ijrx-Pg9v%Y}ba?(d+Tt_xF?z=HT^IQ4)l5Iw=kC?v%=BM}R&Q9w zcGlC##(XC-Z5L||7%I97!|nAmsG5B`j8vM1kwlkHf(|eZj@CNKt~1G&g!Sk+!s?Vk zn%oSbEb@&lKHi?7C+l5lrj>ayPpj4OwQP0%OD7(&+lA}!yKN?Yoh)?P{hbbeLXvMO z6|EN9lCc{t{3Z(npH`=Lg@b+sj{Q3As*%+k`nu^RH>0y>Ga7cT7;AXC>aQWA8SJBY zLM%FKbo#Q@KN=*TAksEcw!q3BUyp1S$wZ=LetZr7{+xIi- z-nG-@Lkr7NyR~mk@^Z1(R?B4l3^b)@`T{q!6H0A>YEbsaxhqL*jD>(Z`jI7euqf5Z zG_9~_6s;+Cv(QVgPUZWV!rr?iO5G5zJS(;L5zn*(9LNL zMj+5QoRAej)Hb0=vtcP*l`;T|!(RM|FJM{|76)qQsI+i_2qc(~aSBLPQc7{ihPA;o z)~!5%Z%a=?7+uOe2NEvXsSYxBW`-f(BaG6S$);TXMO;cca?OrMS>)>E=kg{X+!f|- zs;^v~qtDcHyLy{vS=l#}OzAZPr7|p*2nqd(4l+n{^&_Pdm%(bVrzMQ(@yO#^Kfp7k zUUExEV&Ju*5rNihHBi+dH6GNrAWRvT!^ z(pW0S28p2GPNKXLQON>OI+T}CsGUVfIU|2VsA|CyMu?0E!IWo4VXUFmq|$tl4RtL# zaKh6HI*b@huo^;SFd}8aA;B#*>StDxexqUC8E*mvz6leNMu?mC3?w?pfI1w!12m_h zEI!m;RtM}T=hT|S$5<_9{wogzr$PjbGbEhwgjh2qVvqqJu`B?BSsiBukw&uz91TX= z2(>-3XyKwpgHa$B8=us*2RV|#Juq6P@lroX6(t)*D6=R$eJ_87JR!Xx37PU+2 zXn9h}lZBpxqeL;)`XL68xhi3-@&`%uYxF3^gP|xBf-pkpI!z@R4MpxKpYi}gD8Q)> zS0qVifLc0`{WpS5--AS zz_UqkDj79kSRf}pr4V-X3>qLv?JYtBQ~%fbh?Dkj%95)cMxkLDS~9sba1aT`I)aC9 z@CvS<{?1CZ%jkX+sh6J(aZW)uMx>l#(aBO-pU)~-}J2i066)d zoBV42Gk4XR{SMzhuK9WU`Qyf4AGQAg;{O0+*Y6ys7QMd@@t*prSvYs~$8LU0-T1;@ zshp?S-;8TGu|otxitfGp2b# z?7dk!L8fUW<`Av(=0oM7X6j=1_S3&D+Y(d6%^qn=)V z+54TZqaJ)S(eI`tnYGDZC;4`+P5OyW`)y~E#=VvNVqZ{FFGZ4YRXeroQ7y^Fx<&Ud zp(I-Ql0~P;cC8aR#x%#t@;=#fHC8{{O~+HGt2*e{x{dOTSY=m{wv9kY z*0}r9;Yqm|(zW8gjBslT?Vd7g6J2|n!V3hh-xb@I@N?Qs(uxgMlA^ztSs;-EB&dnX1p{RjqbyeFh%E)e$}1Wct3fL?D)mBOuLV%;lGB0_ zEP*A|C?{T{qXd4yWU!;u($Jt5h>`GuQO-j~ns7!?!BE_9)&f=P1P*CU4oeEJ4a7fCsY~% zqXZ^OlF1{=1Z$8Q8uc9-T?J@U$zwWd47wX)i=G6IfGiMbVMGO37FjJ3AhiCxmXe41 zii-LH4SEC=bP$t58qXnHG`&Cu5E^4*C~Rlp(})2}k&tbn&*~&g3m1cl1-f0Yk=C%_ z5Xb5Z2P1-rAp~_aO?sKAH#rFwmp@ZPoR+ghzzBHt1xh3JG$GfIV6AyLDMgf3MnQ8+ z>PFIPcr^i}TA)gKB34RERe>x>2?RIEY9&2zXd6J*2H=Th3l%QDgfUUjEhg|<(Io_= z9iW7D8Z;*aWhS#CYLfK;l(Pc0PX=(n{X-Qb=LWD!X~GK#kJxnuz-rO^4gkG~i~{l| z3lUj*3pR#{sSDU}SQ>;3$ZOoOu`B$R4S)a8`HoN7zbbRkh*{vU2k(|diHf9)T7o}d zHG1)owXR({JcgVj7B@P52ZiK2Ub(_N{YR&spMBtYb4tE&czcgmHC{?qOybp#j`@#_ zs@U${8{^RR{Q7zRoILgMD}VZ7o&B-OaP8Iji`bKsKh>%7dcHT~HKJYaVCC1<)_mUA z$M`G8aI;g5>s===P0_W8gO#o0mv@cYot6tlj~mR@-_B9fn&)GVlxg8YH>}BB{x?L< zeOE~x7SgTI#H~E9GsBk$UV3w}^WJB`-u7+qdbs-I&)3ghZvOy*+g#OP?>??q=Ek23 zzh)AHf6_5Nb?SJ(jNb6=)Z>26)8y*i@DEL6q09QZe>ao2<7+N>M}B^eH-o2xt7KPN zHSDJkPe;P*h1|33dHVV~`a;?8OJ$^I(RwGw{AsK6G3;vnl;Q5^_|LYIYX_gNqqO1L zwf0lBBbMuU;{O2RYqH;QteW=5eG%pO9U}!g9dh~aknnA;-*TMwN28A3d(JpEUv9e0 za(Dc$f2?1Xddhs7oU2BkHPQV_@Xxc>@%-yV*x}a>y!74d`i8yEzfu~8AbTNd8muBUbk`wSjXuoeo2hhAOfu}r ztQ0D|!9xvI)Tq-+RD#uZnkQPWQ5|VrWHVRx;51%GWRWw9R_GYfwbYvOi(r|*fxkfzrM^W_xXCDQ22BWr z573HW&^o8f4H#DTC}>cfV8WQLTM^YkTks<+- zv`pZ!L7qnmHbS33s!@Vyo;WD84d8(+!BBWIiKAL5D0J3JwWr2Gn-bxVgQV*`7K6$b zp{YhjlFAjKVL&sYF$mFvv=xB01q7rJB>2b>5+uQ`9#sTzqDrg{6EGx~=nG-lzCdo1 ztcc2Bu*tk9>WKtG6`TDA8g+>GDxh$QXzl7cyp%v|7x3EjCZTXkaOANZ&KP0xNno{{ z4Gy$v2D3|oRZz%^`}1N1_&)8I)Wz2jSYX2GHJmSq`5*cz=vYO8Afas8x#)&(KaAvG8mN-zJ^*a zV_`2MFyjVvsYC-v7c~M&AqMnC`2 z`JQsm*}p6t^d+G#y+(y9`kB*(WgHq-1t>5>MTvET4NI=y3sr4w@MEivyvMuo`YU)< z=y|%YM=z}Krl}*z*Xz?BlKyDpT{VXP00NtT-m+7y6`g!7b%?4_=x^D2yR=ri)(qNl zqSUQ0V@@yaC?yr+%6Z_?ZR9%IuyYmUc^Xo1ZdP2E(yD7lCsVC#I5pDm3m%4XrxwlK z8aE>>*2Qj3V<>c1v{hiWW4punr5(*9H@5v>v zdT_kCyiXpf_i%OVr8#<9>F9B4H`n|!)RRvC03TXvQO?$*rE2czV8y>0tp=QBeI1B( zU&k%0-zl1qYs~XJCuznR)1I-Gd&<>g#TXEGzCai%HrF8BJOWoi%7?aLTEi5jA8; z`{aX4Un&Zg^|_Xt>9&2n$vd@Owe$=wt$E}zYkKfyXnvxaD@J;PW4iFL0~}V{3{xvy za7Gt$MzfZ=6w2&1Ful5)jO#b-6xxQ%6e%H7-jae$uXe?xNQ6A_EY?=bAkN7(l2sT+ znA5Fi0b!MOtchr;+Jr4g8eO6X*<6sN_94R~1Jn&8wm9HmIGhO8EpY*%wN@aS)9q}A z1wvS*REXG|8fA{wk+>_1cG|uUvN_t|-FV8%J4YK_+v3&1(lKj>)`oVDRhzV$##vd$ z5vEe@>PDgC=xvR{o}@g64PiCVMihluY6ui{5*q4Egd!WsG!&%QsCgv)NXkznC}@D5 zg@`stutJV97(-*Cgpkz$8d9GEB-4ODq|^?wbJPk_lq(J(5kTo3t@2ugNLny)$Pn5Y z1xxlcu;KFf4PTQO*p}lre_{X9BZNx33|q z*9ROCqFTc&W)k&djR{=?08gXI7#<2DSR7IrB1$+N5IIGp62nQLP(M)BLS08hCe!4x zS{JB^Pu&A#iUaLzv5)FR9urpB*D*~xeA-uULbpC{? zDwe4O&Omt!ksbiGhX4wFO9VbJ7}*OaDd4c^NT`(C=tj~)$w<>o&MzVt{{W~+NCCVr zQD`O@G$!Xf3Y41aI;=l%LBB!;1RSc=H99;9g&#M0bZA$8NzpTjm zZ^o-vX4&WZyhWz?%*o-`ryj45<5^Z&%GXI3vY3M+vUH3&ln|!>rQ>2XE zn`mjdW~@=@_`Wjk?`IobW7ehXRUHmhykob>OrWkUo@H}hP2&~jdD@=NI5*8^#|zNu z5y97W&%?I6DW<*F{lc}bdiZwPUZ7!}EU<-Kvl6^v~4mKF)XM`A;KV^;y?q zhPgdlSzd0Y9)q+;^^DD`l%YM;^lGWUz=3_P`T5BGrtXN;yah@4!#oNd2QW|F} ztFm6i)GA)nC~-Tr*;#)sPBwqWqNtOVTm@*}$6O{JQPa!MC3!y1-5x`HoI2+nCD%n< zoZE_%HZ|aP0??mO2i{FXcj{Pl)v*AUuartOrQ?t;pC4*mg)+S#A7@l$w_SEFKx<0f zatFxo$pd?!lbe42>>>2yKK})zD9eHtjR?H!Buv$?|E~ z&rdbOsOP)xN~WCbjBg6D2I6q;uVZNM9BU4yoYApmNvTUW#0xlXiN9kyWJ6s|vqUZz z1%SJh;IV1X?gvPKX_P|0;7I4LMVghIiiVuvF{pn-K1D9>ql!`P%NF2nSfXH$>Pa)1 z97odzQE|bhM9T=YB)J1H+;k~bN|b8^Ht`_UCxJt|pR*i(Q3A{kn68FJ zrOza^bSz#&%p_Q>2?B*HsG9@I9A^Xlh>{_vI0K=~5`s$*Bq!8X!oe**U^NJZ0lJI3 z2Bb#`;4M-osE-P63mVkSvhdEEY4inuM`)P>AOTVAC`1;J+&^Muxg&~sA`mDcFQI4? zghNL?1z?E-fjmJi!_QJ*rOrs`MTj}%pwdj%6M#mr6o>|WO2Z8TFh>j;km4C&z?0;) zV1>)-L)1HZ24Xl9gxq9FBE~7yu*rdED7-Hx5ME4yIV@C@kY*ePnGO32sfpxLm=whO z8bSLI!y-*f$qNHOJS&1|rMv((y+Gkr4v08`7LEa+kkvT^G~2-q4gtKaq5I8P==kkK6--3lKiRTvgPEez7rh{r(Fg*kx~ zcCyv$U;oqjxb@)uoATJ#PQSR}@Mius8{0)wG3`x_JYNZKwUX$YUqZcOQ=Mk(+Trq2 z>Bq6~)wbP=j=!oocVn;5m)+{|R=T8-^SZkA$nw5llyExUIx#F*>?_( zAMARk(dYhed*J>hc)ZsqAE(n^jyT8E_`3Qt%WKf|DW@M(oo*v$xytncV>P5%J$^I| zsz*ZC+rT!{wiF;qw~X2Yi2Dt4Ix(KjQ^3X?K3DLoY(<#)uPe-}vrD5r9LFnBej|=g=y6)`WJ&peWLFtdA_}_@_ zDZG)YnRL4A!R9 z?XA0!ojCM#?Ol^=L7u6J-A}(qO1WJOoBGFJ#yY;+EE@J>)$yO4ejjfl-`LUoTu;>N z^7{JMAE(b>n0Y!cs?N7i_=D>6+^?T`!d87vu@|n+bHSS%mD$*>RO`u)4z8+r{nbZ1 zTaa$?!gOq9UlqZxW-#3rrH)H<;~F;YmQ1?oR=9karb4|O<(9P1`uX}7vd2{>xc$y| z^|*B(8@EtDgSeShZP%$c7hC!P*0k8=FvRQe z{Fhe@EL!fbkg+BUU%S*0dt_-#+SxD0Ph{t*CU0bj#&*0s5=HjOVr6Uf5QlQa%GO*m z#jNdbLs%KaxE%>o)DfouVq0utqa-L*=0q1{q9e1ZB6{S7g<5rDBwD1PHWzFfWe!-Z zQo%0@P6XZg@LiQbn^|WelUkIp{3= z6I}!sbWDi}0@GE=Q;GH=Xo2tz`WbZmOJA|5#eqLw3WMVy)w)a2Ya_KUsD6wM^eh@& z6G7w&sSuvh)rZq1Q6wmF&rk&;fa*lOQED`bkO-m+RS+V6g@Rjw=Ooqr2?bIJToj^` zw?VT&X^bIYk@Pc!oBfLgqv$JXHzOe>g1~8HkbdS#ta4NfR!S@+y?83HcCLe~4Lk-k zS!I72q7bqrrcD$^0K#cOGfgLvWgwkSgpF&|!8q|qs)HL`9I1&wLcJ=By)&*JMwLs7#%#}f=8n7kR zlE8}4Z~PjD6VD>3gDBHn5==%#VZ?PIrtk=5k|>eVuXo3=F9W0swBtMiOhB?ZBcp;+ z8bEL*IT3;+8YqF#anYGOiElYIgH_Ma$g@J0Xh;=gHLN}WQb~%GHIH%_QHd1{31Ct4 z>`Nsm>MIR;u%IO&t*L8ok=z(N5=HEB4y4UEBvxGu0XI1mA^?ts;3hqIA>~PQ13v?n zQLPQa!D6(Wub}=ib>c}+!epw9p%Pl$q6BEj5gmFE{8Ossj*KRtl2U@v1WzQhLa#vb za}SJl93BNz>IzLEHX3ZInkEYmff>l7ganIL6b^^~)cMYb?4OqK?eRa8?OdGt{B-B_ z(7r!ow8W#Iyma-o?fh?rO?LkP_Mr3k*1L1Tc^?m}?kl;6%m+VAH;29PJ}#|QPKQ4F z*KT>o(CA(1I6T%n$5ZiZWx+!V4SXyz>W!lVXX4-BS0=$mZ zh%H#xw35|e%UHUkD;iRvQyuX|0iwA6^5|`soAMhSsM5@ukGp9W3mtAA$pPOx$iRXjYImesb(WO1MhB(yyeYeJHPg1WZleeds^}Jt>c5;!% z*1cY)kBxQun7ub6roIKZXwJ2b>G6qX$UU0E+2E|gGpiic`1MCV=JlLwYO1WGI$Rr) z?r30EuOGb9Yk!VyO2BEs`Z^6_`^$Io|KxIL3Ahlh8EvA^Tc$5E*6 z)4J0MOdM==ja}WIOk;W)g(Q)&CW?M4<=I%uI1HH=#6)kWxH z*GSK05^{}7JzV=NYB7Hpvsk>7Qfdkpw*<*Vv5O2Vcpw?VcoBgh)0AC|YJ{X~9!nqu zMo_FJ>d6yCDX8QO2_ZwE9SCq}iT?oV2tbglCUs#zj3^dDYxN8#?oF4_nW6f!R)iuH zWHn&x^%5a0dXmzwu>m~^Q}+WB9U;hJmQ z1RlgqzTA3|B&3)=3tBD+28aceO&d#q)`&%-t?&%)32%XGLY7H6SYsHGP!_ZRc{%F< zLV+4m-xww2+@c`@hNO`qWMhG7rZ705St}5EDHSH$eua#jK`jnRT4}h!ShoXlkjAAF zSgjc$rkvm!f@ch{T2TV9@;Z%F422)$g(w+T8iO@*ZAK8oLMs77ZVgF*HbVmA=w#`M z(a7TRNX?5);f{(DGGq<<3l`yZG}Qe(tO22WmM;B8agtuMcLv#Oyf-5jbojrttfD&%1Ty1oG4^` z2<{DJcKV02QWRuHoEg@%yI;^*utz~&4ou-FM#13C6cCj82E2ke9tQ;^gkrn@0P$v8 z(odkIr=O_<<2_0NFQ-yyLoHSZ$Nr_Dp9Gc29ib?B9YoX+)AlTDRgf$DPyYbZ&^9%X z|JCrc>349J57=7#%;#R`hvRnDVDop=)6Y2cynQaTZq3g_h3VFED_ht3Gdi7KH+7V} zg>Fjpd_7k0T@jkpkD&42YQe&~L1HwL|#^(W!Dg}{3ZReWZPTE*6`s!3xHJ7v3Mps$Yk9j@CO=zDmNA8uV(w6nfB zN7Z~Ui%p3>QReRB*Tj97$I`V)bUc;lkEif;{{R_llZQ^+y)6~3j%_-YrO?U4YCeQx zExMck08~P-w~pEoj!m?43`3J|h?|po%d5lEs^F_qJqN0(9Q37WO%(9mOzrnTD{mLk359;guql?P?Hkr3<2lW@``LB`qt9bTxa|rFn zZa0UUf8&F+{d2}vq_aa9Z_^*@GOHQt(woTI=OedWe%yAPtE`TyTh!%Ud8cPQ8ODVA zkq*iI0~)n;uvn#4T!9v8ymbI4p(S@VX0$uuXOh9Vy4;HEcG+TWO{sDi&b6-oh&@}K zF54Jk3vqg_D{XJsu`|BtEJ*v9ELxwq#|N->Bc(a@A);l54HMU)VU-Orf|FdbB@dKK zP8<=_hD@n@gGx)#K|lQjj*x*Rtd22LWswQCFh_7evPl|(sbN5^WqU)GYX-2j+UF?T zjM}BQwGInH@*Eea)ZfVMSt-igV}CQy>FUMph5WcRIcM3$j&3&@XPFU71%-oFHS;UBh z1nuquk~9m9F(EX#3kaADT3H-t*-c^y=}A=yq`kyg7C}mU5h;a&Mcp4k0e>MmryhWb z@)$5T&~Rz17BwnkEPUMmtKsa5}yNvaspCVVzj`UbIB2qWIT$r1}UY-)QQZX#S4s@f{64LA*Iv|fE6z6 z;BlP|bS*e>`;o%S5A2b`jmQtKo`a^s-Lu+bAh38@8xkD*wN#|4AQK{x6-Ld}Jd zWk|(pK{>$1M@AR26jgr7_cT4`X;oY1O>U;+&> znokUx@SsIf5}#}!m9)UIgFOZzl0sU?pp7gwe0kN|JLF7x7hKS zKUv%J{5@TMO>1t{r1Rsyv(VA5`x}vkggU#n$tHur04p@R_y#MkP~P zoc_X{9iPTbTGNwm9&&0{YoBIZo1cKCsRGUF@8^-$b4_?|-3rwh-^9)lN~GikzlS3=U}-{Yq8QnO=?>s`l97`jpj>uaXbkdF9JNsjAd(36MmI=ME;x0%@2 zR8kjSyDhn{2FAR$+2O6V?XiI7r^M@~Dv~$sG1ITYRQegWPAPcpzA#G>CM1cwtMCz-rmZSXJFTa8fH&o8^u% zslSmN8l10XQ_QSS46h1w(Rp3yJuvF4wtl8>D^KoY*%`*Q7P#Usy1D2$HGS}74x-x) zdaWJq0572(B>e*#l}Wh-86cFYBR@^o)Df>lSc2qMj@kXmDHaV>5kx7^LqR>VK{lwy z5b!5Np~h0|Y_rn>t7t zTXSPMV%H_E+j9NRvN_t8)XFpp-pr!J_cw+u6u_}fCCDK#@Fz6gpbizUi1jH2tf9o3 zXG^p}KqBMlI6M?j)Vv=cS;JWd${>aWv4X@--4Ngne#9`RFj%zHf>Mca7();Y(mjR} zN(4!PzfjdpFWiD!g42ea79vX=79;-v)Rra*ko|<o5 z6*QoAVKfYgA|eOK^$8b)km5Pu2Y{Y(4QYr>4uQclV8`wTDSDGcpHamGh8-B_0|HO= z6@!jQ_!9$*N+g*HXOT*nGS=Y>6jy*~B=`~Ja75~q!VNff=Nt&7^d*5M!BlGmA)_r} zH6sNR4g`26@-XT5G#D+Txx5xLDNab~@`-6LV#cI2y+Iia3J_^5^36aYbt;9IP?VNn zQKgCCkXTs(4mzSj5h8iP3?!MLsK7Obvakje$|a#Lqo6bzsWs{>h3pln3d=As9~cVM zB%=&j(FirI5S~j%l68^NrGqsR#zci2i#PN-#~?7?NvtP=XAhw^R`w=rHceqM0;*OB z2G>$1>p2C55K9lWwnq*zFl7X!Q9Akzt2Fyyv|e4`72+==a@TM5Iej|F-!osMd@sRj zqpi}x^1JTW(E0HCuj$j<{b1p*N2~wW@wIJw-|=vM!p(kSTy@{ch_TDn*V*+Sjd_*w zE%x90B`25b&OM(lwe`BR%ASXU*QXsi^)3;OZM7*i;K?6ttO&rrjtMT8$tCy5Dz#!w zwb?JwsXN+oVIsL5OILg{#Ln9xNTjXLpyFxw?fMx^uI6N-CZp6D;;C0D zBR~+ah}w!pjmO>L}P*&&_%9Gq}F*f92?V4O-5_C<2;6(bL?uv&3o0qb!6dP4J6nl zHj*Ug*}Jq>xP0C1q?ZFDHo2$1lWfWwvG9MHU+mJ$qC0%+&Gh_!X>TGd=acJm&*SI& z#`W@XgElqn+g|FvOxWD5t$0T~Yg+2Dn$&GxAjNA+?+_4Li8NK+kDy~xm8{ZngHj7v zE%}Dcdb6#y-LzuEty7hQm5rN47M-rDq|}<2Tg&MuS;L;V{EsiUsn&Ak*G@gYb9_7< zJs7>W)A9{<3-dho?bGr#e7v)dUpHynukUv$IQqIvrS~(E^;)HAGlnX2CQUbF3R8E4 z7`0025311Lyap`}(&aLdDO=QVn%I{;Lkz2{ki@70NqX=&%DZ|lK&@6W)S3>xMV&6* ztdyy02N_MG4Ps-l_PI46VQuS!c+R6|ky@{*sm_mP7V{CmR&P!(D|d3i*O=vN&9>)O zcai74Qn!%U;Pyw}k5R$wPjh4HwKu$>#K_Y)C(wbm`V&m%1)mB;1au-?5f*Gks7?rJ z*B;@BxdEl_Xpe@zAQ8Zb;PqNs~yl!%9Gt_902~Akzy7Pt>rJ;Dt3;)C?w{ z&|)OLM?u*Zs}f5Ofh3d@A|oKs$kb*=hFElm8Nk63gJ{6P$shwXJ3|F-3b_+0uqotm zXlNx=B+XGo85$&T0#aeWVmOq&OF^|DM_vshZVcl=DJ{X88irEp!s{bOoO%Y5$spMy z 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 diff --git a/static/Edit-icon.png b/static/Edit-icon.png deleted file mode 100644 index 5ba7e6040dcea024785c917e5d1d5a484a17401b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3792 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 for documentation, downloads, license, etc. - -(c) 2005 Bob Ippolito. All rights Reserved. - -***/ - -MochiKit.Base._deps('Async', ['Base']); - -MochiKit.Async.NAME = "MochiKit.Async"; -MochiKit.Async.VERSION = "1.4.2"; -MochiKit.Async.__repr__ = function () { - return "[" + this.NAME + " " + this.VERSION + "]"; -}; -MochiKit.Async.toString = function () { - return this.__repr__(); -}; - -/** @id MochiKit.Async.Deferred */ -MochiKit.Async.Deferred = function (/* optional */ canceller) { - this.chain = []; - this.id = this._nextId(); - this.fired = -1; - this.paused = 0; - this.results = [null, null]; - this.canceller = canceller; - this.silentlyCancelled = false; - this.chained = false; -}; - -MochiKit.Async.Deferred.prototype = { - /** @id MochiKit.Async.Deferred.prototype.repr */ - repr: function () { - var state; - if (this.fired == -1) { - state = 'unfired'; - } else if (this.fired === 0) { - state = 'success'; - } else { - state = 'error'; - } - return 'Deferred(' + this.id + ', ' + state + ')'; - }, - - toString: MochiKit.Base.forwardCall("repr"), - - _nextId: MochiKit.Base.counter(), - - /** @id MochiKit.Async.Deferred.prototype.cancel */ - cancel: function () { - var self = MochiKit.Async; - if (this.fired == -1) { - if (this.canceller) { - this.canceller(this); - } else { - this.silentlyCancelled = true; - } - if (this.fired == -1) { - this.errback(new self.CancelledError(this)); - } - } else if ((this.fired === 0) && (this.results[0] instanceof self.Deferred)) { - this.results[0].cancel(); - } - }, - - _resback: function (res) { - /*** - - The primitive that means either callback or errback - - ***/ - this.fired = ((res instanceof Error) ? 1 : 0); - this.results[this.fired] = res; - this._fire(); - }, - - _check: function () { - if (this.fired != -1) { - if (!this.silentlyCancelled) { - throw new MochiKit.Async.AlreadyCalledError(this); - } - this.silentlyCancelled = false; - return; - } - }, - - /** @id MochiKit.Async.Deferred.prototype.callback */ - callback: function (res) { - this._check(); - if (res instanceof MochiKit.Async.Deferred) { - throw new Error("Deferred instances can only be chained if they are the result of a callback"); - } - this._resback(res); - }, - - /** @id MochiKit.Async.Deferred.prototype.errback */ - errback: function (res) { - this._check(); - var self = MochiKit.Async; - if (res instanceof self.Deferred) { - throw new Error("Deferred instances can only be chained if they are the result of a callback"); - } - if (!(res instanceof Error)) { - res = new self.GenericError(res); - } - this._resback(res); - }, - - /** @id MochiKit.Async.Deferred.prototype.addBoth */ - addBoth: function (fn) { - if (arguments.length > 1) { - fn = MochiKit.Base.partial.apply(null, arguments); - } - return this.addCallbacks(fn, fn); - }, - - /** @id MochiKit.Async.Deferred.prototype.addCallback */ - addCallback: function (fn) { - if (arguments.length > 1) { - fn = MochiKit.Base.partial.apply(null, arguments); - } - return this.addCallbacks(fn, null); - }, - - /** @id MochiKit.Async.Deferred.prototype.addErrback */ - addErrback: function (fn) { - if (arguments.length > 1) { - fn = MochiKit.Base.partial.apply(null, arguments); - } - return this.addCallbacks(null, fn); - }, - - /** @id MochiKit.Async.Deferred.prototype.addCallbacks */ - addCallbacks: function (cb, eb) { - if (this.chained) { - throw new Error("Chained Deferreds can not be re-used"); - } - this.chain.push([cb, eb]); - if (this.fired >= 0) { - this._fire(); - } - return this; - }, - - _fire: function () { - /*** - - Used internally to exhaust the callback sequence when a result - is available. - - ***/ - var chain = this.chain; - var fired = this.fired; - var res = this.results[fired]; - var self = this; - var cb = null; - while (chain.length > 0 && this.paused === 0) { - // Array - var pair = chain.shift(); - var f = pair[fired]; - if (f === null) { - continue; - } - try { - res = f(res); - fired = ((res instanceof Error) ? 1 : 0); - if (res instanceof MochiKit.Async.Deferred) { - cb = function (res) { - self._resback(res); - self.paused--; - if ((self.paused === 0) && (self.fired >= 0)) { - self._fire(); - } - }; - this.paused++; - } - } catch (err) { - fired = 1; - if (!(err instanceof Error)) { - err = new MochiKit.Async.GenericError(err); - } - res = err; - } - } - this.fired = fired; - this.results[fired] = res; - if (cb && this.paused) { - // this is for "tail recursion" in case the dependent deferred - // is already fired - res.addBoth(cb); - res.chained = true; - } - } -}; - -MochiKit.Base.update(MochiKit.Async, { - /** @id MochiKit.Async.evalJSONRequest */ - evalJSONRequest: function (req) { - return MochiKit.Base.evalJSON(req.responseText); - }, - - /** @id MochiKit.Async.succeed */ - succeed: function (/* optional */result) { - var d = new MochiKit.Async.Deferred(); - d.callback.apply(d, arguments); - return d; - }, - - /** @id MochiKit.Async.fail */ - fail: function (/* optional */result) { - var d = new MochiKit.Async.Deferred(); - d.errback.apply(d, arguments); - return d; - }, - - /** @id MochiKit.Async.getXMLHttpRequest */ - getXMLHttpRequest: function () { - var self = arguments.callee; - if (!self.XMLHttpRequest) { - var tryThese = [ - function () { return new XMLHttpRequest(); }, - function () { return new ActiveXObject('Msxml2.XMLHTTP'); }, - function () { return new ActiveXObject('Microsoft.XMLHTTP'); }, - function () { return new ActiveXObject('Msxml2.XMLHTTP.4.0'); }, - function () { - throw new MochiKit.Async.BrowserComplianceError("Browser does not support XMLHttpRequest"); - } - ]; - for (var i = 0; i < tryThese.length; i++) { - var func = tryThese[i]; - try { - self.XMLHttpRequest = func; - return func(); - } catch (e) { - // pass - } - } - } - return self.XMLHttpRequest(); - }, - - _xhr_onreadystatechange: function (d) { - // MochiKit.Logging.logDebug('this.readyState', this.readyState); - var m = MochiKit.Base; - if (this.readyState == 4) { - // IE SUCKS - try { - this.onreadystatechange = null; - } catch (e) { - try { - this.onreadystatechange = m.noop; - } catch (e) { - } - } - var status = null; - try { - status = this.status; - if (!status && m.isNotEmpty(this.responseText)) { - // 0 or undefined seems to mean cached or local - status = 304; - } - } catch (e) { - // pass - // MochiKit.Logging.logDebug('error getting status?', repr(items(e))); - } - // 200 is OK, 201 is CREATED, 204 is NO CONTENT - // 304 is NOT MODIFIED, 1223 is apparently a bug in IE - if (status == 200 || status == 201 || status == 204 || - status == 304 || status == 1223) { - d.callback(this); - } else { - var err = new MochiKit.Async.XMLHttpRequestError(this, "Request failed"); - if (err.number) { - // XXX: This seems to happen on page change - d.errback(err); - } else { - // XXX: this seems to happen when the server is unreachable - d.errback(err); - } - } - } - }, - - _xhr_canceller: function (req) { - // IE SUCKS - try { - req.onreadystatechange = null; - } catch (e) { - try { - req.onreadystatechange = MochiKit.Base.noop; - } catch (e) { - } - } - req.abort(); - }, - - - /** @id MochiKit.Async.sendXMLHttpRequest */ - sendXMLHttpRequest: function (req, /* optional */ sendContent) { - if (typeof(sendContent) == "undefined" || sendContent === null) { - sendContent = ""; - } - - var m = MochiKit.Base; - var self = MochiKit.Async; - var d = new self.Deferred(m.partial(self._xhr_canceller, req)); - - try { - req.onreadystatechange = m.bind(self._xhr_onreadystatechange, - req, d); - req.send(sendContent); - } catch (e) { - try { - req.onreadystatechange = null; - } catch (ignore) { - // pass - } - d.errback(e); - } - - return d; - - }, - - /** @id MochiKit.Async.doXHR */ - doXHR: function (url, opts) { - /* - Work around a Firefox bug by dealing with XHR during - the next event loop iteration. Maybe it's this one: - https://bugzilla.mozilla.org/show_bug.cgi?id=249843 - */ - var self = MochiKit.Async; - return self.callLater(0, self._doXHR, url, opts); - }, - - _doXHR: function (url, opts) { - var m = MochiKit.Base; - opts = m.update({ - method: 'GET', - sendContent: '' - /* - queryString: undefined, - username: undefined, - password: undefined, - headers: undefined, - mimeType: undefined - */ - }, opts); - var self = MochiKit.Async; - var req = self.getXMLHttpRequest(); - if (opts.queryString) { - var qs = m.queryString(opts.queryString); - if (qs) { - url += "?" + qs; - } - } - // Safari will send undefined:undefined, so we have to check. - // We can't use apply, since the function is native. - if ('username' in opts) { - req.open(opts.method, url, true, opts.username, opts.password); - } else { - req.open(opts.method, url, true); - } - if (req.overrideMimeType && opts.mimeType) { - req.overrideMimeType(opts.mimeType); - } - req.setRequestHeader("X-Requested-With", "XMLHttpRequest"); - if (opts.headers) { - var headers = opts.headers; - if (!m.isArrayLike(headers)) { - headers = m.items(headers); - } - for (var i = 0; i < headers.length; i++) { - var header = headers[i]; - var name = header[0]; - var value = header[1]; - req.setRequestHeader(name, value); - } - } - return self.sendXMLHttpRequest(req, opts.sendContent); - }, - - _buildURL: function (url/*, ...*/) { - if (arguments.length > 1) { - var m = MochiKit.Base; - var qs = m.queryString.apply(null, m.extend(null, arguments, 1)); - if (qs) { - return url + "?" + qs; - } - } - return url; - }, - - /** @id MochiKit.Async.doSimpleXMLHttpRequest */ - doSimpleXMLHttpRequest: function (url/*, ...*/) { - var self = MochiKit.Async; - url = self._buildURL.apply(self, arguments); - return self.doXHR(url); - }, - - /** @id MochiKit.Async.loadJSONDoc */ - loadJSONDoc: function (url/*, ...*/) { - var self = MochiKit.Async; - url = self._buildURL.apply(self, arguments); - var d = self.doXHR(url, { - 'mimeType': 'text/plain', - 'headers': [['Accept', 'application/json']] - }); - d = d.addCallback(self.evalJSONRequest); - return d; - }, - - /** @id MochiKit.Async.wait */ - wait: function (seconds, /* optional */value) { - var d = new MochiKit.Async.Deferred(); - var m = MochiKit.Base; - if (typeof(value) != 'undefined') { - d.addCallback(function () { return value; }); - } - var timeout = setTimeout( - m.bind("callback", d), - Math.floor(seconds * 1000)); - d.canceller = function () { - try { - clearTimeout(timeout); - } catch (e) { - // pass - } - }; - return d; - }, - - /** @id MochiKit.Async.callLater */ - callLater: function (seconds, func) { - var m = MochiKit.Base; - var pfunc = m.partial.apply(m, m.extend(null, arguments, 1)); - return MochiKit.Async.wait(seconds).addCallback( - function (res) { return pfunc(); } - ); - } -}); - - -/** @id MochiKit.Async.DeferredLock */ -MochiKit.Async.DeferredLock = function () { - this.waiting = []; - this.locked = false; - this.id = this._nextId(); -}; - -MochiKit.Async.DeferredLock.prototype = { - __class__: MochiKit.Async.DeferredLock, - /** @id MochiKit.Async.DeferredLock.prototype.acquire */ - acquire: function () { - var d = new MochiKit.Async.Deferred(); - if (this.locked) { - this.waiting.push(d); - } else { - this.locked = true; - d.callback(this); - } - return d; - }, - /** @id MochiKit.Async.DeferredLock.prototype.release */ - release: function () { - if (!this.locked) { - throw TypeError("Tried to release an unlocked DeferredLock"); - } - this.locked = false; - if (this.waiting.length > 0) { - this.locked = true; - this.waiting.shift().callback(this); - } - }, - _nextId: MochiKit.Base.counter(), - repr: function () { - var state; - if (this.locked) { - state = 'locked, ' + this.waiting.length + ' waiting'; - } else { - state = 'unlocked'; - } - return 'DeferredLock(' + this.id + ', ' + state + ')'; - }, - toString: MochiKit.Base.forwardCall("repr") - -}; - -/** @id MochiKit.Async.DeferredList */ -MochiKit.Async.DeferredList = function (list, /* optional */fireOnOneCallback, fireOnOneErrback, consumeErrors, canceller) { - - // call parent constructor - MochiKit.Async.Deferred.apply(this, [canceller]); - - this.list = list; - var resultList = []; - this.resultList = resultList; - - this.finishedCount = 0; - this.fireOnOneCallback = fireOnOneCallback; - this.fireOnOneErrback = fireOnOneErrback; - this.consumeErrors = consumeErrors; - - var cb = MochiKit.Base.bind(this._cbDeferred, this); - for (var i = 0; i < list.length; i++) { - var d = list[i]; - resultList.push(undefined); - d.addCallback(cb, i, true); - d.addErrback(cb, i, false); - } - - if (list.length === 0 && !fireOnOneCallback) { - this.callback(this.resultList); - } - -}; - -MochiKit.Async.DeferredList.prototype = new MochiKit.Async.Deferred(); - -MochiKit.Async.DeferredList.prototype._cbDeferred = function (index, succeeded, result) { - this.resultList[index] = [succeeded, result]; - this.finishedCount += 1; - if (this.fired == -1) { - if (succeeded && this.fireOnOneCallback) { - this.callback([index, result]); - } else if (!succeeded && this.fireOnOneErrback) { - this.errback(result); - } else if (this.finishedCount == this.list.length) { - this.callback(this.resultList); - } - } - if (!succeeded && this.consumeErrors) { - result = null; - } - return result; -}; - -/** @id MochiKit.Async.gatherResults */ -MochiKit.Async.gatherResults = function (deferredList) { - var d = new MochiKit.Async.DeferredList(deferredList, false, true, false); - d.addCallback(function (results) { - var ret = []; - for (var i = 0; i < results.length; i++) { - ret.push(results[i][1]); - } - return ret; - }); - return d; -}; - -/** @id MochiKit.Async.maybeDeferred */ -MochiKit.Async.maybeDeferred = function (func) { - var self = MochiKit.Async; - var result; - try { - var r = func.apply(null, MochiKit.Base.extend([], arguments, 1)); - if (r instanceof self.Deferred) { - result = r; - } else if (r instanceof Error) { - result = self.fail(r); - } else { - result = self.succeed(r); - } - } catch (e) { - result = self.fail(e); - } - return result; -}; - - -MochiKit.Async.EXPORT = [ - "AlreadyCalledError", - "CancelledError", - "BrowserComplianceError", - "GenericError", - "XMLHttpRequestError", - "Deferred", - "succeed", - "fail", - "getXMLHttpRequest", - "doSimpleXMLHttpRequest", - "loadJSONDoc", - "wait", - "callLater", - "sendXMLHttpRequest", - "DeferredLock", - "DeferredList", - "gatherResults", - "maybeDeferred", - "doXHR" -]; - -MochiKit.Async.EXPORT_OK = [ - "evalJSONRequest" -]; - -MochiKit.Async.__new__ = function () { - var m = MochiKit.Base; - var ne = m.partial(m._newNamedError, this); - - ne("AlreadyCalledError", - /** @id MochiKit.Async.AlreadyCalledError */ - function (deferred) { - /*** - - Raised by the Deferred if callback or errback happens - after it was already fired. - - ***/ - this.deferred = deferred; - } - ); - - ne("CancelledError", - /** @id MochiKit.Async.CancelledError */ - function (deferred) { - /*** - - Raised by the Deferred cancellation mechanism. - - ***/ - this.deferred = deferred; - } - ); - - ne("BrowserComplianceError", - /** @id MochiKit.Async.BrowserComplianceError */ - function (msg) { - /*** - - Raised when the JavaScript runtime is not capable of performing - the given function. Technically, this should really never be - raised because a non-conforming JavaScript runtime probably - isn't going to support exceptions in the first place. - - ***/ - this.message = msg; - } - ); - - ne("GenericError", - /** @id MochiKit.Async.GenericError */ - function (msg) { - this.message = msg; - } - ); - - ne("XMLHttpRequestError", - /** @id MochiKit.Async.XMLHttpRequestError */ - function (req, msg) { - /*** - - Raised when an XMLHttpRequest does not complete for any reason. - - ***/ - this.req = req; - this.message = msg; - try { - // Strange but true that this can raise in some cases. - this.number = req.status; - } catch (e) { - // pass - } - } - ); - - - this.EXPORT_TAGS = { - ":common": this.EXPORT, - ":all": m.concat(this.EXPORT, this.EXPORT_OK) - }; - - m.nameFunctions(this); - -}; - -MochiKit.Async.__new__(); - -MochiKit.Base._exportSymbols(this, MochiKit.Async); diff --git a/static/MochiKit/Base.js b/static/MochiKit/Base.js deleted file mode 100644 index f3343f2..0000000 --- a/static/MochiKit/Base.js +++ /dev/null @@ -1,1489 +0,0 @@ -/*** - -MochiKit.Base 1.4.2 - -See for documentation, downloads, license, etc. - -(c) 2005 Bob Ippolito. All rights Reserved. - -***/ - -if (typeof(dojo) != 'undefined') { - dojo.provide("MochiKit.Base"); -} -if (typeof(MochiKit) == 'undefined') { - MochiKit = {}; -} -if (typeof(MochiKit.Base) == 'undefined') { - MochiKit.Base = {}; -} -if (typeof(MochiKit.__export__) == "undefined") { - MochiKit.__export__ = (MochiKit.__compat__ || - (typeof(JSAN) == 'undefined' && typeof(dojo) == 'undefined') - ); -} - -MochiKit.Base.VERSION = "1.4.2"; -MochiKit.Base.NAME = "MochiKit.Base"; -/** @id MochiKit.Base.update */ -MochiKit.Base.update = function (self, obj/*, ... */) { - if (self === null || self === undefined) { - self = {}; - } - for (var i = 1; i < arguments.length; i++) { - var o = arguments[i]; - if (typeof(o) != 'undefined' && o !== null) { - for (var k in o) { - self[k] = o[k]; - } - } - } - return self; -}; - -MochiKit.Base.update(MochiKit.Base, { - __repr__: function () { - return "[" + this.NAME + " " + this.VERSION + "]"; - }, - - toString: function () { - return this.__repr__(); - }, - - /** @id MochiKit.Base.camelize */ - camelize: function (selector) { - /* from dojo.style.toCamelCase */ - var arr = selector.split('-'); - var cc = arr[0]; - for (var i = 1; i < arr.length; i++) { - cc += arr[i].charAt(0).toUpperCase() + arr[i].substring(1); - } - return cc; - }, - - /** @id MochiKit.Base.counter */ - counter: function (n/* = 1 */) { - if (arguments.length === 0) { - n = 1; - } - return function () { - return n++; - }; - }, - - /** @id MochiKit.Base.clone */ - clone: function (obj) { - var me = arguments.callee; - if (arguments.length == 1) { - me.prototype = obj; - return new me(); - } - }, - - _deps: function(module, deps) { - if (!(module in MochiKit)) { - MochiKit[module] = {}; - } - - if (typeof(dojo) != 'undefined') { - dojo.provide('MochiKit.' + module); - } - for (var i = 0; i < deps.length; i++) { - if (typeof(dojo) != 'undefined') { - dojo.require('MochiKit.' + deps[i]); - } - if (typeof(JSAN) != 'undefined') { - JSAN.use('MochiKit.' + deps[i], []); - } - if (!(deps[i] in MochiKit)) { - throw 'MochiKit.' + module + ' depends on MochiKit.' + deps[i] + '!' - } - } - }, - - _flattenArray: function (res, lst) { - for (var i = 0; i < lst.length; i++) { - var o = lst[i]; - if (o instanceof Array) { - arguments.callee(res, o); - } else { - res.push(o); - } - } - return res; - }, - - /** @id MochiKit.Base.flattenArray */ - flattenArray: function (lst) { - return MochiKit.Base._flattenArray([], lst); - }, - - /** @id MochiKit.Base.flattenArguments */ - flattenArguments: function (lst/* ...*/) { - var res = []; - var m = MochiKit.Base; - var args = m.extend(null, arguments); - while (args.length) { - var o = args.shift(); - if (o && typeof(o) == "object" && typeof(o.length) == "number") { - for (var i = o.length - 1; i >= 0; i--) { - args.unshift(o[i]); - } - } else { - res.push(o); - } - } - return res; - }, - - /** @id MochiKit.Base.extend */ - extend: function (self, obj, /* optional */skip) { - // Extend an array with an array-like object starting - // from the skip index - if (!skip) { - skip = 0; - } - if (obj) { - // allow iterable fall-through, but skip the full isArrayLike - // check for speed, this is called often. - var l = obj.length; - if (typeof(l) != 'number' /* !isArrayLike(obj) */) { - if (typeof(MochiKit.Iter) != "undefined") { - obj = MochiKit.Iter.list(obj); - l = obj.length; - } else { - throw new TypeError("Argument not an array-like and MochiKit.Iter not present"); - } - } - if (!self) { - self = []; - } - for (var i = skip; i < l; i++) { - self.push(obj[i]); - } - } - // This mutates, but it's convenient to return because - // it's often used like a constructor when turning some - // ghetto array-like to a real array - return self; - }, - - - /** @id MochiKit.Base.updatetree */ - updatetree: function (self, obj/*, ...*/) { - if (self === null || self === undefined) { - self = {}; - } - for (var i = 1; i < arguments.length; i++) { - var o = arguments[i]; - if (typeof(o) != 'undefined' && o !== null) { - for (var k in o) { - var v = o[k]; - if (typeof(self[k]) == 'object' && typeof(v) == 'object') { - arguments.callee(self[k], v); - } else { - self[k] = v; - } - } - } - } - return self; - }, - - /** @id MochiKit.Base.setdefault */ - setdefault: function (self, obj/*, ...*/) { - if (self === null || self === undefined) { - self = {}; - } - for (var i = 1; i < arguments.length; i++) { - var o = arguments[i]; - for (var k in o) { - if (!(k in self)) { - self[k] = o[k]; - } - } - } - return self; - }, - - /** @id MochiKit.Base.keys */ - keys: function (obj) { - var rval = []; - for (var prop in obj) { - rval.push(prop); - } - return rval; - }, - - /** @id MochiKit.Base.values */ - values: function (obj) { - var rval = []; - for (var prop in obj) { - rval.push(obj[prop]); - } - return rval; - }, - - /** @id MochiKit.Base.items */ - items: function (obj) { - var rval = []; - var e; - for (var prop in obj) { - var v; - try { - v = obj[prop]; - } catch (e) { - continue; - } - rval.push([prop, v]); - } - return rval; - }, - - - _newNamedError: function (module, name, func) { - func.prototype = new MochiKit.Base.NamedError(module.NAME + "." + name); - module[name] = func; - }, - - - /** @id MochiKit.Base.operator */ - operator: { - // unary logic operators - /** @id MochiKit.Base.truth */ - truth: function (a) { return !!a; }, - /** @id MochiKit.Base.lognot */ - lognot: function (a) { return !a; }, - /** @id MochiKit.Base.identity */ - identity: function (a) { return a; }, - - // bitwise unary operators - /** @id MochiKit.Base.not */ - not: function (a) { return ~a; }, - /** @id MochiKit.Base.neg */ - neg: function (a) { return -a; }, - - // binary operators - /** @id MochiKit.Base.add */ - add: function (a, b) { return a + b; }, - /** @id MochiKit.Base.sub */ - sub: function (a, b) { return a - b; }, - /** @id MochiKit.Base.div */ - div: function (a, b) { return a / b; }, - /** @id MochiKit.Base.mod */ - mod: function (a, b) { return a % b; }, - /** @id MochiKit.Base.mul */ - mul: function (a, b) { return a * b; }, - - // bitwise binary operators - /** @id MochiKit.Base.and */ - and: function (a, b) { return a & b; }, - /** @id MochiKit.Base.or */ - or: function (a, b) { return a | b; }, - /** @id MochiKit.Base.xor */ - xor: function (a, b) { return a ^ b; }, - /** @id MochiKit.Base.lshift */ - lshift: function (a, b) { return a << b; }, - /** @id MochiKit.Base.rshift */ - rshift: function (a, b) { return a >> b; }, - /** @id MochiKit.Base.zrshift */ - zrshift: function (a, b) { return a >>> b; }, - - // near-worthless built-in comparators - /** @id MochiKit.Base.eq */ - eq: function (a, b) { return a == b; }, - /** @id MochiKit.Base.ne */ - ne: function (a, b) { return a != b; }, - /** @id MochiKit.Base.gt */ - gt: function (a, b) { return a > b; }, - /** @id MochiKit.Base.ge */ - ge: function (a, b) { return a >= b; }, - /** @id MochiKit.Base.lt */ - lt: function (a, b) { return a < b; }, - /** @id MochiKit.Base.le */ - le: function (a, b) { return a <= b; }, - - // strict built-in comparators - seq: function (a, b) { return a === b; }, - sne: function (a, b) { return a !== b; }, - - // compare comparators - /** @id MochiKit.Base.ceq */ - ceq: function (a, b) { return MochiKit.Base.compare(a, b) === 0; }, - /** @id MochiKit.Base.cne */ - cne: function (a, b) { return MochiKit.Base.compare(a, b) !== 0; }, - /** @id MochiKit.Base.cgt */ - cgt: function (a, b) { return MochiKit.Base.compare(a, b) == 1; }, - /** @id MochiKit.Base.cge */ - cge: function (a, b) { return MochiKit.Base.compare(a, b) != -1; }, - /** @id MochiKit.Base.clt */ - clt: function (a, b) { return MochiKit.Base.compare(a, b) == -1; }, - /** @id MochiKit.Base.cle */ - cle: function (a, b) { return MochiKit.Base.compare(a, b) != 1; }, - - // binary logical operators - /** @id MochiKit.Base.logand */ - logand: function (a, b) { return a && b; }, - /** @id MochiKit.Base.logor */ - logor: function (a, b) { return a || b; }, - /** @id MochiKit.Base.contains */ - contains: function (a, b) { return b in a; } - }, - - /** @id MochiKit.Base.forwardCall */ - forwardCall: function (func) { - return function () { - return this[func].apply(this, arguments); - }; - }, - - /** @id MochiKit.Base.itemgetter */ - itemgetter: function (func) { - return function (arg) { - return arg[func]; - }; - }, - - /** @id MochiKit.Base.typeMatcher */ - typeMatcher: function (/* typ */) { - var types = {}; - for (var i = 0; i < arguments.length; i++) { - var typ = arguments[i]; - types[typ] = typ; - } - return function () { - for (var i = 0; i < arguments.length; i++) { - if (!(typeof(arguments[i]) in types)) { - return false; - } - } - return true; - }; - }, - - /** @id MochiKit.Base.isNull */ - isNull: function (/* ... */) { - for (var i = 0; i < arguments.length; i++) { - if (arguments[i] !== null) { - return false; - } - } - return true; - }, - - /** @id MochiKit.Base.isUndefinedOrNull */ - isUndefinedOrNull: function (/* ... */) { - for (var i = 0; i < arguments.length; i++) { - var o = arguments[i]; - if (!(typeof(o) == 'undefined' || o === null)) { - return false; - } - } - return true; - }, - - /** @id MochiKit.Base.isEmpty */ - isEmpty: function (obj) { - return !MochiKit.Base.isNotEmpty.apply(this, arguments); - }, - - /** @id MochiKit.Base.isNotEmpty */ - isNotEmpty: function (obj) { - for (var i = 0; i < arguments.length; i++) { - var o = arguments[i]; - if (!(o && o.length)) { - return false; - } - } - return true; - }, - - /** @id MochiKit.Base.isArrayLike */ - isArrayLike: function () { - for (var i = 0; i < arguments.length; i++) { - var o = arguments[i]; - var typ = typeof(o); - if ( - (typ != 'object' && !(typ == 'function' && typeof(o.item) == 'function')) || - o === null || - typeof(o.length) != 'number' || - o.nodeType === 3 || - o.nodeType === 4 - ) { - return false; - } - } - return true; - }, - - /** @id MochiKit.Base.isDateLike */ - isDateLike: function () { - for (var i = 0; i < arguments.length; i++) { - var o = arguments[i]; - if (typeof(o) != "object" || o === null - || typeof(o.getTime) != 'function') { - return false; - } - } - return true; - }, - - - /** @id MochiKit.Base.xmap */ - xmap: function (fn/*, obj... */) { - if (fn === null) { - return MochiKit.Base.extend(null, arguments, 1); - } - var rval = []; - for (var i = 1; i < arguments.length; i++) { - rval.push(fn(arguments[i])); - } - return rval; - }, - - /** @id MochiKit.Base.map */ - map: function (fn, lst/*, lst... */) { - var m = MochiKit.Base; - var itr = MochiKit.Iter; - var isArrayLike = m.isArrayLike; - if (arguments.length <= 2) { - // allow an iterable to be passed - if (!isArrayLike(lst)) { - if (itr) { - // fast path for map(null, iterable) - lst = itr.list(lst); - if (fn === null) { - return lst; - } - } else { - throw new TypeError("Argument not an array-like and MochiKit.Iter not present"); - } - } - // fast path for map(null, lst) - if (fn === null) { - return m.extend(null, lst); - } - // disabled fast path for map(fn, lst) - /* - if (false && typeof(Array.prototype.map) == 'function') { - // Mozilla fast-path - return Array.prototype.map.call(lst, fn); - } - */ - var rval = []; - for (var i = 0; i < lst.length; i++) { - rval.push(fn(lst[i])); - } - return rval; - } else { - // default for map(null, ...) is zip(...) - if (fn === null) { - fn = Array; - } - var length = null; - for (i = 1; i < arguments.length; i++) { - // allow iterables to be passed - if (!isArrayLike(arguments[i])) { - if (itr) { - return itr.list(itr.imap.apply(null, arguments)); - } else { - throw new TypeError("Argument not an array-like and MochiKit.Iter not present"); - } - } - // find the minimum length - var l = arguments[i].length; - if (length === null || length > l) { - length = l; - } - } - rval = []; - for (i = 0; i < length; i++) { - var args = []; - for (var j = 1; j < arguments.length; j++) { - args.push(arguments[j][i]); - } - rval.push(fn.apply(this, args)); - } - return rval; - } - }, - - /** @id MochiKit.Base.xfilter */ - xfilter: function (fn/*, obj... */) { - var rval = []; - if (fn === null) { - fn = MochiKit.Base.operator.truth; - } - for (var i = 1; i < arguments.length; i++) { - var o = arguments[i]; - if (fn(o)) { - rval.push(o); - } - } - return rval; - }, - - /** @id MochiKit.Base.filter */ - filter: function (fn, lst, self) { - var rval = []; - // allow an iterable to be passed - var m = MochiKit.Base; - if (!m.isArrayLike(lst)) { - if (MochiKit.Iter) { - lst = MochiKit.Iter.list(lst); - } else { - throw new TypeError("Argument not an array-like and MochiKit.Iter not present"); - } - } - if (fn === null) { - fn = m.operator.truth; - } - if (typeof(Array.prototype.filter) == 'function') { - // Mozilla fast-path - return Array.prototype.filter.call(lst, fn, self); - } else if (typeof(self) == 'undefined' || self === null) { - for (var i = 0; i < lst.length; i++) { - var o = lst[i]; - if (fn(o)) { - rval.push(o); - } - } - } else { - for (i = 0; i < lst.length; i++) { - o = lst[i]; - if (fn.call(self, o)) { - rval.push(o); - } - } - } - return rval; - }, - - - _wrapDumbFunction: function (func) { - return function () { - // fast path! - switch (arguments.length) { - case 0: return func(); - case 1: return func(arguments[0]); - case 2: return func(arguments[0], arguments[1]); - case 3: return func(arguments[0], arguments[1], arguments[2]); - } - var args = []; - for (var i = 0; i < arguments.length; i++) { - args.push("arguments[" + i + "]"); - } - return eval("(func(" + args.join(",") + "))"); - }; - }, - - /** @id MochiKit.Base.methodcaller */ - methodcaller: function (func/*, args... */) { - var args = MochiKit.Base.extend(null, arguments, 1); - if (typeof(func) == "function") { - return function (obj) { - return func.apply(obj, args); - }; - } else { - return function (obj) { - return obj[func].apply(obj, args); - }; - } - }, - - /** @id MochiKit.Base.method */ - method: function (self, func) { - var m = MochiKit.Base; - return m.bind.apply(this, m.extend([func, self], arguments, 2)); - }, - - /** @id MochiKit.Base.compose */ - compose: function (f1, f2/*, f3, ... fN */) { - var fnlist = []; - var m = MochiKit.Base; - if (arguments.length === 0) { - throw new TypeError("compose() requires at least one argument"); - } - for (var i = 0; i < arguments.length; i++) { - var fn = arguments[i]; - if (typeof(fn) != "function") { - throw new TypeError(m.repr(fn) + " is not a function"); - } - fnlist.push(fn); - } - return function () { - var args = arguments; - for (var i = fnlist.length - 1; i >= 0; i--) { - args = [fnlist[i].apply(this, args)]; - } - return args[0]; - }; - }, - - /** @id MochiKit.Base.bind */ - bind: function (func, self/* args... */) { - if (typeof(func) == "string") { - func = self[func]; - } - var im_func = func.im_func; - var im_preargs = func.im_preargs; - var im_self = func.im_self; - var m = MochiKit.Base; - if (typeof(func) == "function" && typeof(func.apply) == "undefined") { - // this is for cases where JavaScript sucks ass and gives you a - // really dumb built-in function like alert() that doesn't have - // an apply - func = m._wrapDumbFunction(func); - } - if (typeof(im_func) != 'function') { - im_func = func; - } - if (typeof(self) != 'undefined') { - im_self = self; - } - if (typeof(im_preargs) == 'undefined') { - im_preargs = []; - } else { - im_preargs = im_preargs.slice(); - } - m.extend(im_preargs, arguments, 2); - var newfunc = function () { - var args = arguments; - var me = arguments.callee; - if (me.im_preargs.length > 0) { - args = m.concat(me.im_preargs, args); - } - var self = me.im_self; - if (!self) { - self = this; - } - return me.im_func.apply(self, args); - }; - newfunc.im_self = im_self; - newfunc.im_func = im_func; - newfunc.im_preargs = im_preargs; - return newfunc; - }, - - /** @id MochiKit.Base.bindLate */ - bindLate: function (func, self/* args... */) { - var m = MochiKit.Base; - if (typeof(func) != "string") { - return m.bind.apply(this, arguments); - } - var im_preargs = m.extend([], arguments, 2); - var newfunc = function () { - var args = arguments; - var me = arguments.callee; - if (me.im_preargs.length > 0) { - args = m.concat(me.im_preargs, args); - } - var self = me.im_self; - if (!self) { - self = this; - } - return self[me.im_func].apply(self, args); - }; - newfunc.im_self = self; - newfunc.im_func = func; - newfunc.im_preargs = im_preargs; - return newfunc; - }, - - /** @id MochiKit.Base.bindMethods */ - bindMethods: function (self) { - var bind = MochiKit.Base.bind; - for (var k in self) { - var func = self[k]; - if (typeof(func) == 'function') { - self[k] = bind(func, self); - } - } - }, - - /** @id MochiKit.Base.registerComparator */ - registerComparator: function (name, check, comparator, /* optional */ override) { - MochiKit.Base.comparatorRegistry.register(name, check, comparator, override); - }, - - _primitives: {'boolean': true, 'string': true, 'number': true}, - - /** @id MochiKit.Base.compare */ - compare: function (a, b) { - if (a == b) { - return 0; - } - var aIsNull = (typeof(a) == 'undefined' || a === null); - var bIsNull = (typeof(b) == 'undefined' || b === null); - if (aIsNull && bIsNull) { - return 0; - } else if (aIsNull) { - return -1; - } else if (bIsNull) { - return 1; - } - var m = MochiKit.Base; - // bool, number, string have meaningful comparisons - var prim = m._primitives; - if (!(typeof(a) in prim && typeof(b) in prim)) { - try { - return m.comparatorRegistry.match(a, b); - } catch (e) { - if (e != m.NotFound) { - throw e; - } - } - } - if (a < b) { - return -1; - } else if (a > b) { - return 1; - } - // These types can't be compared - var repr = m.repr; - throw new TypeError(repr(a) + " and " + repr(b) + " can not be compared"); - }, - - /** @id MochiKit.Base.compareDateLike */ - compareDateLike: function (a, b) { - return MochiKit.Base.compare(a.getTime(), b.getTime()); - }, - - /** @id MochiKit.Base.compareArrayLike */ - compareArrayLike: function (a, b) { - var compare = MochiKit.Base.compare; - var count = a.length; - var rval = 0; - if (count > b.length) { - rval = 1; - count = b.length; - } else if (count < b.length) { - rval = -1; - } - for (var i = 0; i < count; i++) { - var cmp = compare(a[i], b[i]); - if (cmp) { - return cmp; - } - } - return rval; - }, - - /** @id MochiKit.Base.registerRepr */ - registerRepr: function (name, check, wrap, /* optional */override) { - MochiKit.Base.reprRegistry.register(name, check, wrap, override); - }, - - /** @id MochiKit.Base.repr */ - repr: function (o) { - if (typeof(o) == "undefined") { - return "undefined"; - } else if (o === null) { - return "null"; - } - try { - if (typeof(o.__repr__) == 'function') { - return o.__repr__(); - } else if (typeof(o.repr) == 'function' && o.repr != arguments.callee) { - return o.repr(); - } - return MochiKit.Base.reprRegistry.match(o); - } catch (e) { - if (typeof(o.NAME) == 'string' && ( - o.toString == Function.prototype.toString || - o.toString == Object.prototype.toString - )) { - return o.NAME; - } - } - try { - var ostring = (o + ""); - } catch (e) { - return "[" + typeof(o) + "]"; - } - if (typeof(o) == "function") { - ostring = ostring.replace(/^\s+/, "").replace(/\s+/g, " "); - ostring = ostring.replace(/,(\S)/, ", $1"); - var idx = ostring.indexOf("{"); - if (idx != -1) { - ostring = ostring.substr(0, idx) + "{...}"; - } - } - return ostring; - }, - - /** @id MochiKit.Base.reprArrayLike */ - reprArrayLike: function (o) { - var m = MochiKit.Base; - return "[" + m.map(m.repr, o).join(", ") + "]"; - }, - - /** @id MochiKit.Base.reprString */ - reprString: function (o) { - return ('"' + o.replace(/(["\\])/g, '\\$1') + '"' - ).replace(/[\f]/g, "\\f" - ).replace(/[\b]/g, "\\b" - ).replace(/[\n]/g, "\\n" - ).replace(/[\t]/g, "\\t" - ).replace(/[\v]/g, "\\v" - ).replace(/[\r]/g, "\\r"); - }, - - /** @id MochiKit.Base.reprNumber */ - reprNumber: function (o) { - return o + ""; - }, - - /** @id MochiKit.Base.registerJSON */ - registerJSON: function (name, check, wrap, /* optional */override) { - MochiKit.Base.jsonRegistry.register(name, check, wrap, override); - }, - - - /** @id MochiKit.Base.evalJSON */ - evalJSON: function () { - return eval("(" + MochiKit.Base._filterJSON(arguments[0]) + ")"); - }, - - _filterJSON: function (s) { - var m = s.match(/^\s*\/\*(.*)\*\/\s*$/); - if (m) { - return m[1]; - } - return s; - }, - - /** @id MochiKit.Base.serializeJSON */ - serializeJSON: function (o) { - var objtype = typeof(o); - if (objtype == "number" || objtype == "boolean") { - return o + ""; - } else if (o === null) { - return "null"; - } else if (objtype == "string") { - var res = ""; - for (var i = 0; i < o.length; i++) { - var c = o.charAt(i); - if (c == '\"') { - res += '\\"'; - } else if (c == '\\') { - res += '\\\\'; - } else if (c == '\b') { - res += '\\b'; - } else if (c == '\f') { - res += '\\f'; - } else if (c == '\n') { - res += '\\n'; - } else if (c == '\r') { - res += '\\r'; - } else if (c == '\t') { - res += '\\t'; - } else if (o.charCodeAt(i) <= 0x1F) { - var hex = o.charCodeAt(i).toString(16); - if (hex.length < 2) { - hex = '0' + hex; - } - res += '\\u00' + hex.toUpperCase(); - } else { - res += c; - } - } - return '"' + res + '"'; - } - // recurse - var me = arguments.callee; - // short-circuit for objects that support "json" serialization - // if they return "self" then just pass-through... - var newObj; - if (typeof(o.__json__) == "function") { - newObj = o.__json__(); - if (o !== newObj) { - return me(newObj); - } - } - if (typeof(o.json) == "function") { - newObj = o.json(); - if (o !== newObj) { - return me(newObj); - } - } - // array - if (objtype != "function" && typeof(o.length) == "number") { - var res = []; - for (var i = 0; i < o.length; i++) { - var val = me(o[i]); - if (typeof(val) != "string") { - // skip non-serializable values - continue; - } - res.push(val); - } - return "[" + res.join(", ") + "]"; - } - // look in the registry - var m = MochiKit.Base; - try { - newObj = m.jsonRegistry.match(o); - if (o !== newObj) { - return me(newObj); - } - } catch (e) { - if (e != m.NotFound) { - // something really bad happened - throw e; - } - } - // undefined is outside of the spec - if (objtype == "undefined") { - throw new TypeError("undefined can not be serialized as JSON"); - } - // it's a function with no adapter, bad - if (objtype == "function") { - return null; - } - // generic object code path - res = []; - for (var k in o) { - var useKey; - if (typeof(k) == "number") { - useKey = '"' + k + '"'; - } else if (typeof(k) == "string") { - useKey = me(k); - } else { - // skip non-string or number keys - continue; - } - val = me(o[k]); - if (typeof(val) != "string") { - // skip non-serializable values - continue; - } - res.push(useKey + ":" + val); - } - return "{" + res.join(", ") + "}"; - }, - - - /** @id MochiKit.Base.objEqual */ - objEqual: function (a, b) { - return (MochiKit.Base.compare(a, b) === 0); - }, - - /** @id MochiKit.Base.arrayEqual */ - arrayEqual: function (self, arr) { - if (self.length != arr.length) { - return false; - } - return (MochiKit.Base.compare(self, arr) === 0); - }, - - /** @id MochiKit.Base.concat */ - concat: function (/* lst... */) { - var rval = []; - var extend = MochiKit.Base.extend; - for (var i = 0; i < arguments.length; i++) { - extend(rval, arguments[i]); - } - return rval; - }, - - /** @id MochiKit.Base.keyComparator */ - keyComparator: function (key/* ... */) { - // fast-path for single key comparisons - var m = MochiKit.Base; - var compare = m.compare; - if (arguments.length == 1) { - return function (a, b) { - return compare(a[key], b[key]); - }; - } - var compareKeys = m.extend(null, arguments); - return function (a, b) { - var rval = 0; - // keep comparing until something is inequal or we run out of - // keys to compare - for (var i = 0; (rval === 0) && (i < compareKeys.length); i++) { - var key = compareKeys[i]; - rval = compare(a[key], b[key]); - } - return rval; - }; - }, - - /** @id MochiKit.Base.reverseKeyComparator */ - reverseKeyComparator: function (key) { - var comparator = MochiKit.Base.keyComparator.apply(this, arguments); - return function (a, b) { - return comparator(b, a); - }; - }, - - /** @id MochiKit.Base.partial */ - partial: function (func) { - var m = MochiKit.Base; - return m.bind.apply(this, m.extend([func, undefined], arguments, 1)); - }, - - /** @id MochiKit.Base.listMinMax */ - listMinMax: function (which, lst) { - if (lst.length === 0) { - return null; - } - var cur = lst[0]; - var compare = MochiKit.Base.compare; - for (var i = 1; i < lst.length; i++) { - var o = lst[i]; - if (compare(o, cur) == which) { - cur = o; - } - } - return cur; - }, - - /** @id MochiKit.Base.objMax */ - objMax: function (/* obj... */) { - return MochiKit.Base.listMinMax(1, arguments); - }, - - /** @id MochiKit.Base.objMin */ - objMin: function (/* obj... */) { - return MochiKit.Base.listMinMax(-1, arguments); - }, - - /** @id MochiKit.Base.findIdentical */ - findIdentical: function (lst, value, start/* = 0 */, /* optional */end) { - if (typeof(end) == "undefined" || end === null) { - end = lst.length; - } - if (typeof(start) == "undefined" || start === null) { - start = 0; - } - for (var i = start; i < end; i++) { - if (lst[i] === value) { - return i; - } - } - return -1; - }, - - /** @id MochiKit.Base.mean */ - mean: function(/* lst... */) { - /* http://www.nist.gov/dads/HTML/mean.html */ - var sum = 0; - - var m = MochiKit.Base; - var args = m.extend(null, arguments); - var count = args.length; - - while (args.length) { - var o = args.shift(); - if (o && typeof(o) == "object" && typeof(o.length) == "number") { - count += o.length - 1; - for (var i = o.length - 1; i >= 0; i--) { - sum += o[i]; - } - } else { - sum += o; - } - } - - if (count <= 0) { - throw new TypeError('mean() requires at least one argument'); - } - - return sum/count; - }, - - /** @id MochiKit.Base.median */ - median: function(/* lst... */) { - /* http://www.nist.gov/dads/HTML/median.html */ - var data = MochiKit.Base.flattenArguments(arguments); - if (data.length === 0) { - throw new TypeError('median() requires at least one argument'); - } - data.sort(compare); - if (data.length % 2 == 0) { - var upper = data.length / 2; - return (data[upper] + data[upper - 1]) / 2; - } else { - return data[(data.length - 1) / 2]; - } - }, - - /** @id MochiKit.Base.findValue */ - findValue: function (lst, value, start/* = 0 */, /* optional */end) { - if (typeof(end) == "undefined" || end === null) { - end = lst.length; - } - if (typeof(start) == "undefined" || start === null) { - start = 0; - } - var cmp = MochiKit.Base.compare; - for (var i = start; i < end; i++) { - if (cmp(lst[i], value) === 0) { - return i; - } - } - return -1; - }, - - /** @id MochiKit.Base.nodeWalk */ - nodeWalk: function (node, visitor) { - var nodes = [node]; - var extend = MochiKit.Base.extend; - while (nodes.length) { - var res = visitor(nodes.shift()); - if (res) { - extend(nodes, res); - } - } - }, - - - /** @id MochiKit.Base.nameFunctions */ - nameFunctions: function (namespace) { - var base = namespace.NAME; - if (typeof(base) == 'undefined') { - base = ''; - } else { - base = base + '.'; - } - for (var name in namespace) { - var o = namespace[name]; - if (typeof(o) == 'function' && typeof(o.NAME) == 'undefined') { - try { - o.NAME = base + name; - } catch (e) { - // pass - } - } - } - }, - - - /** @id MochiKit.Base.queryString */ - queryString: function (names, values) { - // check to see if names is a string or a DOM element, and if - // MochiKit.DOM is available. If so, drop it like it's a form - // Ugliest conditional in MochiKit? Probably! - if (typeof(MochiKit.DOM) != "undefined" && arguments.length == 1 - && (typeof(names) == "string" || ( - typeof(names.nodeType) != "undefined" && names.nodeType > 0 - )) - ) { - var kv = MochiKit.DOM.formContents(names); - names = kv[0]; - values = kv[1]; - } else if (arguments.length == 1) { - // Allow the return value of formContents to be passed directly - if (typeof(names.length) == "number" && names.length == 2) { - return arguments.callee(names[0], names[1]); - } - var o = names; - names = []; - values = []; - for (var k in o) { - var v = o[k]; - if (typeof(v) == "function") { - continue; - } else if (MochiKit.Base.isArrayLike(v)){ - for (var i = 0; i < v.length; i++) { - names.push(k); - values.push(v[i]); - } - } else { - names.push(k); - values.push(v); - } - } - } - var rval = []; - var len = Math.min(names.length, values.length); - var urlEncode = MochiKit.Base.urlEncode; - for (var i = 0; i < len; i++) { - v = values[i]; - if (typeof(v) != 'undefined' && v !== null) { - rval.push(urlEncode(names[i]) + "=" + urlEncode(v)); - } - } - return rval.join("&"); - }, - - - /** @id MochiKit.Base.parseQueryString */ - parseQueryString: function (encodedString, useArrays) { - // strip a leading '?' from the encoded string - var qstr = (encodedString.charAt(0) == "?") - ? encodedString.substring(1) - : encodedString; - var pairs = qstr.replace(/\+/g, "%20").split(/\&\;|\&\#38\;|\&|\&/); - var o = {}; - var decode; - if (typeof(decodeURIComponent) != "undefined") { - decode = decodeURIComponent; - } else { - decode = unescape; - } - if (useArrays) { - for (var i = 0; i < pairs.length; i++) { - var pair = pairs[i].split("="); - var name = decode(pair.shift()); - if (!name) { - continue; - } - var arr = o[name]; - if (!(arr instanceof Array)) { - arr = []; - o[name] = arr; - } - arr.push(decode(pair.join("="))); - } - } else { - for (i = 0; i < pairs.length; i++) { - pair = pairs[i].split("="); - var name = pair.shift(); - if (!name) { - continue; - } - o[decode(name)] = decode(pair.join("=")); - } - } - return o; - } -}); - -/** @id MochiKit.Base.AdapterRegistry */ -MochiKit.Base.AdapterRegistry = function () { - this.pairs = []; -}; - -MochiKit.Base.AdapterRegistry.prototype = { - /** @id MochiKit.Base.AdapterRegistry.prototype.register */ - register: function (name, check, wrap, /* optional */ override) { - if (override) { - this.pairs.unshift([name, check, wrap]); - } else { - this.pairs.push([name, check, wrap]); - } - }, - - /** @id MochiKit.Base.AdapterRegistry.prototype.match */ - match: function (/* ... */) { - for (var i = 0; i < this.pairs.length; i++) { - var pair = this.pairs[i]; - if (pair[1].apply(this, arguments)) { - return pair[2].apply(this, arguments); - } - } - throw MochiKit.Base.NotFound; - }, - - /** @id MochiKit.Base.AdapterRegistry.prototype.unregister */ - unregister: function (name) { - for (var i = 0; i < this.pairs.length; i++) { - var pair = this.pairs[i]; - if (pair[0] == name) { - this.pairs.splice(i, 1); - return true; - } - } - return false; - } -}; - - -MochiKit.Base.EXPORT = [ - "flattenArray", - "noop", - "camelize", - "counter", - "clone", - "extend", - "update", - "updatetree", - "setdefault", - "keys", - "values", - "items", - "NamedError", - "operator", - "forwardCall", - "itemgetter", - "typeMatcher", - "isCallable", - "isUndefined", - "isUndefinedOrNull", - "isNull", - "isEmpty", - "isNotEmpty", - "isArrayLike", - "isDateLike", - "xmap", - "map", - "xfilter", - "filter", - "methodcaller", - "compose", - "bind", - "bindLate", - "bindMethods", - "NotFound", - "AdapterRegistry", - "registerComparator", - "compare", - "registerRepr", - "repr", - "objEqual", - "arrayEqual", - "concat", - "keyComparator", - "reverseKeyComparator", - "partial", - "merge", - "listMinMax", - "listMax", - "listMin", - "objMax", - "objMin", - "nodeWalk", - "zip", - "urlEncode", - "queryString", - "serializeJSON", - "registerJSON", - "evalJSON", - "parseQueryString", - "findValue", - "findIdentical", - "flattenArguments", - "method", - "average", - "mean", - "median" -]; - -MochiKit.Base.EXPORT_OK = [ - "nameFunctions", - "comparatorRegistry", - "reprRegistry", - "jsonRegistry", - "compareDateLike", - "compareArrayLike", - "reprArrayLike", - "reprString", - "reprNumber" -]; - -MochiKit.Base._exportSymbols = function (globals, module) { - if (!MochiKit.__export__) { - return; - } - var all = module.EXPORT_TAGS[":all"]; - for (var i = 0; i < all.length; i++) { - globals[all[i]] = module[all[i]]; - } -}; - -MochiKit.Base.__new__ = function () { - // A singleton raised when no suitable adapter is found - var m = this; - - // convenience - /** @id MochiKit.Base.noop */ - m.noop = m.operator.identity; - - // Backwards compat - m.forward = m.forwardCall; - m.find = m.findValue; - - if (typeof(encodeURIComponent) != "undefined") { - /** @id MochiKit.Base.urlEncode */ - m.urlEncode = function (unencoded) { - return encodeURIComponent(unencoded).replace(/\'/g, '%27'); - }; - } else { - m.urlEncode = function (unencoded) { - return escape(unencoded - ).replace(/\+/g, '%2B' - ).replace(/\"/g,'%22' - ).rval.replace(/\'/g, '%27'); - }; - } - - /** @id MochiKit.Base.NamedError */ - m.NamedError = function (name) { - this.message = name; - this.name = name; - }; - m.NamedError.prototype = new Error(); - m.update(m.NamedError.prototype, { - repr: function () { - if (this.message && this.message != this.name) { - return this.name + "(" + m.repr(this.message) + ")"; - } else { - return this.name + "()"; - } - }, - toString: m.forwardCall("repr") - }); - - /** @id MochiKit.Base.NotFound */ - m.NotFound = new m.NamedError("MochiKit.Base.NotFound"); - - - /** @id MochiKit.Base.listMax */ - m.listMax = m.partial(m.listMinMax, 1); - /** @id MochiKit.Base.listMin */ - m.listMin = m.partial(m.listMinMax, -1); - - /** @id MochiKit.Base.isCallable */ - m.isCallable = m.typeMatcher('function'); - /** @id MochiKit.Base.isUndefined */ - m.isUndefined = m.typeMatcher('undefined'); - - /** @id MochiKit.Base.merge */ - m.merge = m.partial(m.update, null); - /** @id MochiKit.Base.zip */ - m.zip = m.partial(m.map, null); - - /** @id MochiKit.Base.average */ - m.average = m.mean; - - /** @id MochiKit.Base.comparatorRegistry */ - m.comparatorRegistry = new m.AdapterRegistry(); - m.registerComparator("dateLike", m.isDateLike, m.compareDateLike); - m.registerComparator("arrayLike", m.isArrayLike, m.compareArrayLike); - - /** @id MochiKit.Base.reprRegistry */ - m.reprRegistry = new m.AdapterRegistry(); - m.registerRepr("arrayLike", m.isArrayLike, m.reprArrayLike); - m.registerRepr("string", m.typeMatcher("string"), m.reprString); - m.registerRepr("numbers", m.typeMatcher("number", "boolean"), m.reprNumber); - - /** @id MochiKit.Base.jsonRegistry */ - m.jsonRegistry = new m.AdapterRegistry(); - - var all = m.concat(m.EXPORT, m.EXPORT_OK); - m.EXPORT_TAGS = { - ":common": m.concat(m.EXPORT_OK), - ":all": all - }; - - m.nameFunctions(this); - -}; - -MochiKit.Base.__new__(); - -// -// XXX: Internet Explorer blows -// -if (MochiKit.__export__) { - compare = MochiKit.Base.compare; - compose = MochiKit.Base.compose; - serializeJSON = MochiKit.Base.serializeJSON; - mean = MochiKit.Base.mean; - median = MochiKit.Base.median; -} - -MochiKit.Base._exportSymbols(this, MochiKit.Base); diff --git a/static/MochiKit/Color.js b/static/MochiKit/Color.js deleted file mode 100644 index a0d5bd8..0000000 --- a/static/MochiKit/Color.js +++ /dev/null @@ -1,863 +0,0 @@ -/*** - -MochiKit.Color 1.4.2 - -See for documentation, downloads, license, etc. - -(c) 2005 Bob Ippolito and others. All rights Reserved. - -***/ - -MochiKit.Base._deps('Color', ['Base', 'DOM', 'Style']); - -MochiKit.Color.NAME = "MochiKit.Color"; -MochiKit.Color.VERSION = "1.4.2"; - -MochiKit.Color.__repr__ = function () { - return "[" + this.NAME + " " + this.VERSION + "]"; -}; - -MochiKit.Color.toString = function () { - return this.__repr__(); -}; - - -/** @id MochiKit.Color.Color */ -MochiKit.Color.Color = function (red, green, blue, alpha) { - if (typeof(alpha) == 'undefined' || alpha === null) { - alpha = 1.0; - } - this.rgb = { - r: red, - g: green, - b: blue, - a: alpha - }; -}; - - -// Prototype methods - -MochiKit.Color.Color.prototype = { - - __class__: MochiKit.Color.Color, - - /** @id MochiKit.Color.Color.prototype.colorWithAlpha */ - colorWithAlpha: function (alpha) { - var rgb = this.rgb; - var m = MochiKit.Color; - return m.Color.fromRGB(rgb.r, rgb.g, rgb.b, alpha); - }, - - /** @id MochiKit.Color.Color.prototype.colorWithHue */ - colorWithHue: function (hue) { - // get an HSL model, and set the new hue... - var hsl = this.asHSL(); - hsl.h = hue; - var m = MochiKit.Color; - // convert back to RGB... - return m.Color.fromHSL(hsl); - }, - - /** @id MochiKit.Color.Color.prototype.colorWithSaturation */ - colorWithSaturation: function (saturation) { - // get an HSL model, and set the new hue... - var hsl = this.asHSL(); - hsl.s = saturation; - var m = MochiKit.Color; - // convert back to RGB... - return m.Color.fromHSL(hsl); - }, - - /** @id MochiKit.Color.Color.prototype.colorWithLightness */ - colorWithLightness: function (lightness) { - // get an HSL model, and set the new hue... - var hsl = this.asHSL(); - hsl.l = lightness; - var m = MochiKit.Color; - // convert back to RGB... - return m.Color.fromHSL(hsl); - }, - - /** @id MochiKit.Color.Color.prototype.darkerColorWithLevel */ - darkerColorWithLevel: function (level) { - var hsl = this.asHSL(); - hsl.l = Math.max(hsl.l - level, 0); - var m = MochiKit.Color; - return m.Color.fromHSL(hsl); - }, - - /** @id MochiKit.Color.Color.prototype.lighterColorWithLevel */ - lighterColorWithLevel: function (level) { - var hsl = this.asHSL(); - hsl.l = Math.min(hsl.l + level, 1); - var m = MochiKit.Color; - return m.Color.fromHSL(hsl); - }, - - /** @id MochiKit.Color.Color.prototype.blendedColor */ - blendedColor: function (other, /* optional */ fraction) { - if (typeof(fraction) == 'undefined' || fraction === null) { - fraction = 0.5; - } - var sf = 1.0 - fraction; - var s = this.rgb; - var d = other.rgb; - var df = fraction; - return MochiKit.Color.Color.fromRGB( - (s.r * sf) + (d.r * df), - (s.g * sf) + (d.g * df), - (s.b * sf) + (d.b * df), - (s.a * sf) + (d.a * df) - ); - }, - - /** @id MochiKit.Color.Color.prototype.compareRGB */ - compareRGB: function (other) { - var a = this.asRGB(); - var b = other.asRGB(); - return MochiKit.Base.compare( - [a.r, a.g, a.b, a.a], - [b.r, b.g, b.b, b.a] - ); - }, - - /** @id MochiKit.Color.Color.prototype.isLight */ - isLight: function () { - return this.asHSL().b > 0.5; - }, - - /** @id MochiKit.Color.Color.prototype.isDark */ - isDark: function () { - return (!this.isLight()); - }, - - /** @id MochiKit.Color.Color.prototype.toHSLString */ - toHSLString: function () { - var c = this.asHSL(); - var ccc = MochiKit.Color.clampColorComponent; - var rval = this._hslString; - if (!rval) { - var mid = ( - ccc(c.h, 360).toFixed(0) - + "," + ccc(c.s, 100).toPrecision(4) + "%" - + "," + ccc(c.l, 100).toPrecision(4) + "%" - ); - var a = c.a; - if (a >= 1) { - a = 1; - rval = "hsl(" + mid + ")"; - } else { - if (a <= 0) { - a = 0; - } - rval = "hsla(" + mid + "," + a + ")"; - } - this._hslString = rval; - } - return rval; - }, - - /** @id MochiKit.Color.Color.prototype.toRGBString */ - toRGBString: function () { - var c = this.rgb; - var ccc = MochiKit.Color.clampColorComponent; - var rval = this._rgbString; - if (!rval) { - var mid = ( - ccc(c.r, 255).toFixed(0) - + "," + ccc(c.g, 255).toFixed(0) - + "," + ccc(c.b, 255).toFixed(0) - ); - if (c.a != 1) { - rval = "rgba(" + mid + "," + c.a + ")"; - } else { - rval = "rgb(" + mid + ")"; - } - this._rgbString = rval; - } - return rval; - }, - - /** @id MochiKit.Color.Color.prototype.asRGB */ - asRGB: function () { - return MochiKit.Base.clone(this.rgb); - }, - - /** @id MochiKit.Color.Color.prototype.toHexString */ - toHexString: function () { - var m = MochiKit.Color; - var c = this.rgb; - var ccc = MochiKit.Color.clampColorComponent; - var rval = this._hexString; - if (!rval) { - rval = ("#" + - m.toColorPart(ccc(c.r, 255)) + - m.toColorPart(ccc(c.g, 255)) + - m.toColorPart(ccc(c.b, 255)) - ); - this._hexString = rval; - } - return rval; - }, - - /** @id MochiKit.Color.Color.prototype.asHSV */ - asHSV: function () { - var hsv = this.hsv; - var c = this.rgb; - if (typeof(hsv) == 'undefined' || hsv === null) { - hsv = MochiKit.Color.rgbToHSV(this.rgb); - this.hsv = hsv; - } - return MochiKit.Base.clone(hsv); - }, - - /** @id MochiKit.Color.Color.prototype.asHSL */ - asHSL: function () { - var hsl = this.hsl; - var c = this.rgb; - if (typeof(hsl) == 'undefined' || hsl === null) { - hsl = MochiKit.Color.rgbToHSL(this.rgb); - this.hsl = hsl; - } - return MochiKit.Base.clone(hsl); - }, - - /** @id MochiKit.Color.Color.prototype.toString */ - toString: function () { - return this.toRGBString(); - }, - - /** @id MochiKit.Color.Color.prototype.repr */ - repr: function () { - var c = this.rgb; - var col = [c.r, c.g, c.b, c.a]; - return this.__class__.NAME + "(" + col.join(", ") + ")"; - } - -}; - -// Constructor methods - -MochiKit.Base.update(MochiKit.Color.Color, { - /** @id MochiKit.Color.Color.fromRGB */ - fromRGB: function (red, green, blue, alpha) { - // designated initializer - var Color = MochiKit.Color.Color; - if (arguments.length == 1) { - var rgb = red; - red = rgb.r; - green = rgb.g; - blue = rgb.b; - if (typeof(rgb.a) == 'undefined') { - alpha = undefined; - } else { - alpha = rgb.a; - } - } - return new Color(red, green, blue, alpha); - }, - - /** @id MochiKit.Color.Color.fromHSL */ - fromHSL: function (hue, saturation, lightness, alpha) { - var m = MochiKit.Color; - return m.Color.fromRGB(m.hslToRGB.apply(m, arguments)); - }, - - /** @id MochiKit.Color.Color.fromHSV */ - fromHSV: function (hue, saturation, value, alpha) { - var m = MochiKit.Color; - return m.Color.fromRGB(m.hsvToRGB.apply(m, arguments)); - }, - - /** @id MochiKit.Color.Color.fromName */ - fromName: function (name) { - var Color = MochiKit.Color.Color; - // Opera 9 seems to "quote" named colors(?!) - if (name.charAt(0) == '"') { - name = name.substr(1, name.length - 2); - } - var htmlColor = Color._namedColors[name.toLowerCase()]; - if (typeof(htmlColor) == 'string') { - return Color.fromHexString(htmlColor); - } else if (name == "transparent") { - return Color.transparentColor(); - } - return null; - }, - - /** @id MochiKit.Color.Color.fromString */ - fromString: function (colorString) { - var self = MochiKit.Color.Color; - var three = colorString.substr(0, 3); - if (three == "rgb") { - return self.fromRGBString(colorString); - } else if (three == "hsl") { - return self.fromHSLString(colorString); - } else if (colorString.charAt(0) == "#") { - return self.fromHexString(colorString); - } - return self.fromName(colorString); - }, - - - /** @id MochiKit.Color.Color.fromHexString */ - fromHexString: function (hexCode) { - if (hexCode.charAt(0) == '#') { - hexCode = hexCode.substring(1); - } - var components = []; - var i, hex; - if (hexCode.length == 3) { - for (i = 0; i < 3; i++) { - hex = hexCode.substr(i, 1); - components.push(parseInt(hex + hex, 16) / 255.0); - } - } else { - for (i = 0; i < 6; i += 2) { - hex = hexCode.substr(i, 2); - components.push(parseInt(hex, 16) / 255.0); - } - } - var Color = MochiKit.Color.Color; - return Color.fromRGB.apply(Color, components); - }, - - - _fromColorString: function (pre, method, scales, colorCode) { - // parses either HSL or RGB - if (colorCode.indexOf(pre) === 0) { - colorCode = colorCode.substring(colorCode.indexOf("(", 3) + 1, colorCode.length - 1); - } - var colorChunks = colorCode.split(/\s*,\s*/); - var colorFloats = []; - for (var i = 0; i < colorChunks.length; i++) { - var c = colorChunks[i]; - var val; - var three = c.substring(c.length - 3); - if (c.charAt(c.length - 1) == '%') { - val = 0.01 * parseFloat(c.substring(0, c.length - 1)); - } else if (three == "deg") { - val = parseFloat(c) / 360.0; - } else if (three == "rad") { - val = parseFloat(c) / (Math.PI * 2); - } else { - val = scales[i] * parseFloat(c); - } - colorFloats.push(val); - } - return this[method].apply(this, colorFloats); - }, - - /** @id MochiKit.Color.Color.fromComputedStyle */ - fromComputedStyle: function (elem, style) { - var d = MochiKit.DOM; - var cls = MochiKit.Color.Color; - for (elem = d.getElement(elem); elem; elem = elem.parentNode) { - var actualColor = MochiKit.Style.getStyle.apply(d, arguments); - if (!actualColor) { - continue; - } - var color = cls.fromString(actualColor); - if (!color) { - break; - } - if (color.asRGB().a > 0) { - return color; - } - } - return null; - }, - - /** @id MochiKit.Color.Color.fromBackground */ - fromBackground: function (elem) { - var cls = MochiKit.Color.Color; - return cls.fromComputedStyle( - elem, "backgroundColor", "background-color") || cls.whiteColor(); - }, - - /** @id MochiKit.Color.Color.fromText */ - fromText: function (elem) { - var cls = MochiKit.Color.Color; - return cls.fromComputedStyle( - elem, "color", "color") || cls.blackColor(); - }, - - /** @id MochiKit.Color.Color.namedColors */ - namedColors: function () { - return MochiKit.Base.clone(MochiKit.Color.Color._namedColors); - } -}); - - -// Module level functions - -MochiKit.Base.update(MochiKit.Color, { - /** @id MochiKit.Color.clampColorComponent */ - clampColorComponent: function (v, scale) { - v *= scale; - if (v < 0) { - return 0; - } else if (v > scale) { - return scale; - } else { - return v; - } - }, - - _hslValue: function (n1, n2, hue) { - if (hue > 6.0) { - hue -= 6.0; - } else if (hue < 0.0) { - hue += 6.0; - } - var val; - if (hue < 1.0) { - val = n1 + (n2 - n1) * hue; - } else if (hue < 3.0) { - val = n2; - } else if (hue < 4.0) { - val = n1 + (n2 - n1) * (4.0 - hue); - } else { - val = n1; - } - return val; - }, - - /** @id MochiKit.Color.hsvToRGB */ - hsvToRGB: function (hue, saturation, value, alpha) { - if (arguments.length == 1) { - var hsv = hue; - hue = hsv.h; - saturation = hsv.s; - value = hsv.v; - alpha = hsv.a; - } - var red; - var green; - var blue; - if (saturation === 0) { - red = value; - green = value; - blue = value; - } else { - var i = Math.floor(hue * 6); - var f = (hue * 6) - i; - var p = value * (1 - saturation); - var q = value * (1 - (saturation * f)); - var t = value * (1 - (saturation * (1 - f))); - switch (i) { - case 1: red = q; green = value; blue = p; break; - case 2: red = p; green = value; blue = t; break; - case 3: red = p; green = q; blue = value; break; - case 4: red = t; green = p; blue = value; break; - case 5: red = value; green = p; blue = q; break; - case 6: // fall through - case 0: red = value; green = t; blue = p; break; - } - } - return { - r: red, - g: green, - b: blue, - a: alpha - }; - }, - - /** @id MochiKit.Color.hslToRGB */ - hslToRGB: function (hue, saturation, lightness, alpha) { - if (arguments.length == 1) { - var hsl = hue; - hue = hsl.h; - saturation = hsl.s; - lightness = hsl.l; - alpha = hsl.a; - } - var red; - var green; - var blue; - if (saturation === 0) { - red = lightness; - green = lightness; - blue = lightness; - } else { - var m2; - if (lightness <= 0.5) { - m2 = lightness * (1.0 + saturation); - } else { - m2 = lightness + saturation - (lightness * saturation); - } - var m1 = (2.0 * lightness) - m2; - var f = MochiKit.Color._hslValue; - var h6 = hue * 6.0; - red = f(m1, m2, h6 + 2); - green = f(m1, m2, h6); - blue = f(m1, m2, h6 - 2); - } - return { - r: red, - g: green, - b: blue, - a: alpha - }; - }, - - /** @id MochiKit.Color.rgbToHSV */ - rgbToHSV: function (red, green, blue, alpha) { - if (arguments.length == 1) { - var rgb = red; - red = rgb.r; - green = rgb.g; - blue = rgb.b; - alpha = rgb.a; - } - var max = Math.max(Math.max(red, green), blue); - var min = Math.min(Math.min(red, green), blue); - var hue; - var saturation; - var value = max; - if (min == max) { - hue = 0; - saturation = 0; - } else { - var delta = (max - min); - saturation = delta / max; - - if (red == max) { - hue = (green - blue) / delta; - } else if (green == max) { - hue = 2 + ((blue - red) / delta); - } else { - hue = 4 + ((red - green) / delta); - } - hue /= 6; - if (hue < 0) { - hue += 1; - } - if (hue > 1) { - hue -= 1; - } - } - return { - h: hue, - s: saturation, - v: value, - a: alpha - }; - }, - - /** @id MochiKit.Color.rgbToHSL */ - rgbToHSL: function (red, green, blue, alpha) { - if (arguments.length == 1) { - var rgb = red; - red = rgb.r; - green = rgb.g; - blue = rgb.b; - alpha = rgb.a; - } - var max = Math.max(red, Math.max(green, blue)); - var min = Math.min(red, Math.min(green, blue)); - var hue; - var saturation; - var lightness = (max + min) / 2.0; - var delta = max - min; - if (delta === 0) { - hue = 0; - saturation = 0; - } else { - if (lightness <= 0.5) { - saturation = delta / (max + min); - } else { - saturation = delta / (2 - max - min); - } - if (red == max) { - hue = (green - blue) / delta; - } else if (green == max) { - hue = 2 + ((blue - red) / delta); - } else { - hue = 4 + ((red - green) / delta); - } - hue /= 6; - if (hue < 0) { - hue += 1; - } - if (hue > 1) { - hue -= 1; - } - - } - return { - h: hue, - s: saturation, - l: lightness, - a: alpha - }; - }, - - /** @id MochiKit.Color.toColorPart */ - toColorPart: function (num) { - num = Math.round(num); - var digits = num.toString(16); - if (num < 16) { - return '0' + digits; - } - return digits; - }, - - __new__: function () { - var m = MochiKit.Base; - /** @id MochiKit.Color.fromRGBString */ - this.Color.fromRGBString = m.bind( - this.Color._fromColorString, this.Color, "rgb", "fromRGB", - [1.0/255.0, 1.0/255.0, 1.0/255.0, 1] - ); - /** @id MochiKit.Color.fromHSLString */ - this.Color.fromHSLString = m.bind( - this.Color._fromColorString, this.Color, "hsl", "fromHSL", - [1.0/360.0, 0.01, 0.01, 1] - ); - - var third = 1.0 / 3.0; - /** @id MochiKit.Color.colors */ - var colors = { - // NSColor colors plus transparent - /** @id MochiKit.Color.blackColor */ - black: [0, 0, 0], - /** @id MochiKit.Color.blueColor */ - blue: [0, 0, 1], - /** @id MochiKit.Color.brownColor */ - brown: [0.6, 0.4, 0.2], - /** @id MochiKit.Color.cyanColor */ - cyan: [0, 1, 1], - /** @id MochiKit.Color.darkGrayColor */ - darkGray: [third, third, third], - /** @id MochiKit.Color.grayColor */ - gray: [0.5, 0.5, 0.5], - /** @id MochiKit.Color.greenColor */ - green: [0, 1, 0], - /** @id MochiKit.Color.lightGrayColor */ - lightGray: [2 * third, 2 * third, 2 * third], - /** @id MochiKit.Color.magentaColor */ - magenta: [1, 0, 1], - /** @id MochiKit.Color.orangeColor */ - orange: [1, 0.5, 0], - /** @id MochiKit.Color.purpleColor */ - purple: [0.5, 0, 0.5], - /** @id MochiKit.Color.redColor */ - red: [1, 0, 0], - /** @id MochiKit.Color.transparentColor */ - transparent: [0, 0, 0, 0], - /** @id MochiKit.Color.whiteColor */ - white: [1, 1, 1], - /** @id MochiKit.Color.yellowColor */ - yellow: [1, 1, 0] - }; - - var makeColor = function (name, r, g, b, a) { - var rval = this.fromRGB(r, g, b, a); - this[name] = function () { return rval; }; - return rval; - }; - - for (var k in colors) { - var name = k + "Color"; - var bindArgs = m.concat( - [makeColor, this.Color, name], - colors[k] - ); - this.Color[name] = m.bind.apply(null, bindArgs); - } - - var isColor = function () { - for (var i = 0; i < arguments.length; i++) { - if (!(arguments[i] instanceof MochiKit.Color.Color)) { - return false; - } - } - return true; - }; - - var compareColor = function (a, b) { - return a.compareRGB(b); - }; - - m.nameFunctions(this); - - m.registerComparator(this.Color.NAME, isColor, compareColor); - - this.EXPORT_TAGS = { - ":common": this.EXPORT, - ":all": m.concat(this.EXPORT, this.EXPORT_OK) - }; - - } -}); - -MochiKit.Color.EXPORT = [ - "Color" -]; - -MochiKit.Color.EXPORT_OK = [ - "clampColorComponent", - "rgbToHSL", - "hslToRGB", - "rgbToHSV", - "hsvToRGB", - "toColorPart" -]; - -MochiKit.Color.__new__(); - -MochiKit.Base._exportSymbols(this, MochiKit.Color); - -// Full table of css3 X11 colors - -MochiKit.Color.Color._namedColors = { - aliceblue: "#f0f8ff", - antiquewhite: "#faebd7", - aqua: "#00ffff", - aquamarine: "#7fffd4", - azure: "#f0ffff", - beige: "#f5f5dc", - bisque: "#ffe4c4", - black: "#000000", - blanchedalmond: "#ffebcd", - blue: "#0000ff", - blueviolet: "#8a2be2", - brown: "#a52a2a", - burlywood: "#deb887", - cadetblue: "#5f9ea0", - chartreuse: "#7fff00", - chocolate: "#d2691e", - coral: "#ff7f50", - cornflowerblue: "#6495ed", - cornsilk: "#fff8dc", - crimson: "#dc143c", - cyan: "#00ffff", - darkblue: "#00008b", - darkcyan: "#008b8b", - darkgoldenrod: "#b8860b", - darkgray: "#a9a9a9", - darkgreen: "#006400", - darkgrey: "#a9a9a9", - darkkhaki: "#bdb76b", - darkmagenta: "#8b008b", - darkolivegreen: "#556b2f", - darkorange: "#ff8c00", - darkorchid: "#9932cc", - darkred: "#8b0000", - darksalmon: "#e9967a", - darkseagreen: "#8fbc8f", - darkslateblue: "#483d8b", - darkslategray: "#2f4f4f", - darkslategrey: "#2f4f4f", - darkturquoise: "#00ced1", - darkviolet: "#9400d3", - deeppink: "#ff1493", - deepskyblue: "#00bfff", - dimgray: "#696969", - dimgrey: "#696969", - dodgerblue: "#1e90ff", - firebrick: "#b22222", - floralwhite: "#fffaf0", - forestgreen: "#228b22", - fuchsia: "#ff00ff", - gainsboro: "#dcdcdc", - ghostwhite: "#f8f8ff", - gold: "#ffd700", - goldenrod: "#daa520", - gray: "#808080", - green: "#008000", - greenyellow: "#adff2f", - grey: "#808080", - honeydew: "#f0fff0", - hotpink: "#ff69b4", - indianred: "#cd5c5c", - indigo: "#4b0082", - ivory: "#fffff0", - khaki: "#f0e68c", - lavender: "#e6e6fa", - lavenderblush: "#fff0f5", - lawngreen: "#7cfc00", - lemonchiffon: "#fffacd", - lightblue: "#add8e6", - lightcoral: "#f08080", - lightcyan: "#e0ffff", - lightgoldenrodyellow: "#fafad2", - lightgray: "#d3d3d3", - lightgreen: "#90ee90", - lightgrey: "#d3d3d3", - lightpink: "#ffb6c1", - lightsalmon: "#ffa07a", - lightseagreen: "#20b2aa", - lightskyblue: "#87cefa", - lightslategray: "#778899", - lightslategrey: "#778899", - lightsteelblue: "#b0c4de", - lightyellow: "#ffffe0", - lime: "#00ff00", - limegreen: "#32cd32", - linen: "#faf0e6", - magenta: "#ff00ff", - maroon: "#800000", - mediumaquamarine: "#66cdaa", - mediumblue: "#0000cd", - mediumorchid: "#ba55d3", - mediumpurple: "#9370db", - mediumseagreen: "#3cb371", - mediumslateblue: "#7b68ee", - mediumspringgreen: "#00fa9a", - mediumturquoise: "#48d1cc", - mediumvioletred: "#c71585", - midnightblue: "#191970", - mintcream: "#f5fffa", - mistyrose: "#ffe4e1", - moccasin: "#ffe4b5", - navajowhite: "#ffdead", - navy: "#000080", - oldlace: "#fdf5e6", - olive: "#808000", - olivedrab: "#6b8e23", - orange: "#ffa500", - orangered: "#ff4500", - orchid: "#da70d6", - palegoldenrod: "#eee8aa", - palegreen: "#98fb98", - paleturquoise: "#afeeee", - palevioletred: "#db7093", - papayawhip: "#ffefd5", - peachpuff: "#ffdab9", - peru: "#cd853f", - pink: "#ffc0cb", - plum: "#dda0dd", - powderblue: "#b0e0e6", - purple: "#800080", - red: "#ff0000", - rosybrown: "#bc8f8f", - royalblue: "#4169e1", - saddlebrown: "#8b4513", - salmon: "#fa8072", - sandybrown: "#f4a460", - seagreen: "#2e8b57", - seashell: "#fff5ee", - sienna: "#a0522d", - silver: "#c0c0c0", - skyblue: "#87ceeb", - slateblue: "#6a5acd", - slategray: "#708090", - slategrey: "#708090", - snow: "#fffafa", - springgreen: "#00ff7f", - steelblue: "#4682b4", - tan: "#d2b48c", - teal: "#008080", - thistle: "#d8bfd8", - tomato: "#ff6347", - turquoise: "#40e0d0", - violet: "#ee82ee", - wheat: "#f5deb3", - white: "#ffffff", - whitesmoke: "#f5f5f5", - yellow: "#ffff00", - yellowgreen: "#9acd32" -}; diff --git a/static/MochiKit/DOM.js b/static/MochiKit/DOM.js deleted file mode 100644 index 82cbaf2..0000000 --- a/static/MochiKit/DOM.js +++ /dev/null @@ -1,1256 +0,0 @@ -/*** - -MochiKit.DOM 1.4.2 - -See for documentation, downloads, license, etc. - -(c) 2005 Bob Ippolito. All rights Reserved. - -***/ - -MochiKit.Base._deps('DOM', ['Base']); - -MochiKit.DOM.NAME = "MochiKit.DOM"; -MochiKit.DOM.VERSION = "1.4.2"; -MochiKit.DOM.__repr__ = function () { - return "[" + this.NAME + " " + this.VERSION + "]"; -}; -MochiKit.DOM.toString = function () { - return this.__repr__(); -}; - -MochiKit.DOM.EXPORT = [ - "removeEmptyTextNodes", - "formContents", - "currentWindow", - "currentDocument", - "withWindow", - "withDocument", - "registerDOMConverter", - "coerceToDOM", - "createDOM", - "createDOMFunc", - "isChildNode", - "getNodeAttribute", - "removeNodeAttribute", - "setNodeAttribute", - "updateNodeAttributes", - "appendChildNodes", - "insertSiblingNodesAfter", - "insertSiblingNodesBefore", - "replaceChildNodes", - "removeElement", - "swapDOM", - "BUTTON", - "TT", - "PRE", - "H1", - "H2", - "H3", - "H4", - "H5", - "H6", - "BR", - "CANVAS", - "HR", - "LABEL", - "TEXTAREA", - "FORM", - "STRONG", - "SELECT", - "OPTION", - "OPTGROUP", - "LEGEND", - "FIELDSET", - "P", - "UL", - "OL", - "LI", - "DL", - "DT", - "DD", - "TD", - "TR", - "THEAD", - "TBODY", - "TFOOT", - "TABLE", - "TH", - "INPUT", - "SPAN", - "A", - "DIV", - "IMG", - "getElement", - "$", - "getElementsByTagAndClassName", - "addToCallStack", - "addLoadEvent", - "focusOnLoad", - "setElementClass", - "toggleElementClass", - "addElementClass", - "removeElementClass", - "swapElementClass", - "hasElementClass", - "computedStyle", // deprecated in 1.4 - "escapeHTML", - "toHTML", - "emitHTML", - "scrapeText", - "getFirstParentByTagAndClassName", - "getFirstElementByTagAndClassName" -]; - -MochiKit.DOM.EXPORT_OK = [ - "domConverters" -]; - -MochiKit.DOM.DEPRECATED = [ - /** @id MochiKit.DOM.computedStyle */ - ['computedStyle', 'MochiKit.Style.getStyle', '1.4'], - /** @id MochiKit.DOM.elementDimensions */ - ['elementDimensions', 'MochiKit.Style.getElementDimensions', '1.4'], - /** @id MochiKit.DOM.elementPosition */ - ['elementPosition', 'MochiKit.Style.getElementPosition', '1.4'], - /** @id MochiKit.DOM.getViewportDimensions */ - ['getViewportDimensions', 'MochiKit.Style.getViewportDimensions', '1.4'], - /** @id MochiKit.DOM.hideElement */ - ['hideElement', 'MochiKit.Style.hideElement', '1.4'], - /** @id MochiKit.DOM.makeClipping */ - ['makeClipping', 'MochiKit.Style.makeClipping', '1.4.1'], - /** @id MochiKit.DOM.makePositioned */ - ['makePositioned', 'MochiKit.Style.makePositioned', '1.4.1'], - /** @id MochiKit.DOM.setElementDimensions */ - ['setElementDimensions', 'MochiKit.Style.setElementDimensions', '1.4'], - /** @id MochiKit.DOM.setElementPosition */ - ['setElementPosition', 'MochiKit.Style.setElementPosition', '1.4'], - /** @id MochiKit.DOM.setDisplayForElement */ - ['setDisplayForElement', 'MochiKit.Style.setDisplayForElement', '1.4'], - /** @id MochiKit.DOM.setOpacity */ - ['setOpacity', 'MochiKit.Style.setOpacity', '1.4'], - /** @id MochiKit.DOM.showElement */ - ['showElement', 'MochiKit.Style.showElement', '1.4'], - /** @id MochiKit.DOM.undoClipping */ - ['undoClipping', 'MochiKit.Style.undoClipping', '1.4.1'], - /** @id MochiKit.DOM.undoPositioned */ - ['undoPositioned', 'MochiKit.Style.undoPositioned', '1.4.1'], - /** @id MochiKit.DOM.Coordinates */ - ['Coordinates', 'MochiKit.Style.Coordinates', '1.4'], // FIXME: broken - /** @id MochiKit.DOM.Dimensions */ - ['Dimensions', 'MochiKit.Style.Dimensions', '1.4'] // FIXME: broken -]; - -MochiKit.Base.update(MochiKit.DOM, { - - /** @id MochiKit.DOM.currentWindow */ - currentWindow: function () { - return MochiKit.DOM._window; - }, - - /** @id MochiKit.DOM.currentDocument */ - currentDocument: function () { - return MochiKit.DOM._document; - }, - - /** @id MochiKit.DOM.withWindow */ - withWindow: function (win, func) { - var self = MochiKit.DOM; - var oldDoc = self._document; - var oldWin = self._window; - var rval; - try { - self._window = win; - self._document = win.document; - rval = func(); - } catch (e) { - self._window = oldWin; - self._document = oldDoc; - throw e; - } - self._window = oldWin; - self._document = oldDoc; - return rval; - }, - - /** @id MochiKit.DOM.formContents */ - formContents: function (elem/* = document.body */) { - var names = []; - var values = []; - var m = MochiKit.Base; - var self = MochiKit.DOM; - if (typeof(elem) == "undefined" || elem === null) { - elem = self._document.body; - } else { - elem = self.getElement(elem); - } - m.nodeWalk(elem, function (elem) { - var name = elem.name; - if (m.isNotEmpty(name)) { - var tagName = elem.tagName.toUpperCase(); - if (tagName === "INPUT" - && (elem.type == "radio" || elem.type == "checkbox") - && !elem.checked - ) { - return null; - } - if (tagName === "SELECT") { - if (elem.type == "select-one") { - if (elem.selectedIndex >= 0) { - var opt = elem.options[elem.selectedIndex]; - var v = opt.value; - if (!v) { - var h = opt.outerHTML; - // internet explorer sure does suck. - if (h && !h.match(/^[^>]+\svalue\s*=/i)) { - v = opt.text; - } - } - names.push(name); - values.push(v); - return null; - } - // no form elements? - names.push(name); - values.push(""); - return null; - } else { - var opts = elem.options; - if (!opts.length) { - names.push(name); - values.push(""); - return null; - } - for (var i = 0; i < opts.length; i++) { - var opt = opts[i]; - if (!opt.selected) { - continue; - } - var v = opt.value; - if (!v) { - var h = opt.outerHTML; - // internet explorer sure does suck. - if (h && !h.match(/^[^>]+\svalue\s*=/i)) { - v = opt.text; - } - } - names.push(name); - values.push(v); - } - return null; - } - } - if (tagName === "FORM" || tagName === "P" || tagName === "SPAN" - || tagName === "DIV" - ) { - return elem.childNodes; - } - names.push(name); - values.push(elem.value || ''); - return null; - } - return elem.childNodes; - }); - return [names, values]; - }, - - /** @id MochiKit.DOM.withDocument */ - withDocument: function (doc, func) { - var self = MochiKit.DOM; - var oldDoc = self._document; - var rval; - try { - self._document = doc; - rval = func(); - } catch (e) { - self._document = oldDoc; - throw e; - } - self._document = oldDoc; - return rval; - }, - - /** @id MochiKit.DOM.registerDOMConverter */ - registerDOMConverter: function (name, check, wrap, /* optional */override) { - MochiKit.DOM.domConverters.register(name, check, wrap, override); - }, - - /** @id MochiKit.DOM.coerceToDOM */ - coerceToDOM: function (node, ctx) { - var m = MochiKit.Base; - var im = MochiKit.Iter; - var self = MochiKit.DOM; - if (im) { - var iter = im.iter; - var repeat = im.repeat; - } - var map = m.map; - var domConverters = self.domConverters; - var coerceToDOM = arguments.callee; - var NotFound = m.NotFound; - while (true) { - if (typeof(node) == 'undefined' || node === null) { - return null; - } - // this is a safari childNodes object, avoiding crashes w/ attr - // lookup - if (typeof(node) == "function" && - typeof(node.length) == "number" && - !(node instanceof Function)) { - node = im ? im.list(node) : m.extend(null, node); - } - if (typeof(node.nodeType) != 'undefined' && node.nodeType > 0) { - return node; - } - if (typeof(node) == 'number' || typeof(node) == 'boolean') { - node = node.toString(); - // FALL THROUGH - } - if (typeof(node) == 'string') { - return self._document.createTextNode(node); - } - if (typeof(node.__dom__) == 'function') { - node = node.__dom__(ctx); - continue; - } - if (typeof(node.dom) == 'function') { - node = node.dom(ctx); - continue; - } - if (typeof(node) == 'function') { - node = node.apply(ctx, [ctx]); - continue; - } - - if (im) { - // iterable - var iterNodes = null; - try { - iterNodes = iter(node); - } catch (e) { - // pass - } - if (iterNodes) { - return map(coerceToDOM, iterNodes, repeat(ctx)); - } - } else if (m.isArrayLike(node)) { - var func = function (n) { return coerceToDOM(n, ctx); }; - return map(func, node); - } - - // adapter - try { - node = domConverters.match(node, ctx); - continue; - } catch (e) { - if (e != NotFound) { - throw e; - } - } - - // fallback - return self._document.createTextNode(node.toString()); - } - // mozilla warnings aren't too bright - return undefined; - }, - - /** @id MochiKit.DOM.isChildNode */ - isChildNode: function (node, maybeparent) { - var self = MochiKit.DOM; - if (typeof(node) == "string") { - node = self.getElement(node); - } - if (typeof(maybeparent) == "string") { - maybeparent = self.getElement(maybeparent); - } - if (typeof(node) == 'undefined' || node === null) { - return false; - } - while (node != null && node !== self._document) { - if (node === maybeparent) { - return true; - } - node = node.parentNode; - } - return false; - }, - - /** @id MochiKit.DOM.setNodeAttribute */ - setNodeAttribute: function (node, attr, value) { - var o = {}; - o[attr] = value; - try { - return MochiKit.DOM.updateNodeAttributes(node, o); - } catch (e) { - // pass - } - return null; - }, - - /** @id MochiKit.DOM.getNodeAttribute */ - getNodeAttribute: function (node, attr) { - var self = MochiKit.DOM; - var rename = self.attributeArray.renames[attr]; - var ignoreValue = self.attributeArray.ignoreAttr[attr]; - node = self.getElement(node); - try { - if (rename) { - return node[rename]; - } - var value = node.getAttribute(attr); - if (value != ignoreValue) { - return value; - } - } catch (e) { - // pass - } - return null; - }, - - /** @id MochiKit.DOM.removeNodeAttribute */ - removeNodeAttribute: function (node, attr) { - var self = MochiKit.DOM; - var rename = self.attributeArray.renames[attr]; - node = self.getElement(node); - try { - if (rename) { - return node[rename]; - } - return node.removeAttribute(attr); - } catch (e) { - // pass - } - return null; - }, - - /** @id MochiKit.DOM.updateNodeAttributes */ - updateNodeAttributes: function (node, attrs) { - var elem = node; - var self = MochiKit.DOM; - if (typeof(node) == 'string') { - elem = self.getElement(node); - } - if (attrs) { - var updatetree = MochiKit.Base.updatetree; - if (self.attributeArray.compliant) { - // not IE, good. - for (var k in attrs) { - var v = attrs[k]; - if (typeof(v) == 'object' && typeof(elem[k]) == 'object') { - if (k == "style" && MochiKit.Style) { - MochiKit.Style.setStyle(elem, v); - } else { - updatetree(elem[k], v); - } - } else if (k.substring(0, 2) == "on") { - if (typeof(v) == "string") { - v = new Function(v); - } - elem[k] = v; - } else { - elem.setAttribute(k, v); - } - if (typeof(elem[k]) == "string" && elem[k] != v) { - // Also set property for weird attributes (see #302) - elem[k] = v; - } - } - } else { - // IE is insane in the membrane - var renames = self.attributeArray.renames; - for (var k in attrs) { - v = attrs[k]; - var renamed = renames[k]; - if (k == "style" && typeof(v) == "string") { - elem.style.cssText = v; - } else if (typeof(renamed) == "string") { - elem[renamed] = v; - } else if (typeof(elem[k]) == 'object' - && typeof(v) == 'object') { - if (k == "style" && MochiKit.Style) { - MochiKit.Style.setStyle(elem, v); - } else { - updatetree(elem[k], v); - } - } else if (k.substring(0, 2) == "on") { - if (typeof(v) == "string") { - v = new Function(v); - } - elem[k] = v; - } else { - elem.setAttribute(k, v); - } - if (typeof(elem[k]) == "string" && elem[k] != v) { - // Also set property for weird attributes (see #302) - elem[k] = v; - } - } - } - } - return elem; - }, - - /** @id MochiKit.DOM.appendChildNodes */ - appendChildNodes: function (node/*, nodes...*/) { - var elem = node; - var self = MochiKit.DOM; - if (typeof(node) == 'string') { - elem = self.getElement(node); - } - var nodeStack = [ - self.coerceToDOM( - MochiKit.Base.extend(null, arguments, 1), - elem - ) - ]; - var concat = MochiKit.Base.concat; - while (nodeStack.length) { - var n = nodeStack.shift(); - if (typeof(n) == 'undefined' || n === null) { - // pass - } else if (typeof(n.nodeType) == 'number') { - elem.appendChild(n); - } else { - nodeStack = concat(n, nodeStack); - } - } - return elem; - }, - - - /** @id MochiKit.DOM.insertSiblingNodesBefore */ - insertSiblingNodesBefore: function (node/*, nodes...*/) { - var elem = node; - var self = MochiKit.DOM; - if (typeof(node) == 'string') { - elem = self.getElement(node); - } - var nodeStack = [ - self.coerceToDOM( - MochiKit.Base.extend(null, arguments, 1), - elem - ) - ]; - var parentnode = elem.parentNode; - var concat = MochiKit.Base.concat; - while (nodeStack.length) { - var n = nodeStack.shift(); - if (typeof(n) == 'undefined' || n === null) { - // pass - } else if (typeof(n.nodeType) == 'number') { - parentnode.insertBefore(n, elem); - } else { - nodeStack = concat(n, nodeStack); - } - } - return parentnode; - }, - - /** @id MochiKit.DOM.insertSiblingNodesAfter */ - insertSiblingNodesAfter: function (node/*, nodes...*/) { - var elem = node; - var self = MochiKit.DOM; - - if (typeof(node) == 'string') { - elem = self.getElement(node); - } - var nodeStack = [ - self.coerceToDOM( - MochiKit.Base.extend(null, arguments, 1), - elem - ) - ]; - - if (elem.nextSibling) { - return self.insertSiblingNodesBefore(elem.nextSibling, nodeStack); - } - else { - return self.appendChildNodes(elem.parentNode, nodeStack); - } - }, - - /** @id MochiKit.DOM.replaceChildNodes */ - replaceChildNodes: function (node/*, nodes...*/) { - var elem = node; - var self = MochiKit.DOM; - if (typeof(node) == 'string') { - elem = self.getElement(node); - arguments[0] = elem; - } - var child; - while ((child = elem.firstChild)) { - elem.removeChild(child); - } - if (arguments.length < 2) { - return elem; - } else { - return self.appendChildNodes.apply(this, arguments); - } - }, - - /** @id MochiKit.DOM.createDOM */ - createDOM: function (name, attrs/*, nodes... */) { - var elem; - var self = MochiKit.DOM; - var m = MochiKit.Base; - if (typeof(attrs) == "string" || typeof(attrs) == "number") { - var args = m.extend([name, null], arguments, 1); - return arguments.callee.apply(this, args); - } - if (typeof(name) == 'string') { - // Internet Explorer is dumb - var xhtml = self._xhtml; - if (attrs && !self.attributeArray.compliant) { - // http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/name_2.asp - var contents = ""; - if ('name' in attrs) { - contents += ' name="' + self.escapeHTML(attrs.name) + '"'; - } - if (name == 'input' && 'type' in attrs) { - contents += ' type="' + self.escapeHTML(attrs.type) + '"'; - } - if (contents) { - name = "<" + name + contents + ">"; - xhtml = false; - } - } - var d = self._document; - if (xhtml && d === document) { - elem = d.createElementNS("http://www.w3.org/1999/xhtml", name); - } else { - elem = d.createElement(name); - } - } else { - elem = name; - } - if (attrs) { - self.updateNodeAttributes(elem, attrs); - } - if (arguments.length <= 2) { - return elem; - } else { - var args = m.extend([elem], arguments, 2); - return self.appendChildNodes.apply(this, args); - } - }, - - /** @id MochiKit.DOM.createDOMFunc */ - createDOMFunc: function (/* tag, attrs, *nodes */) { - var m = MochiKit.Base; - return m.partial.apply( - this, - m.extend([MochiKit.DOM.createDOM], arguments) - ); - }, - - /** @id MochiKit.DOM.removeElement */ - removeElement: function (elem) { - var self = MochiKit.DOM; - var e = self.coerceToDOM(self.getElement(elem)); - e.parentNode.removeChild(e); - return e; - }, - - /** @id MochiKit.DOM.swapDOM */ - swapDOM: function (dest, src) { - var self = MochiKit.DOM; - dest = self.getElement(dest); - var parent = dest.parentNode; - if (src) { - src = self.coerceToDOM(self.getElement(src), parent); - parent.replaceChild(src, dest); - } else { - parent.removeChild(dest); - } - return src; - }, - - /** @id MochiKit.DOM.getElement */ - getElement: function (id) { - var self = MochiKit.DOM; - if (arguments.length == 1) { - return ((typeof(id) == "string") ? - self._document.getElementById(id) : id); - } else { - return MochiKit.Base.map(self.getElement, arguments); - } - }, - - /** @id MochiKit.DOM.getElementsByTagAndClassName */ - getElementsByTagAndClassName: function (tagName, className, - /* optional */parent) { - var self = MochiKit.DOM; - if (typeof(tagName) == 'undefined' || tagName === null) { - tagName = '*'; - } - if (typeof(parent) == 'undefined' || parent === null) { - parent = self._document; - } - parent = self.getElement(parent); - if (parent == null) { - return []; - } - var children = (parent.getElementsByTagName(tagName) - || self._document.all); - if (typeof(className) == 'undefined' || className === null) { - return MochiKit.Base.extend(null, children); - } - - var elements = []; - for (var i = 0; i < children.length; i++) { - var child = children[i]; - var cls = child.className; - if (typeof(cls) != "string") { - cls = child.getAttribute("class"); - } - if (typeof(cls) == "string") { - var classNames = cls.split(' '); - for (var j = 0; j < classNames.length; j++) { - if (classNames[j] == className) { - elements.push(child); - break; - } - } - } - } - - return elements; - }, - - _newCallStack: function (path, once) { - var rval = function () { - var callStack = arguments.callee.callStack; - for (var i = 0; i < callStack.length; i++) { - if (callStack[i].apply(this, arguments) === false) { - break; - } - } - if (once) { - try { - this[path] = null; - } catch (e) { - // pass - } - } - }; - rval.callStack = []; - return rval; - }, - - /** @id MochiKit.DOM.addToCallStack */ - addToCallStack: function (target, path, func, once) { - var self = MochiKit.DOM; - var existing = target[path]; - var regfunc = existing; - if (!(typeof(existing) == 'function' - && typeof(existing.callStack) == "object" - && existing.callStack !== null)) { - regfunc = self._newCallStack(path, once); - if (typeof(existing) == 'function') { - regfunc.callStack.push(existing); - } - target[path] = regfunc; - } - regfunc.callStack.push(func); - }, - - /** @id MochiKit.DOM.addLoadEvent */ - addLoadEvent: function (func) { - var self = MochiKit.DOM; - self.addToCallStack(self._window, "onload", func, true); - - }, - - /** @id MochiKit.DOM.focusOnLoad */ - focusOnLoad: function (element) { - var self = MochiKit.DOM; - self.addLoadEvent(function () { - element = self.getElement(element); - if (element) { - element.focus(); - } - }); - }, - - /** @id MochiKit.DOM.setElementClass */ - setElementClass: function (element, className) { - var self = MochiKit.DOM; - var obj = self.getElement(element); - if (self.attributeArray.compliant) { - obj.setAttribute("class", className); - } else { - obj.setAttribute("className", className); - } - }, - - /** @id MochiKit.DOM.toggleElementClass */ - toggleElementClass: function (className/*, element... */) { - var self = MochiKit.DOM; - for (var i = 1; i < arguments.length; i++) { - var obj = self.getElement(arguments[i]); - if (!self.addElementClass(obj, className)) { - self.removeElementClass(obj, className); - } - } - }, - - /** @id MochiKit.DOM.addElementClass */ - addElementClass: function (element, className) { - var self = MochiKit.DOM; - var obj = self.getElement(element); - var cls = obj.className; - if (typeof(cls) != "string") { - cls = obj.getAttribute("class"); - } - // trivial case, no className yet - if (typeof(cls) != "string" || cls.length === 0) { - self.setElementClass(obj, className); - return true; - } - // the other trivial case, already set as the only class - if (cls == className) { - return false; - } - var classes = cls.split(" "); - for (var i = 0; i < classes.length; i++) { - // already present - if (classes[i] == className) { - return false; - } - } - // append class - self.setElementClass(obj, cls + " " + className); - return true; - }, - - /** @id MochiKit.DOM.removeElementClass */ - removeElementClass: function (element, className) { - var self = MochiKit.DOM; - var obj = self.getElement(element); - var cls = obj.className; - if (typeof(cls) != "string") { - cls = obj.getAttribute("class"); - } - // trivial case, no className yet - if (typeof(cls) != "string" || cls.length === 0) { - return false; - } - // other trivial case, set only to className - if (cls == className) { - self.setElementClass(obj, ""); - return true; - } - var classes = cls.split(" "); - for (var i = 0; i < classes.length; i++) { - // already present - if (classes[i] == className) { - // only check sane case where the class is used once - classes.splice(i, 1); - self.setElementClass(obj, classes.join(" ")); - return true; - } - } - // not found - return false; - }, - - /** @id MochiKit.DOM.swapElementClass */ - swapElementClass: function (element, fromClass, toClass) { - var obj = MochiKit.DOM.getElement(element); - var res = MochiKit.DOM.removeElementClass(obj, fromClass); - if (res) { - MochiKit.DOM.addElementClass(obj, toClass); - } - return res; - }, - - /** @id MochiKit.DOM.hasElementClass */ - hasElementClass: function (element, className/*...*/) { - var obj = MochiKit.DOM.getElement(element); - if (obj == null) { - return false; - } - var cls = obj.className; - if (typeof(cls) != "string") { - cls = obj.getAttribute("class"); - } - if (typeof(cls) != "string") { - return false; - } - var classes = cls.split(" "); - for (var i = 1; i < arguments.length; i++) { - var good = false; - for (var j = 0; j < classes.length; j++) { - if (classes[j] == arguments[i]) { - good = true; - break; - } - } - if (!good) { - return false; - } - } - return true; - }, - - /** @id MochiKit.DOM.escapeHTML */ - escapeHTML: function (s) { - return s.replace(/&/g, "&" - ).replace(/"/g, """ - ).replace(//g, ">"); - }, - - /** @id MochiKit.DOM.toHTML */ - toHTML: function (dom) { - return MochiKit.DOM.emitHTML(dom).join(""); - }, - - /** @id MochiKit.DOM.emitHTML */ - emitHTML: function (dom, /* optional */lst) { - if (typeof(lst) == 'undefined' || lst === null) { - lst = []; - } - // queue is the call stack, we're doing this non-recursively - var queue = [dom]; - var self = MochiKit.DOM; - var escapeHTML = self.escapeHTML; - var attributeArray = self.attributeArray; - while (queue.length) { - dom = queue.pop(); - if (typeof(dom) == 'string') { - lst.push(dom); - } else if (dom.nodeType == 1) { - // we're not using higher order stuff here - // because safari has heisenbugs.. argh. - // - // I think it might have something to do with - // garbage collection and function calls. - lst.push('<' + dom.tagName.toLowerCase()); - var attributes = []; - var domAttr = attributeArray(dom); - for (var i = 0; i < domAttr.length; i++) { - var a = domAttr[i]; - attributes.push([ - " ", - a.name, - '="', - escapeHTML(a.value), - '"' - ]); - } - attributes.sort(); - for (i = 0; i < attributes.length; i++) { - var attrs = attributes[i]; - for (var j = 0; j < attrs.length; j++) { - lst.push(attrs[j]); - } - } - if (dom.hasChildNodes()) { - lst.push(">"); - // queue is the FILO call stack, so we put the close tag - // on first - queue.push(""); - var cnodes = dom.childNodes; - for (i = cnodes.length - 1; i >= 0; i--) { - queue.push(cnodes[i]); - } - } else { - lst.push('/>'); - } - } else if (dom.nodeType == 3) { - lst.push(escapeHTML(dom.nodeValue)); - } - } - return lst; - }, - - /** @id MochiKit.DOM.scrapeText */ - scrapeText: function (node, /* optional */asArray) { - var rval = []; - (function (node) { - var cn = node.childNodes; - if (cn) { - for (var i = 0; i < cn.length; i++) { - arguments.callee.call(this, cn[i]); - } - } - var nodeValue = node.nodeValue; - if (typeof(nodeValue) == 'string') { - rval.push(nodeValue); - } - })(MochiKit.DOM.getElement(node)); - if (asArray) { - return rval; - } else { - return rval.join(""); - } - }, - - /** @id MochiKit.DOM.removeEmptyTextNodes */ - removeEmptyTextNodes: function (element) { - element = MochiKit.DOM.getElement(element); - for (var i = 0; i < element.childNodes.length; i++) { - var node = element.childNodes[i]; - if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) { - node.parentNode.removeChild(node); - } - } - }, - - /** @id MochiKit.DOM.getFirstElementByTagAndClassName */ - getFirstElementByTagAndClassName: function (tagName, className, - /* optional */parent) { - var self = MochiKit.DOM; - if (typeof(tagName) == 'undefined' || tagName === null) { - tagName = '*'; - } - if (typeof(parent) == 'undefined' || parent === null) { - parent = self._document; - } - parent = self.getElement(parent); - if (parent == null) { - return null; - } - var children = (parent.getElementsByTagName(tagName) - || self._document.all); - if (children.length <= 0) { - return null; - } else if (typeof(className) == 'undefined' || className === null) { - return children[0]; - } - - for (var i = 0; i < children.length; i++) { - var child = children[i]; - var cls = child.className; - if (typeof(cls) != "string") { - cls = child.getAttribute("class"); - } - if (typeof(cls) == "string") { - var classNames = cls.split(' '); - for (var j = 0; j < classNames.length; j++) { - if (classNames[j] == className) { - return child; - } - } - } - } - return null; - }, - - /** @id MochiKit.DOM.getFirstParentByTagAndClassName */ - getFirstParentByTagAndClassName: function (elem, tagName, className) { - var self = MochiKit.DOM; - elem = self.getElement(elem); - if (typeof(tagName) == 'undefined' || tagName === null) { - tagName = '*'; - } else { - tagName = tagName.toUpperCase(); - } - if (typeof(className) == 'undefined' || className === null) { - className = null; - } - if (elem) { - elem = elem.parentNode; - } - while (elem && elem.tagName) { - var curTagName = elem.tagName.toUpperCase(); - if ((tagName === '*' || tagName == curTagName) && - (className === null || self.hasElementClass(elem, className))) { - return elem; - } - elem = elem.parentNode; - } - return null; - }, - - __new__: function (win) { - - var m = MochiKit.Base; - if (typeof(document) != "undefined") { - this._document = document; - var kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; - this._xhtml = (document.documentElement && - document.createElementNS && - document.documentElement.namespaceURI === kXULNSURI); - } else if (MochiKit.MockDOM) { - this._document = MochiKit.MockDOM.document; - } - this._window = win; - - this.domConverters = new m.AdapterRegistry(); - - var __tmpElement = this._document.createElement("span"); - var attributeArray; - if (__tmpElement && __tmpElement.attributes && - __tmpElement.attributes.length > 0) { - // for braindead browsers (IE) that insert extra junk - var filter = m.filter; - attributeArray = function (node) { - /*** - - Return an array of attributes for a given node, - filtering out attributes that don't belong for - that are inserted by "Certain Browsers". - - ***/ - return filter(attributeArray.ignoreAttrFilter, node.attributes); - }; - attributeArray.ignoreAttr = {}; - var attrs = __tmpElement.attributes; - var ignoreAttr = attributeArray.ignoreAttr; - for (var i = 0; i < attrs.length; i++) { - var a = attrs[i]; - ignoreAttr[a.name] = a.value; - } - attributeArray.ignoreAttrFilter = function (a) { - return (attributeArray.ignoreAttr[a.name] != a.value); - }; - attributeArray.compliant = false; - attributeArray.renames = { - "class": "className", - "checked": "defaultChecked", - "usemap": "useMap", - "for": "htmlFor", - "readonly": "readOnly", - "colspan": "colSpan", - "bgcolor": "bgColor", - "cellspacing": "cellSpacing", - "cellpadding": "cellPadding" - }; - } else { - attributeArray = function (node) { - return node.attributes; - }; - attributeArray.compliant = true; - attributeArray.ignoreAttr = {}; - attributeArray.renames = {}; - } - this.attributeArray = attributeArray; - - // FIXME: this really belongs in Base, and could probably be cleaner - var _deprecated = function(fromModule, arr) { - var fromName = arr[0]; - var toName = arr[1]; - var toModule = toName.split('.')[1]; - var str = ''; - - str += 'if (!MochiKit.' + toModule + ') { throw new Error("'; - str += 'This function has been deprecated and depends on MochiKit.'; - str += toModule + '.");}'; - str += 'return ' + toName + '.apply(this, arguments);'; - MochiKit[fromModule][fromName] = new Function(str); - } - for (var i = 0; i < MochiKit.DOM.DEPRECATED.length; i++) { - _deprecated('DOM', MochiKit.DOM.DEPRECATED[i]); - } - - // shorthand for createDOM syntax - var createDOMFunc = this.createDOMFunc; - /** @id MochiKit.DOM.UL */ - this.UL = createDOMFunc("ul"); - /** @id MochiKit.DOM.OL */ - this.OL = createDOMFunc("ol"); - /** @id MochiKit.DOM.LI */ - this.LI = createDOMFunc("li"); - /** @id MochiKit.DOM.DL */ - this.DL = createDOMFunc("dl"); - /** @id MochiKit.DOM.DT */ - this.DT = createDOMFunc("dt"); - /** @id MochiKit.DOM.DD */ - this.DD = createDOMFunc("dd"); - /** @id MochiKit.DOM.TD */ - this.TD = createDOMFunc("td"); - /** @id MochiKit.DOM.TR */ - this.TR = createDOMFunc("tr"); - /** @id MochiKit.DOM.TBODY */ - this.TBODY = createDOMFunc("tbody"); - /** @id MochiKit.DOM.THEAD */ - this.THEAD = createDOMFunc("thead"); - /** @id MochiKit.DOM.TFOOT */ - this.TFOOT = createDOMFunc("tfoot"); - /** @id MochiKit.DOM.TABLE */ - this.TABLE = createDOMFunc("table"); - /** @id MochiKit.DOM.TH */ - this.TH = createDOMFunc("th"); - /** @id MochiKit.DOM.INPUT */ - this.INPUT = createDOMFunc("input"); - /** @id MochiKit.DOM.SPAN */ - this.SPAN = createDOMFunc("span"); - /** @id MochiKit.DOM.A */ - this.A = createDOMFunc("a"); - /** @id MochiKit.DOM.DIV */ - this.DIV = createDOMFunc("div"); - /** @id MochiKit.DOM.IMG */ - this.IMG = createDOMFunc("img"); - /** @id MochiKit.DOM.BUTTON */ - this.BUTTON = createDOMFunc("button"); - /** @id MochiKit.DOM.TT */ - this.TT = createDOMFunc("tt"); - /** @id MochiKit.DOM.PRE */ - this.PRE = createDOMFunc("pre"); - /** @id MochiKit.DOM.H1 */ - this.H1 = createDOMFunc("h1"); - /** @id MochiKit.DOM.H2 */ - this.H2 = createDOMFunc("h2"); - /** @id MochiKit.DOM.H3 */ - this.H3 = createDOMFunc("h3"); - /** @id MochiKit.DOM.H4 */ - this.H4 = createDOMFunc("h4"); - /** @id MochiKit.DOM.H5 */ - this.H5 = createDOMFunc("h5"); - /** @id MochiKit.DOM.H6 */ - this.H6 = createDOMFunc("h6"); - /** @id MochiKit.DOM.BR */ - this.BR = createDOMFunc("br"); - /** @id MochiKit.DOM.HR */ - this.HR = createDOMFunc("hr"); - /** @id MochiKit.DOM.LABEL */ - this.LABEL = createDOMFunc("label"); - /** @id MochiKit.DOM.TEXTAREA */ - this.TEXTAREA = createDOMFunc("textarea"); - /** @id MochiKit.DOM.FORM */ - this.FORM = createDOMFunc("form"); - /** @id MochiKit.DOM.P */ - this.P = createDOMFunc("p"); - /** @id MochiKit.DOM.SELECT */ - this.SELECT = createDOMFunc("select"); - /** @id MochiKit.DOM.OPTION */ - this.OPTION = createDOMFunc("option"); - /** @id MochiKit.DOM.OPTGROUP */ - this.OPTGROUP = createDOMFunc("optgroup"); - /** @id MochiKit.DOM.LEGEND */ - this.LEGEND = createDOMFunc("legend"); - /** @id MochiKit.DOM.FIELDSET */ - this.FIELDSET = createDOMFunc("fieldset"); - /** @id MochiKit.DOM.STRONG */ - this.STRONG = createDOMFunc("strong"); - /** @id MochiKit.DOM.CANVAS */ - this.CANVAS = createDOMFunc("canvas"); - - /** @id MochiKit.DOM.$ */ - this.$ = this.getElement; - - this.EXPORT_TAGS = { - ":common": this.EXPORT, - ":all": m.concat(this.EXPORT, this.EXPORT_OK) - }; - - m.nameFunctions(this); - - } -}); - - -MochiKit.DOM.__new__(((typeof(window) == "undefined") ? this : window)); - -// -// XXX: Internet Explorer blows -// -if (MochiKit.__export__) { - withWindow = MochiKit.DOM.withWindow; - withDocument = MochiKit.DOM.withDocument; -} - -MochiKit.Base._exportSymbols(this, MochiKit.DOM); diff --git a/static/MochiKit/DateTime.js b/static/MochiKit/DateTime.js deleted file mode 100644 index cbb3c91..0000000 --- a/static/MochiKit/DateTime.js +++ /dev/null @@ -1,222 +0,0 @@ -/*** - -MochiKit.DateTime 1.4.2 - -See for documentation, downloads, license, etc. - -(c) 2005 Bob Ippolito. All rights Reserved. - -***/ - -MochiKit.Base._deps('DateTime', ['Base']); - -MochiKit.DateTime.NAME = "MochiKit.DateTime"; -MochiKit.DateTime.VERSION = "1.4.2"; -MochiKit.DateTime.__repr__ = function () { - return "[" + this.NAME + " " + this.VERSION + "]"; -}; -MochiKit.DateTime.toString = function () { - return this.__repr__(); -}; - -/** @id MochiKit.DateTime.isoDate */ -MochiKit.DateTime.isoDate = function (str) { - str = str + ""; - if (typeof(str) != "string" || str.length === 0) { - return null; - } - var iso = str.split('-'); - if (iso.length === 0) { - return null; - } - var date = new Date(iso[0], iso[1] - 1, iso[2]); - date.setFullYear(iso[0]); - date.setMonth(iso[1] - 1); - date.setDate(iso[2]); - return date; -}; - -MochiKit.DateTime._isoRegexp = /(\d{4,})(?:-(\d{1,2})(?:-(\d{1,2})(?:[T ](\d{1,2}):(\d{1,2})(?::(\d{1,2})(?:\.(\d+))?)?(?:(Z)|([+-])(\d{1,2})(?::(\d{1,2}))?)?)?)?)?/; - -/** @id MochiKit.DateTime.isoTimestamp */ -MochiKit.DateTime.isoTimestamp = function (str) { - str = str + ""; - if (typeof(str) != "string" || str.length === 0) { - return null; - } - var res = str.match(MochiKit.DateTime._isoRegexp); - if (typeof(res) == "undefined" || res === null) { - return null; - } - var year, month, day, hour, min, sec, msec; - year = parseInt(res[1], 10); - if (typeof(res[2]) == "undefined" || res[2] === '') { - return new Date(year); - } - month = parseInt(res[2], 10) - 1; - day = parseInt(res[3], 10); - if (typeof(res[4]) == "undefined" || res[4] === '') { - return new Date(year, month, day); - } - hour = parseInt(res[4], 10); - min = parseInt(res[5], 10); - sec = (typeof(res[6]) != "undefined" && res[6] !== '') ? parseInt(res[6], 10) : 0; - if (typeof(res[7]) != "undefined" && res[7] !== '') { - msec = Math.round(1000.0 * parseFloat("0." + res[7])); - } else { - msec = 0; - } - if ((typeof(res[8]) == "undefined" || res[8] === '') && (typeof(res[9]) == "undefined" || res[9] === '')) { - return new Date(year, month, day, hour, min, sec, msec); - } - var ofs; - if (typeof(res[9]) != "undefined" && res[9] !== '') { - ofs = parseInt(res[10], 10) * 3600000; - if (typeof(res[11]) != "undefined" && res[11] !== '') { - ofs += parseInt(res[11], 10) * 60000; - } - if (res[9] == "-") { - ofs = -ofs; - } - } else { - ofs = 0; - } - return new Date(Date.UTC(year, month, day, hour, min, sec, msec) - ofs); -}; - -/** @id MochiKit.DateTime.toISOTime */ -MochiKit.DateTime.toISOTime = function (date, realISO/* = false */) { - if (typeof(date) == "undefined" || date === null) { - return null; - } - var hh = date.getHours(); - var mm = date.getMinutes(); - var ss = date.getSeconds(); - var lst = [ - ((realISO && (hh < 10)) ? "0" + hh : hh), - ((mm < 10) ? "0" + mm : mm), - ((ss < 10) ? "0" + ss : ss) - ]; - return lst.join(":"); -}; - -/** @id MochiKit.DateTime.toISOTimeStamp */ -MochiKit.DateTime.toISOTimestamp = function (date, realISO/* = false*/) { - if (typeof(date) == "undefined" || date === null) { - return null; - } - var sep = realISO ? "T" : " "; - var foot = realISO ? "Z" : ""; - if (realISO) { - date = new Date(date.getTime() + (date.getTimezoneOffset() * 60000)); - } - return MochiKit.DateTime.toISODate(date) + sep + MochiKit.DateTime.toISOTime(date, realISO) + foot; -}; - -/** @id MochiKit.DateTime.toISODate */ -MochiKit.DateTime.toISODate = function (date) { - if (typeof(date) == "undefined" || date === null) { - return null; - } - var _padTwo = MochiKit.DateTime._padTwo; - var _padFour = MochiKit.DateTime._padFour; - return [ - _padFour(date.getFullYear()), - _padTwo(date.getMonth() + 1), - _padTwo(date.getDate()) - ].join("-"); -}; - -/** @id MochiKit.DateTime.americanDate */ -MochiKit.DateTime.americanDate = function (d) { - d = d + ""; - if (typeof(d) != "string" || d.length === 0) { - return null; - } - var a = d.split('/'); - return new Date(a[2], a[0] - 1, a[1]); -}; - -MochiKit.DateTime._padTwo = function (n) { - return (n > 9) ? n : "0" + n; -}; - -MochiKit.DateTime._padFour = function(n) { - switch(n.toString().length) { - case 1: return "000" + n; break; - case 2: return "00" + n; break; - case 3: return "0" + n; break; - case 4: - default: - return n; - } -}; - -/** @id MochiKit.DateTime.toPaddedAmericanDate */ -MochiKit.DateTime.toPaddedAmericanDate = function (d) { - if (typeof(d) == "undefined" || d === null) { - return null; - } - var _padTwo = MochiKit.DateTime._padTwo; - return [ - _padTwo(d.getMonth() + 1), - _padTwo(d.getDate()), - d.getFullYear() - ].join('/'); -}; - -/** @id MochiKit.DateTime.toAmericanDate */ -MochiKit.DateTime.toAmericanDate = function (d) { - if (typeof(d) == "undefined" || d === null) { - return null; - } - return [d.getMonth() + 1, d.getDate(), d.getFullYear()].join('/'); -}; - -MochiKit.DateTime.EXPORT = [ - "isoDate", - "isoTimestamp", - "toISOTime", - "toISOTimestamp", - "toISODate", - "americanDate", - "toPaddedAmericanDate", - "toAmericanDate" -]; - -MochiKit.DateTime.EXPORT_OK = []; -MochiKit.DateTime.EXPORT_TAGS = { - ":common": MochiKit.DateTime.EXPORT, - ":all": MochiKit.DateTime.EXPORT -}; - -MochiKit.DateTime.__new__ = function () { - // MochiKit.Base.nameFunctions(this); - var base = this.NAME + "."; - for (var k in this) { - var o = this[k]; - if (typeof(o) == 'function' && typeof(o.NAME) == 'undefined') { - try { - o.NAME = base + k; - } catch (e) { - // pass - } - } - } -}; - -MochiKit.DateTime.__new__(); - -if (typeof(MochiKit.Base) != "undefined") { - MochiKit.Base._exportSymbols(this, MochiKit.DateTime); -} else { - (function (globals, module) { - if ((typeof(JSAN) == 'undefined' && typeof(dojo) == 'undefined') - || (MochiKit.__export__ === false)) { - var all = module.EXPORT_TAGS[":all"]; - for (var i = 0; i < all.length; i++) { - globals[all[i]] = module[all[i]]; - } - } - })(this, MochiKit.DateTime); -} diff --git a/static/MochiKit/DragAndDrop.js b/static/MochiKit/DragAndDrop.js deleted file mode 100644 index b23b102..0000000 --- a/static/MochiKit/DragAndDrop.js +++ /dev/null @@ -1,793 +0,0 @@ -/*** -MochiKit.DragAndDrop 1.4.2 - -See for documentation, downloads, license, etc. - -Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) - Mochi-ized By Thomas Herve (_firstname_@nimail.org) - -***/ - -MochiKit.Base._deps('DragAndDrop', ['Base', 'Iter', 'DOM', 'Signal', 'Visual', 'Position']); - -MochiKit.DragAndDrop.NAME = 'MochiKit.DragAndDrop'; -MochiKit.DragAndDrop.VERSION = '1.4.2'; - -MochiKit.DragAndDrop.__repr__ = function () { - return '[' + this.NAME + ' ' + this.VERSION + ']'; -}; - -MochiKit.DragAndDrop.toString = function () { - return this.__repr__(); -}; - -MochiKit.DragAndDrop.EXPORT = [ - "Droppable", - "Draggable" -]; - -MochiKit.DragAndDrop.EXPORT_OK = [ - "Droppables", - "Draggables" -]; - -MochiKit.DragAndDrop.Droppables = { - /*** - - Manage all droppables. Shouldn't be used, use the Droppable object instead. - - ***/ - drops: [], - - remove: function (element) { - this.drops = MochiKit.Base.filter(function (d) { - return d.element != MochiKit.DOM.getElement(element); - }, this.drops); - }, - - register: function (drop) { - this.drops.push(drop); - }, - - unregister: function (drop) { - this.drops = MochiKit.Base.filter(function (d) { - return d != drop; - }, this.drops); - }, - - prepare: function (element) { - MochiKit.Base.map(function (drop) { - if (drop.isAccepted(element)) { - if (drop.options.activeclass) { - MochiKit.DOM.addElementClass(drop.element, - drop.options.activeclass); - } - drop.options.onactive(drop.element, element); - } - }, this.drops); - }, - - findDeepestChild: function (drops) { - deepest = drops[0]; - - for (i = 1; i < drops.length; ++i) { - if (MochiKit.DOM.isChildNode(drops[i].element, deepest.element)) { - deepest = drops[i]; - } - } - return deepest; - }, - - show: function (point, element) { - if (!this.drops.length) { - return; - } - var affected = []; - - if (this.last_active) { - this.last_active.deactivate(); - } - MochiKit.Iter.forEach(this.drops, function (drop) { - if (drop.isAffected(point, element)) { - affected.push(drop); - } - }); - if (affected.length > 0) { - drop = this.findDeepestChild(affected); - MochiKit.Position.within(drop.element, point.page.x, point.page.y); - drop.options.onhover(element, drop.element, - MochiKit.Position.overlap(drop.options.overlap, drop.element)); - drop.activate(); - } - }, - - fire: function (event, element) { - if (!this.last_active) { - return; - } - MochiKit.Position.prepare(); - - if (this.last_active.isAffected(event.mouse(), element)) { - this.last_active.options.ondrop(element, - this.last_active.element, event); - } - }, - - reset: function (element) { - MochiKit.Base.map(function (drop) { - if (drop.options.activeclass) { - MochiKit.DOM.removeElementClass(drop.element, - drop.options.activeclass); - } - drop.options.ondesactive(drop.element, element); - }, this.drops); - if (this.last_active) { - this.last_active.deactivate(); - } - } -}; - -/** @id MochiKit.DragAndDrop.Droppable */ -MochiKit.DragAndDrop.Droppable = function (element, options) { - var cls = arguments.callee; - if (!(this instanceof cls)) { - return new cls(element, options); - } - this.__init__(element, options); -}; - -MochiKit.DragAndDrop.Droppable.prototype = { - /*** - - A droppable object. Simple use is to create giving an element: - - new MochiKit.DragAndDrop.Droppable('myelement'); - - Generally you'll want to define the 'ondrop' function and maybe the - 'accept' option to filter draggables. - - ***/ - __class__: MochiKit.DragAndDrop.Droppable, - - __init__: function (element, /* optional */options) { - var d = MochiKit.DOM; - var b = MochiKit.Base; - this.element = d.getElement(element); - this.options = b.update({ - - /** @id MochiKit.DragAndDrop.greedy */ - greedy: true, - - /** @id MochiKit.DragAndDrop.hoverclass */ - hoverclass: null, - - /** @id MochiKit.DragAndDrop.activeclass */ - activeclass: null, - - /** @id MochiKit.DragAndDrop.hoverfunc */ - hoverfunc: b.noop, - - /** @id MochiKit.DragAndDrop.accept */ - accept: null, - - /** @id MochiKit.DragAndDrop.onactive */ - onactive: b.noop, - - /** @id MochiKit.DragAndDrop.ondesactive */ - ondesactive: b.noop, - - /** @id MochiKit.DragAndDrop.onhover */ - onhover: b.noop, - - /** @id MochiKit.DragAndDrop.ondrop */ - ondrop: b.noop, - - /** @id MochiKit.DragAndDrop.containment */ - containment: [], - tree: false - }, options); - - // cache containers - this.options._containers = []; - b.map(MochiKit.Base.bind(function (c) { - this.options._containers.push(d.getElement(c)); - }, this), this.options.containment); - - MochiKit.Style.makePositioned(this.element); // fix IE - - MochiKit.DragAndDrop.Droppables.register(this); - }, - - /** @id MochiKit.DragAndDrop.isContained */ - isContained: function (element) { - if (this.options._containers.length) { - var containmentNode; - if (this.options.tree) { - containmentNode = element.treeNode; - } else { - containmentNode = element.parentNode; - } - return MochiKit.Iter.some(this.options._containers, function (c) { - return containmentNode == c; - }); - } else { - return true; - } - }, - - /** @id MochiKit.DragAndDrop.isAccepted */ - isAccepted: function (element) { - return ((!this.options.accept) || MochiKit.Iter.some( - this.options.accept, function (c) { - return MochiKit.DOM.hasElementClass(element, c); - })); - }, - - /** @id MochiKit.DragAndDrop.isAffected */ - isAffected: function (point, element) { - return ((this.element != element) && - this.isContained(element) && - this.isAccepted(element) && - MochiKit.Position.within(this.element, point.page.x, - point.page.y)); - }, - - /** @id MochiKit.DragAndDrop.deactivate */ - deactivate: function () { - /*** - - A droppable is deactivate when a draggable has been over it and left. - - ***/ - if (this.options.hoverclass) { - MochiKit.DOM.removeElementClass(this.element, - this.options.hoverclass); - } - this.options.hoverfunc(this.element, false); - MochiKit.DragAndDrop.Droppables.last_active = null; - }, - - /** @id MochiKit.DragAndDrop.activate */ - activate: function () { - /*** - - A droppable is active when a draggable is over it. - - ***/ - if (this.options.hoverclass) { - MochiKit.DOM.addElementClass(this.element, this.options.hoverclass); - } - this.options.hoverfunc(this.element, true); - MochiKit.DragAndDrop.Droppables.last_active = this; - }, - - /** @id MochiKit.DragAndDrop.destroy */ - destroy: function () { - /*** - - Delete this droppable. - - ***/ - MochiKit.DragAndDrop.Droppables.unregister(this); - }, - - /** @id MochiKit.DragAndDrop.repr */ - repr: function () { - return '[' + this.__class__.NAME + ", options:" + MochiKit.Base.repr(this.options) + "]"; - } -}; - -MochiKit.DragAndDrop.Draggables = { - /*** - - Manage draggables elements. Not intended to direct use. - - ***/ - drags: [], - - register: function (draggable) { - if (this.drags.length === 0) { - var conn = MochiKit.Signal.connect; - this.eventMouseUp = conn(document, 'onmouseup', this, this.endDrag); - this.eventMouseMove = conn(document, 'onmousemove', this, - this.updateDrag); - this.eventKeypress = conn(document, 'onkeypress', this, - this.keyPress); - } - this.drags.push(draggable); - }, - - unregister: function (draggable) { - this.drags = MochiKit.Base.filter(function (d) { - return d != draggable; - }, this.drags); - if (this.drags.length === 0) { - var disc = MochiKit.Signal.disconnect; - disc(this.eventMouseUp); - disc(this.eventMouseMove); - disc(this.eventKeypress); - } - }, - - activate: function (draggable) { - // allows keypress events if window is not currently focused - // fails for Safari - window.focus(); - this.activeDraggable = draggable; - }, - - deactivate: function () { - this.activeDraggable = null; - }, - - updateDrag: function (event) { - if (!this.activeDraggable) { - return; - } - var pointer = event.mouse(); - // Mozilla-based browsers fire successive mousemove events with - // the same coordinates, prevent needless redrawing (moz bug?) - if (this._lastPointer && (MochiKit.Base.repr(this._lastPointer.page) == - MochiKit.Base.repr(pointer.page))) { - return; - } - this._lastPointer = pointer; - this.activeDraggable.updateDrag(event, pointer); - }, - - endDrag: function (event) { - if (!this.activeDraggable) { - return; - } - this._lastPointer = null; - this.activeDraggable.endDrag(event); - this.activeDraggable = null; - }, - - keyPress: function (event) { - if (this.activeDraggable) { - this.activeDraggable.keyPress(event); - } - }, - - notify: function (eventName, draggable, event) { - MochiKit.Signal.signal(this, eventName, draggable, event); - } -}; - -/** @id MochiKit.DragAndDrop.Draggable */ -MochiKit.DragAndDrop.Draggable = function (element, options) { - var cls = arguments.callee; - if (!(this instanceof cls)) { - return new cls(element, options); - } - this.__init__(element, options); -}; - -MochiKit.DragAndDrop.Draggable.prototype = { - /*** - - A draggable object. Simple instantiate : - - new MochiKit.DragAndDrop.Draggable('myelement'); - - ***/ - __class__ : MochiKit.DragAndDrop.Draggable, - - __init__: function (element, /* optional */options) { - var v = MochiKit.Visual; - var b = MochiKit.Base; - options = b.update({ - - /** @id MochiKit.DragAndDrop.handle */ - handle: false, - - /** @id MochiKit.DragAndDrop.starteffect */ - starteffect: function (innerelement) { - this._savedOpacity = MochiKit.Style.getStyle(innerelement, 'opacity') || 1.0; - new v.Opacity(innerelement, {duration:0.2, from:this._savedOpacity, to:0.7}); - }, - /** @id MochiKit.DragAndDrop.reverteffect */ - reverteffect: function (innerelement, top_offset, left_offset) { - var dur = Math.sqrt(Math.abs(top_offset^2) + - Math.abs(left_offset^2))*0.02; - return new v.Move(innerelement, - {x: -left_offset, y: -top_offset, duration: dur}); - }, - - /** @id MochiKit.DragAndDrop.endeffect */ - endeffect: function (innerelement) { - new v.Opacity(innerelement, {duration:0.2, from:0.7, to:this._savedOpacity}); - }, - - /** @id MochiKit.DragAndDrop.onchange */ - onchange: b.noop, - - /** @id MochiKit.DragAndDrop.zindex */ - zindex: 1000, - - /** @id MochiKit.DragAndDrop.revert */ - revert: false, - - /** @id MochiKit.DragAndDrop.scroll */ - scroll: false, - - /** @id MochiKit.DragAndDrop.scrollSensitivity */ - scrollSensitivity: 20, - - /** @id MochiKit.DragAndDrop.scrollSpeed */ - scrollSpeed: 15, - // false, or xy or [x, y] or function (x, y){return [x, y];} - - /** @id MochiKit.DragAndDrop.snap */ - snap: false - }, options); - - var d = MochiKit.DOM; - this.element = d.getElement(element); - - if (options.handle && (typeof(options.handle) == 'string')) { - this.handle = d.getFirstElementByTagAndClassName(null, - options.handle, this.element); - } - if (!this.handle) { - this.handle = d.getElement(options.handle); - } - if (!this.handle) { - this.handle = this.element; - } - - if (options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) { - options.scroll = d.getElement(options.scroll); - this._isScrollChild = MochiKit.DOM.isChildNode(this.element, options.scroll); - } - - MochiKit.Style.makePositioned(this.element); // fix IE - - this.delta = this.currentDelta(); - this.options = options; - this.dragging = false; - - this.eventMouseDown = MochiKit.Signal.connect(this.handle, - 'onmousedown', this, this.initDrag); - MochiKit.DragAndDrop.Draggables.register(this); - }, - - /** @id MochiKit.DragAndDrop.destroy */ - destroy: function () { - MochiKit.Signal.disconnect(this.eventMouseDown); - MochiKit.DragAndDrop.Draggables.unregister(this); - }, - - /** @id MochiKit.DragAndDrop.currentDelta */ - currentDelta: function () { - var s = MochiKit.Style.getStyle; - return [ - parseInt(s(this.element, 'left') || '0'), - parseInt(s(this.element, 'top') || '0')]; - }, - - /** @id MochiKit.DragAndDrop.initDrag */ - initDrag: function (event) { - if (!event.mouse().button.left) { - return; - } - // abort on form elements, fixes a Firefox issue - var src = event.target(); - var tagName = (src.tagName || '').toUpperCase(); - if (tagName === 'INPUT' || tagName === 'SELECT' || - tagName === 'OPTION' || tagName === 'BUTTON' || - tagName === 'TEXTAREA') { - return; - } - - if (this._revert) { - this._revert.cancel(); - this._revert = null; - } - - var pointer = event.mouse(); - var pos = MochiKit.Position.cumulativeOffset(this.element); - this.offset = [pointer.page.x - pos.x, pointer.page.y - pos.y]; - - MochiKit.DragAndDrop.Draggables.activate(this); - event.stop(); - }, - - /** @id MochiKit.DragAndDrop.startDrag */ - startDrag: function (event) { - this.dragging = true; - if (this.options.selectclass) { - MochiKit.DOM.addElementClass(this.element, - this.options.selectclass); - } - if (this.options.zindex) { - this.originalZ = parseInt(MochiKit.Style.getStyle(this.element, - 'z-index') || '0'); - this.element.style.zIndex = this.options.zindex; - } - - if (this.options.ghosting) { - this._clone = this.element.cloneNode(true); - this.ghostPosition = MochiKit.Position.absolutize(this.element); - this.element.parentNode.insertBefore(this._clone, this.element); - } - - if (this.options.scroll) { - if (this.options.scroll == window) { - var where = this._getWindowScroll(this.options.scroll); - this.originalScrollLeft = where.left; - this.originalScrollTop = where.top; - } else { - this.originalScrollLeft = this.options.scroll.scrollLeft; - this.originalScrollTop = this.options.scroll.scrollTop; - } - } - - MochiKit.DragAndDrop.Droppables.prepare(this.element); - MochiKit.DragAndDrop.Draggables.notify('start', this, event); - if (this.options.starteffect) { - this.options.starteffect(this.element); - } - }, - - /** @id MochiKit.DragAndDrop.updateDrag */ - updateDrag: function (event, pointer) { - if (!this.dragging) { - this.startDrag(event); - } - MochiKit.Position.prepare(); - MochiKit.DragAndDrop.Droppables.show(pointer, this.element); - MochiKit.DragAndDrop.Draggables.notify('drag', this, event); - this.draw(pointer); - this.options.onchange(this); - - if (this.options.scroll) { - this.stopScrolling(); - var p, q; - if (this.options.scroll == window) { - var s = this._getWindowScroll(this.options.scroll); - p = new MochiKit.Style.Coordinates(s.left, s.top); - q = new MochiKit.Style.Coordinates(s.left + s.width, - s.top + s.height); - } else { - p = MochiKit.Position.page(this.options.scroll); - p.x += this.options.scroll.scrollLeft; - p.y += this.options.scroll.scrollTop; - p.x += (window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0); - p.y += (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0); - q = new MochiKit.Style.Coordinates(p.x + this.options.scroll.offsetWidth, - p.y + this.options.scroll.offsetHeight); - } - var speed = [0, 0]; - if (pointer.page.x > (q.x - this.options.scrollSensitivity)) { - speed[0] = pointer.page.x - (q.x - this.options.scrollSensitivity); - } else if (pointer.page.x < (p.x + this.options.scrollSensitivity)) { - speed[0] = pointer.page.x - (p.x + this.options.scrollSensitivity); - } - if (pointer.page.y > (q.y - this.options.scrollSensitivity)) { - speed[1] = pointer.page.y - (q.y - this.options.scrollSensitivity); - } else if (pointer.page.y < (p.y + this.options.scrollSensitivity)) { - speed[1] = pointer.page.y - (p.y + this.options.scrollSensitivity); - } - this.startScrolling(speed); - } - - // fix AppleWebKit rendering - if (/AppleWebKit/.test(navigator.appVersion)) { - window.scrollBy(0, 0); - } - event.stop(); - }, - - /** @id MochiKit.DragAndDrop.finishDrag */ - finishDrag: function (event, success) { - var dr = MochiKit.DragAndDrop; - this.dragging = false; - if (this.options.selectclass) { - MochiKit.DOM.removeElementClass(this.element, - this.options.selectclass); - } - - if (this.options.ghosting) { - // XXX: from a user point of view, it would be better to remove - // the node only *after* the MochiKit.Visual.Move end when used - // with revert. - MochiKit.Position.relativize(this.element, this.ghostPosition); - MochiKit.DOM.removeElement(this._clone); - this._clone = null; - } - - if (success) { - dr.Droppables.fire(event, this.element); - } - dr.Draggables.notify('end', this, event); - - var revert = this.options.revert; - if (revert && typeof(revert) == 'function') { - revert = revert(this.element); - } - - var d = this.currentDelta(); - if (revert && this.options.reverteffect) { - this._revert = this.options.reverteffect(this.element, - d[1] - this.delta[1], d[0] - this.delta[0]); - } else { - this.delta = d; - } - - if (this.options.zindex) { - this.element.style.zIndex = this.originalZ; - } - - if (this.options.endeffect) { - this.options.endeffect(this.element); - } - - dr.Draggables.deactivate(); - dr.Droppables.reset(this.element); - }, - - /** @id MochiKit.DragAndDrop.keyPress */ - keyPress: function (event) { - if (event.key().string != "KEY_ESCAPE") { - return; - } - this.finishDrag(event, false); - event.stop(); - }, - - /** @id MochiKit.DragAndDrop.endDrag */ - endDrag: function (event) { - if (!this.dragging) { - return; - } - this.stopScrolling(); - this.finishDrag(event, true); - event.stop(); - }, - - /** @id MochiKit.DragAndDrop.draw */ - draw: function (point) { - var pos = MochiKit.Position.cumulativeOffset(this.element); - var d = this.currentDelta(); - pos.x -= d[0]; - pos.y -= d[1]; - - if (this.options.scroll && (this.options.scroll != window && this._isScrollChild)) { - pos.x -= this.options.scroll.scrollLeft - this.originalScrollLeft; - pos.y -= this.options.scroll.scrollTop - this.originalScrollTop; - } - - var p = [point.page.x - pos.x - this.offset[0], - point.page.y - pos.y - this.offset[1]]; - - if (this.options.snap) { - if (typeof(this.options.snap) == 'function') { - p = this.options.snap(p[0], p[1]); - } else { - if (this.options.snap instanceof Array) { - var i = -1; - p = MochiKit.Base.map(MochiKit.Base.bind(function (v) { - i += 1; - return Math.round(v/this.options.snap[i]) * - this.options.snap[i]; - }, this), p); - } else { - p = MochiKit.Base.map(MochiKit.Base.bind(function (v) { - return Math.round(v/this.options.snap) * - this.options.snap; - }, this), p); - } - } - } - var style = this.element.style; - if ((!this.options.constraint) || - (this.options.constraint == 'horizontal')) { - style.left = p[0] + 'px'; - } - if ((!this.options.constraint) || - (this.options.constraint == 'vertical')) { - style.top = p[1] + 'px'; - } - if (style.visibility == 'hidden') { - style.visibility = ''; // fix gecko rendering - } - }, - - /** @id MochiKit.DragAndDrop.stopScrolling */ - stopScrolling: function () { - if (this.scrollInterval) { - clearInterval(this.scrollInterval); - this.scrollInterval = null; - MochiKit.DragAndDrop.Draggables._lastScrollPointer = null; - } - }, - - /** @id MochiKit.DragAndDrop.startScrolling */ - startScrolling: function (speed) { - if (!speed[0] && !speed[1]) { - return; - } - this.scrollSpeed = [speed[0] * this.options.scrollSpeed, - speed[1] * this.options.scrollSpeed]; - this.lastScrolled = new Date(); - this.scrollInterval = setInterval(MochiKit.Base.bind(this.scroll, this), 10); - }, - - /** @id MochiKit.DragAndDrop.scroll */ - scroll: function () { - var current = new Date(); - var delta = current - this.lastScrolled; - this.lastScrolled = current; - - if (this.options.scroll == window) { - var s = this._getWindowScroll(this.options.scroll); - if (this.scrollSpeed[0] || this.scrollSpeed[1]) { - var dm = delta / 1000; - this.options.scroll.scrollTo(s.left + dm * this.scrollSpeed[0], - s.top + dm * this.scrollSpeed[1]); - } - } else { - this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; - this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000; - } - - var d = MochiKit.DragAndDrop; - - MochiKit.Position.prepare(); - d.Droppables.show(d.Draggables._lastPointer, this.element); - d.Draggables.notify('drag', this); - if (this._isScrollChild) { - d.Draggables._lastScrollPointer = d.Draggables._lastScrollPointer || d.Draggables._lastPointer; - d.Draggables._lastScrollPointer.x += this.scrollSpeed[0] * delta / 1000; - d.Draggables._lastScrollPointer.y += this.scrollSpeed[1] * delta / 1000; - if (d.Draggables._lastScrollPointer.x < 0) { - d.Draggables._lastScrollPointer.x = 0; - } - if (d.Draggables._lastScrollPointer.y < 0) { - d.Draggables._lastScrollPointer.y = 0; - } - this.draw(d.Draggables._lastScrollPointer); - } - - this.options.onchange(this); - }, - - _getWindowScroll: function (win) { - var vp, w, h; - MochiKit.DOM.withWindow(win, function () { - vp = MochiKit.Style.getViewportPosition(win.document); - }); - if (win.innerWidth) { - w = win.innerWidth; - h = win.innerHeight; - } else if (win.document.documentElement && win.document.documentElement.clientWidth) { - w = win.document.documentElement.clientWidth; - h = win.document.documentElement.clientHeight; - } else { - w = win.document.body.offsetWidth; - h = win.document.body.offsetHeight; - } - return {top: vp.y, left: vp.x, width: w, height: h}; - }, - - /** @id MochiKit.DragAndDrop.repr */ - repr: function () { - return '[' + this.__class__.NAME + ", options:" + MochiKit.Base.repr(this.options) + "]"; - } -}; - -MochiKit.DragAndDrop.__new__ = function () { - MochiKit.Base.nameFunctions(this); - - this.EXPORT_TAGS = { - ":common": this.EXPORT, - ":all": MochiKit.Base.concat(this.EXPORT, this.EXPORT_OK) - }; -}; - -MochiKit.DragAndDrop.__new__(); - -MochiKit.Base._exportSymbols(this, MochiKit.DragAndDrop); - diff --git a/static/MochiKit/Format.js b/static/MochiKit/Format.js deleted file mode 100644 index 36b7153..0000000 --- a/static/MochiKit/Format.js +++ /dev/null @@ -1,304 +0,0 @@ -/*** - -MochiKit.Format 1.4.2 - -See for documentation, downloads, license, etc. - -(c) 2005 Bob Ippolito. All rights Reserved. - -***/ - -MochiKit.Base._deps('Format', ['Base']); - -MochiKit.Format.NAME = "MochiKit.Format"; -MochiKit.Format.VERSION = "1.4.2"; -MochiKit.Format.__repr__ = function () { - return "[" + this.NAME + " " + this.VERSION + "]"; -}; -MochiKit.Format.toString = function () { - return this.__repr__(); -}; - -MochiKit.Format._numberFormatter = function (placeholder, header, footer, locale, isPercent, precision, leadingZeros, separatorAt, trailingZeros) { - return function (num) { - num = parseFloat(num); - if (typeof(num) == "undefined" || num === null || isNaN(num)) { - return placeholder; - } - var curheader = header; - var curfooter = footer; - if (num < 0) { - num = -num; - } else { - curheader = curheader.replace(/-/, ""); - } - var me = arguments.callee; - var fmt = MochiKit.Format.formatLocale(locale); - if (isPercent) { - num = num * 100.0; - curfooter = fmt.percent + curfooter; - } - num = MochiKit.Format.roundToFixed(num, precision); - var parts = num.split(/\./); - var whole = parts[0]; - var frac = (parts.length == 1) ? "" : parts[1]; - var res = ""; - while (whole.length < leadingZeros) { - whole = "0" + whole; - } - if (separatorAt) { - while (whole.length > separatorAt) { - var i = whole.length - separatorAt; - //res = res + fmt.separator + whole.substring(i, whole.length); - res = fmt.separator + whole.substring(i, whole.length) + res; - whole = whole.substring(0, i); - } - } - res = whole + res; - if (precision > 0) { - while (frac.length < trailingZeros) { - frac = frac + "0"; - } - res = res + fmt.decimal + frac; - } - return curheader + res + curfooter; - }; -}; - -/** @id MochiKit.Format.numberFormatter */ -MochiKit.Format.numberFormatter = function (pattern, placeholder/* = "" */, locale/* = "default" */) { - // http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html - // | 0 | leading or trailing zeros - // | # | just the number - // | , | separator - // | . | decimal separator - // | % | Multiply by 100 and format as percent - if (typeof(placeholder) == "undefined") { - placeholder = ""; - } - var match = pattern.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/); - if (!match) { - throw TypeError("Invalid pattern"); - } - var header = pattern.substr(0, match.index); - var footer = pattern.substr(match.index + match[0].length); - if (header.search(/-/) == -1) { - header = header + "-"; - } - var whole = match[1]; - var frac = (typeof(match[2]) == "string" && match[2] != "") ? match[2] : ""; - var isPercent = (typeof(match[3]) == "string" && match[3] != ""); - var tmp = whole.split(/,/); - var separatorAt; - if (typeof(locale) == "undefined") { - locale = "default"; - } - if (tmp.length == 1) { - separatorAt = null; - } else { - separatorAt = tmp[1].length; - } - var leadingZeros = whole.length - whole.replace(/0/g, "").length; - var trailingZeros = frac.length - frac.replace(/0/g, "").length; - var precision = frac.length; - var rval = MochiKit.Format._numberFormatter( - placeholder, header, footer, locale, isPercent, precision, - leadingZeros, separatorAt, trailingZeros - ); - var m = MochiKit.Base; - if (m) { - var fn = arguments.callee; - var args = m.concat(arguments); - rval.repr = function () { - return [ - self.NAME, - "(", - map(m.repr, args).join(", "), - ")" - ].join(""); - }; - } - return rval; -}; - -/** @id MochiKit.Format.formatLocale */ -MochiKit.Format.formatLocale = function (locale) { - if (typeof(locale) == "undefined" || locale === null) { - locale = "default"; - } - if (typeof(locale) == "string") { - var rval = MochiKit.Format.LOCALE[locale]; - if (typeof(rval) == "string") { - rval = arguments.callee(rval); - MochiKit.Format.LOCALE[locale] = rval; - } - return rval; - } else { - return locale; - } -}; - -/** @id MochiKit.Format.twoDigitAverage */ -MochiKit.Format.twoDigitAverage = function (numerator, denominator) { - if (denominator) { - var res = numerator / denominator; - if (!isNaN(res)) { - return MochiKit.Format.twoDigitFloat(res); - } - } - return "0"; -}; - -/** @id MochiKit.Format.twoDigitFloat */ -MochiKit.Format.twoDigitFloat = function (aNumber) { - var res = roundToFixed(aNumber, 2); - if (res.indexOf(".00") > 0) { - return res.substring(0, res.length - 3); - } else if (res.charAt(res.length - 1) == "0") { - return res.substring(0, res.length - 1); - } else { - return res; - } -}; - -/** @id MochiKit.Format.lstrip */ -MochiKit.Format.lstrip = function (str, /* optional */chars) { - str = str + ""; - if (typeof(str) != "string") { - return null; - } - if (!chars) { - return str.replace(/^\s+/, ""); - } else { - return str.replace(new RegExp("^[" + chars + "]+"), ""); - } -}; - -/** @id MochiKit.Format.rstrip */ -MochiKit.Format.rstrip = function (str, /* optional */chars) { - str = str + ""; - if (typeof(str) != "string") { - return null; - } - if (!chars) { - return str.replace(/\s+$/, ""); - } else { - return str.replace(new RegExp("[" + chars + "]+$"), ""); - } -}; - -/** @id MochiKit.Format.strip */ -MochiKit.Format.strip = function (str, /* optional */chars) { - var self = MochiKit.Format; - return self.rstrip(self.lstrip(str, chars), chars); -}; - -/** @id MochiKit.Format.truncToFixed */ -MochiKit.Format.truncToFixed = function (aNumber, precision) { - var res = Math.floor(aNumber).toFixed(0); - if (aNumber < 0) { - res = Math.ceil(aNumber).toFixed(0); - if (res.charAt(0) != "-" && precision > 0) { - res = "-" + res; - } - } - if (res.indexOf("e") < 0 && precision > 0) { - var tail = aNumber.toString(); - if (tail.indexOf("e") > 0) { - tail = "."; - } else if (tail.indexOf(".") < 0) { - tail = "."; - } else { - tail = tail.substring(tail.indexOf(".")); - } - if (tail.length - 1 > precision) { - tail = tail.substring(0, precision + 1); - } - while (tail.length - 1 < precision) { - tail += "0"; - } - res += tail; - } - return res; -}; - -/** @id MochiKit.Format.roundToFixed */ -MochiKit.Format.roundToFixed = function (aNumber, precision) { - var upper = Math.abs(aNumber) + 0.5 * Math.pow(10, -precision); - var res = MochiKit.Format.truncToFixed(upper, precision); - if (aNumber < 0) { - res = "-" + res; - } - return res; -}; - -/** @id MochiKit.Format.percentFormat */ -MochiKit.Format.percentFormat = function (aNumber) { - return MochiKit.Format.twoDigitFloat(100 * aNumber) + '%'; -}; - -MochiKit.Format.EXPORT = [ - "truncToFixed", - "roundToFixed", - "numberFormatter", - "formatLocale", - "twoDigitAverage", - "twoDigitFloat", - "percentFormat", - "lstrip", - "rstrip", - "strip" -]; - -MochiKit.Format.LOCALE = { - en_US: {separator: ",", decimal: ".", percent: "%"}, - de_DE: {separator: ".", decimal: ",", percent: "%"}, - pt_BR: {separator: ".", decimal: ",", percent: "%"}, - fr_FR: {separator: " ", decimal: ",", percent: "%"}, - "default": "en_US" -}; - -MochiKit.Format.EXPORT_OK = []; -MochiKit.Format.EXPORT_TAGS = { - ':all': MochiKit.Format.EXPORT, - ':common': MochiKit.Format.EXPORT -}; - -MochiKit.Format.__new__ = function () { - // MochiKit.Base.nameFunctions(this); - var base = this.NAME + "."; - var k, v, o; - for (k in this.LOCALE) { - o = this.LOCALE[k]; - if (typeof(o) == "object") { - o.repr = function () { return this.NAME; }; - o.NAME = base + "LOCALE." + k; - } - } - for (k in this) { - o = this[k]; - if (typeof(o) == 'function' && typeof(o.NAME) == 'undefined') { - try { - o.NAME = base + k; - } catch (e) { - // pass - } - } - } -}; - -MochiKit.Format.__new__(); - -if (typeof(MochiKit.Base) != "undefined") { - MochiKit.Base._exportSymbols(this, MochiKit.Format); -} else { - (function (globals, module) { - if ((typeof(JSAN) == 'undefined' && typeof(dojo) == 'undefined') - || (MochiKit.__export__ === false)) { - var all = module.EXPORT_TAGS[":all"]; - for (var i = 0; i < all.length; i++) { - globals[all[i]] = module[all[i]]; - } - } - })(this, MochiKit.Format); -} diff --git a/static/MochiKit/Iter.js b/static/MochiKit/Iter.js deleted file mode 100644 index 99f3155..0000000 --- a/static/MochiKit/Iter.js +++ /dev/null @@ -1,844 +0,0 @@ -/*** - -MochiKit.Iter 1.4.2 - -See for documentation, downloads, license, etc. - -(c) 2005 Bob Ippolito. All rights Reserved. - -***/ - -MochiKit.Base._deps('Iter', ['Base']); - -MochiKit.Iter.NAME = "MochiKit.Iter"; -MochiKit.Iter.VERSION = "1.4.2"; -MochiKit.Base.update(MochiKit.Iter, { - __repr__: function () { - return "[" + this.NAME + " " + this.VERSION + "]"; - }, - toString: function () { - return this.__repr__(); - }, - - /** @id MochiKit.Iter.registerIteratorFactory */ - registerIteratorFactory: function (name, check, iterfactory, /* optional */ override) { - MochiKit.Iter.iteratorRegistry.register(name, check, iterfactory, override); - }, - - /** @id MochiKit.Iter.isIterable */ - isIterable: function(o) { - return o != null && - (typeof(o.next) == "function" || typeof(o.iter) == "function"); - }, - - /** @id MochiKit.Iter.iter */ - iter: function (iterable, /* optional */ sentinel) { - var self = MochiKit.Iter; - if (arguments.length == 2) { - return self.takewhile( - function (a) { return a != sentinel; }, - iterable - ); - } - if (typeof(iterable.next) == 'function') { - return iterable; - } else if (typeof(iterable.iter) == 'function') { - return iterable.iter(); - /* - } else if (typeof(iterable.__iterator__) == 'function') { - // - // XXX: We can't support JavaScript 1.7 __iterator__ directly - // because of Object.prototype.__iterator__ - // - return iterable.__iterator__(); - */ - } - - try { - return self.iteratorRegistry.match(iterable); - } catch (e) { - var m = MochiKit.Base; - if (e == m.NotFound) { - e = new TypeError(typeof(iterable) + ": " + m.repr(iterable) + " is not iterable"); - } - throw e; - } - }, - - /** @id MochiKit.Iter.count */ - count: function (n) { - if (!n) { - n = 0; - } - var m = MochiKit.Base; - return { - repr: function () { return "count(" + n + ")"; }, - toString: m.forwardCall("repr"), - next: m.counter(n) - }; - }, - - /** @id MochiKit.Iter.cycle */ - cycle: function (p) { - var self = MochiKit.Iter; - var m = MochiKit.Base; - var lst = []; - var iterator = self.iter(p); - return { - repr: function () { return "cycle(...)"; }, - toString: m.forwardCall("repr"), - next: function () { - try { - var rval = iterator.next(); - lst.push(rval); - return rval; - } catch (e) { - if (e != self.StopIteration) { - throw e; - } - if (lst.length === 0) { - this.next = function () { - throw self.StopIteration; - }; - } else { - var i = -1; - this.next = function () { - i = (i + 1) % lst.length; - return lst[i]; - }; - } - return this.next(); - } - } - }; - }, - - /** @id MochiKit.Iter.repeat */ - repeat: function (elem, /* optional */n) { - var m = MochiKit.Base; - if (typeof(n) == 'undefined') { - return { - repr: function () { - return "repeat(" + m.repr(elem) + ")"; - }, - toString: m.forwardCall("repr"), - next: function () { - return elem; - } - }; - } - return { - repr: function () { - return "repeat(" + m.repr(elem) + ", " + n + ")"; - }, - toString: m.forwardCall("repr"), - next: function () { - if (n <= 0) { - throw MochiKit.Iter.StopIteration; - } - n -= 1; - return elem; - } - }; - }, - - /** @id MochiKit.Iter.next */ - next: function (iterator) { - return iterator.next(); - }, - - /** @id MochiKit.Iter.izip */ - izip: function (p, q/*, ...*/) { - var m = MochiKit.Base; - var self = MochiKit.Iter; - var next = self.next; - var iterables = m.map(self.iter, arguments); - return { - repr: function () { return "izip(...)"; }, - toString: m.forwardCall("repr"), - next: function () { return m.map(next, iterables); } - }; - }, - - /** @id MochiKit.Iter.ifilter */ - ifilter: function (pred, seq) { - var m = MochiKit.Base; - seq = MochiKit.Iter.iter(seq); - if (pred === null) { - pred = m.operator.truth; - } - return { - repr: function () { return "ifilter(...)"; }, - toString: m.forwardCall("repr"), - next: function () { - while (true) { - var rval = seq.next(); - if (pred(rval)) { - return rval; - } - } - // mozilla warnings aren't too bright - return undefined; - } - }; - }, - - /** @id MochiKit.Iter.ifilterfalse */ - ifilterfalse: function (pred, seq) { - var m = MochiKit.Base; - seq = MochiKit.Iter.iter(seq); - if (pred === null) { - pred = m.operator.truth; - } - return { - repr: function () { return "ifilterfalse(...)"; }, - toString: m.forwardCall("repr"), - next: function () { - while (true) { - var rval = seq.next(); - if (!pred(rval)) { - return rval; - } - } - // mozilla warnings aren't too bright - return undefined; - } - }; - }, - - /** @id MochiKit.Iter.islice */ - islice: function (seq/*, [start,] stop[, step] */) { - var self = MochiKit.Iter; - var m = MochiKit.Base; - seq = self.iter(seq); - var start = 0; - var stop = 0; - var step = 1; - var i = -1; - if (arguments.length == 2) { - stop = arguments[1]; - } else if (arguments.length == 3) { - start = arguments[1]; - stop = arguments[2]; - } else { - start = arguments[1]; - stop = arguments[2]; - step = arguments[3]; - } - return { - repr: function () { - return "islice(" + ["...", start, stop, step].join(", ") + ")"; - }, - toString: m.forwardCall("repr"), - next: function () { - var rval; - while (i < start) { - rval = seq.next(); - i++; - } - if (start >= stop) { - throw self.StopIteration; - } - start += step; - return rval; - } - }; - }, - - /** @id MochiKit.Iter.imap */ - imap: function (fun, p, q/*, ...*/) { - var m = MochiKit.Base; - var self = MochiKit.Iter; - var iterables = m.map(self.iter, m.extend(null, arguments, 1)); - var map = m.map; - var next = self.next; - return { - repr: function () { return "imap(...)"; }, - toString: m.forwardCall("repr"), - next: function () { - return fun.apply(this, map(next, iterables)); - } - }; - }, - - /** @id MochiKit.Iter.applymap */ - applymap: function (fun, seq, self) { - seq = MochiKit.Iter.iter(seq); - var m = MochiKit.Base; - return { - repr: function () { return "applymap(...)"; }, - toString: m.forwardCall("repr"), - next: function () { - return fun.apply(self, seq.next()); - } - }; - }, - - /** @id MochiKit.Iter.chain */ - chain: function (p, q/*, ...*/) { - // dumb fast path - var self = MochiKit.Iter; - var m = MochiKit.Base; - if (arguments.length == 1) { - return self.iter(arguments[0]); - } - var argiter = m.map(self.iter, arguments); - return { - repr: function () { return "chain(...)"; }, - toString: m.forwardCall("repr"), - next: function () { - while (argiter.length > 1) { - try { - var result = argiter[0].next(); - return result; - } catch (e) { - if (e != self.StopIteration) { - throw e; - } - argiter.shift(); - var result = argiter[0].next(); - return result; - } - } - if (argiter.length == 1) { - // optimize last element - var arg = argiter.shift(); - this.next = m.bind("next", arg); - return this.next(); - } - throw self.StopIteration; - } - }; - }, - - /** @id MochiKit.Iter.takewhile */ - takewhile: function (pred, seq) { - var self = MochiKit.Iter; - seq = self.iter(seq); - return { - repr: function () { return "takewhile(...)"; }, - toString: MochiKit.Base.forwardCall("repr"), - next: function () { - var rval = seq.next(); - if (!pred(rval)) { - this.next = function () { - throw self.StopIteration; - }; - this.next(); - } - return rval; - } - }; - }, - - /** @id MochiKit.Iter.dropwhile */ - dropwhile: function (pred, seq) { - seq = MochiKit.Iter.iter(seq); - var m = MochiKit.Base; - var bind = m.bind; - return { - "repr": function () { return "dropwhile(...)"; }, - "toString": m.forwardCall("repr"), - "next": function () { - while (true) { - var rval = seq.next(); - if (!pred(rval)) { - break; - } - } - this.next = bind("next", seq); - return rval; - } - }; - }, - - _tee: function (ident, sync, iterable) { - sync.pos[ident] = -1; - var m = MochiKit.Base; - var listMin = m.listMin; - return { - repr: function () { return "tee(" + ident + ", ...)"; }, - toString: m.forwardCall("repr"), - next: function () { - var rval; - var i = sync.pos[ident]; - - if (i == sync.max) { - rval = iterable.next(); - sync.deque.push(rval); - sync.max += 1; - sync.pos[ident] += 1; - } else { - rval = sync.deque[i - sync.min]; - sync.pos[ident] += 1; - if (i == sync.min && listMin(sync.pos) != sync.min) { - sync.min += 1; - sync.deque.shift(); - } - } - return rval; - } - }; - }, - - /** @id MochiKit.Iter.tee */ - tee: function (iterable, n/* = 2 */) { - var rval = []; - var sync = { - "pos": [], - "deque": [], - "max": -1, - "min": -1 - }; - if (arguments.length == 1 || typeof(n) == "undefined" || n === null) { - n = 2; - } - var self = MochiKit.Iter; - iterable = self.iter(iterable); - var _tee = self._tee; - for (var i = 0; i < n; i++) { - rval.push(_tee(i, sync, iterable)); - } - return rval; - }, - - /** @id MochiKit.Iter.list */ - list: function (iterable) { - // Fast-path for Array and Array-like - var rval; - if (iterable instanceof Array) { - return iterable.slice(); - } - // this is necessary to avoid a Safari crash - if (typeof(iterable) == "function" && - !(iterable instanceof Function) && - typeof(iterable.length) == 'number') { - rval = []; - for (var i = 0; i < iterable.length; i++) { - rval.push(iterable[i]); - } - return rval; - } - - var self = MochiKit.Iter; - iterable = self.iter(iterable); - var rval = []; - var a_val; - try { - while (true) { - a_val = iterable.next(); - rval.push(a_val); - } - } catch (e) { - if (e != self.StopIteration) { - throw e; - } - return rval; - } - // mozilla warnings aren't too bright - return undefined; - }, - - - /** @id MochiKit.Iter.reduce */ - reduce: function (fn, iterable, /* optional */initial) { - var i = 0; - var x = initial; - var self = MochiKit.Iter; - iterable = self.iter(iterable); - if (arguments.length < 3) { - try { - x = iterable.next(); - } catch (e) { - if (e == self.StopIteration) { - e = new TypeError("reduce() of empty sequence with no initial value"); - } - throw e; - } - i++; - } - try { - while (true) { - x = fn(x, iterable.next()); - } - } catch (e) { - if (e != self.StopIteration) { - throw e; - } - } - return x; - }, - - /** @id MochiKit.Iter.range */ - range: function (/* [start,] stop[, step] */) { - var start = 0; - var stop = 0; - var step = 1; - if (arguments.length == 1) { - stop = arguments[0]; - } else if (arguments.length == 2) { - start = arguments[0]; - stop = arguments[1]; - } else if (arguments.length == 3) { - start = arguments[0]; - stop = arguments[1]; - step = arguments[2]; - } else { - throw new TypeError("range() takes 1, 2, or 3 arguments!"); - } - if (step === 0) { - throw new TypeError("range() step must not be 0"); - } - return { - next: function () { - if ((step > 0 && start >= stop) || (step < 0 && start <= stop)) { - throw MochiKit.Iter.StopIteration; - } - var rval = start; - start += step; - return rval; - }, - repr: function () { - return "range(" + [start, stop, step].join(", ") + ")"; - }, - toString: MochiKit.Base.forwardCall("repr") - }; - }, - - /** @id MochiKit.Iter.sum */ - sum: function (iterable, start/* = 0 */) { - if (typeof(start) == "undefined" || start === null) { - start = 0; - } - var x = start; - var self = MochiKit.Iter; - iterable = self.iter(iterable); - try { - while (true) { - x += iterable.next(); - } - } catch (e) { - if (e != self.StopIteration) { - throw e; - } - } - return x; - }, - - /** @id MochiKit.Iter.exhaust */ - exhaust: function (iterable) { - var self = MochiKit.Iter; - iterable = self.iter(iterable); - try { - while (true) { - iterable.next(); - } - } catch (e) { - if (e != self.StopIteration) { - throw e; - } - } - }, - - /** @id MochiKit.Iter.forEach */ - forEach: function (iterable, func, /* optional */obj) { - var m = MochiKit.Base; - var self = MochiKit.Iter; - if (arguments.length > 2) { - func = m.bind(func, obj); - } - // fast path for array - if (m.isArrayLike(iterable) && !self.isIterable(iterable)) { - try { - for (var i = 0; i < iterable.length; i++) { - func(iterable[i]); - } - } catch (e) { - if (e != self.StopIteration) { - throw e; - } - } - } else { - self.exhaust(self.imap(func, iterable)); - } - }, - - /** @id MochiKit.Iter.every */ - every: function (iterable, func) { - var self = MochiKit.Iter; - try { - self.ifilterfalse(func, iterable).next(); - return false; - } catch (e) { - if (e != self.StopIteration) { - throw e; - } - return true; - } - }, - - /** @id MochiKit.Iter.sorted */ - sorted: function (iterable, /* optional */cmp) { - var rval = MochiKit.Iter.list(iterable); - if (arguments.length == 1) { - cmp = MochiKit.Base.compare; - } - rval.sort(cmp); - return rval; - }, - - /** @id MochiKit.Iter.reversed */ - reversed: function (iterable) { - var rval = MochiKit.Iter.list(iterable); - rval.reverse(); - return rval; - }, - - /** @id MochiKit.Iter.some */ - some: function (iterable, func) { - var self = MochiKit.Iter; - try { - self.ifilter(func, iterable).next(); - return true; - } catch (e) { - if (e != self.StopIteration) { - throw e; - } - return false; - } - }, - - /** @id MochiKit.Iter.iextend */ - iextend: function (lst, iterable) { - var m = MochiKit.Base; - var self = MochiKit.Iter; - if (m.isArrayLike(iterable) && !self.isIterable(iterable)) { - // fast-path for array-like - for (var i = 0; i < iterable.length; i++) { - lst.push(iterable[i]); - } - } else { - iterable = self.iter(iterable); - try { - while (true) { - lst.push(iterable.next()); - } - } catch (e) { - if (e != self.StopIteration) { - throw e; - } - } - } - return lst; - }, - - /** @id MochiKit.Iter.groupby */ - groupby: function(iterable, /* optional */ keyfunc) { - var m = MochiKit.Base; - var self = MochiKit.Iter; - if (arguments.length < 2) { - keyfunc = m.operator.identity; - } - iterable = self.iter(iterable); - - // shared - var pk = undefined; - var k = undefined; - var v; - - function fetch() { - v = iterable.next(); - k = keyfunc(v); - }; - - function eat() { - var ret = v; - v = undefined; - return ret; - }; - - var first = true; - var compare = m.compare; - return { - repr: function () { return "groupby(...)"; }, - next: function() { - // iterator-next - - // iterate until meet next group - while (compare(k, pk) === 0) { - fetch(); - if (first) { - first = false; - break; - } - } - pk = k; - return [k, { - next: function() { - // subiterator-next - if (v == undefined) { // Is there something to eat? - fetch(); - } - if (compare(k, pk) !== 0) { - throw self.StopIteration; - } - return eat(); - } - }]; - } - }; - }, - - /** @id MochiKit.Iter.groupby_as_array */ - groupby_as_array: function (iterable, /* optional */ keyfunc) { - var m = MochiKit.Base; - var self = MochiKit.Iter; - if (arguments.length < 2) { - keyfunc = m.operator.identity; - } - - iterable = self.iter(iterable); - var result = []; - var first = true; - var prev_key; - var compare = m.compare; - while (true) { - try { - var value = iterable.next(); - var key = keyfunc(value); - } catch (e) { - if (e == self.StopIteration) { - break; - } - throw e; - } - if (first || compare(key, prev_key) !== 0) { - var values = []; - result.push([key, values]); - } - values.push(value); - first = false; - prev_key = key; - } - return result; - }, - - /** @id MochiKit.Iter.arrayLikeIter */ - arrayLikeIter: function (iterable) { - var i = 0; - return { - repr: function () { return "arrayLikeIter(...)"; }, - toString: MochiKit.Base.forwardCall("repr"), - next: function () { - if (i >= iterable.length) { - throw MochiKit.Iter.StopIteration; - } - return iterable[i++]; - } - }; - }, - - /** @id MochiKit.Iter.hasIterateNext */ - hasIterateNext: function (iterable) { - return (iterable && typeof(iterable.iterateNext) == "function"); - }, - - /** @id MochiKit.Iter.iterateNextIter */ - iterateNextIter: function (iterable) { - return { - repr: function () { return "iterateNextIter(...)"; }, - toString: MochiKit.Base.forwardCall("repr"), - next: function () { - var rval = iterable.iterateNext(); - if (rval === null || rval === undefined) { - throw MochiKit.Iter.StopIteration; - } - return rval; - } - }; - } -}); - - -MochiKit.Iter.EXPORT_OK = [ - "iteratorRegistry", - "arrayLikeIter", - "hasIterateNext", - "iterateNextIter" -]; - -MochiKit.Iter.EXPORT = [ - "StopIteration", - "registerIteratorFactory", - "iter", - "count", - "cycle", - "repeat", - "next", - "izip", - "ifilter", - "ifilterfalse", - "islice", - "imap", - "applymap", - "chain", - "takewhile", - "dropwhile", - "tee", - "list", - "reduce", - "range", - "sum", - "exhaust", - "forEach", - "every", - "sorted", - "reversed", - "some", - "iextend", - "groupby", - "groupby_as_array" -]; - -MochiKit.Iter.__new__ = function () { - var m = MochiKit.Base; - // Re-use StopIteration if exists (e.g. SpiderMonkey) - if (typeof(StopIteration) != "undefined") { - this.StopIteration = StopIteration; - } else { - /** @id MochiKit.Iter.StopIteration */ - this.StopIteration = new m.NamedError("StopIteration"); - } - this.iteratorRegistry = new m.AdapterRegistry(); - // Register the iterator factory for arrays - this.registerIteratorFactory( - "arrayLike", - m.isArrayLike, - this.arrayLikeIter - ); - - this.registerIteratorFactory( - "iterateNext", - this.hasIterateNext, - this.iterateNextIter - ); - - this.EXPORT_TAGS = { - ":common": this.EXPORT, - ":all": m.concat(this.EXPORT, this.EXPORT_OK) - }; - - m.nameFunctions(this); - -}; - -MochiKit.Iter.__new__(); - -// -// XXX: Internet Explorer blows -// -if (MochiKit.__export__) { - reduce = MochiKit.Iter.reduce; -} - -MochiKit.Base._exportSymbols(this, MochiKit.Iter); diff --git a/static/MochiKit/Logging.js b/static/MochiKit/Logging.js deleted file mode 100644 index 463ccd0..0000000 --- a/static/MochiKit/Logging.js +++ /dev/null @@ -1,315 +0,0 @@ -/*** - -MochiKit.Logging 1.4.2 - -See for documentation, downloads, license, etc. - -(c) 2005 Bob Ippolito. All rights Reserved. - -***/ - -MochiKit.Base._deps('Logging', ['Base']); - -MochiKit.Logging.NAME = "MochiKit.Logging"; -MochiKit.Logging.VERSION = "1.4.2"; -MochiKit.Logging.__repr__ = function () { - return "[" + this.NAME + " " + this.VERSION + "]"; -}; - -MochiKit.Logging.toString = function () { - return this.__repr__(); -}; - - -MochiKit.Logging.EXPORT = [ - "LogLevel", - "LogMessage", - "Logger", - "alertListener", - "logger", - "log", - "logError", - "logDebug", - "logFatal", - "logWarning" -]; - - -MochiKit.Logging.EXPORT_OK = [ - "logLevelAtLeast", - "isLogMessage", - "compareLogMessage" -]; - - -/** @id MochiKit.Logging.LogMessage */ -MochiKit.Logging.LogMessage = function (num, level, info) { - this.num = num; - this.level = level; - this.info = info; - this.timestamp = new Date(); -}; - -MochiKit.Logging.LogMessage.prototype = { - /** @id MochiKit.Logging.LogMessage.prototype.repr */ - repr: function () { - var m = MochiKit.Base; - return 'LogMessage(' + - m.map( - m.repr, - [this.num, this.level, this.info] - ).join(', ') + ')'; - }, - /** @id MochiKit.Logging.LogMessage.prototype.toString */ - toString: MochiKit.Base.forwardCall("repr") -}; - -MochiKit.Base.update(MochiKit.Logging, { - /** @id MochiKit.Logging.logLevelAtLeast */ - logLevelAtLeast: function (minLevel) { - var self = MochiKit.Logging; - if (typeof(minLevel) == 'string') { - minLevel = self.LogLevel[minLevel]; - } - return function (msg) { - var msgLevel = msg.level; - if (typeof(msgLevel) == 'string') { - msgLevel = self.LogLevel[msgLevel]; - } - return msgLevel >= minLevel; - }; - }, - - /** @id MochiKit.Logging.isLogMessage */ - isLogMessage: function (/* ... */) { - var LogMessage = MochiKit.Logging.LogMessage; - for (var i = 0; i < arguments.length; i++) { - if (!(arguments[i] instanceof LogMessage)) { - return false; - } - } - return true; - }, - - /** @id MochiKit.Logging.compareLogMessage */ - compareLogMessage: function (a, b) { - return MochiKit.Base.compare([a.level, a.info], [b.level, b.info]); - }, - - /** @id MochiKit.Logging.alertListener */ - alertListener: function (msg) { - alert( - "num: " + msg.num + - "\nlevel: " + msg.level + - "\ninfo: " + msg.info.join(" ") - ); - } - -}); - -/** @id MochiKit.Logging.Logger */ -MochiKit.Logging.Logger = function (/* optional */maxSize) { - this.counter = 0; - if (typeof(maxSize) == 'undefined' || maxSize === null) { - maxSize = -1; - } - this.maxSize = maxSize; - this._messages = []; - this.listeners = {}; - this.useNativeConsole = false; -}; - -MochiKit.Logging.Logger.prototype = { - /** @id MochiKit.Logging.Logger.prototype.clear */ - clear: function () { - this._messages.splice(0, this._messages.length); - }, - - /** @id MochiKit.Logging.Logger.prototype.logToConsole */ - logToConsole: function (msg) { - if (typeof(window) != "undefined" && window.console - && window.console.log) { - // Safari and FireBug 0.4 - // Percent replacement is a workaround for cute Safari crashing bug - window.console.log(msg.replace(/%/g, '\uFF05')); - } else if (typeof(opera) != "undefined" && opera.postError) { - // Opera - opera.postError(msg); - } else if (typeof(printfire) == "function") { - // FireBug 0.3 and earlier - printfire(msg); - } else if (typeof(Debug) != "undefined" && Debug.writeln) { - // IE Web Development Helper (?) - // http://www.nikhilk.net/Entry.aspx?id=93 - Debug.writeln(msg); - } else if (typeof(debug) != "undefined" && debug.trace) { - // Atlas framework (?) - // http://www.nikhilk.net/Entry.aspx?id=93 - debug.trace(msg); - } - }, - - /** @id MochiKit.Logging.Logger.prototype.dispatchListeners */ - dispatchListeners: function (msg) { - for (var k in this.listeners) { - var pair = this.listeners[k]; - if (pair.ident != k || (pair[0] && !pair[0](msg))) { - continue; - } - pair[1](msg); - } - }, - - /** @id MochiKit.Logging.Logger.prototype.addListener */ - addListener: function (ident, filter, listener) { - if (typeof(filter) == 'string') { - filter = MochiKit.Logging.logLevelAtLeast(filter); - } - var entry = [filter, listener]; - entry.ident = ident; - this.listeners[ident] = entry; - }, - - /** @id MochiKit.Logging.Logger.prototype.removeListener */ - removeListener: function (ident) { - delete this.listeners[ident]; - }, - - /** @id MochiKit.Logging.Logger.prototype.baseLog */ - baseLog: function (level, message/*, ...*/) { - if (typeof(level) == "number") { - if (level >= MochiKit.Logging.LogLevel.FATAL) { - level = 'FATAL'; - } else if (level >= MochiKit.Logging.LogLevel.ERROR) { - level = 'ERROR'; - } else if (level >= MochiKit.Logging.LogLevel.WARNING) { - level = 'WARNING'; - } else if (level >= MochiKit.Logging.LogLevel.INFO) { - level = 'INFO'; - } else { - level = 'DEBUG'; - } - } - var msg = new MochiKit.Logging.LogMessage( - this.counter, - level, - MochiKit.Base.extend(null, arguments, 1) - ); - this._messages.push(msg); - this.dispatchListeners(msg); - if (this.useNativeConsole) { - this.logToConsole(msg.level + ": " + msg.info.join(" ")); - } - this.counter += 1; - while (this.maxSize >= 0 && this._messages.length > this.maxSize) { - this._messages.shift(); - } - }, - - /** @id MochiKit.Logging.Logger.prototype.getMessages */ - getMessages: function (howMany) { - var firstMsg = 0; - if (!(typeof(howMany) == 'undefined' || howMany === null)) { - firstMsg = Math.max(0, this._messages.length - howMany); - } - return this._messages.slice(firstMsg); - }, - - /** @id MochiKit.Logging.Logger.prototype.getMessageText */ - getMessageText: function (howMany) { - if (typeof(howMany) == 'undefined' || howMany === null) { - howMany = 30; - } - var messages = this.getMessages(howMany); - if (messages.length) { - var lst = map(function (m) { - return '\n [' + m.num + '] ' + m.level + ': ' + m.info.join(' '); - }, messages); - lst.unshift('LAST ' + messages.length + ' MESSAGES:'); - return lst.join(''); - } - return ''; - }, - - /** @id MochiKit.Logging.Logger.prototype.debuggingBookmarklet */ - debuggingBookmarklet: function (inline) { - if (typeof(MochiKit.LoggingPane) == "undefined") { - alert(this.getMessageText()); - } else { - MochiKit.LoggingPane.createLoggingPane(inline || false); - } - } -}; - -MochiKit.Logging.__new__ = function () { - this.LogLevel = { - ERROR: 40, - FATAL: 50, - WARNING: 30, - INFO: 20, - DEBUG: 10 - }; - - var m = MochiKit.Base; - m.registerComparator("LogMessage", - this.isLogMessage, - this.compareLogMessage - ); - - var partial = m.partial; - - var Logger = this.Logger; - var baseLog = Logger.prototype.baseLog; - m.update(this.Logger.prototype, { - debug: partial(baseLog, 'DEBUG'), - log: partial(baseLog, 'INFO'), - error: partial(baseLog, 'ERROR'), - fatal: partial(baseLog, 'FATAL'), - warning: partial(baseLog, 'WARNING') - }); - - // indirectly find logger so it can be replaced - var self = this; - var connectLog = function (name) { - return function () { - self.logger[name].apply(self.logger, arguments); - }; - }; - - /** @id MochiKit.Logging.log */ - this.log = connectLog('log'); - /** @id MochiKit.Logging.logError */ - this.logError = connectLog('error'); - /** @id MochiKit.Logging.logDebug */ - this.logDebug = connectLog('debug'); - /** @id MochiKit.Logging.logFatal */ - this.logFatal = connectLog('fatal'); - /** @id MochiKit.Logging.logWarning */ - this.logWarning = connectLog('warning'); - this.logger = new Logger(); - this.logger.useNativeConsole = true; - - this.EXPORT_TAGS = { - ":common": this.EXPORT, - ":all": m.concat(this.EXPORT, this.EXPORT_OK) - }; - - m.nameFunctions(this); - -}; - -if (typeof(printfire) == "undefined" && - typeof(document) != "undefined" && document.createEvent && - typeof(dispatchEvent) != "undefined") { - // FireBug really should be less lame about this global function - printfire = function () { - printfire.args = arguments; - var ev = document.createEvent("Events"); - ev.initEvent("printfire", false, true); - dispatchEvent(ev); - }; -} - -MochiKit.Logging.__new__(); - -MochiKit.Base._exportSymbols(this, MochiKit.Logging); diff --git a/static/MochiKit/LoggingPane.js b/static/MochiKit/LoggingPane.js deleted file mode 100644 index 95c4fe5..0000000 --- a/static/MochiKit/LoggingPane.js +++ /dev/null @@ -1,353 +0,0 @@ -/*** - -MochiKit.LoggingPane 1.4.2 - -See for documentation, downloads, license, etc. - -(c) 2005 Bob Ippolito. All rights Reserved. - -***/ - -MochiKit.Base._deps('LoggingPane', ['Base', 'Logging']); - -MochiKit.LoggingPane.NAME = "MochiKit.LoggingPane"; -MochiKit.LoggingPane.VERSION = "1.4.2"; -MochiKit.LoggingPane.__repr__ = function () { - return "[" + this.NAME + " " + this.VERSION + "]"; -}; - -MochiKit.LoggingPane.toString = function () { - return this.__repr__(); -}; - -/** @id MochiKit.LoggingPane.createLoggingPane */ -MochiKit.LoggingPane.createLoggingPane = function (inline/* = false */) { - var m = MochiKit.LoggingPane; - inline = !(!inline); - if (m._loggingPane && m._loggingPane.inline != inline) { - m._loggingPane.closePane(); - m._loggingPane = null; - } - if (!m._loggingPane || m._loggingPane.closed) { - m._loggingPane = new m.LoggingPane(inline, MochiKit.Logging.logger); - } - return m._loggingPane; -}; - -/** @id MochiKit.LoggingPane.LoggingPane */ -MochiKit.LoggingPane.LoggingPane = function (inline/* = false */, logger/* = MochiKit.Logging.logger */) { - - /* Use a div if inline, pop up a window if not */ - /* Create the elements */ - if (typeof(logger) == "undefined" || logger === null) { - logger = MochiKit.Logging.logger; - } - this.logger = logger; - var update = MochiKit.Base.update; - var updatetree = MochiKit.Base.updatetree; - var bind = MochiKit.Base.bind; - var clone = MochiKit.Base.clone; - var win = window; - var uid = "_MochiKit_LoggingPane"; - if (typeof(MochiKit.DOM) != "undefined") { - win = MochiKit.DOM.currentWindow(); - } - if (!inline) { - // name the popup with the base URL for uniqueness - var url = win.location.href.split("?")[0].replace(/[#:\/.><&%-]/g, "_"); - var name = uid + "_" + url; - var nwin = win.open("", name, "dependent,resizable,height=200"); - if (!nwin) { - alert("Not able to open debugging window due to pop-up blocking."); - return undefined; - } - nwin.document.write( - '' - + '[MochiKit.LoggingPane]' - + '' - ); - nwin.document.close(); - nwin.document.title += ' ' + win.document.title; - win = nwin; - } - var doc = win.document; - this.doc = doc; - - // Connect to the debug pane if it already exists (i.e. in a window orphaned by the page being refreshed) - var debugPane = doc.getElementById(uid); - var existing_pane = !!debugPane; - if (debugPane && typeof(debugPane.loggingPane) != "undefined") { - debugPane.loggingPane.logger = this.logger; - debugPane.loggingPane.buildAndApplyFilter(); - return debugPane.loggingPane; - } - - if (existing_pane) { - // clear any existing contents - var child; - while ((child = debugPane.firstChild)) { - debugPane.removeChild(child); - } - } else { - debugPane = doc.createElement("div"); - debugPane.id = uid; - } - debugPane.loggingPane = this; - var levelFilterField = doc.createElement("input"); - var infoFilterField = doc.createElement("input"); - var filterButton = doc.createElement("button"); - var loadButton = doc.createElement("button"); - var clearButton = doc.createElement("button"); - var closeButton = doc.createElement("button"); - var logPaneArea = doc.createElement("div"); - var logPane = doc.createElement("div"); - - /* Set up the functions */ - var listenerId = uid + "_Listener"; - this.colorTable = clone(this.colorTable); - var messages = []; - var messageFilter = null; - - /** @id MochiKit.LoggingPane.messageLevel */ - var messageLevel = function (msg) { - var level = msg.level; - if (typeof(level) == "number") { - level = MochiKit.Logging.LogLevel[level]; - } - return level; - }; - - /** @id MochiKit.LoggingPane.messageText */ - var messageText = function (msg) { - return msg.info.join(" "); - }; - - /** @id MochiKit.LoggingPane.addMessageText */ - var addMessageText = bind(function (msg) { - var level = messageLevel(msg); - var text = messageText(msg); - var c = this.colorTable[level]; - var p = doc.createElement("span"); - p.className = "MochiKit-LogMessage MochiKit-LogLevel-" + level; - p.style.cssText = "margin: 0px; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; white-space: pre-line; word-wrap: break-word; wrap-option: emergency; color: " + c; - p.appendChild(doc.createTextNode(level + ": " + text)); - logPane.appendChild(p); - logPane.appendChild(doc.createElement("br")); - if (logPaneArea.offsetHeight > logPaneArea.scrollHeight) { - logPaneArea.scrollTop = 0; - } else { - logPaneArea.scrollTop = logPaneArea.scrollHeight; - } - }, this); - - /** @id MochiKit.LoggingPane.addMessage */ - var addMessage = function (msg) { - messages[messages.length] = msg; - addMessageText(msg); - }; - - /** @id MochiKit.LoggingPane.buildMessageFilter */ - var buildMessageFilter = function () { - var levelre, infore; - try { - /* Catch any exceptions that might arise due to invalid regexes */ - levelre = new RegExp(levelFilterField.value); - infore = new RegExp(infoFilterField.value); - } catch(e) { - /* If there was an error with the regexes, do no filtering */ - logDebug("Error in filter regex: " + e.message); - return null; - } - - return function (msg) { - return ( - levelre.test(messageLevel(msg)) && - infore.test(messageText(msg)) - ); - }; - }; - - /** @id MochiKit.LoggingPane.clearMessagePane */ - var clearMessagePane = function () { - while (logPane.firstChild) { - logPane.removeChild(logPane.firstChild); - } - }; - - /** @id MochiKit.LoggingPane.clearMessages */ - var clearMessages = function () { - messages = []; - clearMessagePane(); - }; - - /** @id MochiKit.LoggingPane.closePane */ - var closePane = bind(function () { - if (this.closed) { - return; - } - this.closed = true; - if (MochiKit.LoggingPane._loggingPane == this) { - MochiKit.LoggingPane._loggingPane = null; - } - this.logger.removeListener(listenerId); - try { - try { - debugPane.loggingPane = null; - } catch(e) { logFatal("Bookmarklet was closed incorrectly."); } - if (inline) { - debugPane.parentNode.removeChild(debugPane); - } else { - this.win.close(); - } - } catch(e) {} - }, this); - - /** @id MochiKit.LoggingPane.filterMessages */ - var filterMessages = function () { - clearMessagePane(); - - for (var i = 0; i < messages.length; i++) { - var msg = messages[i]; - if (messageFilter === null || messageFilter(msg)) { - addMessageText(msg); - } - } - }; - - this.buildAndApplyFilter = function () { - messageFilter = buildMessageFilter(); - - filterMessages(); - - this.logger.removeListener(listenerId); - this.logger.addListener(listenerId, messageFilter, addMessage); - }; - - - /** @id MochiKit.LoggingPane.loadMessages */ - var loadMessages = bind(function () { - messages = this.logger.getMessages(); - filterMessages(); - }, this); - - /** @id MochiKit.LoggingPane.filterOnEnter */ - var filterOnEnter = bind(function (event) { - event = event || window.event; - key = event.which || event.keyCode; - if (key == 13) { - this.buildAndApplyFilter(); - } - }, this); - - /* Create the debug pane */ - var style = "display: block; z-index: 1000; left: 0px; bottom: 0px; position: fixed; width: 100%; background-color: white; font: " + this.logFont; - if (inline) { - style += "; height: 10em; border-top: 2px solid black"; - } else { - style += "; height: 100%;"; - } - debugPane.style.cssText = style; - - if (!existing_pane) { - doc.body.appendChild(debugPane); - } - - /* Create the filter fields */ - style = {"cssText": "width: 33%; display: inline; font: " + this.logFont}; - - updatetree(levelFilterField, { - "value": "FATAL|ERROR|WARNING|INFO|DEBUG", - "onkeypress": filterOnEnter, - "style": style - }); - debugPane.appendChild(levelFilterField); - - updatetree(infoFilterField, { - "value": ".*", - "onkeypress": filterOnEnter, - "style": style - }); - debugPane.appendChild(infoFilterField); - - /* Create the buttons */ - style = "width: 8%; display:inline; font: " + this.logFont; - - filterButton.appendChild(doc.createTextNode("Filter")); - filterButton.onclick = bind("buildAndApplyFilter", this); - filterButton.style.cssText = style; - debugPane.appendChild(filterButton); - - loadButton.appendChild(doc.createTextNode("Load")); - loadButton.onclick = loadMessages; - loadButton.style.cssText = style; - debugPane.appendChild(loadButton); - - clearButton.appendChild(doc.createTextNode("Clear")); - clearButton.onclick = clearMessages; - clearButton.style.cssText = style; - debugPane.appendChild(clearButton); - - closeButton.appendChild(doc.createTextNode("Close")); - closeButton.onclick = closePane; - closeButton.style.cssText = style; - debugPane.appendChild(closeButton); - - /* Create the logging pane */ - logPaneArea.style.cssText = "overflow: auto; width: 100%"; - logPane.style.cssText = "width: 100%; height: " + (inline ? "8em" : "100%"); - - logPaneArea.appendChild(logPane); - debugPane.appendChild(logPaneArea); - - this.buildAndApplyFilter(); - loadMessages(); - - if (inline) { - this.win = undefined; - } else { - this.win = win; - } - this.inline = inline; - this.closePane = closePane; - this.closed = false; - - - return this; -}; - -MochiKit.LoggingPane.LoggingPane.prototype = { - "logFont": "8pt Verdana,sans-serif", - "colorTable": { - "ERROR": "red", - "FATAL": "darkred", - "WARNING": "blue", - "INFO": "black", - "DEBUG": "green" - } -}; - - -MochiKit.LoggingPane.EXPORT_OK = [ - "LoggingPane" -]; - -MochiKit.LoggingPane.EXPORT = [ - "createLoggingPane" -]; - -MochiKit.LoggingPane.__new__ = function () { - this.EXPORT_TAGS = { - ":common": this.EXPORT, - ":all": MochiKit.Base.concat(this.EXPORT, this.EXPORT_OK) - }; - - MochiKit.Base.nameFunctions(this); - - MochiKit.LoggingPane._loggingPane = null; - -}; - -MochiKit.LoggingPane.__new__(); - -MochiKit.Base._exportSymbols(this, MochiKit.LoggingPane); diff --git a/static/MochiKit/MochiKit.js b/static/MochiKit/MochiKit.js deleted file mode 100644 index 1ec157e..0000000 --- a/static/MochiKit/MochiKit.js +++ /dev/null @@ -1,188 +0,0 @@ -/*** - -MochiKit.MochiKit 1.4.2 - -See for documentation, downloads, license, etc. - -(c) 2005 Bob Ippolito. All rights Reserved. - -***/ - -if (typeof(MochiKit) == 'undefined') { - MochiKit = {}; -} - -if (typeof(MochiKit.MochiKit) == 'undefined') { - /** @id MochiKit.MochiKit */ - MochiKit.MochiKit = {}; -} - -MochiKit.MochiKit.NAME = "MochiKit.MochiKit"; -MochiKit.MochiKit.VERSION = "1.4.2"; -MochiKit.MochiKit.__repr__ = function () { - return "[" + this.NAME + " " + this.VERSION + "]"; -}; - -/** @id MochiKit.MochiKit.toString */ -MochiKit.MochiKit.toString = function () { - return this.__repr__(); -}; - -/** @id MochiKit.MochiKit.SUBMODULES */ -MochiKit.MochiKit.SUBMODULES = [ - "Base", - "Iter", - "Logging", - "DateTime", - "Format", - "Async", - "DOM", - "Selector", - "Style", - "LoggingPane", - "Color", - "Signal", - "Position", - "Visual", - "DragAndDrop", - "Sortable" -]; - -if (typeof(JSAN) != 'undefined' || typeof(dojo) != 'undefined') { - if (typeof(dojo) != 'undefined') { - dojo.provide('MochiKit.MochiKit'); - (function (lst) { - for (var i = 0; i < lst.length; i++) { - dojo.require("MochiKit." + lst[i]); - } - })(MochiKit.MochiKit.SUBMODULES); - } - if (typeof(JSAN) != 'undefined') { - (function (lst) { - for (var i = 0; i < lst.length; i++) { - JSAN.use("MochiKit." + lst[i], []); - } - })(MochiKit.MochiKit.SUBMODULES); - } - (function () { - var extend = MochiKit.Base.extend; - var self = MochiKit.MochiKit; - var modules = self.SUBMODULES; - var EXPORT = []; - var EXPORT_OK = []; - var EXPORT_TAGS = {}; - var i, k, m, all; - for (i = 0; i < modules.length; i++) { - m = MochiKit[modules[i]]; - extend(EXPORT, m.EXPORT); - extend(EXPORT_OK, m.EXPORT_OK); - for (k in m.EXPORT_TAGS) { - EXPORT_TAGS[k] = extend(EXPORT_TAGS[k], m.EXPORT_TAGS[k]); - } - all = m.EXPORT_TAGS[":all"]; - if (!all) { - all = extend(null, m.EXPORT, m.EXPORT_OK); - } - var j; - for (j = 0; j < all.length; j++) { - k = all[j]; - self[k] = m[k]; - } - } - self.EXPORT = EXPORT; - self.EXPORT_OK = EXPORT_OK; - self.EXPORT_TAGS = EXPORT_TAGS; - }()); - -} else { - if (typeof(MochiKit.__compat__) == 'undefined') { - MochiKit.__compat__ = true; - } - (function () { - if (typeof(document) == "undefined") { - return; - } - var scripts = document.getElementsByTagName("script"); - var kXHTMLNSURI = "http://www.w3.org/1999/xhtml"; - var kSVGNSURI = "http://www.w3.org/2000/svg"; - var kXLINKNSURI = "http://www.w3.org/1999/xlink"; - var kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; - var base = null; - var baseElem = null; - var allScripts = {}; - var i; - var src; - for (i = 0; i < scripts.length; i++) { - src = null; - switch (scripts[i].namespaceURI) { - case kSVGNSURI: - src = scripts[i].getAttributeNS(kXLINKNSURI, "href"); - break; - /* - case null: // HTML - case '': // HTML - case kXHTMLNSURI: - case kXULNSURI: - */ - default: - src = scripts[i].getAttribute("src"); - break; - } - if (!src) { - continue; - } - allScripts[src] = true; - if (src.match(/MochiKit.js(\?.*)?$/)) { - base = src.substring(0, src.lastIndexOf('MochiKit.js')); - baseElem = scripts[i]; - } - } - if (base === null) { - return; - } - var modules = MochiKit.MochiKit.SUBMODULES; - for (var i = 0; i < modules.length; i++) { - if (MochiKit[modules[i]]) { - continue; - } - var uri = base + modules[i] + '.js'; - if (uri in allScripts) { - continue; - } - if (baseElem.namespaceURI == kSVGNSURI || - baseElem.namespaceURI == kXULNSURI) { - // SVG, XUL - /* - SVG does not support document.write, so if Safari wants to - support SVG tests it should fix its deferred loading bug - (see following below). - - */ - var s = document.createElementNS(baseElem.namespaceURI, 'script'); - s.setAttribute("id", "MochiKit_" + base + modules[i]); - if (baseElem.namespaceURI == kSVGNSURI) { - s.setAttributeNS(kXLINKNSURI, 'href', uri); - } else { - s.setAttribute('src', uri); - } - s.setAttribute("type", "application/x-javascript"); - baseElem.parentNode.appendChild(s); - } else { - // HTML, XHTML - /* - DOM can not be used here because Safari does - deferred loading of scripts unless they are - in the document or inserted with document.write - - This is not XHTML compliant. If you want XHTML - compliance then you must use the packed version of MochiKit - or include each script individually (basically unroll - these document.write calls into your XHTML source) - - */ - document.write('<' + baseElem.nodeName + ' src="' + uri + - '" type="text/javascript">'); - } - }; - })(); -} diff --git a/static/MochiKit/MockDOM.js b/static/MochiKit/MockDOM.js deleted file mode 100644 index 250d12e..0000000 --- a/static/MochiKit/MockDOM.js +++ /dev/null @@ -1,115 +0,0 @@ -/*** - -MochiKit.MockDOM 1.4.2 - -See for documentation, downloads, license, etc. - -(c) 2005 Bob Ippolito. All rights Reserved. - -***/ - -if (typeof(MochiKit) == "undefined") { - MochiKit = {}; -} - -if (typeof(MochiKit.MockDOM) == "undefined") { - MochiKit.MockDOM = {}; -} - -MochiKit.MockDOM.NAME = "MochiKit.MockDOM"; -MochiKit.MockDOM.VERSION = "1.4.2"; - -MochiKit.MockDOM.__repr__ = function () { - return "[" + this.NAME + " " + this.VERSION + "]"; -}; - -/** @id MochiKit.MockDOM.toString */ -MochiKit.MockDOM.toString = function () { - return this.__repr__(); -}; - -/** @id MochiKit.MockDOM.createDocument */ -MochiKit.MockDOM.createDocument = function () { - var doc = new MochiKit.MockDOM.MockElement("DOCUMENT"); - doc.body = doc.createElement("BODY"); - doc.appendChild(doc.body); - return doc; -}; - -/** @id MochiKit.MockDOM.MockElement */ -MochiKit.MockDOM.MockElement = function (name, data, ownerDocument) { - this.tagName = this.nodeName = name.toUpperCase(); - this.ownerDocument = ownerDocument || null; - if (name == "DOCUMENT") { - this.nodeType = 9; - this.childNodes = []; - } else if (typeof(data) == "string") { - this.nodeValue = data; - this.nodeType = 3; - } else { - this.nodeType = 1; - this.childNodes = []; - } - if (name.substring(0, 1) == "<") { - var nameattr = name.substring( - name.indexOf('"') + 1, name.lastIndexOf('"')); - name = name.substring(1, name.indexOf(" ")); - this.tagName = this.nodeName = name.toUpperCase(); - this.setAttribute("name", nameattr); - } -}; - -MochiKit.MockDOM.MockElement.prototype = { - /** @id MochiKit.MockDOM.MockElement.prototype.createElement */ - createElement: function (tagName) { - return new MochiKit.MockDOM.MockElement(tagName, null, this.nodeType == 9 ? this : this.ownerDocument); - }, - /** @id MochiKit.MockDOM.MockElement.prototype.createTextNode */ - createTextNode: function (text) { - return new MochiKit.MockDOM.MockElement("text", text, this.nodeType == 9 ? this : this.ownerDocument); - }, - /** @id MochiKit.MockDOM.MockElement.prototype.setAttribute */ - setAttribute: function (name, value) { - this[name] = value; - }, - /** @id MochiKit.MockDOM.MockElement.prototype.getAttribute */ - getAttribute: function (name) { - return this[name]; - }, - /** @id MochiKit.MockDOM.MockElement.prototype.appendChild */ - appendChild: function (child) { - this.childNodes.push(child); - }, - /** @id MochiKit.MockDOM.MockElement.prototype.toString */ - toString: function () { - return "MockElement(" + this.tagName + ")"; - }, - /** @id MochiKit.MockDOM.MockElement.prototype.getElementsByTagName */ - getElementsByTagName: function (tagName) { - var foundElements = []; - MochiKit.Base.nodeWalk(this, function(node){ - if (tagName == '*' || tagName == node.tagName) { - foundElements.push(node); - return node.childNodes; - } - }); - return foundElements; - } -}; - - /** @id MochiKit.MockDOM.EXPORT_OK */ -MochiKit.MockDOM.EXPORT_OK = [ - "mockElement", - "createDocument" -]; - - /** @id MochiKit.MockDOM.EXPORT */ -MochiKit.MockDOM.EXPORT = [ - "document" -]; - -MochiKit.MockDOM.__new__ = function () { - this.document = this.createDocument(); -}; - -MochiKit.MockDOM.__new__(); diff --git a/static/MochiKit/Position.js b/static/MochiKit/Position.js deleted file mode 100644 index 70288c7..0000000 --- a/static/MochiKit/Position.js +++ /dev/null @@ -1,236 +0,0 @@ -/*** - -MochiKit.Position 1.4.2 - -See for documentation, downloads, license, etc. - -(c) 2005-2006 Bob Ippolito and others. All rights Reserved. - -***/ - -MochiKit.Base._deps('Position', ['Base', 'DOM', 'Style']); - -MochiKit.Position.NAME = 'MochiKit.Position'; -MochiKit.Position.VERSION = '1.4.2'; -MochiKit.Position.__repr__ = function () { - return '[' + this.NAME + ' ' + this.VERSION + ']'; -}; -MochiKit.Position.toString = function () { - return this.__repr__(); -}; - -MochiKit.Position.EXPORT_OK = []; - -MochiKit.Position.EXPORT = [ -]; - - -MochiKit.Base.update(MochiKit.Position, { - // set to true if needed, warning: firefox performance problems - // NOT neeeded for page scrolling, only if draggable contained in - // scrollable elements - includeScrollOffsets: false, - - /** @id MochiKit.Position.prepare */ - prepare: function () { - var deltaX = window.pageXOffset - || document.documentElement.scrollLeft - || document.body.scrollLeft - || 0; - var deltaY = window.pageYOffset - || document.documentElement.scrollTop - || document.body.scrollTop - || 0; - this.windowOffset = new MochiKit.Style.Coordinates(deltaX, deltaY); - }, - - /** @id MochiKit.Position.cumulativeOffset */ - cumulativeOffset: function (element) { - var valueT = 0; - var valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - } while (element); - return new MochiKit.Style.Coordinates(valueL, valueT); - }, - - /** @id MochiKit.Position.realOffset */ - realOffset: function (element) { - var valueT = 0; - var valueL = 0; - do { - valueT += element.scrollTop || 0; - valueL += element.scrollLeft || 0; - element = element.parentNode; - } while (element); - return new MochiKit.Style.Coordinates(valueL, valueT); - }, - - /** @id MochiKit.Position.within */ - within: function (element, x, y) { - if (this.includeScrollOffsets) { - return this.withinIncludingScrolloffsets(element, x, y); - } - this.xcomp = x; - this.ycomp = y; - this.offset = this.cumulativeOffset(element); - if (element.style.position == "fixed") { - this.offset.x += this.windowOffset.x; - this.offset.y += this.windowOffset.y; - } - - return (y >= this.offset.y && - y < this.offset.y + element.offsetHeight && - x >= this.offset.x && - x < this.offset.x + element.offsetWidth); - }, - - /** @id MochiKit.Position.withinIncludingScrolloffsets */ - withinIncludingScrolloffsets: function (element, x, y) { - var offsetcache = this.realOffset(element); - - this.xcomp = x + offsetcache.x - this.windowOffset.x; - this.ycomp = y + offsetcache.y - this.windowOffset.y; - this.offset = this.cumulativeOffset(element); - - return (this.ycomp >= this.offset.y && - this.ycomp < this.offset.y + element.offsetHeight && - this.xcomp >= this.offset.x && - this.xcomp < this.offset.x + element.offsetWidth); - }, - - // within must be called directly before - /** @id MochiKit.Position.overlap */ - overlap: function (mode, element) { - if (!mode) { - return 0; - } - if (mode == 'vertical') { - return ((this.offset.y + element.offsetHeight) - this.ycomp) / - element.offsetHeight; - } - if (mode == 'horizontal') { - return ((this.offset.x + element.offsetWidth) - this.xcomp) / - element.offsetWidth; - } - }, - - /** @id MochiKit.Position.absolutize */ - absolutize: function (element) { - element = MochiKit.DOM.getElement(element); - if (element.style.position == 'absolute') { - return; - } - MochiKit.Position.prepare(); - - var offsets = MochiKit.Position.positionedOffset(element); - var width = element.clientWidth; - var height = element.clientHeight; - - var oldStyle = { - 'position': element.style.position, - 'left': offsets.x - parseFloat(element.style.left || 0), - 'top': offsets.y - parseFloat(element.style.top || 0), - 'width': element.style.width, - 'height': element.style.height - }; - - element.style.position = 'absolute'; - element.style.top = offsets.y + 'px'; - element.style.left = offsets.x + 'px'; - element.style.width = width + 'px'; - element.style.height = height + 'px'; - - return oldStyle; - }, - - /** @id MochiKit.Position.positionedOffset */ - positionedOffset: function (element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - if (element) { - p = MochiKit.Style.getStyle(element, 'position'); - if (p == 'relative' || p == 'absolute') { - break; - } - } - } while (element); - return new MochiKit.Style.Coordinates(valueL, valueT); - }, - - /** @id MochiKit.Position.relativize */ - relativize: function (element, oldPos) { - element = MochiKit.DOM.getElement(element); - if (element.style.position == 'relative') { - return; - } - MochiKit.Position.prepare(); - - var top = parseFloat(element.style.top || 0) - - (oldPos['top'] || 0); - var left = parseFloat(element.style.left || 0) - - (oldPos['left'] || 0); - - element.style.position = oldPos['position']; - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.width = oldPos['width']; - element.style.height = oldPos['height']; - }, - - /** @id MochiKit.Position.clone */ - clone: function (source, target) { - source = MochiKit.DOM.getElement(source); - target = MochiKit.DOM.getElement(target); - target.style.position = 'absolute'; - var offsets = this.cumulativeOffset(source); - target.style.top = offsets.y + 'px'; - target.style.left = offsets.x + 'px'; - target.style.width = source.offsetWidth + 'px'; - target.style.height = source.offsetHeight + 'px'; - }, - - /** @id MochiKit.Position.page */ - page: function (forElement) { - var valueT = 0; - var valueL = 0; - - var element = forElement; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - - // Safari fix - if (element.offsetParent == document.body && MochiKit.Style.getStyle(element, 'position') == 'absolute') { - break; - } - } while (element = element.offsetParent); - - element = forElement; - do { - valueT -= element.scrollTop || 0; - valueL -= element.scrollLeft || 0; - } while (element = element.parentNode); - - return new MochiKit.Style.Coordinates(valueL, valueT); - } -}); - -MochiKit.Position.__new__ = function (win) { - var m = MochiKit.Base; - this.EXPORT_TAGS = { - ':common': this.EXPORT, - ':all': m.concat(this.EXPORT, this.EXPORT_OK) - }; - - m.nameFunctions(this); -}; - -MochiKit.Position.__new__(this); - -MochiKit.Base._exportSymbols(this, MochiKit.Position); \ No newline at end of file diff --git a/static/MochiKit/Selector.js b/static/MochiKit/Selector.js deleted file mode 100644 index fe96533..0000000 --- a/static/MochiKit/Selector.js +++ /dev/null @@ -1,415 +0,0 @@ -/*** - -MochiKit.Selector 1.4.2 - -See for documentation, downloads, license, etc. - -(c) 2005 Bob Ippolito and others. All rights Reserved. - -***/ - -MochiKit.Base._deps('Selector', ['Base', 'DOM', 'Iter']); - -MochiKit.Selector.NAME = "MochiKit.Selector"; -MochiKit.Selector.VERSION = "1.4.2"; - -MochiKit.Selector.__repr__ = function () { - return "[" + this.NAME + " " + this.VERSION + "]"; -}; - -MochiKit.Selector.toString = function () { - return this.__repr__(); -}; - -MochiKit.Selector.EXPORT = [ - "Selector", - "findChildElements", - "findDocElements", - "$$" -]; - -MochiKit.Selector.EXPORT_OK = [ -]; - -MochiKit.Selector.Selector = function (expression) { - this.params = {classNames: [], pseudoClassNames: []}; - this.expression = expression.toString().replace(/(^\s+|\s+$)/g, ''); - this.parseExpression(); - this.compileMatcher(); -}; - -MochiKit.Selector.Selector.prototype = { - /*** - - Selector class: convenient object to make CSS selections. - - ***/ - __class__: MochiKit.Selector.Selector, - - /** @id MochiKit.Selector.Selector.prototype.parseExpression */ - parseExpression: function () { - function abort(message) { - throw 'Parse error in selector: ' + message; - } - - if (this.expression == '') { - abort('empty expression'); - } - - var repr = MochiKit.Base.repr; - var params = this.params; - var expr = this.expression; - var match, modifier, clause, rest; - while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!^$*]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) { - params.attributes = params.attributes || []; - params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''}); - expr = match[1]; - } - - if (expr == '*') { - return this.params.wildcard = true; - } - - while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+(?:\([^)]*\))?)(.*)/i)) { - modifier = match[1]; - clause = match[2]; - rest = match[3]; - switch (modifier) { - case '#': - params.id = clause; - break; - case '.': - params.classNames.push(clause); - break; - case ':': - params.pseudoClassNames.push(clause); - break; - case '': - case undefined: - params.tagName = clause.toUpperCase(); - break; - default: - abort(repr(expr)); - } - expr = rest; - } - - if (expr.length > 0) { - abort(repr(expr)); - } - }, - - /** @id MochiKit.Selector.Selector.prototype.buildMatchExpression */ - buildMatchExpression: function () { - var repr = MochiKit.Base.repr; - var params = this.params; - var conditions = []; - var clause, i; - - function childElements(element) { - return "MochiKit.Base.filter(function (node) { return node.nodeType == 1; }, " + element + ".childNodes)"; - } - - if (params.wildcard) { - conditions.push('true'); - } - if (clause = params.id) { - conditions.push('element.id == ' + repr(clause)); - } - if (clause = params.tagName) { - conditions.push('element.tagName.toUpperCase() == ' + repr(clause)); - } - if ((clause = params.classNames).length > 0) { - for (i = 0; i < clause.length; i++) { - conditions.push('MochiKit.DOM.hasElementClass(element, ' + repr(clause[i]) + ')'); - } - } - if ((clause = params.pseudoClassNames).length > 0) { - for (i = 0; i < clause.length; i++) { - var match = clause[i].match(/^([^(]+)(?:\((.*)\))?$/); - var pseudoClass = match[1]; - var pseudoClassArgument = match[2]; - switch (pseudoClass) { - case 'root': - conditions.push('element.nodeType == 9 || element === element.ownerDocument.documentElement'); break; - case 'nth-child': - case 'nth-last-child': - case 'nth-of-type': - case 'nth-last-of-type': - match = pseudoClassArgument.match(/^((?:(\d+)n\+)?(\d+)|odd|even)$/); - if (!match) { - throw "Invalid argument to pseudo element nth-child: " + pseudoClassArgument; - } - var a, b; - if (match[0] == 'odd') { - a = 2; - b = 1; - } else if (match[0] == 'even') { - a = 2; - b = 0; - } else { - a = match[2] && parseInt(match) || null; - b = parseInt(match[3]); - } - conditions.push('this.nthChild(element,' + a + ',' + b - + ',' + !!pseudoClass.match('^nth-last') // Reverse - + ',' + !!pseudoClass.match('of-type$') // Restrict to same tagName - + ')'); - break; - case 'first-child': - conditions.push('this.nthChild(element, null, 1)'); - break; - case 'last-child': - conditions.push('this.nthChild(element, null, 1, true)'); - break; - case 'first-of-type': - conditions.push('this.nthChild(element, null, 1, false, true)'); - break; - case 'last-of-type': - conditions.push('this.nthChild(element, null, 1, true, true)'); - break; - case 'only-child': - conditions.push(childElements('element.parentNode') + '.length == 1'); - break; - case 'only-of-type': - conditions.push('MochiKit.Base.filter(function (node) { return node.tagName == element.tagName; }, ' + childElements('element.parentNode') + ').length == 1'); - break; - case 'empty': - conditions.push('element.childNodes.length == 0'); - break; - case 'enabled': - conditions.push('(this.isUIElement(element) && element.disabled === false)'); - break; - case 'disabled': - conditions.push('(this.isUIElement(element) && element.disabled === true)'); - break; - case 'checked': - conditions.push('(this.isUIElement(element) && element.checked === true)'); - break; - case 'not': - var subselector = new MochiKit.Selector.Selector(pseudoClassArgument); - conditions.push('!( ' + subselector.buildMatchExpression() + ')') - break; - } - } - } - if (clause = params.attributes) { - MochiKit.Base.map(function (attribute) { - var value = 'MochiKit.DOM.getNodeAttribute(element, ' + repr(attribute.name) + ')'; - var splitValueBy = function (delimiter) { - return value + '.split(' + repr(delimiter) + ')'; - } - conditions.push(value + ' != null'); - switch (attribute.operator) { - case '=': - conditions.push(value + ' == ' + repr(attribute.value)); - break; - case '~=': - conditions.push('MochiKit.Base.findValue(' + splitValueBy(' ') + ', ' + repr(attribute.value) + ') > -1'); - break; - case '^=': - conditions.push(value + '.substring(0, ' + attribute.value.length + ') == ' + repr(attribute.value)); - break; - case '$=': - conditions.push(value + '.substring(' + value + '.length - ' + attribute.value.length + ') == ' + repr(attribute.value)); - break; - case '*=': - conditions.push(value + '.match(' + repr(attribute.value) + ')'); - break; - case '|=': - conditions.push(splitValueBy('-') + '[0].toUpperCase() == ' + repr(attribute.value.toUpperCase())); - break; - case '!=': - conditions.push(value + ' != ' + repr(attribute.value)); - break; - case '': - case undefined: - // Condition already added above - break; - default: - throw 'Unknown operator ' + attribute.operator + ' in selector'; - } - }, clause); - } - - return conditions.join(' && '); - }, - - /** @id MochiKit.Selector.Selector.prototype.compileMatcher */ - compileMatcher: function () { - var code = 'return (!element.tagName) ? false : ' + - this.buildMatchExpression() + ';'; - this.match = new Function('element', code); - }, - - /** @id MochiKit.Selector.Selector.prototype.nthChild */ - nthChild: function (element, a, b, reverse, sametag){ - var siblings = MochiKit.Base.filter(function (node) { - return node.nodeType == 1; - }, element.parentNode.childNodes); - if (sametag) { - siblings = MochiKit.Base.filter(function (node) { - return node.tagName == element.tagName; - }, siblings); - } - if (reverse) { - siblings = MochiKit.Iter.reversed(siblings); - } - if (a) { - var actualIndex = MochiKit.Base.findIdentical(siblings, element); - return ((actualIndex + 1 - b) / a) % 1 == 0; - } else { - return b == MochiKit.Base.findIdentical(siblings, element) + 1; - } - }, - - /** @id MochiKit.Selector.Selector.prototype.isUIElement */ - isUIElement: function (element) { - return MochiKit.Base.findValue(['input', 'button', 'select', 'option', 'textarea', 'object'], - element.tagName.toLowerCase()) > -1; - }, - - /** @id MochiKit.Selector.Selector.prototype.findElements */ - findElements: function (scope, axis) { - var element; - - if (axis == undefined) { - axis = ""; - } - - function inScope(element, scope) { - if (axis == "") { - return MochiKit.DOM.isChildNode(element, scope); - } else if (axis == ">") { - return element.parentNode === scope; - } else if (axis == "+") { - return element === nextSiblingElement(scope); - } else if (axis == "~") { - var sibling = scope; - while (sibling = nextSiblingElement(sibling)) { - if (element === sibling) { - return true; - } - } - return false; - } else { - throw "Invalid axis: " + axis; - } - } - - if (element = MochiKit.DOM.getElement(this.params.id)) { - if (this.match(element)) { - if (!scope || inScope(element, scope)) { - return [element]; - } - } - } - - function nextSiblingElement(node) { - node = node.nextSibling; - while (node && node.nodeType != 1) { - node = node.nextSibling; - } - return node; - } - - if (axis == "") { - scope = (scope || MochiKit.DOM.currentDocument()).getElementsByTagName(this.params.tagName || '*'); - } else if (axis == ">") { - if (!scope) { - throw "> combinator not allowed without preceeding expression"; - } - scope = MochiKit.Base.filter(function (node) { - return node.nodeType == 1; - }, scope.childNodes); - } else if (axis == "+") { - if (!scope) { - throw "+ combinator not allowed without preceeding expression"; - } - scope = nextSiblingElement(scope) && [nextSiblingElement(scope)]; - } else if (axis == "~") { - if (!scope) { - throw "~ combinator not allowed without preceeding expression"; - } - var newscope = []; - while (nextSiblingElement(scope)) { - scope = nextSiblingElement(scope); - newscope.push(scope); - } - scope = newscope; - } - - if (!scope) { - return []; - } - - var results = MochiKit.Base.filter(MochiKit.Base.bind(function (scopeElt) { - return this.match(scopeElt); - }, this), scope); - - return results; - }, - - /** @id MochiKit.Selector.Selector.prototype.repr */ - repr: function () { - return 'Selector(' + this.expression + ')'; - }, - - toString: MochiKit.Base.forwardCall("repr") -}; - -MochiKit.Base.update(MochiKit.Selector, { - - /** @id MochiKit.Selector.findChildElements */ - findChildElements: function (element, expressions) { - var uniq = function(arr) { - var res = []; - for (var i = 0; i < arr.length; i++) { - if (MochiKit.Base.findIdentical(res, arr[i]) < 0) { - res.push(arr[i]); - } - } - return res; - }; - return MochiKit.Base.flattenArray(MochiKit.Base.map(function (expression) { - var nextScope = ""; - var reducer = function (results, expr) { - if (match = expr.match(/^[>+~]$/)) { - nextScope = match[0]; - return results; - } else { - var selector = new MochiKit.Selector.Selector(expr); - var elements = MochiKit.Iter.reduce(function (elements, result) { - return MochiKit.Base.extend(elements, selector.findElements(result || element, nextScope)); - }, results, []); - nextScope = ""; - return elements; - } - }; - var exprs = expression.replace(/(^\s+|\s+$)/g, '').split(/\s+/); - return uniq(MochiKit.Iter.reduce(reducer, exprs, [null])); - }, expressions)); - }, - - findDocElements: function () { - return MochiKit.Selector.findChildElements(MochiKit.DOM.currentDocument(), arguments); - }, - - __new__: function () { - var m = MochiKit.Base; - - this.$$ = this.findDocElements; - - this.EXPORT_TAGS = { - ":common": this.EXPORT, - ":all": m.concat(this.EXPORT, this.EXPORT_OK) - }; - - m.nameFunctions(this); - } -}); - -MochiKit.Selector.__new__(); - -MochiKit.Base._exportSymbols(this, MochiKit.Selector); - diff --git a/static/MochiKit/Signal.js b/static/MochiKit/Signal.js deleted file mode 100644 index d49513c..0000000 --- a/static/MochiKit/Signal.js +++ /dev/null @@ -1,897 +0,0 @@ -/*** - -MochiKit.Signal 1.4.2 - -See for documentation, downloads, license, etc. - -(c) 2006 Jonathan Gardner, Beau Hartshorne, Bob Ippolito. All rights Reserved. - -***/ - -MochiKit.Base._deps('Signal', ['Base', 'DOM', 'Style']); - -MochiKit.Signal.NAME = 'MochiKit.Signal'; -MochiKit.Signal.VERSION = '1.4.2'; - -MochiKit.Signal._observers = []; - -/** @id MochiKit.Signal.Event */ -MochiKit.Signal.Event = function (src, e) { - this._event = e || window.event; - this._src = src; -}; - -MochiKit.Base.update(MochiKit.Signal.Event.prototype, { - - __repr__: function () { - var repr = MochiKit.Base.repr; - var str = '{event(): ' + repr(this.event()) + - ', src(): ' + repr(this.src()) + - ', type(): ' + repr(this.type()) + - ', target(): ' + repr(this.target()); - - if (this.type() && - this.type().indexOf('key') === 0 || - this.type().indexOf('mouse') === 0 || - this.type().indexOf('click') != -1 || - this.type() == 'contextmenu') { - str += ', modifier(): ' + '{alt: ' + repr(this.modifier().alt) + - ', ctrl: ' + repr(this.modifier().ctrl) + - ', meta: ' + repr(this.modifier().meta) + - ', shift: ' + repr(this.modifier().shift) + - ', any: ' + repr(this.modifier().any) + '}'; - } - - if (this.type() && this.type().indexOf('key') === 0) { - str += ', key(): {code: ' + repr(this.key().code) + - ', string: ' + repr(this.key().string) + '}'; - } - - if (this.type() && ( - this.type().indexOf('mouse') === 0 || - this.type().indexOf('click') != -1 || - this.type() == 'contextmenu')) { - - str += ', mouse(): {page: ' + repr(this.mouse().page) + - ', client: ' + repr(this.mouse().client); - - if (this.type() != 'mousemove' && this.type() != 'mousewheel') { - str += ', button: {left: ' + repr(this.mouse().button.left) + - ', middle: ' + repr(this.mouse().button.middle) + - ', right: ' + repr(this.mouse().button.right) + '}'; - } - if (this.type() == 'mousewheel') { - str += ', wheel: ' + repr(this.mouse().wheel); - } - str += '}'; - } - if (this.type() == 'mouseover' || this.type() == 'mouseout' || - this.type() == 'mouseenter' || this.type() == 'mouseleave') { - str += ', relatedTarget(): ' + repr(this.relatedTarget()); - } - str += '}'; - return str; - }, - - /** @id MochiKit.Signal.Event.prototype.toString */ - toString: function () { - return this.__repr__(); - }, - - /** @id MochiKit.Signal.Event.prototype.src */ - src: function () { - return this._src; - }, - - /** @id MochiKit.Signal.Event.prototype.event */ - event: function () { - return this._event; - }, - - /** @id MochiKit.Signal.Event.prototype.type */ - type: function () { - if (this._event.type === "DOMMouseScroll") { - return "mousewheel"; - } else { - return this._event.type || undefined; - } - }, - - /** @id MochiKit.Signal.Event.prototype.target */ - target: function () { - return this._event.target || this._event.srcElement; - }, - - _relatedTarget: null, - /** @id MochiKit.Signal.Event.prototype.relatedTarget */ - relatedTarget: function () { - if (this._relatedTarget !== null) { - return this._relatedTarget; - } - - var elem = null; - if (this.type() == 'mouseover' || this.type() == 'mouseenter') { - elem = (this._event.relatedTarget || - this._event.fromElement); - } else if (this.type() == 'mouseout' || this.type() == 'mouseleave') { - elem = (this._event.relatedTarget || - this._event.toElement); - } - try { - if (elem !== null && elem.nodeType !== null) { - this._relatedTarget = elem; - return elem; - } - } catch (ignore) { - // Firefox 3 throws a permission denied error when accessing - // any property on XUL elements (e.g. scrollbars)... - } - - return undefined; - }, - - _modifier: null, - /** @id MochiKit.Signal.Event.prototype.modifier */ - modifier: function () { - if (this._modifier !== null) { - return this._modifier; - } - var m = {}; - m.alt = this._event.altKey; - m.ctrl = this._event.ctrlKey; - m.meta = this._event.metaKey || false; // IE and Opera punt here - m.shift = this._event.shiftKey; - m.any = m.alt || m.ctrl || m.shift || m.meta; - this._modifier = m; - return m; - }, - - _key: null, - /** @id MochiKit.Signal.Event.prototype.key */ - key: function () { - if (this._key !== null) { - return this._key; - } - var k = {}; - if (this.type() && this.type().indexOf('key') === 0) { - - /* - - If you're looking for a special key, look for it in keydown or - keyup, but never keypress. If you're looking for a Unicode - chracter, look for it with keypress, but never keyup or - keydown. - - Notes: - - FF key event behavior: - key event charCode keyCode - DOWN ku,kd 0 40 - DOWN kp 0 40 - ESC ku,kd 0 27 - ESC kp 0 27 - a ku,kd 0 65 - a kp 97 0 - shift+a ku,kd 0 65 - shift+a kp 65 0 - 1 ku,kd 0 49 - 1 kp 49 0 - shift+1 ku,kd 0 0 - shift+1 kp 33 0 - - IE key event behavior: - (IE doesn't fire keypress events for special keys.) - key event keyCode - DOWN ku,kd 40 - DOWN kp undefined - ESC ku,kd 27 - ESC kp 27 - a ku,kd 65 - a kp 97 - shift+a ku,kd 65 - shift+a kp 65 - 1 ku,kd 49 - 1 kp 49 - shift+1 ku,kd 49 - shift+1 kp 33 - - Safari key event behavior: - (Safari sets charCode and keyCode to something crazy for - special keys.) - key event charCode keyCode - DOWN ku,kd 63233 40 - DOWN kp 63233 63233 - ESC ku,kd 27 27 - ESC kp 27 27 - a ku,kd 97 65 - a kp 97 97 - shift+a ku,kd 65 65 - shift+a kp 65 65 - 1 ku,kd 49 49 - 1 kp 49 49 - shift+1 ku,kd 33 49 - shift+1 kp 33 33 - - */ - - /* look for special keys here */ - if (this.type() == 'keydown' || this.type() == 'keyup') { - k.code = this._event.keyCode; - k.string = (MochiKit.Signal._specialKeys[k.code] || - 'KEY_UNKNOWN'); - this._key = k; - return k; - - /* look for characters here */ - } else if (this.type() == 'keypress') { - - /* - - Special key behavior: - - IE: does not fire keypress events for special keys - FF: sets charCode to 0, and sets the correct keyCode - Safari: sets keyCode and charCode to something stupid - - */ - - k.code = 0; - k.string = ''; - - if (typeof(this._event.charCode) != 'undefined' && - this._event.charCode !== 0 && - !MochiKit.Signal._specialMacKeys[this._event.charCode]) { - k.code = this._event.charCode; - k.string = String.fromCharCode(k.code); - } else if (this._event.keyCode && - typeof(this._event.charCode) == 'undefined') { // IE - k.code = this._event.keyCode; - k.string = String.fromCharCode(k.code); - } - - this._key = k; - return k; - } - } - return undefined; - }, - - _mouse: null, - /** @id MochiKit.Signal.Event.prototype.mouse */ - mouse: function () { - if (this._mouse !== null) { - return this._mouse; - } - - var m = {}; - var e = this._event; - - if (this.type() && ( - this.type().indexOf('mouse') === 0 || - this.type().indexOf('click') != -1 || - this.type() == 'contextmenu')) { - - m.client = new MochiKit.Style.Coordinates(0, 0); - if (e.clientX || e.clientY) { - m.client.x = (!e.clientX || e.clientX < 0) ? 0 : e.clientX; - m.client.y = (!e.clientY || e.clientY < 0) ? 0 : e.clientY; - } - - m.page = new MochiKit.Style.Coordinates(0, 0); - if (e.pageX || e.pageY) { - m.page.x = (!e.pageX || e.pageX < 0) ? 0 : e.pageX; - m.page.y = (!e.pageY || e.pageY < 0) ? 0 : e.pageY; - } else { - /* - - The IE shortcut can be off by two. We fix it. See: - http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/getboundingclientrect.asp - - This is similar to the method used in - MochiKit.Style.getElementPosition(). - - */ - var de = MochiKit.DOM._document.documentElement; - var b = MochiKit.DOM._document.body; - - m.page.x = e.clientX + - (de.scrollLeft || b.scrollLeft) - - (de.clientLeft || 0); - - m.page.y = e.clientY + - (de.scrollTop || b.scrollTop) - - (de.clientTop || 0); - - } - if (this.type() != 'mousemove' && this.type() != 'mousewheel') { - m.button = {}; - m.button.left = false; - m.button.right = false; - m.button.middle = false; - - /* we could check e.button, but which is more consistent */ - if (e.which) { - m.button.left = (e.which == 1); - m.button.middle = (e.which == 2); - m.button.right = (e.which == 3); - - /* - - Mac browsers and right click: - - - Safari doesn't fire any click events on a right - click: - http://bugs.webkit.org/show_bug.cgi?id=6595 - - - Firefox fires the event, and sets ctrlKey = true - - - Opera fires the event, and sets metaKey = true - - oncontextmenu is fired on right clicks between - browsers and across platforms. - - */ - - } else { - m.button.left = !!(e.button & 1); - m.button.right = !!(e.button & 2); - m.button.middle = !!(e.button & 4); - } - } - if (this.type() == 'mousewheel') { - m.wheel = new MochiKit.Style.Coordinates(0, 0); - if (e.wheelDeltaX || e.wheelDeltaY) { - m.wheel.x = e.wheelDeltaX / -40 || 0; - m.wheel.y = e.wheelDeltaY / -40 || 0; - } else if (e.wheelDelta) { - m.wheel.y = e.wheelDelta / -40; - } else { - m.wheel.y = e.detail || 0; - } - } - this._mouse = m; - return m; - } - return undefined; - }, - - /** @id MochiKit.Signal.Event.prototype.stop */ - stop: function () { - this.stopPropagation(); - this.preventDefault(); - }, - - /** @id MochiKit.Signal.Event.prototype.stopPropagation */ - stopPropagation: function () { - if (this._event.stopPropagation) { - this._event.stopPropagation(); - } else { - this._event.cancelBubble = true; - } - }, - - /** @id MochiKit.Signal.Event.prototype.preventDefault */ - preventDefault: function () { - if (this._event.preventDefault) { - this._event.preventDefault(); - } else if (this._confirmUnload === null) { - this._event.returnValue = false; - } - }, - - _confirmUnload: null, - - /** @id MochiKit.Signal.Event.prototype.confirmUnload */ - confirmUnload: function (msg) { - if (this.type() == 'beforeunload') { - this._confirmUnload = msg; - this._event.returnValue = msg; - } - } -}); - -/* Safari sets keyCode to these special values onkeypress. */ -MochiKit.Signal._specialMacKeys = { - 3: 'KEY_ENTER', - 63289: 'KEY_NUM_PAD_CLEAR', - 63276: 'KEY_PAGE_UP', - 63277: 'KEY_PAGE_DOWN', - 63275: 'KEY_END', - 63273: 'KEY_HOME', - 63234: 'KEY_ARROW_LEFT', - 63232: 'KEY_ARROW_UP', - 63235: 'KEY_ARROW_RIGHT', - 63233: 'KEY_ARROW_DOWN', - 63302: 'KEY_INSERT', - 63272: 'KEY_DELETE' -}; - -/* for KEY_F1 - KEY_F12 */ -(function () { - var _specialMacKeys = MochiKit.Signal._specialMacKeys; - for (i = 63236; i <= 63242; i++) { - // no F0 - _specialMacKeys[i] = 'KEY_F' + (i - 63236 + 1); - } -})(); - -/* Standard keyboard key codes. */ -MochiKit.Signal._specialKeys = { - 8: 'KEY_BACKSPACE', - 9: 'KEY_TAB', - 12: 'KEY_NUM_PAD_CLEAR', // weird, for Safari and Mac FF only - 13: 'KEY_ENTER', - 16: 'KEY_SHIFT', - 17: 'KEY_CTRL', - 18: 'KEY_ALT', - 19: 'KEY_PAUSE', - 20: 'KEY_CAPS_LOCK', - 27: 'KEY_ESCAPE', - 32: 'KEY_SPACEBAR', - 33: 'KEY_PAGE_UP', - 34: 'KEY_PAGE_DOWN', - 35: 'KEY_END', - 36: 'KEY_HOME', - 37: 'KEY_ARROW_LEFT', - 38: 'KEY_ARROW_UP', - 39: 'KEY_ARROW_RIGHT', - 40: 'KEY_ARROW_DOWN', - 44: 'KEY_PRINT_SCREEN', - 45: 'KEY_INSERT', - 46: 'KEY_DELETE', - 59: 'KEY_SEMICOLON', // weird, for Safari and IE only - 91: 'KEY_WINDOWS_LEFT', - 92: 'KEY_WINDOWS_RIGHT', - 93: 'KEY_SELECT', - 106: 'KEY_NUM_PAD_ASTERISK', - 107: 'KEY_NUM_PAD_PLUS_SIGN', - 109: 'KEY_NUM_PAD_HYPHEN-MINUS', - 110: 'KEY_NUM_PAD_FULL_STOP', - 111: 'KEY_NUM_PAD_SOLIDUS', - 144: 'KEY_NUM_LOCK', - 145: 'KEY_SCROLL_LOCK', - 186: 'KEY_SEMICOLON', - 187: 'KEY_EQUALS_SIGN', - 188: 'KEY_COMMA', - 189: 'KEY_HYPHEN-MINUS', - 190: 'KEY_FULL_STOP', - 191: 'KEY_SOLIDUS', - 192: 'KEY_GRAVE_ACCENT', - 219: 'KEY_LEFT_SQUARE_BRACKET', - 220: 'KEY_REVERSE_SOLIDUS', - 221: 'KEY_RIGHT_SQUARE_BRACKET', - 222: 'KEY_APOSTROPHE' - // undefined: 'KEY_UNKNOWN' -}; - -(function () { - /* for KEY_0 - KEY_9 */ - var _specialKeys = MochiKit.Signal._specialKeys; - for (var i = 48; i <= 57; i++) { - _specialKeys[i] = 'KEY_' + (i - 48); - } - - /* for KEY_A - KEY_Z */ - for (i = 65; i <= 90; i++) { - _specialKeys[i] = 'KEY_' + String.fromCharCode(i); - } - - /* for KEY_NUM_PAD_0 - KEY_NUM_PAD_9 */ - for (i = 96; i <= 105; i++) { - _specialKeys[i] = 'KEY_NUM_PAD_' + (i - 96); - } - - /* for KEY_F1 - KEY_F12 */ - for (i = 112; i <= 123; i++) { - // no F0 - _specialKeys[i] = 'KEY_F' + (i - 112 + 1); - } -})(); - -/* Internal object to keep track of created signals. */ -MochiKit.Signal.Ident = function (ident) { - this.source = ident.source; - this.signal = ident.signal; - this.listener = ident.listener; - this.isDOM = ident.isDOM; - this.objOrFunc = ident.objOrFunc; - this.funcOrStr = ident.funcOrStr; - this.connected = ident.connected; -}; - -MochiKit.Signal.Ident.prototype = {}; - -MochiKit.Base.update(MochiKit.Signal, { - - __repr__: function () { - return '[' + this.NAME + ' ' + this.VERSION + ']'; - }, - - toString: function () { - return this.__repr__(); - }, - - _unloadCache: function () { - var self = MochiKit.Signal; - var observers = self._observers; - - for (var i = 0; i < observers.length; i++) { - if (observers[i].signal !== 'onload' && observers[i].signal !== 'onunload') { - self._disconnect(observers[i]); - } - } - }, - - _listener: function (src, sig, func, obj, isDOM) { - var self = MochiKit.Signal; - var E = self.Event; - if (!isDOM) { - /* We don't want to re-bind already bound methods */ - if (typeof(func.im_self) == 'undefined') { - return MochiKit.Base.bindLate(func, obj); - } else { - return func; - } - } - obj = obj || src; - if (typeof(func) == "string") { - if (sig === 'onload' || sig === 'onunload') { - return function (nativeEvent) { - obj[func].apply(obj, [new E(src, nativeEvent)]); - - var ident = new MochiKit.Signal.Ident({ - source: src, signal: sig, objOrFunc: obj, funcOrStr: func}); - - MochiKit.Signal._disconnect(ident); - }; - } else { - return function (nativeEvent) { - obj[func].apply(obj, [new E(src, nativeEvent)]); - }; - } - } else { - if (sig === 'onload' || sig === 'onunload') { - return function (nativeEvent) { - func.apply(obj, [new E(src, nativeEvent)]); - - var ident = new MochiKit.Signal.Ident({ - source: src, signal: sig, objOrFunc: func}); - - MochiKit.Signal._disconnect(ident); - }; - } else { - return function (nativeEvent) { - func.apply(obj, [new E(src, nativeEvent)]); - }; - } - } - }, - - _browserAlreadyHasMouseEnterAndLeave: function () { - return /MSIE/.test(navigator.userAgent); - }, - - _browserLacksMouseWheelEvent: function () { - return /Gecko\//.test(navigator.userAgent); - }, - - _mouseEnterListener: function (src, sig, func, obj) { - var E = MochiKit.Signal.Event; - return function (nativeEvent) { - var e = new E(src, nativeEvent); - try { - e.relatedTarget().nodeName; - } catch (err) { - /* probably hit a permission denied error; possibly one of - * firefox's screwy anonymous DIVs inside an input element. - * Allow this event to propogate up. - */ - return; - } - e.stop(); - if (MochiKit.DOM.isChildNode(e.relatedTarget(), src)) { - /* We've moved between our node and a child. Ignore. */ - return; - } - e.type = function () { return sig; }; - if (typeof(func) == "string") { - return obj[func].apply(obj, [e]); - } else { - return func.apply(obj, [e]); - } - }; - }, - - _getDestPair: function (objOrFunc, funcOrStr) { - var obj = null; - var func = null; - if (typeof(funcOrStr) != 'undefined') { - obj = objOrFunc; - func = funcOrStr; - if (typeof(funcOrStr) == 'string') { - if (typeof(objOrFunc[funcOrStr]) != "function") { - throw new Error("'funcOrStr' must be a function on 'objOrFunc'"); - } - } else if (typeof(funcOrStr) != 'function') { - throw new Error("'funcOrStr' must be a function or string"); - } - } else if (typeof(objOrFunc) != "function") { - throw new Error("'objOrFunc' must be a function if 'funcOrStr' is not given"); - } else { - func = objOrFunc; - } - return [obj, func]; - }, - - /** @id MochiKit.Signal.connect */ - connect: function (src, sig, objOrFunc/* optional */, funcOrStr) { - src = MochiKit.DOM.getElement(src); - var self = MochiKit.Signal; - - if (typeof(sig) != 'string') { - throw new Error("'sig' must be a string"); - } - - var destPair = self._getDestPair(objOrFunc, funcOrStr); - var obj = destPair[0]; - var func = destPair[1]; - if (typeof(obj) == 'undefined' || obj === null) { - obj = src; - } - - var isDOM = !!(src.addEventListener || src.attachEvent); - if (isDOM && (sig === "onmouseenter" || sig === "onmouseleave") - && !self._browserAlreadyHasMouseEnterAndLeave()) { - var listener = self._mouseEnterListener(src, sig.substr(2), func, obj); - if (sig === "onmouseenter") { - sig = "onmouseover"; - } else { - sig = "onmouseout"; - } - } else if (isDOM && sig == "onmousewheel" && self._browserLacksMouseWheelEvent()) { - var listener = self._listener(src, sig, func, obj, isDOM); - sig = "onDOMMouseScroll"; - } else { - var listener = self._listener(src, sig, func, obj, isDOM); - } - - if (src.addEventListener) { - src.addEventListener(sig.substr(2), listener, false); - } else if (src.attachEvent) { - src.attachEvent(sig, listener); // useCapture unsupported - } - - var ident = new MochiKit.Signal.Ident({ - source: src, - signal: sig, - listener: listener, - isDOM: isDOM, - objOrFunc: objOrFunc, - funcOrStr: funcOrStr, - connected: true - }); - self._observers.push(ident); - - if (!isDOM && typeof(src.__connect__) == 'function') { - var args = MochiKit.Base.extend([ident], arguments, 1); - src.__connect__.apply(src, args); - } - - return ident; - }, - - _disconnect: function (ident) { - // already disconnected - if (!ident.connected) { - return; - } - ident.connected = false; - var src = ident.source; - var sig = ident.signal; - var listener = ident.listener; - // check isDOM - if (!ident.isDOM) { - if (typeof(src.__disconnect__) == 'function') { - src.__disconnect__(ident, sig, ident.objOrFunc, ident.funcOrStr); - } - return; - } - if (src.removeEventListener) { - src.removeEventListener(sig.substr(2), listener, false); - } else if (src.detachEvent) { - src.detachEvent(sig, listener); // useCapture unsupported - } else { - throw new Error("'src' must be a DOM element"); - } - }, - - /** @id MochiKit.Signal.disconnect */ - disconnect: function (ident) { - var self = MochiKit.Signal; - var observers = self._observers; - var m = MochiKit.Base; - if (arguments.length > 1) { - // compatibility API - var src = MochiKit.DOM.getElement(arguments[0]); - var sig = arguments[1]; - var obj = arguments[2]; - var func = arguments[3]; - for (var i = observers.length - 1; i >= 0; i--) { - var o = observers[i]; - if (o.source === src && o.signal === sig && o.objOrFunc === obj && o.funcOrStr === func) { - self._disconnect(o); - if (!self._lock) { - observers.splice(i, 1); - } else { - self._dirty = true; - } - return true; - } - } - } else { - var idx = m.findIdentical(observers, ident); - if (idx >= 0) { - self._disconnect(ident); - if (!self._lock) { - observers.splice(idx, 1); - } else { - self._dirty = true; - } - return true; - } - } - return false; - }, - - /** @id MochiKit.Signal.disconnectAllTo */ - disconnectAllTo: function (objOrFunc, /* optional */funcOrStr) { - var self = MochiKit.Signal; - var observers = self._observers; - var disconnect = self._disconnect; - var locked = self._lock; - var dirty = self._dirty; - if (typeof(funcOrStr) === 'undefined') { - funcOrStr = null; - } - for (var i = observers.length - 1; i >= 0; i--) { - var ident = observers[i]; - if (ident.objOrFunc === objOrFunc && - (funcOrStr === null || ident.funcOrStr === funcOrStr)) { - disconnect(ident); - if (locked) { - dirty = true; - } else { - observers.splice(i, 1); - } - } - } - self._dirty = dirty; - }, - - /** @id MochiKit.Signal.disconnectAll */ - disconnectAll: function (src/* optional */, sig) { - src = MochiKit.DOM.getElement(src); - var m = MochiKit.Base; - var signals = m.flattenArguments(m.extend(null, arguments, 1)); - var self = MochiKit.Signal; - var disconnect = self._disconnect; - var observers = self._observers; - var i, ident; - var locked = self._lock; - var dirty = self._dirty; - if (signals.length === 0) { - // disconnect all - for (i = observers.length - 1; i >= 0; i--) { - ident = observers[i]; - if (ident.source === src) { - disconnect(ident); - if (!locked) { - observers.splice(i, 1); - } else { - dirty = true; - } - } - } - } else { - var sigs = {}; - for (i = 0; i < signals.length; i++) { - sigs[signals[i]] = true; - } - for (i = observers.length - 1; i >= 0; i--) { - ident = observers[i]; - if (ident.source === src && ident.signal in sigs) { - disconnect(ident); - if (!locked) { - observers.splice(i, 1); - } else { - dirty = true; - } - } - } - } - self._dirty = dirty; - }, - - /** @id MochiKit.Signal.signal */ - signal: function (src, sig) { - var self = MochiKit.Signal; - var observers = self._observers; - src = MochiKit.DOM.getElement(src); - var args = MochiKit.Base.extend(null, arguments, 2); - var errors = []; - self._lock = true; - for (var i = 0; i < observers.length; i++) { - var ident = observers[i]; - if (ident.source === src && ident.signal === sig && - ident.connected) { - try { - ident.listener.apply(src, args); - } catch (e) { - errors.push(e); - } - } - } - self._lock = false; - if (self._dirty) { - self._dirty = false; - for (var i = observers.length - 1; i >= 0; i--) { - if (!observers[i].connected) { - observers.splice(i, 1); - } - } - } - if (errors.length == 1) { - throw errors[0]; - } else if (errors.length > 1) { - var e = new Error("Multiple errors thrown in handling 'sig', see errors property"); - e.errors = errors; - throw e; - } - } - -}); - -MochiKit.Signal.EXPORT_OK = []; - -MochiKit.Signal.EXPORT = [ - 'connect', - 'disconnect', - 'signal', - 'disconnectAll', - 'disconnectAllTo' -]; - -MochiKit.Signal.__new__ = function (win) { - var m = MochiKit.Base; - this._document = document; - this._window = win; - this._lock = false; - this._dirty = false; - - try { - this.connect(window, 'onunload', this._unloadCache); - } catch (e) { - // pass: might not be a browser - } - - this.EXPORT_TAGS = { - ':common': this.EXPORT, - ':all': m.concat(this.EXPORT, this.EXPORT_OK) - }; - - m.nameFunctions(this); -}; - -MochiKit.Signal.__new__(this); - -// -// XXX: Internet Explorer blows -// -if (MochiKit.__export__) { - connect = MochiKit.Signal.connect; - disconnect = MochiKit.Signal.disconnect; - disconnectAll = MochiKit.Signal.disconnectAll; - signal = MochiKit.Signal.signal; -} - -MochiKit.Base._exportSymbols(this, MochiKit.Signal); diff --git a/static/MochiKit/Sortable.js b/static/MochiKit/Sortable.js deleted file mode 100644 index 463cce2..0000000 --- a/static/MochiKit/Sortable.js +++ /dev/null @@ -1,589 +0,0 @@ -/*** -Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) - Mochi-ized By Thomas Herve (_firstname_@nimail.org) - -See scriptaculous.js for full license. - -***/ - -MochiKit.Base._deps('Sortable', ['Base', 'Iter', 'DOM', 'Position', 'DragAndDrop']); - -MochiKit.Sortable.NAME = 'MochiKit.Sortable'; -MochiKit.Sortable.VERSION = '1.4.2'; - -MochiKit.Sortable.__repr__ = function () { - return '[' + this.NAME + ' ' + this.VERSION + ']'; -}; - -MochiKit.Sortable.toString = function () { - return this.__repr__(); -}; - -MochiKit.Sortable.EXPORT = [ -]; - -MochiKit.Sortable.EXPORT_OK = [ -]; - -MochiKit.Base.update(MochiKit.Sortable, { - /*** - - Manage sortables. Mainly use the create function to add a sortable. - - ***/ - sortables: {}, - - _findRootElement: function (element) { - while (element.tagName.toUpperCase() != "BODY") { - if (element.id && MochiKit.Sortable.sortables[element.id]) { - return element; - } - element = element.parentNode; - } - }, - - _createElementId: function(element) { - if (element.id == null || element.id == "") { - var d = MochiKit.DOM; - var id; - var count = 1; - while (d.getElement(id = "sortable" + count) != null) { - count += 1; - } - d.setNodeAttribute(element, "id", id); - } - }, - - /** @id MochiKit.Sortable.options */ - options: function (element) { - element = MochiKit.Sortable._findRootElement(MochiKit.DOM.getElement(element)); - if (!element) { - return; - } - return MochiKit.Sortable.sortables[element.id]; - }, - - /** @id MochiKit.Sortable.destroy */ - destroy: function (element){ - var s = MochiKit.Sortable.options(element); - var b = MochiKit.Base; - var d = MochiKit.DragAndDrop; - - if (s) { - MochiKit.Signal.disconnect(s.startHandle); - MochiKit.Signal.disconnect(s.endHandle); - b.map(function (dr) { - d.Droppables.remove(dr); - }, s.droppables); - b.map(function (dr) { - dr.destroy(); - }, s.draggables); - - delete MochiKit.Sortable.sortables[s.element.id]; - } - }, - - /** @id MochiKit.Sortable.create */ - create: function (element, options) { - element = MochiKit.DOM.getElement(element); - var self = MochiKit.Sortable; - self._createElementId(element); - - /** @id MochiKit.Sortable.options */ - options = MochiKit.Base.update({ - - /** @id MochiKit.Sortable.element */ - element: element, - - /** @id MochiKit.Sortable.tag */ - tag: 'li', // assumes li children, override with tag: 'tagname' - - /** @id MochiKit.Sortable.dropOnEmpty */ - dropOnEmpty: false, - - /** @id MochiKit.Sortable.tree */ - tree: false, - - /** @id MochiKit.Sortable.treeTag */ - treeTag: 'ul', - - /** @id MochiKit.Sortable.overlap */ - overlap: 'vertical', // one of 'vertical', 'horizontal' - - /** @id MochiKit.Sortable.constraint */ - constraint: 'vertical', // one of 'vertical', 'horizontal', false - // also takes array of elements (or ids); or false - - /** @id MochiKit.Sortable.containment */ - containment: [element], - - /** @id MochiKit.Sortable.handle */ - handle: false, // or a CSS class - - /** @id MochiKit.Sortable.only */ - only: false, - - /** @id MochiKit.Sortable.hoverclass */ - hoverclass: null, - - /** @id MochiKit.Sortable.ghosting */ - ghosting: false, - - /** @id MochiKit.Sortable.scroll */ - scroll: false, - - /** @id MochiKit.Sortable.scrollSensitivity */ - scrollSensitivity: 20, - - /** @id MochiKit.Sortable.scrollSpeed */ - scrollSpeed: 15, - - /** @id MochiKit.Sortable.format */ - format: /^[^_]*_(.*)$/, - - /** @id MochiKit.Sortable.onChange */ - onChange: MochiKit.Base.noop, - - /** @id MochiKit.Sortable.onUpdate */ - onUpdate: MochiKit.Base.noop, - - /** @id MochiKit.Sortable.accept */ - accept: null - }, options); - - // clear any old sortable with same element - self.destroy(element); - - // build options for the draggables - var options_for_draggable = { - revert: true, - ghosting: options.ghosting, - scroll: options.scroll, - scrollSensitivity: options.scrollSensitivity, - scrollSpeed: options.scrollSpeed, - constraint: options.constraint, - handle: options.handle - }; - - if (options.starteffect) { - options_for_draggable.starteffect = options.starteffect; - } - - if (options.reverteffect) { - options_for_draggable.reverteffect = options.reverteffect; - } else if (options.ghosting) { - options_for_draggable.reverteffect = function (innerelement) { - innerelement.style.top = 0; - innerelement.style.left = 0; - }; - } - - if (options.endeffect) { - options_for_draggable.endeffect = options.endeffect; - } - - if (options.zindex) { - options_for_draggable.zindex = options.zindex; - } - - // build options for the droppables - var options_for_droppable = { - overlap: options.overlap, - containment: options.containment, - hoverclass: options.hoverclass, - onhover: self.onHover, - tree: options.tree, - accept: options.accept - } - - var options_for_tree = { - onhover: self.onEmptyHover, - overlap: options.overlap, - containment: options.containment, - hoverclass: options.hoverclass, - accept: options.accept - } - - // fix for gecko engine - MochiKit.DOM.removeEmptyTextNodes(element); - - options.draggables = []; - options.droppables = []; - - // drop on empty handling - if (options.dropOnEmpty || options.tree) { - new MochiKit.DragAndDrop.Droppable(element, options_for_tree); - options.droppables.push(element); - } - MochiKit.Base.map(function (e) { - // handles are per-draggable - var handle = options.handle ? - MochiKit.DOM.getFirstElementByTagAndClassName(null, - options.handle, e) : e; - options.draggables.push( - new MochiKit.DragAndDrop.Draggable(e, - MochiKit.Base.update(options_for_draggable, - {handle: handle}))); - new MochiKit.DragAndDrop.Droppable(e, options_for_droppable); - if (options.tree) { - e.treeNode = element; - } - options.droppables.push(e); - }, (self.findElements(element, options) || [])); - - if (options.tree) { - MochiKit.Base.map(function (e) { - new MochiKit.DragAndDrop.Droppable(e, options_for_tree); - e.treeNode = element; - options.droppables.push(e); - }, (self.findTreeElements(element, options) || [])); - } - - // keep reference - self.sortables[element.id] = options; - - options.lastValue = self.serialize(element); - options.startHandle = MochiKit.Signal.connect(MochiKit.DragAndDrop.Draggables, 'start', - MochiKit.Base.partial(self.onStart, element)); - options.endHandle = MochiKit.Signal.connect(MochiKit.DragAndDrop.Draggables, 'end', - MochiKit.Base.partial(self.onEnd, element)); - }, - - /** @id MochiKit.Sortable.onStart */ - onStart: function (element, draggable) { - var self = MochiKit.Sortable; - var options = self.options(element); - options.lastValue = self.serialize(options.element); - }, - - /** @id MochiKit.Sortable.onEnd */ - onEnd: function (element, draggable) { - var self = MochiKit.Sortable; - self.unmark(); - var options = self.options(element); - if (options.lastValue != self.serialize(options.element)) { - options.onUpdate(options.element); - } - }, - - // return all suitable-for-sortable elements in a guaranteed order - - /** @id MochiKit.Sortable.findElements */ - findElements: function (element, options) { - return MochiKit.Sortable.findChildren(element, options.only, options.tree, options.tag); - }, - - /** @id MochiKit.Sortable.findTreeElements */ - findTreeElements: function (element, options) { - return MochiKit.Sortable.findChildren( - element, options.only, options.tree ? true : false, options.treeTag); - }, - - /** @id MochiKit.Sortable.findChildren */ - findChildren: function (element, only, recursive, tagName) { - if (!element.hasChildNodes()) { - return null; - } - tagName = tagName.toUpperCase(); - if (only) { - only = MochiKit.Base.flattenArray([only]); - } - var elements = []; - MochiKit.Base.map(function (e) { - if (e.tagName && - e.tagName.toUpperCase() == tagName && - (!only || - MochiKit.Iter.some(only, function (c) { - return MochiKit.DOM.hasElementClass(e, c); - }))) { - elements.push(e); - } - if (recursive) { - var grandchildren = MochiKit.Sortable.findChildren(e, only, recursive, tagName); - if (grandchildren && grandchildren.length > 0) { - elements = elements.concat(grandchildren); - } - } - }, element.childNodes); - return elements; - }, - - /** @id MochiKit.Sortable.onHover */ - onHover: function (element, dropon, overlap) { - if (MochiKit.DOM.isChildNode(dropon, element)) { - return; - } - var self = MochiKit.Sortable; - - if (overlap > .33 && overlap < .66 && self.options(dropon).tree) { - return; - } else if (overlap > 0.5) { - self.mark(dropon, 'before'); - if (dropon.previousSibling != element) { - var oldParentNode = element.parentNode; - element.style.visibility = 'hidden'; // fix gecko rendering - dropon.parentNode.insertBefore(element, dropon); - if (dropon.parentNode != oldParentNode) { - self.options(oldParentNode).onChange(element); - } - self.options(dropon.parentNode).onChange(element); - } - } else { - self.mark(dropon, 'after'); - var nextElement = dropon.nextSibling || null; - if (nextElement != element) { - var oldParentNode = element.parentNode; - element.style.visibility = 'hidden'; // fix gecko rendering - dropon.parentNode.insertBefore(element, nextElement); - if (dropon.parentNode != oldParentNode) { - self.options(oldParentNode).onChange(element); - } - self.options(dropon.parentNode).onChange(element); - } - } - }, - - _offsetSize: function (element, type) { - if (type == 'vertical' || type == 'height') { - return element.offsetHeight; - } else { - return element.offsetWidth; - } - }, - - /** @id MochiKit.Sortable.onEmptyHover */ - onEmptyHover: function (element, dropon, overlap) { - var oldParentNode = element.parentNode; - var self = MochiKit.Sortable; - var droponOptions = self.options(dropon); - - if (!MochiKit.DOM.isChildNode(dropon, element)) { - var index; - - var children = self.findElements(dropon, {tag: droponOptions.tag, - only: droponOptions.only}); - var child = null; - - if (children) { - var offset = self._offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap); - - for (index = 0; index < children.length; index += 1) { - if (offset - self._offsetSize(children[index], droponOptions.overlap) >= 0) { - offset -= self._offsetSize(children[index], droponOptions.overlap); - } else if (offset - (self._offsetSize (children[index], droponOptions.overlap) / 2) >= 0) { - child = index + 1 < children.length ? children[index + 1] : null; - break; - } else { - child = children[index]; - break; - } - } - } - - dropon.insertBefore(element, child); - - self.options(oldParentNode).onChange(element); - droponOptions.onChange(element); - } - }, - - /** @id MochiKit.Sortable.unmark */ - unmark: function () { - var m = MochiKit.Sortable._marker; - if (m) { - MochiKit.Style.hideElement(m); - } - }, - - /** @id MochiKit.Sortable.mark */ - mark: function (dropon, position) { - // mark on ghosting only - var d = MochiKit.DOM; - var self = MochiKit.Sortable; - var sortable = self.options(dropon.parentNode); - if (sortable && !sortable.ghosting) { - return; - } - - if (!self._marker) { - self._marker = d.getElement('dropmarker') || - document.createElement('DIV'); - MochiKit.Style.hideElement(self._marker); - d.addElementClass(self._marker, 'dropmarker'); - self._marker.style.position = 'absolute'; - document.getElementsByTagName('body').item(0).appendChild(self._marker); - } - var offsets = MochiKit.Position.cumulativeOffset(dropon); - self._marker.style.left = offsets.x + 'px'; - self._marker.style.top = offsets.y + 'px'; - - if (position == 'after') { - if (sortable.overlap == 'horizontal') { - self._marker.style.left = (offsets.x + dropon.clientWidth) + 'px'; - } else { - self._marker.style.top = (offsets.y + dropon.clientHeight) + 'px'; - } - } - MochiKit.Style.showElement(self._marker); - }, - - _tree: function (element, options, parent) { - var self = MochiKit.Sortable; - var children = self.findElements(element, options) || []; - - for (var i = 0; i < children.length; ++i) { - var match = children[i].id.match(options.format); - - if (!match) { - continue; - } - - var child = { - id: encodeURIComponent(match ? match[1] : null), - element: element, - parent: parent, - children: [], - position: parent.children.length, - container: self._findChildrenElement(children[i], options.treeTag.toUpperCase()) - } - - /* Get the element containing the children and recurse over it */ - if (child.container) { - self._tree(child.container, options, child) - } - - parent.children.push (child); - } - - return parent; - }, - - /* Finds the first element of the given tag type within a parent element. - Used for finding the first LI[ST] within a L[IST]I[TEM].*/ - _findChildrenElement: function (element, containerTag) { - if (element && element.hasChildNodes) { - containerTag = containerTag.toUpperCase(); - for (var i = 0; i < element.childNodes.length; ++i) { - if (element.childNodes[i].tagName.toUpperCase() == containerTag) { - return element.childNodes[i]; - } - } - } - return null; - }, - - /** @id MochiKit.Sortable.tree */ - tree: function (element, options) { - element = MochiKit.DOM.getElement(element); - var sortableOptions = MochiKit.Sortable.options(element); - options = MochiKit.Base.update({ - tag: sortableOptions.tag, - treeTag: sortableOptions.treeTag, - only: sortableOptions.only, - name: element.id, - format: sortableOptions.format - }, options || {}); - - var root = { - id: null, - parent: null, - children: new Array, - container: element, - position: 0 - } - - return MochiKit.Sortable._tree(element, options, root); - }, - - /** - * Specifies the sequence for the Sortable. - * @param {Node} element Element to use as the Sortable. - * @param {Object} newSequence New sequence to use. - * @param {Object} options Options to use fro the Sortable. - */ - setSequence: function (element, newSequence, options) { - var self = MochiKit.Sortable; - var b = MochiKit.Base; - element = MochiKit.DOM.getElement(element); - options = b.update(self.options(element), options || {}); - - var nodeMap = {}; - b.map(function (n) { - var m = n.id.match(options.format); - if (m) { - nodeMap[m[1]] = [n, n.parentNode]; - } - n.parentNode.removeChild(n); - }, self.findElements(element, options)); - - b.map(function (ident) { - var n = nodeMap[ident]; - if (n) { - n[1].appendChild(n[0]); - delete nodeMap[ident]; - } - }, newSequence); - }, - - /* Construct a [i] index for a particular node */ - _constructIndex: function (node) { - var index = ''; - do { - if (node.id) { - index = '[' + node.position + ']' + index; - } - } while ((node = node.parent) != null); - return index; - }, - - /** @id MochiKit.Sortable.sequence */ - sequence: function (element, options) { - element = MochiKit.DOM.getElement(element); - var self = MochiKit.Sortable; - var options = MochiKit.Base.update(self.options(element), options || {}); - - return MochiKit.Base.map(function (item) { - return item.id.match(options.format) ? item.id.match(options.format)[1] : ''; - }, MochiKit.DOM.getElement(self.findElements(element, options) || [])); - }, - - /** - * Serializes the content of a Sortable. Useful to send this content through a XMLHTTPRequest. - * These options override the Sortable options for the serialization only. - * @param {Node} element Element to serialize. - * @param {Object} options Serialization options. - */ - serialize: function (element, options) { - element = MochiKit.DOM.getElement(element); - var self = MochiKit.Sortable; - options = MochiKit.Base.update(self.options(element), options || {}); - var name = encodeURIComponent(options.name || element.id); - - if (options.tree) { - return MochiKit.Base.flattenArray(MochiKit.Base.map(function (item) { - return [name + self._constructIndex(item) + "[id]=" + - encodeURIComponent(item.id)].concat(item.children.map(arguments.callee)); - }, self.tree(element, options).children)).join('&'); - } else { - return MochiKit.Base.map(function (item) { - return name + "[]=" + encodeURIComponent(item); - }, self.sequence(element, options)).join('&'); - } - } -}); - -// trunk compatibility -MochiKit.Sortable.Sortable = MochiKit.Sortable; - -MochiKit.Sortable.__new__ = function () { - MochiKit.Base.nameFunctions(this); - - this.EXPORT_TAGS = { - ":common": this.EXPORT, - ":all": MochiKit.Base.concat(this.EXPORT, this.EXPORT_OK) - }; -}; - -MochiKit.Sortable.__new__(); - -MochiKit.Base._exportSymbols(this, MochiKit.Sortable); diff --git a/static/MochiKit/Style.js b/static/MochiKit/Style.js deleted file mode 100644 index 68bd919..0000000 --- a/static/MochiKit/Style.js +++ /dev/null @@ -1,594 +0,0 @@ -/*** - -MochiKit.Style 1.4.2 - -See for documentation, downloads, license, etc. - -(c) 2005-2006 Bob Ippolito, Beau Hartshorne. All rights Reserved. - -***/ - -MochiKit.Base._deps('Style', ['Base', 'DOM']); - -MochiKit.Style.NAME = 'MochiKit.Style'; -MochiKit.Style.VERSION = '1.4.2'; -MochiKit.Style.__repr__ = function () { - return '[' + this.NAME + ' ' + this.VERSION + ']'; -}; -MochiKit.Style.toString = function () { - return this.__repr__(); -}; - -MochiKit.Style.EXPORT_OK = []; - -MochiKit.Style.EXPORT = [ - 'setStyle', - 'setOpacity', - 'getStyle', - 'getElementDimensions', - 'elementDimensions', // deprecated - 'setElementDimensions', - 'getElementPosition', - 'elementPosition', // deprecated - 'setElementPosition', - "makePositioned", - "undoPositioned", - "makeClipping", - "undoClipping", - 'setDisplayForElement', - 'hideElement', - 'showElement', - 'getViewportDimensions', - 'getViewportPosition', - 'Dimensions', - 'Coordinates' -]; - - -/* - - Dimensions - -*/ -/** @id MochiKit.Style.Dimensions */ -MochiKit.Style.Dimensions = function (w, h) { - this.w = w; - this.h = h; -}; - -MochiKit.Style.Dimensions.prototype.__repr__ = function () { - var repr = MochiKit.Base.repr; - return '{w: ' + repr(this.w) + ', h: ' + repr(this.h) + '}'; -}; - -MochiKit.Style.Dimensions.prototype.toString = function () { - return this.__repr__(); -}; - - -/* - - Coordinates - -*/ -/** @id MochiKit.Style.Coordinates */ -MochiKit.Style.Coordinates = function (x, y) { - this.x = x; - this.y = y; -}; - -MochiKit.Style.Coordinates.prototype.__repr__ = function () { - var repr = MochiKit.Base.repr; - return '{x: ' + repr(this.x) + ', y: ' + repr(this.y) + '}'; -}; - -MochiKit.Style.Coordinates.prototype.toString = function () { - return this.__repr__(); -}; - - -MochiKit.Base.update(MochiKit.Style, { - - /** @id MochiKit.Style.getStyle */ - getStyle: function (elem, cssProperty) { - var dom = MochiKit.DOM; - var d = dom._document; - - elem = dom.getElement(elem); - cssProperty = MochiKit.Base.camelize(cssProperty); - - if (!elem || elem == d) { - return undefined; - } - if (cssProperty == 'opacity' && typeof(elem.filters) != 'undefined') { - var opacity = (MochiKit.Style.getStyle(elem, 'filter') || '').match(/alpha\(opacity=(.*)\)/); - if (opacity && opacity[1]) { - return parseFloat(opacity[1]) / 100; - } - return 1.0; - } - if (cssProperty == 'float' || cssProperty == 'cssFloat' || cssProperty == 'styleFloat') { - if (elem.style["float"]) { - return elem.style["float"]; - } else if (elem.style.cssFloat) { - return elem.style.cssFloat; - } else if (elem.style.styleFloat) { - return elem.style.styleFloat; - } else { - return "none"; - } - } - var value = elem.style ? elem.style[cssProperty] : null; - if (!value) { - if (d.defaultView && d.defaultView.getComputedStyle) { - var css = d.defaultView.getComputedStyle(elem, null); - cssProperty = cssProperty.replace(/([A-Z])/g, '-$1' - ).toLowerCase(); // from dojo.style.toSelectorCase - value = css ? css.getPropertyValue(cssProperty) : null; - } else if (elem.currentStyle) { - value = elem.currentStyle[cssProperty]; - if (/^\d/.test(value) && !/px$/.test(value) && cssProperty != 'fontWeight') { - /* Convert to px using an hack from Dean Edwards */ - var left = elem.style.left; - var rsLeft = elem.runtimeStyle.left; - elem.runtimeStyle.left = elem.currentStyle.left; - elem.style.left = value || 0; - value = elem.style.pixelLeft + "px"; - elem.style.left = left; - elem.runtimeStyle.left = rsLeft; - } - } - } - if (cssProperty == 'opacity') { - value = parseFloat(value); - } - - if (/Opera/.test(navigator.userAgent) && (MochiKit.Base.findValue(['left', 'top', 'right', 'bottom'], cssProperty) != -1)) { - if (MochiKit.Style.getStyle(elem, 'position') == 'static') { - value = 'auto'; - } - } - - return value == 'auto' ? null : value; - }, - - /** @id MochiKit.Style.setStyle */ - setStyle: function (elem, style) { - elem = MochiKit.DOM.getElement(elem); - for (var name in style) { - switch (name) { - case 'opacity': - MochiKit.Style.setOpacity(elem, style[name]); - break; - case 'float': - case 'cssFloat': - case 'styleFloat': - if (typeof(elem.style["float"]) != "undefined") { - elem.style["float"] = style[name]; - } else if (typeof(elem.style.cssFloat) != "undefined") { - elem.style.cssFloat = style[name]; - } else { - elem.style.styleFloat = style[name]; - } - break; - default: - elem.style[MochiKit.Base.camelize(name)] = style[name]; - } - } - }, - - /** @id MochiKit.Style.setOpacity */ - setOpacity: function (elem, o) { - elem = MochiKit.DOM.getElement(elem); - var self = MochiKit.Style; - if (o == 1) { - var toSet = /Gecko/.test(navigator.userAgent) && !(/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent)); - elem.style["opacity"] = toSet ? 0.999999 : 1.0; - if (/MSIE/.test(navigator.userAgent)) { - elem.style['filter'] = - self.getStyle(elem, 'filter').replace(/alpha\([^\)]*\)/gi, ''); - } - } else { - if (o < 0.00001) { - o = 0; - } - elem.style["opacity"] = o; - if (/MSIE/.test(navigator.userAgent)) { - elem.style['filter'] = - self.getStyle(elem, 'filter').replace(/alpha\([^\)]*\)/gi, '') + 'alpha(opacity=' + o * 100 + ')'; - } - } - }, - - /* - - getElementPosition is adapted from YAHOO.util.Dom.getXY v0.9.0. - Copyright: Copyright (c) 2006, Yahoo! Inc. All rights reserved. - License: BSD, http://developer.yahoo.net/yui/license.txt - - */ - - /** @id MochiKit.Style.getElementPosition */ - getElementPosition: function (elem, /* optional */relativeTo) { - var self = MochiKit.Style; - var dom = MochiKit.DOM; - elem = dom.getElement(elem); - - if (!elem || - (!(elem.x && elem.y) && - (!elem.parentNode === null || - self.getStyle(elem, 'display') == 'none'))) { - return undefined; - } - - var c = new self.Coordinates(0, 0); - var box = null; - var parent = null; - - var d = MochiKit.DOM._document; - var de = d.documentElement; - var b = d.body; - - if (!elem.parentNode && elem.x && elem.y) { - /* it's just a MochiKit.Style.Coordinates object */ - c.x += elem.x || 0; - c.y += elem.y || 0; - } else if (elem.getBoundingClientRect) { // IE shortcut - /* - - The IE shortcut can be off by two. We fix it. See: - http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/getboundingclientrect.asp - - This is similar to the method used in - MochiKit.Signal.Event.mouse(). - - */ - box = elem.getBoundingClientRect(); - - c.x += box.left + - (de.scrollLeft || b.scrollLeft) - - (de.clientLeft || 0); - - c.y += box.top + - (de.scrollTop || b.scrollTop) - - (de.clientTop || 0); - - } else if (elem.offsetParent) { - c.x += elem.offsetLeft; - c.y += elem.offsetTop; - parent = elem.offsetParent; - - if (parent != elem) { - while (parent) { - c.x += parseInt(parent.style.borderLeftWidth) || 0; - c.y += parseInt(parent.style.borderTopWidth) || 0; - c.x += parent.offsetLeft; - c.y += parent.offsetTop; - parent = parent.offsetParent; - } - } - - /* - - Opera < 9 and old Safari (absolute) incorrectly account for - body offsetTop and offsetLeft. - - */ - var ua = navigator.userAgent.toLowerCase(); - if ((typeof(opera) != 'undefined' && - parseFloat(opera.version()) < 9) || - (ua.indexOf('AppleWebKit') != -1 && - self.getStyle(elem, 'position') == 'absolute')) { - - c.x -= b.offsetLeft; - c.y -= b.offsetTop; - - } - - // Adjust position for strange Opera scroll bug - if (elem.parentNode) { - parent = elem.parentNode; - } else { - parent = null; - } - while (parent) { - var tagName = parent.tagName.toUpperCase(); - if (tagName === 'BODY' || tagName === 'HTML') { - break; - } - var disp = self.getStyle(parent, 'display'); - // Handle strange Opera bug for some display - if (disp.search(/^inline|table-row.*$/i)) { - c.x -= parent.scrollLeft; - c.y -= parent.scrollTop; - } - if (parent.parentNode) { - parent = parent.parentNode; - } else { - parent = null; - } - } - } - - if (typeof(relativeTo) != 'undefined') { - relativeTo = arguments.callee(relativeTo); - if (relativeTo) { - c.x -= (relativeTo.x || 0); - c.y -= (relativeTo.y || 0); - } - } - - return c; - }, - - /** @id MochiKit.Style.setElementPosition */ - setElementPosition: function (elem, newPos/* optional */, units) { - elem = MochiKit.DOM.getElement(elem); - if (typeof(units) == 'undefined') { - units = 'px'; - } - var newStyle = {}; - var isUndefNull = MochiKit.Base.isUndefinedOrNull; - if (!isUndefNull(newPos.x)) { - newStyle['left'] = newPos.x + units; - } - if (!isUndefNull(newPos.y)) { - newStyle['top'] = newPos.y + units; - } - MochiKit.DOM.updateNodeAttributes(elem, {'style': newStyle}); - }, - - /** @id MochiKit.Style.makePositioned */ - makePositioned: function (element) { - element = MochiKit.DOM.getElement(element); - var pos = MochiKit.Style.getStyle(element, 'position'); - if (pos == 'static' || !pos) { - element.style.position = 'relative'; - // Opera returns the offset relative to the positioning context, - // when an element is position relative but top and left have - // not been defined - if (/Opera/.test(navigator.userAgent)) { - element.style.top = 0; - element.style.left = 0; - } - } - }, - - /** @id MochiKit.Style.undoPositioned */ - undoPositioned: function (element) { - element = MochiKit.DOM.getElement(element); - if (element.style.position == 'relative') { - element.style.position = element.style.top = element.style.left = element.style.bottom = element.style.right = ''; - } - }, - - /** @id MochiKit.Style.makeClipping */ - makeClipping: function (element) { - element = MochiKit.DOM.getElement(element); - var s = element.style; - var oldOverflow = { 'overflow': s.overflow, - 'overflow-x': s.overflowX, - 'overflow-y': s.overflowY }; - if ((MochiKit.Style.getStyle(element, 'overflow') || 'visible') != 'hidden') { - element.style.overflow = 'hidden'; - element.style.overflowX = 'hidden'; - element.style.overflowY = 'hidden'; - } - return oldOverflow; - }, - - /** @id MochiKit.Style.undoClipping */ - undoClipping: function (element, overflow) { - element = MochiKit.DOM.getElement(element); - if (typeof(overflow) == 'string') { - element.style.overflow = overflow; - } else if (overflow != null) { - element.style.overflow = overflow['overflow']; - element.style.overflowX = overflow['overflow-x']; - element.style.overflowY = overflow['overflow-y']; - } - }, - - /** @id MochiKit.Style.getElementDimensions */ - getElementDimensions: function (elem, contentSize/*optional*/) { - var self = MochiKit.Style; - var dom = MochiKit.DOM; - if (typeof(elem.w) == 'number' || typeof(elem.h) == 'number') { - return new self.Dimensions(elem.w || 0, elem.h || 0); - } - elem = dom.getElement(elem); - if (!elem) { - return undefined; - } - var disp = self.getStyle(elem, 'display'); - // display can be empty/undefined on WebKit/KHTML - if (disp == 'none' || disp == '' || typeof(disp) == 'undefined') { - var s = elem.style; - var originalVisibility = s.visibility; - var originalPosition = s.position; - var originalDisplay = s.display; - s.visibility = 'hidden'; - s.position = 'absolute'; - s.display = self._getDefaultDisplay(elem); - var originalWidth = elem.offsetWidth; - var originalHeight = elem.offsetHeight; - s.display = originalDisplay; - s.position = originalPosition; - s.visibility = originalVisibility; - } else { - originalWidth = elem.offsetWidth || 0; - originalHeight = elem.offsetHeight || 0; - } - if (contentSize) { - var tableCell = 'colSpan' in elem && 'rowSpan' in elem; - var collapse = (tableCell && elem.parentNode && self.getStyle( - elem.parentNode, 'borderCollapse') == 'collapse') - if (collapse) { - if (/MSIE/.test(navigator.userAgent)) { - var borderLeftQuota = elem.previousSibling? 0.5 : 1; - var borderRightQuota = elem.nextSibling? 0.5 : 1; - } - else { - var borderLeftQuota = 0.5; - var borderRightQuota = 0.5; - } - } else { - var borderLeftQuota = 1; - var borderRightQuota = 1; - } - originalWidth -= Math.round( - (parseFloat(self.getStyle(elem, 'paddingLeft')) || 0) - + (parseFloat(self.getStyle(elem, 'paddingRight')) || 0) - + borderLeftQuota * - (parseFloat(self.getStyle(elem, 'borderLeftWidth')) || 0) - + borderRightQuota * - (parseFloat(self.getStyle(elem, 'borderRightWidth')) || 0) - ); - if (tableCell) { - if (/Gecko|Opera/.test(navigator.userAgent) - && !/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent)) { - var borderHeightQuota = 0; - } else if (/MSIE/.test(navigator.userAgent)) { - var borderHeightQuota = 1; - } else { - var borderHeightQuota = collapse? 0.5 : 1; - } - } else { - var borderHeightQuota = 1; - } - originalHeight -= Math.round( - (parseFloat(self.getStyle(elem, 'paddingTop')) || 0) - + (parseFloat(self.getStyle(elem, 'paddingBottom')) || 0) - + borderHeightQuota * ( - (parseFloat(self.getStyle(elem, 'borderTopWidth')) || 0) - + (parseFloat(self.getStyle(elem, 'borderBottomWidth')) || 0)) - ); - } - return new self.Dimensions(originalWidth, originalHeight); - }, - - /** @id MochiKit.Style.setElementDimensions */ - setElementDimensions: function (elem, newSize/* optional */, units) { - elem = MochiKit.DOM.getElement(elem); - if (typeof(units) == 'undefined') { - units = 'px'; - } - var newStyle = {}; - var isUndefNull = MochiKit.Base.isUndefinedOrNull; - if (!isUndefNull(newSize.w)) { - newStyle['width'] = newSize.w + units; - } - if (!isUndefNull(newSize.h)) { - newStyle['height'] = newSize.h + units; - } - MochiKit.DOM.updateNodeAttributes(elem, {'style': newStyle}); - }, - - _getDefaultDisplay: function (elem) { - var self = MochiKit.Style; - var dom = MochiKit.DOM; - elem = dom.getElement(elem); - if (!elem) { - return undefined; - } - var tagName = elem.tagName.toUpperCase(); - return self._defaultDisplay[tagName] || 'block'; - }, - - /** @id MochiKit.Style.setDisplayForElement */ - setDisplayForElement: function (display, element/*, ...*/) { - var elements = MochiKit.Base.extend(null, arguments, 1); - var getElement = MochiKit.DOM.getElement; - for (var i = 0; i < elements.length; i++) { - element = getElement(elements[i]); - if (element) { - element.style.display = display; - } - } - }, - - /** @id MochiKit.Style.getViewportDimensions */ - getViewportDimensions: function () { - var d = new MochiKit.Style.Dimensions(); - var w = MochiKit.DOM._window; - var b = MochiKit.DOM._document.body; - if (w.innerWidth) { - d.w = w.innerWidth; - d.h = w.innerHeight; - } else if (b && b.parentElement && b.parentElement.clientWidth) { - d.w = b.parentElement.clientWidth; - d.h = b.parentElement.clientHeight; - } else if (b && b.clientWidth) { - d.w = b.clientWidth; - d.h = b.clientHeight; - } - return d; - }, - - /** @id MochiKit.Style.getViewportPosition */ - getViewportPosition: function () { - var c = new MochiKit.Style.Coordinates(0, 0); - var d = MochiKit.DOM._document; - var de = d.documentElement; - var db = d.body; - if (de && (de.scrollTop || de.scrollLeft)) { - c.x = de.scrollLeft; - c.y = de.scrollTop; - } else if (db) { - c.x = db.scrollLeft; - c.y = db.scrollTop; - } - return c; - }, - - __new__: function () { - var m = MochiKit.Base; - - var inlines = ['A','ABBR','ACRONYM','B','BASEFONT','BDO','BIG','BR', - 'CITE','CODE','DFN','EM','FONT','I','IMG','KBD','LABEL', - 'Q','S','SAMP','SMALL','SPAN','STRIKE','STRONG','SUB', - 'SUP','TEXTAREA','TT','U','VAR']; - this._defaultDisplay = { 'TABLE': 'table', - 'THEAD': 'table-header-group', - 'TBODY': 'table-row-group', - 'TFOOT': 'table-footer-group', - 'COLGROUP': 'table-column-group', - 'COL': 'table-column', - 'TR': 'table-row', - 'TD': 'table-cell', - 'TH': 'table-cell', - 'CAPTION': 'table-caption', - 'LI': 'list-item', - 'INPUT': 'inline-block', - 'SELECT': 'inline-block' }; - // CSS 'display' support in IE6/7 is just broken... - if (/MSIE/.test(navigator.userAgent)) { - for (var k in this._defaultDisplay) { - var v = this._defaultDisplay[k]; - if (v.indexOf('table') == 0) { - this._defaultDisplay[k] = 'block'; - } - } - } - for (var i = 0; i < inlines.length; i++) { - this._defaultDisplay[inlines[i]] = 'inline'; - } - - this.elementPosition = this.getElementPosition; - this.elementDimensions = this.getElementDimensions; - - this.hideElement = m.partial(this.setDisplayForElement, 'none'); - // TODO: showElement could be improved by using getDefaultDisplay. - this.showElement = m.partial(this.setDisplayForElement, 'block'); - - this.EXPORT_TAGS = { - ':common': this.EXPORT, - ':all': m.concat(this.EXPORT, this.EXPORT_OK) - }; - - m.nameFunctions(this); - } -}); - -MochiKit.Style.__new__(); -MochiKit.Base._exportSymbols(this, MochiKit.Style); diff --git a/static/MochiKit/Test.js b/static/MochiKit/Test.js deleted file mode 100644 index 30bfb4c..0000000 --- a/static/MochiKit/Test.js +++ /dev/null @@ -1,162 +0,0 @@ -/*** - -MochiKit.Test 1.4.2 - -See for documentation, downloads, license, etc. - -(c) 2005 Bob Ippolito. All rights Reserved. - -***/ - -MochiKit.Base._deps('Test', ['Base']); - -MochiKit.Test.NAME = "MochiKit.Test"; -MochiKit.Test.VERSION = "1.4.2"; -MochiKit.Test.__repr__ = function () { - return "[" + this.NAME + " " + this.VERSION + "]"; -}; - -MochiKit.Test.toString = function () { - return this.__repr__(); -}; - - -MochiKit.Test.EXPORT = ["runTests"]; -MochiKit.Test.EXPORT_OK = []; - -MochiKit.Test.runTests = function (obj) { - if (typeof(obj) == "string") { - obj = JSAN.use(obj); - } - var suite = new MochiKit.Test.Suite(); - suite.run(obj); -}; - -MochiKit.Test.Suite = function () { - this.testIndex = 0; - MochiKit.Base.bindMethods(this); -}; - -MochiKit.Test.Suite.prototype = { - run: function (obj) { - try { - obj(this); - } catch (e) { - this.traceback(e); - } - }, - traceback: function (e) { - var items = MochiKit.Iter.sorted(MochiKit.Base.items(e)); - print("not ok " + this.testIndex + " - Error thrown"); - for (var i = 0; i < items.length; i++) { - var kv = items[i]; - if (kv[0] == "stack") { - kv[1] = kv[1].split(/\n/)[0]; - } - this.print("# " + kv.join(": ")); - } - }, - print: function (s) { - print(s); - }, - is: function (got, expected, /* optional */message) { - var res = 1; - var msg = null; - try { - res = MochiKit.Base.compare(got, expected); - } catch (e) { - msg = "Can not compare " + typeof(got) + ":" + typeof(expected); - } - if (res) { - msg = "Expected value did not compare equal"; - } - if (!res) { - return this.testResult(true, message); - } - return this.testResult(false, message, - [[msg], ["got:", got], ["expected:", expected]]); - }, - - testResult: function (pass, msg, failures) { - this.testIndex += 1; - if (pass) { - this.print("ok " + this.testIndex + " - " + msg); - return; - } - this.print("not ok " + this.testIndex + " - " + msg); - if (failures) { - for (var i = 0; i < failures.length; i++) { - this.print("# " + failures[i].join(" ")); - } - } - }, - - isDeeply: function (got, expected, /* optional */message) { - var m = MochiKit.Base; - var res = 1; - try { - res = m.compare(got, expected); - } catch (e) { - // pass - } - if (res === 0) { - return this.ok(true, message); - } - var gk = m.keys(got); - var ek = m.keys(expected); - gk.sort(); - ek.sort(); - if (m.compare(gk, ek)) { - // differing keys - var cmp = {}; - var i; - for (i = 0; i < gk.length; i++) { - cmp[gk[i]] = "got"; - } - for (i = 0; i < ek.length; i++) { - if (ek[i] in cmp) { - delete cmp[ek[i]]; - } else { - cmp[ek[i]] = "expected"; - } - } - var diffkeys = m.keys(cmp); - diffkeys.sort(); - var gotkeys = []; - var expkeys = []; - while (diffkeys.length) { - var k = diffkeys.shift(); - if (k in Object.prototype) { - continue; - } - (cmp[k] == "got" ? gotkeys : expkeys).push(k); - } - - - } - - return this.testResult((!res), msg, - (msg ? [["got:", got], ["expected:", expected]] : undefined) - ); - }, - - ok: function (res, message) { - return this.testResult(res, message); - } -}; - -MochiKit.Test.__new__ = function () { - var m = MochiKit.Base; - - this.EXPORT_TAGS = { - ":common": this.EXPORT, - ":all": m.concat(this.EXPORT, this.EXPORT_OK) - }; - - m.nameFunctions(this); - -}; - -MochiKit.Test.__new__(); - -MochiKit.Base._exportSymbols(this, MochiKit.Test); diff --git a/static/MochiKit/Visual.js b/static/MochiKit/Visual.js deleted file mode 100644 index df97554..0000000 --- a/static/MochiKit/Visual.js +++ /dev/null @@ -1,2026 +0,0 @@ -/*** - -MochiKit.Visual 1.4.2 - -See for documentation, downloads, license, etc. - -(c) 2005 Bob Ippolito and others. All rights Reserved. - -***/ - -MochiKit.Base._deps('Visual', ['Base', 'DOM', 'Style', 'Color', 'Position']); - -MochiKit.Visual.NAME = "MochiKit.Visual"; -MochiKit.Visual.VERSION = "1.4.2"; - -MochiKit.Visual.__repr__ = function () { - return "[" + this.NAME + " " + this.VERSION + "]"; -}; - -MochiKit.Visual.toString = function () { - return this.__repr__(); -}; - -MochiKit.Visual._RoundCorners = function (e, options) { - e = MochiKit.DOM.getElement(e); - this._setOptions(options); - if (this.options.__unstable__wrapElement) { - e = this._doWrap(e); - } - - var color = this.options.color; - var C = MochiKit.Color.Color; - if (this.options.color === "fromElement") { - color = C.fromBackground(e); - } else if (!(color instanceof C)) { - color = C.fromString(color); - } - this.isTransparent = (color.asRGB().a <= 0); - - var bgColor = this.options.bgColor; - if (this.options.bgColor === "fromParent") { - bgColor = C.fromBackground(e.offsetParent); - } else if (!(bgColor instanceof C)) { - bgColor = C.fromString(bgColor); - } - - this._roundCornersImpl(e, color, bgColor); -}; - -MochiKit.Visual._RoundCorners.prototype = { - _doWrap: function (e) { - var parent = e.parentNode; - var doc = MochiKit.DOM.currentDocument(); - if (typeof(doc.defaultView) === "undefined" - || doc.defaultView === null) { - return e; - } - var style = doc.defaultView.getComputedStyle(e, null); - if (typeof(style) === "undefined" || style === null) { - return e; - } - var wrapper = MochiKit.DOM.DIV({"style": { - display: "block", - // convert padding to margin - marginTop: style.getPropertyValue("padding-top"), - marginRight: style.getPropertyValue("padding-right"), - marginBottom: style.getPropertyValue("padding-bottom"), - marginLeft: style.getPropertyValue("padding-left"), - // remove padding so the rounding looks right - padding: "0px" - /* - paddingRight: "0px", - paddingLeft: "0px" - */ - }}); - wrapper.innerHTML = e.innerHTML; - e.innerHTML = ""; - e.appendChild(wrapper); - return e; - }, - - _roundCornersImpl: function (e, color, bgColor) { - if (this.options.border) { - this._renderBorder(e, bgColor); - } - if (this._isTopRounded()) { - this._roundTopCorners(e, color, bgColor); - } - if (this._isBottomRounded()) { - this._roundBottomCorners(e, color, bgColor); - } - }, - - _renderBorder: function (el, bgColor) { - var borderValue = "1px solid " + this._borderColor(bgColor); - var borderL = "border-left: " + borderValue; - var borderR = "border-right: " + borderValue; - var style = "style='" + borderL + ";" + borderR + "'"; - el.innerHTML = "

" + el.innerHTML + "
"; - }, - - _roundTopCorners: function (el, color, bgColor) { - var corner = this._createCorner(bgColor); - for (var i = 0; i < this.options.numSlices; i++) { - corner.appendChild( - this._createCornerSlice(color, bgColor, i, "top") - ); - } - el.style.paddingTop = 0; - el.insertBefore(corner, el.firstChild); - }, - - _roundBottomCorners: function (el, color, bgColor) { - var corner = this._createCorner(bgColor); - for (var i = (this.options.numSlices - 1); i >= 0; i--) { - corner.appendChild( - this._createCornerSlice(color, bgColor, i, "bottom") - ); - } - el.style.paddingBottom = 0; - el.appendChild(corner); - }, - - _createCorner: function (bgColor) { - var dom = MochiKit.DOM; - return dom.DIV({style: {backgroundColor: bgColor.toString()}}); - }, - - _createCornerSlice: function (color, bgColor, n, position) { - var slice = MochiKit.DOM.SPAN(); - - var inStyle = slice.style; - inStyle.backgroundColor = color.toString(); - inStyle.display = "block"; - inStyle.height = "1px"; - inStyle.overflow = "hidden"; - inStyle.fontSize = "1px"; - - var borderColor = this._borderColor(color, bgColor); - if (this.options.border && n === 0) { - inStyle.borderTopStyle = "solid"; - inStyle.borderTopWidth = "1px"; - inStyle.borderLeftWidth = "0px"; - inStyle.borderRightWidth = "0px"; - inStyle.borderBottomWidth = "0px"; - // assumes css compliant box model - inStyle.height = "0px"; - inStyle.borderColor = borderColor.toString(); - } else if (borderColor) { - inStyle.borderColor = borderColor.toString(); - inStyle.borderStyle = "solid"; - inStyle.borderWidth = "0px 1px"; - } - - if (!this.options.compact && (n == (this.options.numSlices - 1))) { - inStyle.height = "2px"; - } - - this._setMargin(slice, n, position); - this._setBorder(slice, n, position); - - return slice; - }, - - _setOptions: function (options) { - this.options = { - corners: "all", - color: "fromElement", - bgColor: "fromParent", - blend: true, - border: false, - compact: false, - __unstable__wrapElement: false - }; - MochiKit.Base.update(this.options, options); - - this.options.numSlices = (this.options.compact ? 2 : 4); - }, - - _whichSideTop: function () { - var corners = this.options.corners; - if (this._hasString(corners, "all", "top")) { - return ""; - } - - var has_tl = (corners.indexOf("tl") != -1); - var has_tr = (corners.indexOf("tr") != -1); - if (has_tl && has_tr) { - return ""; - } - if (has_tl) { - return "left"; - } - if (has_tr) { - return "right"; - } - return ""; - }, - - _whichSideBottom: function () { - var corners = this.options.corners; - if (this._hasString(corners, "all", "bottom")) { - return ""; - } - - var has_bl = (corners.indexOf('bl') != -1); - var has_br = (corners.indexOf('br') != -1); - if (has_bl && has_br) { - return ""; - } - if (has_bl) { - return "left"; - } - if (has_br) { - return "right"; - } - return ""; - }, - - _borderColor: function (color, bgColor) { - if (color == "transparent") { - return bgColor; - } else if (this.options.border) { - return this.options.border; - } else if (this.options.blend) { - return bgColor.blendedColor(color); - } - return ""; - }, - - - _setMargin: function (el, n, corners) { - var marginSize = this._marginSize(n) + "px"; - var whichSide = ( - corners == "top" ? this._whichSideTop() : this._whichSideBottom() - ); - var style = el.style; - - if (whichSide == "left") { - style.marginLeft = marginSize; - style.marginRight = "0px"; - } else if (whichSide == "right") { - style.marginRight = marginSize; - style.marginLeft = "0px"; - } else { - style.marginLeft = marginSize; - style.marginRight = marginSize; - } - }, - - _setBorder: function (el, n, corners) { - var borderSize = this._borderSize(n) + "px"; - var whichSide = ( - corners == "top" ? this._whichSideTop() : this._whichSideBottom() - ); - - var style = el.style; - if (whichSide == "left") { - style.borderLeftWidth = borderSize; - style.borderRightWidth = "0px"; - } else if (whichSide == "right") { - style.borderRightWidth = borderSize; - style.borderLeftWidth = "0px"; - } else { - style.borderLeftWidth = borderSize; - style.borderRightWidth = borderSize; - } - }, - - _marginSize: function (n) { - if (this.isTransparent) { - return 0; - } - - var o = this.options; - if (o.compact && o.blend) { - var smBlendedMarginSizes = [1, 0]; - return smBlendedMarginSizes[n]; - } else if (o.compact) { - var compactMarginSizes = [2, 1]; - return compactMarginSizes[n]; - } else if (o.blend) { - var blendedMarginSizes = [3, 2, 1, 0]; - return blendedMarginSizes[n]; - } else { - var marginSizes = [5, 3, 2, 1]; - return marginSizes[n]; - } - }, - - _borderSize: function (n) { - var o = this.options; - var borderSizes; - if (o.compact && (o.blend || this.isTransparent)) { - return 1; - } else if (o.compact) { - borderSizes = [1, 0]; - } else if (o.blend) { - borderSizes = [2, 1, 1, 1]; - } else if (o.border) { - borderSizes = [0, 2, 0, 0]; - } else if (this.isTransparent) { - borderSizes = [5, 3, 2, 1]; - } else { - return 0; - } - return borderSizes[n]; - }, - - _hasString: function (str) { - for (var i = 1; i< arguments.length; i++) { - if (str.indexOf(arguments[i]) != -1) { - return true; - } - } - return false; - }, - - _isTopRounded: function () { - return this._hasString(this.options.corners, - "all", "top", "tl", "tr" - ); - }, - - _isBottomRounded: function () { - return this._hasString(this.options.corners, - "all", "bottom", "bl", "br" - ); - }, - - _hasSingleTextChild: function (el) { - return (el.childNodes.length == 1 && el.childNodes[0].nodeType == 3); - } -}; - -/** @id MochiKit.Visual.roundElement */ -MochiKit.Visual.roundElement = function (e, options) { - new MochiKit.Visual._RoundCorners(e, options); -}; - -/** @id MochiKit.Visual.roundClass */ -MochiKit.Visual.roundClass = function (tagName, className, options) { - var elements = MochiKit.DOM.getElementsByTagAndClassName( - tagName, className - ); - for (var i = 0; i < elements.length; i++) { - MochiKit.Visual.roundElement(elements[i], options); - } -}; - -/** @id MochiKit.Visual.tagifyText */ -MochiKit.Visual.tagifyText = function (element, /* optional */tagifyStyle) { - /*** - - Change a node text to character in tags. - - @param tagifyStyle: the style to apply to character nodes, default to - 'position: relative'. - - ***/ - tagifyStyle = tagifyStyle || 'position:relative'; - if (/MSIE/.test(navigator.userAgent)) { - tagifyStyle += ';zoom:1'; - } - element = MochiKit.DOM.getElement(element); - var ma = MochiKit.Base.map; - ma(function (child) { - if (child.nodeType == 3) { - ma(function (character) { - element.insertBefore( - MochiKit.DOM.SPAN({style: tagifyStyle}, - character == ' ' ? String.fromCharCode(160) : character), child); - }, child.nodeValue.split('')); - MochiKit.DOM.removeElement(child); - } - }, element.childNodes); -}; - -/** @id MochiKit.Visual.forceRerendering */ -MochiKit.Visual.forceRerendering = function (element) { - try { - element = MochiKit.DOM.getElement(element); - var n = document.createTextNode(' '); - element.appendChild(n); - element.removeChild(n); - } catch(e) { - } -}; - -/** @id MochiKit.Visual.multiple */ -MochiKit.Visual.multiple = function (elements, effect, /* optional */options) { - /*** - - Launch the same effect subsequently on given elements. - - ***/ - options = MochiKit.Base.update({ - speed: 0.1, delay: 0.0 - }, options); - var masterDelay = options.delay; - var index = 0; - MochiKit.Base.map(function (innerelement) { - options.delay = index * options.speed + masterDelay; - new effect(innerelement, options); - index += 1; - }, elements); -}; - -MochiKit.Visual.PAIRS = { - 'slide': ['slideDown', 'slideUp'], - 'blind': ['blindDown', 'blindUp'], - 'appear': ['appear', 'fade'], - 'size': ['grow', 'shrink'] -}; - -/** @id MochiKit.Visual.toggle */ -MochiKit.Visual.toggle = function (element, /* optional */effect, /* optional */options) { - /*** - - Toggle an item between two state depending of its visibility, making - a effect between these states. Default effect is 'appear', can be - 'slide' or 'blind'. - - ***/ - element = MochiKit.DOM.getElement(element); - effect = (effect || 'appear').toLowerCase(); - options = MochiKit.Base.update({ - queue: {position: 'end', scope: (element.id || 'global'), limit: 1} - }, options); - var v = MochiKit.Visual; - v[MochiKit.Style.getStyle(element, 'display') != 'none' ? - v.PAIRS[effect][1] : v.PAIRS[effect][0]](element, options); -}; - -/*** - -Transitions: define functions calculating variations depending of a position. - -***/ - -MochiKit.Visual.Transitions = {}; - -/** @id MochiKit.Visual.Transitions.linear */ -MochiKit.Visual.Transitions.linear = function (pos) { - return pos; -}; - -/** @id MochiKit.Visual.Transitions.sinoidal */ -MochiKit.Visual.Transitions.sinoidal = function (pos) { - return 0.5 - Math.cos(pos*Math.PI)/2; -}; - -/** @id MochiKit.Visual.Transitions.reverse */ -MochiKit.Visual.Transitions.reverse = function (pos) { - return 1 - pos; -}; - -/** @id MochiKit.Visual.Transitions.flicker */ -MochiKit.Visual.Transitions.flicker = function (pos) { - return 0.25 - Math.cos(pos*Math.PI)/4 + Math.random()/2; -}; - -/** @id MochiKit.Visual.Transitions.wobble */ -MochiKit.Visual.Transitions.wobble = function (pos) { - return 0.5 - Math.cos(9*pos*Math.PI)/2; -}; - -/** @id MochiKit.Visual.Transitions.pulse */ -MochiKit.Visual.Transitions.pulse = function (pos, pulses) { - if (pulses) { - pos *= 2 * pulses; - } else { - pos *= 10; - } - var decimals = pos - Math.floor(pos); - return (Math.floor(pos) % 2 == 0) ? decimals : 1 - decimals; -}; - -/** @id MochiKit.Visual.Transitions.parabolic */ -MochiKit.Visual.Transitions.parabolic = function (pos) { - return pos * pos; -}; - -/** @id MochiKit.Visual.Transitions.none */ -MochiKit.Visual.Transitions.none = function (pos) { - return 0; -}; - -/** @id MochiKit.Visual.Transitions.full */ -MochiKit.Visual.Transitions.full = function (pos) { - return 1; -}; - -/*** - -Core effects - -***/ - -MochiKit.Visual.ScopedQueue = function () { - var cls = arguments.callee; - if (!(this instanceof cls)) { - return new cls(); - } - this.__init__(); -}; - -MochiKit.Base.update(MochiKit.Visual.ScopedQueue.prototype, { - __init__: function () { - this.effects = []; - this.interval = null; - }, - - /** @id MochiKit.Visual.ScopedQueue.prototype.add */ - add: function (effect) { - var timestamp = new Date().getTime(); - - var position = (typeof(effect.options.queue) == 'string') ? - effect.options.queue : effect.options.queue.position; - - var ma = MochiKit.Base.map; - switch (position) { - case 'front': - // move unstarted effects after this effect - ma(function (e) { - if (e.state == 'idle') { - e.startOn += effect.finishOn; - e.finishOn += effect.finishOn; - } - }, this.effects); - break; - case 'end': - var finish; - // start effect after last queued effect has finished - ma(function (e) { - var i = e.finishOn; - if (i >= (finish || i)) { - finish = i; - } - }, this.effects); - timestamp = finish || timestamp; - break; - case 'break': - ma(function (e) { - e.finalize(); - }, this.effects); - break; - } - - effect.startOn += timestamp; - effect.finishOn += timestamp; - if (!effect.options.queue.limit || - this.effects.length < effect.options.queue.limit) { - this.effects.push(effect); - } - - if (!this.interval) { - this.interval = this.startLoop(MochiKit.Base.bind(this.loop, this), - 40); - } - }, - - /** @id MochiKit.Visual.ScopedQueue.prototype.startLoop */ - startLoop: function (func, interval) { - return setInterval(func, interval); - }, - - /** @id MochiKit.Visual.ScopedQueue.prototype.remove */ - remove: function (effect) { - this.effects = MochiKit.Base.filter(function (e) { - return e != effect; - }, this.effects); - if (!this.effects.length) { - this.stopLoop(this.interval); - this.interval = null; - } - }, - - /** @id MochiKit.Visual.ScopedQueue.prototype.stopLoop */ - stopLoop: function (interval) { - clearInterval(interval); - }, - - /** @id MochiKit.Visual.ScopedQueue.prototype.loop */ - loop: function () { - var timePos = new Date().getTime(); - MochiKit.Base.map(function (effect) { - effect.loop(timePos); - }, this.effects); - } -}); - -MochiKit.Visual.Queues = { - instances: {}, - - get: function (queueName) { - if (typeof(queueName) != 'string') { - return queueName; - } - - if (!this.instances[queueName]) { - this.instances[queueName] = new MochiKit.Visual.ScopedQueue(); - } - return this.instances[queueName]; - } -}; - -MochiKit.Visual.Queue = MochiKit.Visual.Queues.get('global'); - -MochiKit.Visual.DefaultOptions = { - transition: MochiKit.Visual.Transitions.sinoidal, - duration: 1.0, // seconds - fps: 25.0, // max. 25fps due to MochiKit.Visual.Queue implementation - sync: false, // true for combining - from: 0.0, - to: 1.0, - delay: 0.0, - queue: 'parallel' -}; - -MochiKit.Visual.Base = function () {}; - -MochiKit.Visual.Base.prototype = { - /*** - - Basic class for all Effects. Define a looping mechanism called for each step - of an effect. Don't instantiate it, only subclass it. - - ***/ - - __class__ : MochiKit.Visual.Base, - - /** @id MochiKit.Visual.Base.prototype.start */ - start: function (options) { - var v = MochiKit.Visual; - this.options = MochiKit.Base.setdefault(options, - v.DefaultOptions); - this.currentFrame = 0; - this.state = 'idle'; - this.startOn = this.options.delay*1000; - this.finishOn = this.startOn + (this.options.duration*1000); - this.event('beforeStart'); - if (!this.options.sync) { - v.Queues.get(typeof(this.options.queue) == 'string' ? - 'global' : this.options.queue.scope).add(this); - } - }, - - /** @id MochiKit.Visual.Base.prototype.loop */ - loop: function (timePos) { - if (timePos >= this.startOn) { - if (timePos >= this.finishOn) { - return this.finalize(); - } - var pos = (timePos - this.startOn) / (this.finishOn - this.startOn); - var frame = - Math.round(pos * this.options.fps * this.options.duration); - if (frame > this.currentFrame) { - this.render(pos); - this.currentFrame = frame; - } - } - }, - - /** @id MochiKit.Visual.Base.prototype.render */ - render: function (pos) { - if (this.state == 'idle') { - this.state = 'running'; - this.event('beforeSetup'); - this.setup(); - this.event('afterSetup'); - } - if (this.state == 'running') { - if (this.options.transition) { - pos = this.options.transition(pos); - } - pos *= (this.options.to - this.options.from); - pos += this.options.from; - this.event('beforeUpdate'); - this.update(pos); - this.event('afterUpdate'); - } - }, - - /** @id MochiKit.Visual.Base.prototype.cancel */ - cancel: function () { - if (!this.options.sync) { - MochiKit.Visual.Queues.get(typeof(this.options.queue) == 'string' ? - 'global' : this.options.queue.scope).remove(this); - } - this.state = 'finished'; - }, - - /** @id MochiKit.Visual.Base.prototype.finalize */ - finalize: function () { - this.render(1.0); - this.cancel(); - this.event('beforeFinish'); - this.finish(); - this.event('afterFinish'); - }, - - setup: function () { - }, - - finish: function () { - }, - - update: function (position) { - }, - - /** @id MochiKit.Visual.Base.prototype.event */ - event: function (eventName) { - if (this.options[eventName + 'Internal']) { - this.options[eventName + 'Internal'](this); - } - if (this.options[eventName]) { - this.options[eventName](this); - } - }, - - /** @id MochiKit.Visual.Base.prototype.repr */ - repr: function () { - return '[' + this.__class__.NAME + ', options:' + - MochiKit.Base.repr(this.options) + ']'; - } -}; - -/** @id MochiKit.Visual.Parallel */ -MochiKit.Visual.Parallel = function (effects, options) { - var cls = arguments.callee; - if (!(this instanceof cls)) { - return new cls(effects, options); - } - - this.__init__(effects, options); -}; - -MochiKit.Visual.Parallel.prototype = new MochiKit.Visual.Base(); - -MochiKit.Base.update(MochiKit.Visual.Parallel.prototype, { - /*** - - Run multiple effects at the same time. - - ***/ - - __class__ : MochiKit.Visual.Parallel, - - __init__: function (effects, options) { - this.effects = effects || []; - this.start(options); - }, - - /** @id MochiKit.Visual.Parallel.prototype.update */ - update: function (position) { - MochiKit.Base.map(function (effect) { - effect.render(position); - }, this.effects); - }, - - /** @id MochiKit.Visual.Parallel.prototype.finish */ - finish: function () { - MochiKit.Base.map(function (effect) { - effect.finalize(); - }, this.effects); - } -}); - -/** @id MochiKit.Visual.Sequence */ -MochiKit.Visual.Sequence = function (effects, options) { - var cls = arguments.callee; - if (!(this instanceof cls)) { - return new cls(effects, options); - } - this.__init__(effects, options); -}; - -MochiKit.Visual.Sequence.prototype = new MochiKit.Visual.Base(); - -MochiKit.Base.update(MochiKit.Visual.Sequence.prototype, { - - __class__ : MochiKit.Visual.Sequence, - - __init__: function (effects, options) { - var defs = { transition: MochiKit.Visual.Transitions.linear, - duration: 0 }; - this.effects = effects || []; - MochiKit.Base.map(function (effect) { - defs.duration += effect.options.duration; - }, this.effects); - MochiKit.Base.setdefault(options, defs); - this.start(options); - }, - - /** @id MochiKit.Visual.Sequence.prototype.update */ - update: function (position) { - var time = position * this.options.duration; - for (var i = 0; i < this.effects.length; i++) { - var effect = this.effects[i]; - if (time <= effect.options.duration) { - effect.render(time / effect.options.duration); - break; - } else { - time -= effect.options.duration; - } - } - }, - - /** @id MochiKit.Visual.Sequence.prototype.finish */ - finish: function () { - MochiKit.Base.map(function (effect) { - effect.finalize(); - }, this.effects); - } -}); - -/** @id MochiKit.Visual.Opacity */ -MochiKit.Visual.Opacity = function (element, options) { - var cls = arguments.callee; - if (!(this instanceof cls)) { - return new cls(element, options); - } - this.__init__(element, options); -}; - -MochiKit.Visual.Opacity.prototype = new MochiKit.Visual.Base(); - -MochiKit.Base.update(MochiKit.Visual.Opacity.prototype, { - /*** - - Change the opacity of an element. - - @param options: 'from' and 'to' change the starting and ending opacities. - Must be between 0.0 and 1.0. Default to current opacity and 1.0. - - ***/ - - __class__ : MochiKit.Visual.Opacity, - - __init__: function (element, /* optional */options) { - var b = MochiKit.Base; - var s = MochiKit.Style; - this.element = MochiKit.DOM.getElement(element); - // make this work on IE on elements without 'layout' - if (this.element.currentStyle && - (!this.element.currentStyle.hasLayout)) { - s.setStyle(this.element, {zoom: 1}); - } - options = b.update({ - from: s.getStyle(this.element, 'opacity') || 0.0, - to: 1.0 - }, options); - this.start(options); - }, - - /** @id MochiKit.Visual.Opacity.prototype.update */ - update: function (position) { - MochiKit.Style.setStyle(this.element, {'opacity': position}); - } -}); - -/** @id MochiKit.Visual.Move.prototype */ -MochiKit.Visual.Move = function (element, options) { - var cls = arguments.callee; - if (!(this instanceof cls)) { - return new cls(element, options); - } - this.__init__(element, options); -}; - -MochiKit.Visual.Move.prototype = new MochiKit.Visual.Base(); - -MochiKit.Base.update(MochiKit.Visual.Move.prototype, { - /*** - - Move an element between its current position to a defined position - - @param options: 'x' and 'y' for final positions, default to 0, 0. - - ***/ - - __class__ : MochiKit.Visual.Move, - - __init__: function (element, /* optional */options) { - this.element = MochiKit.DOM.getElement(element); - options = MochiKit.Base.update({ - x: 0, - y: 0, - mode: 'relative' - }, options); - this.start(options); - }, - - /** @id MochiKit.Visual.Move.prototype.setup */ - setup: function () { - // Bug in Opera: Opera returns the 'real' position of a static element - // or relative element that does not have top/left explicitly set. - // ==> Always set top and left for position relative elements in your - // stylesheets (to 0 if you do not need them) - MochiKit.Style.makePositioned(this.element); - - var s = this.element.style; - var originalVisibility = s.visibility; - var originalDisplay = s.display; - if (originalDisplay == 'none') { - s.visibility = 'hidden'; - s.display = ''; - } - - this.originalLeft = parseFloat(MochiKit.Style.getStyle(this.element, 'left') || '0'); - this.originalTop = parseFloat(MochiKit.Style.getStyle(this.element, 'top') || '0'); - - if (this.options.mode == 'absolute') { - // absolute movement, so we need to calc deltaX and deltaY - this.options.x -= this.originalLeft; - this.options.y -= this.originalTop; - } - if (originalDisplay == 'none') { - s.visibility = originalVisibility; - s.display = originalDisplay; - } - }, - - /** @id MochiKit.Visual.Move.prototype.update */ - update: function (position) { - MochiKit.Style.setStyle(this.element, { - left: Math.round(this.options.x * position + this.originalLeft) + 'px', - top: Math.round(this.options.y * position + this.originalTop) + 'px' - }); - } -}); - -/** @id MochiKit.Visual.Scale */ -MochiKit.Visual.Scale = function (element, percent, options) { - var cls = arguments.callee; - if (!(this instanceof cls)) { - return new cls(element, percent, options); - } - this.__init__(element, percent, options); -}; - -MochiKit.Visual.Scale.prototype = new MochiKit.Visual.Base(); - -MochiKit.Base.update(MochiKit.Visual.Scale.prototype, { - /*** - - Change the size of an element. - - @param percent: final_size = percent*original_size - - @param options: several options changing scale behaviour - - ***/ - - __class__ : MochiKit.Visual.Scale, - - __init__: function (element, percent, /* optional */options) { - this.element = MochiKit.DOM.getElement(element); - options = MochiKit.Base.update({ - scaleX: true, - scaleY: true, - scaleContent: true, - scaleFromCenter: false, - scaleMode: 'box', // 'box' or 'contents' or {} with provided values - scaleFrom: 100.0, - scaleTo: percent - }, options); - this.start(options); - }, - - /** @id MochiKit.Visual.Scale.prototype.setup */ - setup: function () { - this.restoreAfterFinish = this.options.restoreAfterFinish || false; - this.elementPositioning = MochiKit.Style.getStyle(this.element, - 'position'); - - var ma = MochiKit.Base.map; - var b = MochiKit.Base.bind; - this.originalStyle = {}; - ma(b(function (k) { - this.originalStyle[k] = this.element.style[k]; - }, this), ['top', 'left', 'width', 'height', 'fontSize']); - - this.originalTop = this.element.offsetTop; - this.originalLeft = this.element.offsetLeft; - - var fontSize = MochiKit.Style.getStyle(this.element, - 'font-size') || '100%'; - ma(b(function (fontSizeType) { - if (fontSize.indexOf(fontSizeType) > 0) { - this.fontSize = parseFloat(fontSize); - this.fontSizeType = fontSizeType; - } - }, this), ['em', 'px', '%']); - - this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; - - if (/^content/.test(this.options.scaleMode)) { - this.dims = [this.element.scrollHeight, this.element.scrollWidth]; - } else if (this.options.scaleMode == 'box') { - this.dims = [this.element.offsetHeight, this.element.offsetWidth]; - } else { - this.dims = [this.options.scaleMode.originalHeight, - this.options.scaleMode.originalWidth]; - } - }, - - /** @id MochiKit.Visual.Scale.prototype.update */ - update: function (position) { - var currentScale = (this.options.scaleFrom/100.0) + - (this.factor * position); - if (this.options.scaleContent && this.fontSize) { - MochiKit.Style.setStyle(this.element, { - fontSize: this.fontSize * currentScale + this.fontSizeType - }); - } - this.setDimensions(this.dims[0] * currentScale, - this.dims[1] * currentScale); - }, - - /** @id MochiKit.Visual.Scale.prototype.finish */ - finish: function () { - if (this.restoreAfterFinish) { - MochiKit.Style.setStyle(this.element, this.originalStyle); - } - }, - - /** @id MochiKit.Visual.Scale.prototype.setDimensions */ - setDimensions: function (height, width) { - var d = {}; - var r = Math.round; - if (/MSIE/.test(navigator.userAgent)) { - r = Math.ceil; - } - if (this.options.scaleX) { - d.width = r(width) + 'px'; - } - if (this.options.scaleY) { - d.height = r(height) + 'px'; - } - if (this.options.scaleFromCenter) { - var topd = (height - this.dims[0])/2; - var leftd = (width - this.dims[1])/2; - if (this.elementPositioning == 'absolute') { - if (this.options.scaleY) { - d.top = this.originalTop - topd + 'px'; - } - if (this.options.scaleX) { - d.left = this.originalLeft - leftd + 'px'; - } - } else { - if (this.options.scaleY) { - d.top = -topd + 'px'; - } - if (this.options.scaleX) { - d.left = -leftd + 'px'; - } - } - } - MochiKit.Style.setStyle(this.element, d); - } -}); - -/** @id MochiKit.Visual.Highlight */ -MochiKit.Visual.Highlight = function (element, options) { - var cls = arguments.callee; - if (!(this instanceof cls)) { - return new cls(element, options); - } - this.__init__(element, options); -}; - -MochiKit.Visual.Highlight.prototype = new MochiKit.Visual.Base(); - -MochiKit.Base.update(MochiKit.Visual.Highlight.prototype, { - /*** - - Highlight an item of the page. - - @param options: 'startcolor' for choosing highlighting color, default - to '#ffff99'. - - ***/ - - __class__ : MochiKit.Visual.Highlight, - - __init__: function (element, /* optional */options) { - this.element = MochiKit.DOM.getElement(element); - options = MochiKit.Base.update({ - startcolor: '#ffff99' - }, options); - this.start(options); - }, - - /** @id MochiKit.Visual.Highlight.prototype.setup */ - setup: function () { - var b = MochiKit.Base; - var s = MochiKit.Style; - // Prevent executing on elements not in the layout flow - if (s.getStyle(this.element, 'display') == 'none') { - this.cancel(); - return; - } - // Disable background image during the effect - this.oldStyle = { - backgroundImage: s.getStyle(this.element, 'background-image') - }; - s.setStyle(this.element, { - backgroundImage: 'none' - }); - - if (!this.options.endcolor) { - this.options.endcolor = - MochiKit.Color.Color.fromBackground(this.element).toHexString(); - } - if (b.isUndefinedOrNull(this.options.restorecolor)) { - this.options.restorecolor = s.getStyle(this.element, - 'background-color'); - } - // init color calculations - this._base = b.map(b.bind(function (i) { - return parseInt( - this.options.startcolor.slice(i*2 + 1, i*2 + 3), 16); - }, this), [0, 1, 2]); - this._delta = b.map(b.bind(function (i) { - return parseInt(this.options.endcolor.slice(i*2 + 1, i*2 + 3), 16) - - this._base[i]; - }, this), [0, 1, 2]); - }, - - /** @id MochiKit.Visual.Highlight.prototype.update */ - update: function (position) { - var m = '#'; - MochiKit.Base.map(MochiKit.Base.bind(function (i) { - m += MochiKit.Color.toColorPart(Math.round(this._base[i] + - this._delta[i]*position)); - }, this), [0, 1, 2]); - MochiKit.Style.setStyle(this.element, { - backgroundColor: m - }); - }, - - /** @id MochiKit.Visual.Highlight.prototype.finish */ - finish: function () { - MochiKit.Style.setStyle(this.element, - MochiKit.Base.update(this.oldStyle, { - backgroundColor: this.options.restorecolor - })); - } -}); - -/** @id MochiKit.Visual.ScrollTo */ -MochiKit.Visual.ScrollTo = function (element, options) { - var cls = arguments.callee; - if (!(this instanceof cls)) { - return new cls(element, options); - } - this.__init__(element, options); -}; - -MochiKit.Visual.ScrollTo.prototype = new MochiKit.Visual.Base(); - -MochiKit.Base.update(MochiKit.Visual.ScrollTo.prototype, { - /*** - - Scroll to an element in the page. - - ***/ - - __class__ : MochiKit.Visual.ScrollTo, - - __init__: function (element, /* optional */options) { - this.element = MochiKit.DOM.getElement(element); - this.start(options); - }, - - /** @id MochiKit.Visual.ScrollTo.prototype.setup */ - setup: function () { - var p = MochiKit.Position; - p.prepare(); - var offsets = p.cumulativeOffset(this.element); - if (this.options.offset) { - offsets.y += this.options.offset; - } - var max; - if (window.innerHeight) { - max = window.innerHeight - window.height; - } else if (document.documentElement && - document.documentElement.clientHeight) { - max = document.documentElement.clientHeight - - document.body.scrollHeight; - } else if (document.body) { - max = document.body.clientHeight - document.body.scrollHeight; - } - this.scrollStart = p.windowOffset.y; - this.delta = (offsets.y > max ? max : offsets.y) - this.scrollStart; - }, - - /** @id MochiKit.Visual.ScrollTo.prototype.update */ - update: function (position) { - var p = MochiKit.Position; - p.prepare(); - window.scrollTo(p.windowOffset.x, this.scrollStart + (position * this.delta)); - } -}); - -MochiKit.Visual.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; - -MochiKit.Visual.Morph = function (element, options) { - var cls = arguments.callee; - if (!(this instanceof cls)) { - return new cls(element, options); - } - this.__init__(element, options); -}; - -MochiKit.Visual.Morph.prototype = new MochiKit.Visual.Base(); - -MochiKit.Base.update(MochiKit.Visual.Morph.prototype, { - /*** - - Morph effect: make a transformation from current style to the given style, - automatically making a transition between the two. - - ***/ - - __class__ : MochiKit.Visual.Morph, - - __init__: function (element, /* optional */options) { - this.element = MochiKit.DOM.getElement(element); - this.start(options); - }, - - /** @id MochiKit.Visual.Morph.prototype.setup */ - setup: function () { - var b = MochiKit.Base; - var style = this.options.style; - this.styleStart = {}; - this.styleEnd = {}; - this.units = {}; - var value, unit; - for (var s in style) { - value = style[s]; - s = b.camelize(s); - if (MochiKit.Visual.CSS_LENGTH.test(value)) { - var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/); - value = parseFloat(components[1]); - unit = (components.length == 3) ? components[2] : null; - this.styleEnd[s] = value; - this.units[s] = unit; - value = MochiKit.Style.getStyle(this.element, s); - components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/); - value = parseFloat(components[1]); - this.styleStart[s] = value; - } else if (/[Cc]olor$/.test(s)) { - var c = MochiKit.Color.Color; - value = c.fromString(value); - if (value) { - this.units[s] = "color"; - this.styleEnd[s] = value.toHexString(); - value = MochiKit.Style.getStyle(this.element, s); - this.styleStart[s] = c.fromString(value).toHexString(); - - this.styleStart[s] = b.map(b.bind(function (i) { - return parseInt( - this.styleStart[s].slice(i*2 + 1, i*2 + 3), 16); - }, this), [0, 1, 2]); - this.styleEnd[s] = b.map(b.bind(function (i) { - return parseInt( - this.styleEnd[s].slice(i*2 + 1, i*2 + 3), 16); - }, this), [0, 1, 2]); - } - } else { - // For non-length & non-color properties, we just set the value - this.element.style[s] = value; - } - } - }, - - /** @id MochiKit.Visual.Morph.prototype.update */ - update: function (position) { - var value; - for (var s in this.styleStart) { - if (this.units[s] == "color") { - var m = '#'; - var start = this.styleStart[s]; - var end = this.styleEnd[s]; - MochiKit.Base.map(MochiKit.Base.bind(function (i) { - m += MochiKit.Color.toColorPart(Math.round(start[i] + - (end[i] - start[i])*position)); - }, this), [0, 1, 2]); - this.element.style[s] = m; - } else { - value = this.styleStart[s] + Math.round((this.styleEnd[s] - this.styleStart[s]) * position * 1000) / 1000 + this.units[s]; - this.element.style[s] = value; - } - } - } -}); - -/*** - -Combination effects. - -***/ - -/** @id MochiKit.Visual.fade */ -MochiKit.Visual.fade = function (element, /* optional */ options) { - /*** - - Fade a given element: change its opacity and hide it in the end. - - @param options: 'to' and 'from' to change opacity. - - ***/ - var s = MochiKit.Style; - var oldOpacity = s.getStyle(element, 'opacity'); - options = MochiKit.Base.update({ - from: s.getStyle(element, 'opacity') || 1.0, - to: 0.0, - afterFinishInternal: function (effect) { - if (effect.options.to !== 0) { - return; - } - s.hideElement(effect.element); - s.setStyle(effect.element, {'opacity': oldOpacity}); - } - }, options); - return new MochiKit.Visual.Opacity(element, options); -}; - -/** @id MochiKit.Visual.appear */ -MochiKit.Visual.appear = function (element, /* optional */ options) { - /*** - - Make an element appear. - - @param options: 'to' and 'from' to change opacity. - - ***/ - var s = MochiKit.Style; - var v = MochiKit.Visual; - options = MochiKit.Base.update({ - from: (s.getStyle(element, 'display') == 'none' ? 0.0 : - s.getStyle(element, 'opacity') || 0.0), - to: 1.0, - // force Safari to render floated elements properly - afterFinishInternal: function (effect) { - v.forceRerendering(effect.element); - }, - beforeSetupInternal: function (effect) { - s.setStyle(effect.element, {'opacity': effect.options.from}); - s.showElement(effect.element); - } - }, options); - return new v.Opacity(element, options); -}; - -/** @id MochiKit.Visual.puff */ -MochiKit.Visual.puff = function (element, /* optional */ options) { - /*** - - 'Puff' an element: grow it to double size, fading it and make it hidden. - - ***/ - var s = MochiKit.Style; - var v = MochiKit.Visual; - element = MochiKit.DOM.getElement(element); - var elementDimensions = MochiKit.Style.getElementDimensions(element, true); - var oldStyle = { - position: s.getStyle(element, 'position'), - top: element.style.top, - left: element.style.left, - width: element.style.width, - height: element.style.height, - opacity: s.getStyle(element, 'opacity') - }; - options = MochiKit.Base.update({ - beforeSetupInternal: function (effect) { - MochiKit.Position.absolutize(effect.effects[0].element); - }, - afterFinishInternal: function (effect) { - s.hideElement(effect.effects[0].element); - s.setStyle(effect.effects[0].element, oldStyle); - }, - scaleContent: true, - scaleFromCenter: true - }, options); - return new v.Parallel( - [new v.Scale(element, 200, - {sync: true, scaleFromCenter: options.scaleFromCenter, - scaleMode: {originalHeight: elementDimensions.h, - originalWidth: elementDimensions.w}, - scaleContent: options.scaleContent, restoreAfterFinish: true}), - new v.Opacity(element, {sync: true, to: 0.0 })], - options); -}; - -/** @id MochiKit.Visual.blindUp */ -MochiKit.Visual.blindUp = function (element, /* optional */ options) { - /*** - - Blind an element up: change its vertical size to 0. - - ***/ - var d = MochiKit.DOM; - var s = MochiKit.Style; - element = d.getElement(element); - var elementDimensions = s.getElementDimensions(element, true); - var elemClip = s.makeClipping(element); - options = MochiKit.Base.update({ - scaleContent: false, - scaleX: false, - scaleMode: {originalHeight: elementDimensions.h, - originalWidth: elementDimensions.w}, - restoreAfterFinish: true, - afterFinishInternal: function (effect) { - s.hideElement(effect.element); - s.undoClipping(effect.element, elemClip); - } - }, options); - return new MochiKit.Visual.Scale(element, 0, options); -}; - -/** @id MochiKit.Visual.blindDown */ -MochiKit.Visual.blindDown = function (element, /* optional */ options) { - /*** - - Blind an element down: restore its vertical size. - - ***/ - var d = MochiKit.DOM; - var s = MochiKit.Style; - element = d.getElement(element); - var elementDimensions = s.getElementDimensions(element, true); - var elemClip; - options = MochiKit.Base.update({ - scaleContent: false, - scaleX: false, - scaleFrom: 0, - scaleMode: {originalHeight: elementDimensions.h, - originalWidth: elementDimensions.w}, - restoreAfterFinish: true, - afterSetupInternal: function (effect) { - elemClip = s.makeClipping(effect.element); - s.setStyle(effect.element, {height: '0px'}); - s.showElement(effect.element); - }, - afterFinishInternal: function (effect) { - s.undoClipping(effect.element, elemClip); - } - }, options); - return new MochiKit.Visual.Scale(element, 100, options); -}; - -/** @id MochiKit.Visual.switchOff */ -MochiKit.Visual.switchOff = function (element, /* optional */ options) { - /*** - - Apply a switch-off-like effect. - - ***/ - var d = MochiKit.DOM; - var s = MochiKit.Style; - element = d.getElement(element); - var elementDimensions = s.getElementDimensions(element, true); - var oldOpacity = s.getStyle(element, 'opacity'); - var elemClip; - options = MochiKit.Base.update({ - duration: 0.7, - restoreAfterFinish: true, - beforeSetupInternal: function (effect) { - s.makePositioned(element); - elemClip = s.makeClipping(element); - }, - afterFinishInternal: function (effect) { - s.hideElement(element); - s.undoClipping(element, elemClip); - s.undoPositioned(element); - s.setStyle(element, {'opacity': oldOpacity}); - } - }, options); - var v = MochiKit.Visual; - return new v.Sequence( - [new v.appear(element, - { sync: true, duration: 0.57 * options.duration, - from: 0, transition: v.Transitions.flicker }), - new v.Scale(element, 1, - { sync: true, duration: 0.43 * options.duration, - scaleFromCenter: true, scaleX: false, - scaleMode: {originalHeight: elementDimensions.h, - originalWidth: elementDimensions.w}, - scaleContent: false, restoreAfterFinish: true })], - options); -}; - -/** @id MochiKit.Visual.dropOut */ -MochiKit.Visual.dropOut = function (element, /* optional */ options) { - /*** - - Make an element fall and disappear. - - ***/ - var d = MochiKit.DOM; - var s = MochiKit.Style; - element = d.getElement(element); - var oldStyle = { - top: s.getStyle(element, 'top'), - left: s.getStyle(element, 'left'), - opacity: s.getStyle(element, 'opacity') - }; - - options = MochiKit.Base.update({ - duration: 0.5, - distance: 100, - beforeSetupInternal: function (effect) { - s.makePositioned(effect.effects[0].element); - }, - afterFinishInternal: function (effect) { - s.hideElement(effect.effects[0].element); - s.undoPositioned(effect.effects[0].element); - s.setStyle(effect.effects[0].element, oldStyle); - } - }, options); - var v = MochiKit.Visual; - return new v.Parallel( - [new v.Move(element, {x: 0, y: options.distance, sync: true}), - new v.Opacity(element, {sync: true, to: 0.0})], - options); -}; - -/** @id MochiKit.Visual.shake */ -MochiKit.Visual.shake = function (element, /* optional */ options) { - /*** - - Move an element from left to right several times. - - ***/ - var d = MochiKit.DOM; - var v = MochiKit.Visual; - var s = MochiKit.Style; - element = d.getElement(element); - var oldStyle = { - top: s.getStyle(element, 'top'), - left: s.getStyle(element, 'left') - }; - options = MochiKit.Base.update({ - duration: 0.5, - afterFinishInternal: function (effect) { - s.undoPositioned(element); - s.setStyle(element, oldStyle); - } - }, options); - return new v.Sequence( - [new v.Move(element, { sync: true, duration: 0.1 * options.duration, - x: 20, y: 0 }), - new v.Move(element, { sync: true, duration: 0.2 * options.duration, - x: -40, y: 0 }), - new v.Move(element, { sync: true, duration: 0.2 * options.duration, - x: 40, y: 0 }), - new v.Move(element, { sync: true, duration: 0.2 * options.duration, - x: -40, y: 0 }), - new v.Move(element, { sync: true, duration: 0.2 * options.duration, - x: 40, y: 0 }), - new v.Move(element, { sync: true, duration: 0.1 * options.duration, - x: -20, y: 0 })], - options); -}; - -/** @id MochiKit.Visual.slideDown */ -MochiKit.Visual.slideDown = function (element, /* optional */ options) { - /*** - - Slide an element down. - It needs to have the content of the element wrapped in a container - element with fixed height. - - ***/ - var d = MochiKit.DOM; - var b = MochiKit.Base; - var s = MochiKit.Style; - element = d.getElement(element); - if (!element.firstChild) { - throw new Error("MochiKit.Visual.slideDown must be used on a element with a child"); - } - d.removeEmptyTextNodes(element); - var oldInnerBottom = s.getStyle(element.firstChild, 'bottom') || 0; - var elementDimensions = s.getElementDimensions(element, true); - var elemClip; - options = b.update({ - scaleContent: false, - scaleX: false, - scaleFrom: 0, - scaleMode: {originalHeight: elementDimensions.h, - originalWidth: elementDimensions.w}, - restoreAfterFinish: true, - afterSetupInternal: function (effect) { - s.makePositioned(effect.element); - s.makePositioned(effect.element.firstChild); - if (/Opera/.test(navigator.userAgent)) { - s.setStyle(effect.element, {top: ''}); - } - elemClip = s.makeClipping(effect.element); - s.setStyle(effect.element, {height: '0px'}); - s.showElement(effect.element); - }, - afterUpdateInternal: function (effect) { - var elementDimensions = s.getElementDimensions(effect.element, true); - s.setStyle(effect.element.firstChild, - {bottom: (effect.dims[0] - elementDimensions.h) + 'px'}); - }, - afterFinishInternal: function (effect) { - s.undoClipping(effect.element, elemClip); - // IE will crash if child is undoPositioned first - if (/MSIE/.test(navigator.userAgent)) { - s.undoPositioned(effect.element); - s.undoPositioned(effect.element.firstChild); - } else { - s.undoPositioned(effect.element.firstChild); - s.undoPositioned(effect.element); - } - s.setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); - } - }, options); - - return new MochiKit.Visual.Scale(element, 100, options); -}; - -/** @id MochiKit.Visual.slideUp */ -MochiKit.Visual.slideUp = function (element, /* optional */ options) { - /*** - - Slide an element up. - It needs to have the content of the element wrapped in a container - element with fixed height. - - ***/ - var d = MochiKit.DOM; - var b = MochiKit.Base; - var s = MochiKit.Style; - element = d.getElement(element); - if (!element.firstChild) { - throw new Error("MochiKit.Visual.slideUp must be used on a element with a child"); - } - d.removeEmptyTextNodes(element); - var oldInnerBottom = s.getStyle(element.firstChild, 'bottom'); - var elementDimensions = s.getElementDimensions(element, true); - var elemClip; - options = b.update({ - scaleContent: false, - scaleX: false, - scaleMode: {originalHeight: elementDimensions.h, - originalWidth: elementDimensions.w}, - scaleFrom: 100, - restoreAfterFinish: true, - beforeStartInternal: function (effect) { - s.makePositioned(effect.element); - s.makePositioned(effect.element.firstChild); - if (/Opera/.test(navigator.userAgent)) { - s.setStyle(effect.element, {top: ''}); - } - elemClip = s.makeClipping(effect.element); - s.showElement(effect.element); - }, - afterUpdateInternal: function (effect) { - var elementDimensions = s.getElementDimensions(effect.element, true); - s.setStyle(effect.element.firstChild, - {bottom: (effect.dims[0] - elementDimensions.h) + 'px'}); - }, - afterFinishInternal: function (effect) { - s.hideElement(effect.element); - s.undoClipping(effect.element, elemClip); - s.undoPositioned(effect.element.firstChild); - s.undoPositioned(effect.element); - s.setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); - } - }, options); - return new MochiKit.Visual.Scale(element, 0, options); -}; - -// Bug in opera makes the TD containing this element expand for a instance -// after finish -/** @id MochiKit.Visual.squish */ -MochiKit.Visual.squish = function (element, /* optional */ options) { - /*** - - Reduce an element and make it disappear. - - ***/ - var d = MochiKit.DOM; - var b = MochiKit.Base; - var s = MochiKit.Style; - var elementDimensions = s.getElementDimensions(element, true); - var elemClip; - options = b.update({ - restoreAfterFinish: true, - scaleMode: {originalHeight: elementDimensions.w, - originalWidth: elementDimensions.h}, - beforeSetupInternal: function (effect) { - elemClip = s.makeClipping(effect.element); - }, - afterFinishInternal: function (effect) { - s.hideElement(effect.element); - s.undoClipping(effect.element, elemClip); - } - }, options); - - return new MochiKit.Visual.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, options); -}; - -/** @id MochiKit.Visual.grow */ -MochiKit.Visual.grow = function (element, /* optional */ options) { - /*** - - Grow an element to its original size. Make it zero-sized before - if necessary. - - ***/ - var d = MochiKit.DOM; - var v = MochiKit.Visual; - var s = MochiKit.Style; - element = d.getElement(element); - options = MochiKit.Base.update({ - direction: 'center', - moveTransition: v.Transitions.sinoidal, - scaleTransition: v.Transitions.sinoidal, - opacityTransition: v.Transitions.full, - scaleContent: true, - scaleFromCenter: false - }, options); - var oldStyle = { - top: element.style.top, - left: element.style.left, - height: element.style.height, - width: element.style.width, - opacity: s.getStyle(element, 'opacity') - }; - var dims = s.getElementDimensions(element, true); - var initialMoveX, initialMoveY; - var moveX, moveY; - - switch (options.direction) { - case 'top-left': - initialMoveX = initialMoveY = moveX = moveY = 0; - break; - case 'top-right': - initialMoveX = dims.w; - initialMoveY = moveY = 0; - moveX = -dims.w; - break; - case 'bottom-left': - initialMoveX = moveX = 0; - initialMoveY = dims.h; - moveY = -dims.h; - break; - case 'bottom-right': - initialMoveX = dims.w; - initialMoveY = dims.h; - moveX = -dims.w; - moveY = -dims.h; - break; - case 'center': - initialMoveX = dims.w / 2; - initialMoveY = dims.h / 2; - moveX = -dims.w / 2; - moveY = -dims.h / 2; - break; - } - - var optionsParallel = MochiKit.Base.update({ - beforeSetupInternal: function (effect) { - s.setStyle(effect.effects[0].element, {height: '0px'}); - s.showElement(effect.effects[0].element); - }, - afterFinishInternal: function (effect) { - s.undoClipping(effect.effects[0].element); - s.undoPositioned(effect.effects[0].element); - s.setStyle(effect.effects[0].element, oldStyle); - } - }, options); - - return new v.Move(element, { - x: initialMoveX, - y: initialMoveY, - duration: 0.01, - beforeSetupInternal: function (effect) { - s.hideElement(effect.element); - s.makeClipping(effect.element); - s.makePositioned(effect.element); - }, - afterFinishInternal: function (effect) { - new v.Parallel( - [new v.Opacity(effect.element, { - sync: true, to: 1.0, from: 0.0, - transition: options.opacityTransition - }), - new v.Move(effect.element, { - x: moveX, y: moveY, sync: true, - transition: options.moveTransition - }), - new v.Scale(effect.element, 100, { - scaleMode: {originalHeight: dims.h, - originalWidth: dims.w}, - sync: true, - scaleFrom: /Opera/.test(navigator.userAgent) ? 1 : 0, - transition: options.scaleTransition, - scaleContent: options.scaleContent, - scaleFromCenter: options.scaleFromCenter, - restoreAfterFinish: true - }) - ], optionsParallel - ); - } - }); -}; - -/** @id MochiKit.Visual.shrink */ -MochiKit.Visual.shrink = function (element, /* optional */ options) { - /*** - - Shrink an element and make it disappear. - - ***/ - var d = MochiKit.DOM; - var v = MochiKit.Visual; - var s = MochiKit.Style; - element = d.getElement(element); - options = MochiKit.Base.update({ - direction: 'center', - moveTransition: v.Transitions.sinoidal, - scaleTransition: v.Transitions.sinoidal, - opacityTransition: v.Transitions.none, - scaleContent: true, - scaleFromCenter: false - }, options); - var oldStyle = { - top: element.style.top, - left: element.style.left, - height: element.style.height, - width: element.style.width, - opacity: s.getStyle(element, 'opacity') - }; - - var dims = s.getElementDimensions(element, true); - var moveX, moveY; - - switch (options.direction) { - case 'top-left': - moveX = moveY = 0; - break; - case 'top-right': - moveX = dims.w; - moveY = 0; - break; - case 'bottom-left': - moveX = 0; - moveY = dims.h; - break; - case 'bottom-right': - moveX = dims.w; - moveY = dims.h; - break; - case 'center': - moveX = dims.w / 2; - moveY = dims.h / 2; - break; - } - var elemClip; - - var optionsParallel = MochiKit.Base.update({ - beforeStartInternal: function (effect) { - s.makePositioned(effect.effects[0].element); - elemClip = s.makeClipping(effect.effects[0].element); - }, - afterFinishInternal: function (effect) { - s.hideElement(effect.effects[0].element); - s.undoClipping(effect.effects[0].element, elemClip); - s.undoPositioned(effect.effects[0].element); - s.setStyle(effect.effects[0].element, oldStyle); - } - }, options); - - return new v.Parallel( - [new v.Opacity(element, { - sync: true, to: 0.0, from: 1.0, - transition: options.opacityTransition - }), - new v.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, { - scaleMode: {originalHeight: dims.h, originalWidth: dims.w}, - sync: true, transition: options.scaleTransition, - scaleContent: options.scaleContent, - scaleFromCenter: options.scaleFromCenter, - restoreAfterFinish: true - }), - new v.Move(element, { - x: moveX, y: moveY, sync: true, transition: options.moveTransition - }) - ], optionsParallel - ); -}; - -/** @id MochiKit.Visual.pulsate */ -MochiKit.Visual.pulsate = function (element, /* optional */ options) { - /*** - - Pulse an element between appear/fade. - - ***/ - var d = MochiKit.DOM; - var v = MochiKit.Visual; - var b = MochiKit.Base; - var oldOpacity = MochiKit.Style.getStyle(element, 'opacity'); - options = b.update({ - duration: 3.0, - from: 0, - afterFinishInternal: function (effect) { - MochiKit.Style.setStyle(effect.element, {'opacity': oldOpacity}); - } - }, options); - var transition = options.transition || v.Transitions.sinoidal; - options.transition = function (pos) { - return transition(1 - v.Transitions.pulse(pos, options.pulses)); - }; - return new v.Opacity(element, options); -}; - -/** @id MochiKit.Visual.fold */ -MochiKit.Visual.fold = function (element, /* optional */ options) { - /*** - - Fold an element, first vertically, then horizontally. - - ***/ - var d = MochiKit.DOM; - var v = MochiKit.Visual; - var s = MochiKit.Style; - element = d.getElement(element); - var elementDimensions = s.getElementDimensions(element, true); - var oldStyle = { - top: element.style.top, - left: element.style.left, - width: element.style.width, - height: element.style.height - }; - var elemClip = s.makeClipping(element); - options = MochiKit.Base.update({ - scaleContent: false, - scaleX: false, - scaleMode: {originalHeight: elementDimensions.h, - originalWidth: elementDimensions.w}, - afterFinishInternal: function (effect) { - new v.Scale(element, 1, { - scaleContent: false, - scaleY: false, - scaleMode: {originalHeight: elementDimensions.h, - originalWidth: elementDimensions.w}, - afterFinishInternal: function (effect) { - s.hideElement(effect.element); - s.undoClipping(effect.element, elemClip); - s.setStyle(effect.element, oldStyle); - } - }); - } - }, options); - return new v.Scale(element, 5, options); -}; - - -// Compatibility with MochiKit 1.0 -MochiKit.Visual.Color = MochiKit.Color.Color; -MochiKit.Visual.getElementsComputedStyle = MochiKit.DOM.computedStyle; - -/* end of Rico adaptation */ - -MochiKit.Visual.__new__ = function () { - var m = MochiKit.Base; - - m.nameFunctions(this); - - this.EXPORT_TAGS = { - ":common": this.EXPORT, - ":all": m.concat(this.EXPORT, this.EXPORT_OK) - }; - -}; - -MochiKit.Visual.EXPORT = [ - "roundElement", - "roundClass", - "tagifyText", - "multiple", - "toggle", - "Parallel", - "Sequence", - "Opacity", - "Move", - "Scale", - "Highlight", - "ScrollTo", - "Morph", - "fade", - "appear", - "puff", - "blindUp", - "blindDown", - "switchOff", - "dropOut", - "shake", - "slideDown", - "slideUp", - "squish", - "grow", - "shrink", - "pulsate", - "fold" -]; - -MochiKit.Visual.EXPORT_OK = [ - "Base", - "PAIRS" -]; - -MochiKit.Visual.__new__(); - -MochiKit.Base._exportSymbols(this, MochiKit.Visual); diff --git a/static/MochiKit/__package__.js b/static/MochiKit/__package__.js deleted file mode 100644 index 8d644b1..0000000 --- a/static/MochiKit/__package__.js +++ /dev/null @@ -1,18 +0,0 @@ -dojo.kwCompoundRequire({ - "common": [ - "MochiKit.Base", - "MochiKit.Iter", - "MochiKit.Logging", - "MochiKit.DateTime", - "MochiKit.Format", - "MochiKit.Async", - "MochiKit.DOM", - "MochiKit.Style", - "MochiKit.LoggingPane", - "MochiKit.Color", - "MochiKit.Signal", - "MochiKit.Position", - "MochiKit.Visual" - ] -}); -dojo.provide("MochiKit.*"); diff --git a/static/arrow.gif b/static/arrow.gif deleted file mode 100644 index 1b91abd1cb36282e4856f86f8167a79dc664c99b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 462 zcmZ?wbhEHbWM|-Ec*f1}`0?W_SFY^aw{QRc{l9+wx^?T;@87@o?Afz-@809bkDoYk zf?*WUG6WQVvM@3*a5LzDECIy{1G{zucT+PrDCp%Yfa~Ed|Hy0Cg3nM!_ V!=xFLx+nEdoIJ6$y`_=C8UPT)ERp~K diff --git a/static/arrowsub.gif b/static/arrowsub.gif deleted file mode 100644 index 1b91abd1cb36282e4856f86f8167a79dc664c99b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 462 zcmZ?wbhEHbWM|-Ec*f1}`0?W_SFY^aw{QRc{l9+wx^?T;@87@o?Afz-@809bkDoYk zf?*WUG6WQVvM@3*a5LzDECIy{1G{zucT+PrDCp%Yfa~Ed|Hy0Cg3nM!_ V!=xFLx+nEdoIJ6$y`_=C8UPT)ERp~K diff --git a/static/arrowsub.png b/static/arrowsub.png deleted file mode 100644 index 4040348c3cbbf25ad9341a16c56740c1c588b7fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c4!3HFg*81KCQnH>djv*DdlK=3t@CY2>P+L&5 kLqXYz(M4c2mxwXLj%eX;xxEU@fC?ErUHx3vIVCg!0QFWBu>b%7 diff --git a/static/file-icons.png b/static/file-icons.png deleted file mode 100644 index 58fdd60cc45db182ba86f7dfbd51bcdef5ea3a06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42702 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 li { - position: relative; -} -.fa-li { - position: absolute; - left: -2.142857142857143em; - width: 2.142857142857143em; - top: 0.14285714285714285em; - text-align: center; -} -.fa-li.fa-lg { - left: -1.8571428571428572em; -} -.fa-border { - padding: .2em .25em .15em; - border: solid 0.08em #eeeeee; - border-radius: .1em; -} -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.fa.pull-left { - margin-right: .3em; -} -.fa.pull-right { - margin-left: .3em; -} -.fa-spin { - -webkit-animation: spin 2s infinite linear; - -moz-animation: spin 2s infinite linear; - -o-animation: spin 2s infinite linear; - animation: spin 2s infinite linear; -} -@-moz-keyframes spin { - 0% { - -moz-transform: rotate(0deg); - } - 100% { - -moz-transform: rotate(359deg); - } -} -@-webkit-keyframes spin { - 0% { - -webkit-transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - } -} -@-o-keyframes spin { - 0% { - -o-transform: rotate(0deg); - } - 100% { - -o-transform: rotate(359deg); - } -} -@-ms-keyframes spin { - 0% { - -ms-transform: rotate(0deg); - } - 100% { - -ms-transform: rotate(359deg); - } -} -@keyframes spin { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(359deg); - } -} -.fa-rotate-90 { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); - -webkit-transform: rotate(90deg); - -moz-transform: rotate(90deg); - -ms-transform: rotate(90deg); - -o-transform: rotate(90deg); - transform: rotate(90deg); -} -.fa-rotate-180 { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); - -webkit-transform: rotate(180deg); - -moz-transform: rotate(180deg); - -ms-transform: rotate(180deg); - -o-transform: rotate(180deg); - transform: rotate(180deg); -} -.fa-rotate-270 { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); - -webkit-transform: rotate(270deg); - -moz-transform: rotate(270deg); - -ms-transform: rotate(270deg); - -o-transform: rotate(270deg); - transform: rotate(270deg); -} -.fa-flip-horizontal { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); - -webkit-transform: scale(-1, 1); - -moz-transform: scale(-1, 1); - -ms-transform: scale(-1, 1); - -o-transform: scale(-1, 1); - transform: scale(-1, 1); -} -.fa-flip-vertical { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); - -webkit-transform: scale(1, -1); - -moz-transform: scale(1, -1); - -ms-transform: scale(1, -1); - -o-transform: scale(1, -1); - transform: scale(1, -1); -} -.fa-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.fa-stack-1x, -.fa-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.fa-stack-1x { - line-height: inherit; -} -.fa-stack-2x { - font-size: 2em; -} -.fa-inverse { - color: #ffffff; -} -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ -.fa-glass:before { - content: "\f000"; -} -.fa-music:before { - content: "\f001"; -} -.fa-search:before { - content: "\f002"; -} -.fa-envelope-o:before { - content: "\f003"; -} -.fa-heart:before { - content: "\f004"; -} -.fa-star:before { - content: "\f005"; -} -.fa-star-o:before { - content: "\f006"; -} -.fa-user:before { - content: "\f007"; -} -.fa-film:before { - content: "\f008"; -} -.fa-th-large:before { - content: "\f009"; -} -.fa-th:before { - content: "\f00a"; -} -.fa-th-list:before { - content: "\f00b"; -} -.fa-check:before { - content: "\f00c"; -} -.fa-times:before { - content: "\f00d"; -} -.fa-search-plus:before { - content: "\f00e"; -} -.fa-search-minus:before { - content: "\f010"; -} -.fa-power-off:before { - content: "\f011"; -} -.fa-signal:before { - content: "\f012"; -} -.fa-gear:before, -.fa-cog:before { - content: "\f013"; -} -.fa-trash-o:before { - content: "\f014"; -} -.fa-home:before { - content: "\f015"; -} -.fa-file-o:before { - content: "\f016"; -} -.fa-clock-o:before { - content: "\f017"; -} -.fa-road:before { - content: "\f018"; -} -.fa-download:before { - content: "\f019"; -} -.fa-arrow-circle-o-down:before { - content: "\f01a"; -} -.fa-arrow-circle-o-up:before { - content: "\f01b"; -} -.fa-inbox:before { - content: "\f01c"; -} -.fa-play-circle-o:before { - content: "\f01d"; -} -.fa-rotate-right:before, -.fa-repeat:before { - content: "\f01e"; -} -.fa-refresh:before { - content: "\f021"; -} -.fa-list-alt:before { - content: "\f022"; -} -.fa-lock:before { - content: "\f023"; -} -.fa-flag:before { - content: "\f024"; -} -.fa-headphones:before { - content: "\f025"; -} -.fa-volume-off:before { - content: "\f026"; -} -.fa-volume-down:before { - content: "\f027"; -} -.fa-volume-up:before { - content: "\f028"; -} -.fa-qrcode:before { - content: "\f029"; -} -.fa-barcode:before { - content: "\f02a"; -} -.fa-tag:before { - content: "\f02b"; -} -.fa-tags:before { - content: "\f02c"; -} -.fa-book:before { - content: "\f02d"; -} -.fa-bookmark:before { - content: "\f02e"; -} -.fa-print:before { - content: "\f02f"; -} -.fa-camera:before { - content: "\f030"; -} -.fa-font:before { - content: "\f031"; -} -.fa-bold:before { - content: "\f032"; -} -.fa-italic:before { - content: "\f033"; -} -.fa-text-height:before { - content: "\f034"; -} -.fa-text-width:before { - content: "\f035"; -} -.fa-align-left:before { - content: "\f036"; -} -.fa-align-center:before { - content: "\f037"; -} -.fa-align-right:before { - content: "\f038"; -} -.fa-align-justify:before { - content: "\f039"; -} -.fa-list:before { - content: "\f03a"; -} -.fa-dedent:before, -.fa-outdent:before { - content: "\f03b"; -} -.fa-indent:before { - content: "\f03c"; -} -.fa-video-camera:before { - content: "\f03d"; -} -.fa-picture-o:before { - content: "\f03e"; -} -.fa-pencil:before { - content: "\f040"; -} -.fa-map-marker:before { - content: "\f041"; -} -.fa-adjust:before { - content: "\f042"; -} -.fa-tint:before { - content: "\f043"; -} -.fa-edit:before, -.fa-pencil-square-o:before { - content: "\f044"; -} -.fa-share-square-o:before { - content: "\f045"; -} -.fa-check-square-o:before { - content: "\f046"; -} -.fa-arrows:before { - content: "\f047"; -} -.fa-step-backward:before { - content: "\f048"; -} -.fa-fast-backward:before { - content: "\f049"; -} -.fa-backward:before { - content: "\f04a"; -} -.fa-play:before { - content: "\f04b"; -} -.fa-pause:before { - content: "\f04c"; -} -.fa-stop:before { - content: "\f04d"; -} -.fa-forward:before { - content: "\f04e"; -} -.fa-fast-forward:before { - content: "\f050"; -} -.fa-step-forward:before { - content: "\f051"; -} -.fa-eject:before { - content: "\f052"; -} -.fa-chevron-left:before { - content: "\f053"; -} -.fa-chevron-right:before { - content: "\f054"; -} -.fa-plus-circle:before { - content: "\f055"; -} -.fa-minus-circle:before { - content: "\f056"; -} -.fa-times-circle:before { - content: "\f057"; -} -.fa-check-circle:before { - content: "\f058"; -} -.fa-question-circle:before { - content: "\f059"; -} -.fa-info-circle:before { - content: "\f05a"; -} -.fa-crosshairs:before { - content: "\f05b"; -} -.fa-times-circle-o:before { - content: "\f05c"; -} -.fa-check-circle-o:before { - content: "\f05d"; -} -.fa-ban:before { - content: "\f05e"; -} -.fa-arrow-left:before { - content: "\f060"; -} -.fa-arrow-right:before { - content: "\f061"; -} -.fa-arrow-up:before { - content: "\f062"; -} -.fa-arrow-down:before { - content: "\f063"; -} -.fa-mail-forward:before, -.fa-share:before { - content: "\f064"; -} -.fa-expand:before { - content: "\f065"; -} -.fa-compress:before { - content: "\f066"; -} -.fa-plus:before { - content: "\f067"; -} -.fa-minus:before { - content: "\f068"; -} -.fa-asterisk:before { - content: "\f069"; -} -.fa-exclamation-circle:before { - content: "\f06a"; -} -.fa-gift:before { - content: "\f06b"; -} -.fa-leaf:before { - content: "\f06c"; -} -.fa-fire:before { - content: "\f06d"; -} -.fa-eye:before { - content: "\f06e"; -} -.fa-eye-slash:before { - content: "\f070"; -} -.fa-warning:before, -.fa-exclamation-triangle:before { - content: "\f071"; -} -.fa-plane:before { - content: "\f072"; -} -.fa-calendar:before { - content: "\f073"; -} -.fa-random:before { - content: "\f074"; -} -.fa-comment:before { - content: "\f075"; -} -.fa-magnet:before { - content: "\f076"; -} -.fa-chevron-up:before { - content: "\f077"; -} -.fa-chevron-down:before { - content: "\f078"; -} -.fa-retweet:before { - content: "\f079"; -} -.fa-shopping-cart:before { - content: "\f07a"; -} -.fa-folder:before { - content: "\f07b"; -} -.fa-folder-open:before { - content: "\f07c"; -} -.fa-arrows-v:before { - content: "\f07d"; -} -.fa-arrows-h:before { - content: "\f07e"; -} -.fa-bar-chart-o:before { - content: "\f080"; -} -.fa-twitter-square:before { - content: "\f081"; -} -.fa-facebook-square:before { - content: "\f082"; -} -.fa-camera-retro:before { - content: "\f083"; -} -.fa-key:before { - content: "\f084"; -} -.fa-gears:before, -.fa-cogs:before { - content: "\f085"; -} -.fa-comments:before { - content: "\f086"; -} -.fa-thumbs-o-up:before { - content: "\f087"; -} -.fa-thumbs-o-down:before { - content: "\f088"; -} -.fa-star-half:before { - content: "\f089"; -} -.fa-heart-o:before { - content: "\f08a"; -} -.fa-sign-out:before { - content: "\f08b"; -} -.fa-linkedin-square:before { - content: "\f08c"; -} -.fa-thumb-tack:before { - content: "\f08d"; -} -.fa-external-link:before { - content: "\f08e"; -} -.fa-sign-in:before { - content: "\f090"; -} -.fa-trophy:before { - content: "\f091"; -} -.fa-github-square:before { - content: "\f092"; -} -.fa-upload:before { - content: "\f093"; -} -.fa-lemon-o:before { - content: "\f094"; -} -.fa-phone:before { - content: "\f095"; -} -.fa-square-o:before { - content: "\f096"; -} -.fa-bookmark-o:before { - content: "\f097"; -} -.fa-phone-square:before { - content: "\f098"; -} -.fa-twitter:before { - content: "\f099"; -} -.fa-facebook:before { - content: "\f09a"; -} -.fa-github:before { - content: "\f09b"; -} -.fa-unlock:before { - content: "\f09c"; -} -.fa-credit-card:before { - content: "\f09d"; -} -.fa-rss:before { - content: "\f09e"; -} -.fa-hdd-o:before { - content: "\f0a0"; -} -.fa-bullhorn:before { - content: "\f0a1"; -} -.fa-bell:before { - content: "\f0f3"; -} -.fa-certificate:before { - content: "\f0a3"; -} -.fa-hand-o-right:before { - content: "\f0a4"; -} -.fa-hand-o-left:before { - content: "\f0a5"; -} -.fa-hand-o-up:before { - content: "\f0a6"; -} -.fa-hand-o-down:before { - content: "\f0a7"; -} -.fa-arrow-circle-left:before { - content: "\f0a8"; -} -.fa-arrow-circle-right:before { - content: "\f0a9"; -} -.fa-arrow-circle-up:before { - content: "\f0aa"; -} -.fa-arrow-circle-down:before { - content: "\f0ab"; -} -.fa-globe:before { - content: "\f0ac"; -} -.fa-wrench:before { - content: "\f0ad"; -} -.fa-tasks:before { - content: "\f0ae"; -} -.fa-filter:before { - content: "\f0b0"; -} -.fa-briefcase:before { - content: "\f0b1"; -} -.fa-arrows-alt:before { - content: "\f0b2"; -} -.fa-group:before, -.fa-users:before { - content: "\f0c0"; -} -.fa-chain:before, -.fa-link:before { - content: "\f0c1"; -} -.fa-cloud:before { - content: "\f0c2"; -} -.fa-flask:before { - content: "\f0c3"; -} -.fa-cut:before, -.fa-scissors:before { - content: "\f0c4"; -} -.fa-copy:before, -.fa-files-o:before { - content: "\f0c5"; -} -.fa-paperclip:before { - content: "\f0c6"; -} -.fa-save:before, -.fa-floppy-o:before { - content: "\f0c7"; -} -.fa-square:before { - content: "\f0c8"; -} -.fa-bars:before { - content: "\f0c9"; -} -.fa-list-ul:before { - content: "\f0ca"; -} -.fa-list-ol:before { - content: "\f0cb"; -} -.fa-strikethrough:before { - content: "\f0cc"; -} -.fa-underline:before { - content: "\f0cd"; -} -.fa-table:before { - content: "\f0ce"; -} -.fa-magic:before { - content: "\f0d0"; -} -.fa-truck:before { - content: "\f0d1"; -} -.fa-pinterest:before { - content: "\f0d2"; -} -.fa-pinterest-square:before { - content: "\f0d3"; -} -.fa-google-plus-square:before { - content: "\f0d4"; -} -.fa-google-plus:before { - content: "\f0d5"; -} -.fa-money:before { - content: "\f0d6"; -} -.fa-caret-down:before { - content: "\f0d7"; -} -.fa-caret-up:before { - content: "\f0d8"; -} -.fa-caret-left:before { - content: "\f0d9"; -} -.fa-caret-right:before { - content: "\f0da"; -} -.fa-columns:before { - content: "\f0db"; -} -.fa-unsorted:before, -.fa-sort:before { - content: "\f0dc"; -} -.fa-sort-down:before, -.fa-sort-asc:before { - content: "\f0dd"; -} -.fa-sort-up:before, -.fa-sort-desc:before { - content: "\f0de"; -} -.fa-envelope:before { - content: "\f0e0"; -} -.fa-linkedin:before { - content: "\f0e1"; -} -.fa-rotate-left:before, -.fa-undo:before { - content: "\f0e2"; -} -.fa-legal:before, -.fa-gavel:before { - content: "\f0e3"; -} -.fa-dashboard:before, -.fa-tachometer:before { - content: "\f0e4"; -} -.fa-comment-o:before { - content: "\f0e5"; -} -.fa-comments-o:before { - content: "\f0e6"; -} -.fa-flash:before, -.fa-bolt:before { - content: "\f0e7"; -} -.fa-sitemap:before { - content: "\f0e8"; -} -.fa-umbrella:before { - content: "\f0e9"; -} -.fa-paste:before, -.fa-clipboard:before { - content: "\f0ea"; -} -.fa-lightbulb-o:before { - content: "\f0eb"; -} -.fa-exchange:before { - content: "\f0ec"; -} -.fa-cloud-download:before { - content: "\f0ed"; -} -.fa-cloud-upload:before { - content: "\f0ee"; -} -.fa-user-md:before { - content: "\f0f0"; -} -.fa-stethoscope:before { - content: "\f0f1"; -} -.fa-suitcase:before { - content: "\f0f2"; -} -.fa-bell-o:before { - content: "\f0a2"; -} -.fa-coffee:before { - content: "\f0f4"; -} -.fa-cutlery:before { - content: "\f0f5"; -} -.fa-file-text-o:before { - content: "\f0f6"; -} -.fa-building-o:before { - content: "\f0f7"; -} -.fa-hospital-o:before { - content: "\f0f8"; -} -.fa-ambulance:before { - content: "\f0f9"; -} -.fa-medkit:before { - content: "\f0fa"; -} -.fa-fighter-jet:before { - content: "\f0fb"; -} -.fa-beer:before { - content: "\f0fc"; -} -.fa-h-square:before { - content: "\f0fd"; -} -.fa-plus-square:before { - content: "\f0fe"; -} -.fa-angle-double-left:before { - content: "\f100"; -} -.fa-angle-double-right:before { - content: "\f101"; -} -.fa-angle-double-up:before { - content: "\f102"; -} -.fa-angle-double-down:before { - content: "\f103"; -} -.fa-angle-left:before { - content: "\f104"; -} -.fa-angle-right:before { - content: "\f105"; -} -.fa-angle-up:before { - content: "\f106"; -} -.fa-angle-down:before { - content: "\f107"; -} -.fa-desktop:before { - content: "\f108"; -} -.fa-laptop:before { - content: "\f109"; -} -.fa-tablet:before { - content: "\f10a"; -} -.fa-mobile-phone:before, -.fa-mobile:before { - content: "\f10b"; -} -.fa-circle-o:before { - content: "\f10c"; -} -.fa-quote-left:before { - content: "\f10d"; -} -.fa-quote-right:before { - content: "\f10e"; -} -.fa-spinner:before { - content: "\f110"; -} -.fa-circle:before { - content: "\f111"; -} -.fa-mail-reply:before, -.fa-reply:before { - content: "\f112"; -} -.fa-github-alt:before { - content: "\f113"; -} -.fa-folder-o:before { - content: "\f114"; -} -.fa-folder-open-o:before { - content: "\f115"; -} -.fa-smile-o:before { - content: "\f118"; -} -.fa-frown-o:before { - content: "\f119"; -} -.fa-meh-o:before { - content: "\f11a"; -} -.fa-gamepad:before { - content: "\f11b"; -} -.fa-keyboard-o:before { - content: "\f11c"; -} -.fa-flag-o:before { - content: "\f11d"; -} -.fa-flag-checkered:before { - content: "\f11e"; -} -.fa-terminal:before { - content: "\f120"; -} -.fa-code:before { - content: "\f121"; -} -.fa-reply-all:before { - content: "\f122"; -} -.fa-mail-reply-all:before { - content: "\f122"; -} -.fa-star-half-empty:before, -.fa-star-half-full:before, -.fa-star-half-o:before { - content: "\f123"; -} -.fa-location-arrow:before { - content: "\f124"; -} -.fa-crop:before { - content: "\f125"; -} -.fa-code-fork:before { - content: "\f126"; -} -.fa-unlink:before, -.fa-chain-broken:before { - content: "\f127"; -} -.fa-question:before { - content: "\f128"; -} -.fa-info:before { - content: "\f129"; -} -.fa-exclamation:before { - content: "\f12a"; -} -.fa-superscript:before { - content: "\f12b"; -} -.fa-subscript:before { - content: "\f12c"; -} -.fa-eraser:before { - content: "\f12d"; -} -.fa-puzzle-piece:before { - content: "\f12e"; -} -.fa-microphone:before { - content: "\f130"; -} -.fa-microphone-slash:before { - content: "\f131"; -} -.fa-shield:before { - content: "\f132"; -} -.fa-calendar-o:before { - content: "\f133"; -} -.fa-fire-extinguisher:before { - content: "\f134"; -} -.fa-rocket:before { - content: "\f135"; -} -.fa-maxcdn:before { - content: "\f136"; -} -.fa-chevron-circle-left:before { - content: "\f137"; -} -.fa-chevron-circle-right:before { - content: "\f138"; -} -.fa-chevron-circle-up:before { - content: "\f139"; -} -.fa-chevron-circle-down:before { - content: "\f13a"; -} -.fa-html5:before { - content: "\f13b"; -} -.fa-css3:before { - content: "\f13c"; -} -.fa-anchor:before { - content: "\f13d"; -} -.fa-unlock-alt:before { - content: "\f13e"; -} -.fa-bullseye:before { - content: "\f140"; -} -.fa-ellipsis-h:before { - content: "\f141"; -} -.fa-ellipsis-v:before { - content: "\f142"; -} -.fa-rss-square:before { - content: "\f143"; -} -.fa-play-circle:before { - content: "\f144"; -} -.fa-ticket:before { - content: "\f145"; -} -.fa-minus-square:before { - content: "\f146"; -} -.fa-minus-square-o:before { - content: "\f147"; -} -.fa-level-up:before { - content: "\f148"; -} -.fa-level-down:before { - content: "\f149"; -} -.fa-check-square:before { - content: "\f14a"; -} -.fa-pencil-square:before { - content: "\f14b"; -} -.fa-external-link-square:before { - content: "\f14c"; -} -.fa-share-square:before { - content: "\f14d"; -} -.fa-compass:before { - content: "\f14e"; -} -.fa-toggle-down:before, -.fa-caret-square-o-down:before { - content: "\f150"; -} -.fa-toggle-up:before, -.fa-caret-square-o-up:before { - content: "\f151"; -} -.fa-toggle-right:before, -.fa-caret-square-o-right:before { - content: "\f152"; -} -.fa-euro:before, -.fa-eur:before { - content: "\f153"; -} -.fa-gbp:before { - content: "\f154"; -} -.fa-dollar:before, -.fa-usd:before { - content: "\f155"; -} -.fa-rupee:before, -.fa-inr:before { - content: "\f156"; -} -.fa-cny:before, -.fa-rmb:before, -.fa-yen:before, -.fa-jpy:before { - content: "\f157"; -} -.fa-ruble:before, -.fa-rouble:before, -.fa-rub:before { - content: "\f158"; -} -.fa-won:before, -.fa-krw:before { - content: "\f159"; -} -.fa-bitcoin:before, -.fa-btc:before { - content: "\f15a"; -} -.fa-file:before { - content: "\f15b"; -} -.fa-file-text:before { - content: "\f15c"; -} -.fa-sort-alpha-asc:before { - content: "\f15d"; -} -.fa-sort-alpha-desc:before { - content: "\f15e"; -} -.fa-sort-amount-asc:before { - content: "\f160"; -} -.fa-sort-amount-desc:before { - content: "\f161"; -} -.fa-sort-numeric-asc:before { - content: "\f162"; -} -.fa-sort-numeric-desc:before { - content: "\f163"; -} -.fa-thumbs-up:before { - content: "\f164"; -} -.fa-thumbs-down:before { - content: "\f165"; -} -.fa-youtube-square:before { - content: "\f166"; -} -.fa-youtube:before { - content: "\f167"; -} -.fa-xing:before { - content: "\f168"; -} -.fa-xing-square:before { - content: "\f169"; -} -.fa-youtube-play:before { - content: "\f16a"; -} -.fa-dropbox:before { - content: "\f16b"; -} -.fa-stack-overflow:before { - content: "\f16c"; -} -.fa-instagram:before { - content: "\f16d"; -} -.fa-flickr:before { - content: "\f16e"; -} -.fa-adn:before { - content: "\f170"; -} -.fa-bitbucket:before { - content: "\f171"; -} -.fa-bitbucket-square:before { - content: "\f172"; -} -.fa-tumblr:before { - content: "\f173"; -} -.fa-tumblr-square:before { - content: "\f174"; -} -.fa-long-arrow-down:before { - content: "\f175"; -} -.fa-long-arrow-up:before { - content: "\f176"; -} -.fa-long-arrow-left:before { - content: "\f177"; -} -.fa-long-arrow-right:before { - content: "\f178"; -} -.fa-apple:before { - content: "\f179"; -} -.fa-windows:before { - content: "\f17a"; -} -.fa-android:before { - content: "\f17b"; -} -.fa-linux:before { - content: "\f17c"; -} -.fa-dribbble:before { - content: "\f17d"; -} -.fa-skype:before { - content: "\f17e"; -} -.fa-foursquare:before { - content: "\f180"; -} -.fa-trello:before { - content: "\f181"; -} -.fa-female:before { - content: "\f182"; -} -.fa-male:before { - content: "\f183"; -} -.fa-gittip:before { - content: "\f184"; -} -.fa-sun-o:before { - content: "\f185"; -} -.fa-moon-o:before { - content: "\f186"; -} -.fa-archive:before { - content: "\f187"; -} -.fa-bug:before { - content: "\f188"; -} -.fa-vk:before { - content: "\f189"; -} -.fa-weibo:before { - content: "\f18a"; -} -.fa-renren:before { - content: "\f18b"; -} -.fa-pagelines:before { - content: "\f18c"; -} -.fa-stack-exchange:before { - content: "\f18d"; -} -.fa-arrow-circle-o-right:before { - content: "\f18e"; -} -.fa-arrow-circle-o-left:before { - content: "\f190"; -} -.fa-toggle-left:before, -.fa-caret-square-o-left:before { - content: "\f191"; -} -.fa-dot-circle-o:before { - content: "\f192"; -} -.fa-wheelchair:before { - content: "\f193"; -} -.fa-vimeo-square:before { - content: "\f194"; -} -.fa-turkish-lira:before, -.fa-try:before { - content: "\f195"; -} -.fa-plus-square-o:before { - content: "\f196"; -} diff --git a/static/geomarkers.js b/static/geomarkers.js deleted file mode 100644 index fa58ff3..0000000 --- a/static/geomarkers.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Created by ignace on 29-9-15. - */ - function addMarker(map, latlong, text) { - var ll = latlong.split(','); - var myLatlng = new google.maps.LatLng(ll[0],ll[1]); - var marker = new google.maps.Marker({ - position: myLatlng, - title: text - }); - marker.setMap(map); - } - function makeGoogleMap() { - - var mapOptions = { - center: new google.maps.LatLng(50,0), - zoom: 1, - mapTypeId: google.maps.MapTypeId.ROADMAP - }; - var map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions); - addAllMarkers(map); - } \ No newline at end of file diff --git a/static/grids-responsive-min.css b/static/grids-responsive-min.css deleted file mode 100644 index 1df05db..0000000 --- a/static/grids-responsive-min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! -Pure v0.6.0 -Copyright 2014 Yahoo! Inc. All rights reserved. -Licensed under the BSD License. -https://github.com/yahoo/pure/blob/master/LICENSE.md -*/ -@media screen and (min-width:35.5em){.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-1-2,.pure-u-sm-1-3,.pure-u-sm-2-3,.pure-u-sm-1-4,.pure-u-sm-3-4,.pure-u-sm-1-5,.pure-u-sm-2-5,.pure-u-sm-3-5,.pure-u-sm-4-5,.pure-u-sm-5-5,.pure-u-sm-1-6,.pure-u-sm-5-6,.pure-u-sm-1-8,.pure-u-sm-3-8,.pure-u-sm-5-8,.pure-u-sm-7-8,.pure-u-sm-1-12,.pure-u-sm-5-12,.pure-u-sm-7-12,.pure-u-sm-11-12,.pure-u-sm-1-24,.pure-u-sm-2-24,.pure-u-sm-3-24,.pure-u-sm-4-24,.pure-u-sm-5-24,.pure-u-sm-6-24,.pure-u-sm-7-24,.pure-u-sm-8-24,.pure-u-sm-9-24,.pure-u-sm-10-24,.pure-u-sm-11-24,.pure-u-sm-12-24,.pure-u-sm-13-24,.pure-u-sm-14-24,.pure-u-sm-15-24,.pure-u-sm-16-24,.pure-u-sm-17-24,.pure-u-sm-18-24,.pure-u-sm-19-24,.pure-u-sm-20-24,.pure-u-sm-21-24,.pure-u-sm-22-24,.pure-u-sm-23-24,.pure-u-sm-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-sm-1-24{width:4.1667%;*width:4.1357%}.pure-u-sm-1-12,.pure-u-sm-2-24{width:8.3333%;*width:8.3023%}.pure-u-sm-1-8,.pure-u-sm-3-24{width:12.5%;*width:12.469%}.pure-u-sm-1-6,.pure-u-sm-4-24{width:16.6667%;*width:16.6357%}.pure-u-sm-1-5{width:20%;*width:19.969%}.pure-u-sm-5-24{width:20.8333%;*width:20.8023%}.pure-u-sm-1-4,.pure-u-sm-6-24{width:25%;*width:24.969%}.pure-u-sm-7-24{width:29.1667%;*width:29.1357%}.pure-u-sm-1-3,.pure-u-sm-8-24{width:33.3333%;*width:33.3023%}.pure-u-sm-3-8,.pure-u-sm-9-24{width:37.5%;*width:37.469%}.pure-u-sm-2-5{width:40%;*width:39.969%}.pure-u-sm-5-12,.pure-u-sm-10-24{width:41.6667%;*width:41.6357%}.pure-u-sm-11-24{width:45.8333%;*width:45.8023%}.pure-u-sm-1-2,.pure-u-sm-12-24{width:50%;*width:49.969%}.pure-u-sm-13-24{width:54.1667%;*width:54.1357%}.pure-u-sm-7-12,.pure-u-sm-14-24{width:58.3333%;*width:58.3023%}.pure-u-sm-3-5{width:60%;*width:59.969%}.pure-u-sm-5-8,.pure-u-sm-15-24{width:62.5%;*width:62.469%}.pure-u-sm-2-3,.pure-u-sm-16-24{width:66.6667%;*width:66.6357%}.pure-u-sm-17-24{width:70.8333%;*width:70.8023%}.pure-u-sm-3-4,.pure-u-sm-18-24{width:75%;*width:74.969%}.pure-u-sm-19-24{width:79.1667%;*width:79.1357%}.pure-u-sm-4-5{width:80%;*width:79.969%}.pure-u-sm-5-6,.pure-u-sm-20-24{width:83.3333%;*width:83.3023%}.pure-u-sm-7-8,.pure-u-sm-21-24{width:87.5%;*width:87.469%}.pure-u-sm-11-12,.pure-u-sm-22-24{width:91.6667%;*width:91.6357%}.pure-u-sm-23-24{width:95.8333%;*width:95.8023%}.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-5-5,.pure-u-sm-24-24{width:100%}}@media screen and (min-width:48em){.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-1-2,.pure-u-md-1-3,.pure-u-md-2-3,.pure-u-md-1-4,.pure-u-md-3-4,.pure-u-md-1-5,.pure-u-md-2-5,.pure-u-md-3-5,.pure-u-md-4-5,.pure-u-md-5-5,.pure-u-md-1-6,.pure-u-md-5-6,.pure-u-md-1-8,.pure-u-md-3-8,.pure-u-md-5-8,.pure-u-md-7-8,.pure-u-md-1-12,.pure-u-md-5-12,.pure-u-md-7-12,.pure-u-md-11-12,.pure-u-md-1-24,.pure-u-md-2-24,.pure-u-md-3-24,.pure-u-md-4-24,.pure-u-md-5-24,.pure-u-md-6-24,.pure-u-md-7-24,.pure-u-md-8-24,.pure-u-md-9-24,.pure-u-md-10-24,.pure-u-md-11-24,.pure-u-md-12-24,.pure-u-md-13-24,.pure-u-md-14-24,.pure-u-md-15-24,.pure-u-md-16-24,.pure-u-md-17-24,.pure-u-md-18-24,.pure-u-md-19-24,.pure-u-md-20-24,.pure-u-md-21-24,.pure-u-md-22-24,.pure-u-md-23-24,.pure-u-md-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-md-1-24{width:4.1667%;*width:4.1357%}.pure-u-md-1-12,.pure-u-md-2-24{width:8.3333%;*width:8.3023%}.pure-u-md-1-8,.pure-u-md-3-24{width:12.5%;*width:12.469%}.pure-u-md-1-6,.pure-u-md-4-24{width:16.6667%;*width:16.6357%}.pure-u-md-1-5{width:20%;*width:19.969%}.pure-u-md-5-24{width:20.8333%;*width:20.8023%}.pure-u-md-1-4,.pure-u-md-6-24{width:25%;*width:24.969%}.pure-u-md-7-24{width:29.1667%;*width:29.1357%}.pure-u-md-1-3,.pure-u-md-8-24{width:33.3333%;*width:33.3023%}.pure-u-md-3-8,.pure-u-md-9-24{width:37.5%;*width:37.469%}.pure-u-md-2-5{width:40%;*width:39.969%}.pure-u-md-5-12,.pure-u-md-10-24{width:41.6667%;*width:41.6357%}.pure-u-md-11-24{width:45.8333%;*width:45.8023%}.pure-u-md-1-2,.pure-u-md-12-24{width:50%;*width:49.969%}.pure-u-md-13-24{width:54.1667%;*width:54.1357%}.pure-u-md-7-12,.pure-u-md-14-24{width:58.3333%;*width:58.3023%}.pure-u-md-3-5{width:60%;*width:59.969%}.pure-u-md-5-8,.pure-u-md-15-24{width:62.5%;*width:62.469%}.pure-u-md-2-3,.pure-u-md-16-24{width:66.6667%;*width:66.6357%}.pure-u-md-17-24{width:70.8333%;*width:70.8023%}.pure-u-md-3-4,.pure-u-md-18-24{width:75%;*width:74.969%}.pure-u-md-19-24{width:79.1667%;*width:79.1357%}.pure-u-md-4-5{width:80%;*width:79.969%}.pure-u-md-5-6,.pure-u-md-20-24{width:83.3333%;*width:83.3023%}.pure-u-md-7-8,.pure-u-md-21-24{width:87.5%;*width:87.469%}.pure-u-md-11-12,.pure-u-md-22-24{width:91.6667%;*width:91.6357%}.pure-u-md-23-24{width:95.8333%;*width:95.8023%}.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-5-5,.pure-u-md-24-24{width:100%}}@media screen and (min-width:64em){.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-1-2,.pure-u-lg-1-3,.pure-u-lg-2-3,.pure-u-lg-1-4,.pure-u-lg-3-4,.pure-u-lg-1-5,.pure-u-lg-2-5,.pure-u-lg-3-5,.pure-u-lg-4-5,.pure-u-lg-5-5,.pure-u-lg-1-6,.pure-u-lg-5-6,.pure-u-lg-1-8,.pure-u-lg-3-8,.pure-u-lg-5-8,.pure-u-lg-7-8,.pure-u-lg-1-12,.pure-u-lg-5-12,.pure-u-lg-7-12,.pure-u-lg-11-12,.pure-u-lg-1-24,.pure-u-lg-2-24,.pure-u-lg-3-24,.pure-u-lg-4-24,.pure-u-lg-5-24,.pure-u-lg-6-24,.pure-u-lg-7-24,.pure-u-lg-8-24,.pure-u-lg-9-24,.pure-u-lg-10-24,.pure-u-lg-11-24,.pure-u-lg-12-24,.pure-u-lg-13-24,.pure-u-lg-14-24,.pure-u-lg-15-24,.pure-u-lg-16-24,.pure-u-lg-17-24,.pure-u-lg-18-24,.pure-u-lg-19-24,.pure-u-lg-20-24,.pure-u-lg-21-24,.pure-u-lg-22-24,.pure-u-lg-23-24,.pure-u-lg-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-lg-1-24{width:4.1667%;*width:4.1357%}.pure-u-lg-1-12,.pure-u-lg-2-24{width:8.3333%;*width:8.3023%}.pure-u-lg-1-8,.pure-u-lg-3-24{width:12.5%;*width:12.469%}.pure-u-lg-1-6,.pure-u-lg-4-24{width:16.6667%;*width:16.6357%}.pure-u-lg-1-5{width:20%;*width:19.969%}.pure-u-lg-5-24{width:20.8333%;*width:20.8023%}.pure-u-lg-1-4,.pure-u-lg-6-24{width:25%;*width:24.969%}.pure-u-lg-7-24{width:29.1667%;*width:29.1357%}.pure-u-lg-1-3,.pure-u-lg-8-24{width:33.3333%;*width:33.3023%}.pure-u-lg-3-8,.pure-u-lg-9-24{width:37.5%;*width:37.469%}.pure-u-lg-2-5{width:40%;*width:39.969%}.pure-u-lg-5-12,.pure-u-lg-10-24{width:41.6667%;*width:41.6357%}.pure-u-lg-11-24{width:45.8333%;*width:45.8023%}.pure-u-lg-1-2,.pure-u-lg-12-24{width:50%;*width:49.969%}.pure-u-lg-13-24{width:54.1667%;*width:54.1357%}.pure-u-lg-7-12,.pure-u-lg-14-24{width:58.3333%;*width:58.3023%}.pure-u-lg-3-5{width:60%;*width:59.969%}.pure-u-lg-5-8,.pure-u-lg-15-24{width:62.5%;*width:62.469%}.pure-u-lg-2-3,.pure-u-lg-16-24{width:66.6667%;*width:66.6357%}.pure-u-lg-17-24{width:70.8333%;*width:70.8023%}.pure-u-lg-3-4,.pure-u-lg-18-24{width:75%;*width:74.969%}.pure-u-lg-19-24{width:79.1667%;*width:79.1357%}.pure-u-lg-4-5{width:80%;*width:79.969%}.pure-u-lg-5-6,.pure-u-lg-20-24{width:83.3333%;*width:83.3023%}.pure-u-lg-7-8,.pure-u-lg-21-24{width:87.5%;*width:87.469%}.pure-u-lg-11-12,.pure-u-lg-22-24{width:91.6667%;*width:91.6357%}.pure-u-lg-23-24{width:95.8333%;*width:95.8023%}.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-5-5,.pure-u-lg-24-24{width:100%}}@media screen and (min-width:80em){.pure-u-xl-1,.pure-u-xl-1-1,.pure-u-xl-1-2,.pure-u-xl-1-3,.pure-u-xl-2-3,.pure-u-xl-1-4,.pure-u-xl-3-4,.pure-u-xl-1-5,.pure-u-xl-2-5,.pure-u-xl-3-5,.pure-u-xl-4-5,.pure-u-xl-5-5,.pure-u-xl-1-6,.pure-u-xl-5-6,.pure-u-xl-1-8,.pure-u-xl-3-8,.pure-u-xl-5-8,.pure-u-xl-7-8,.pure-u-xl-1-12,.pure-u-xl-5-12,.pure-u-xl-7-12,.pure-u-xl-11-12,.pure-u-xl-1-24,.pure-u-xl-2-24,.pure-u-xl-3-24,.pure-u-xl-4-24,.pure-u-xl-5-24,.pure-u-xl-6-24,.pure-u-xl-7-24,.pure-u-xl-8-24,.pure-u-xl-9-24,.pure-u-xl-10-24,.pure-u-xl-11-24,.pure-u-xl-12-24,.pure-u-xl-13-24,.pure-u-xl-14-24,.pure-u-xl-15-24,.pure-u-xl-16-24,.pure-u-xl-17-24,.pure-u-xl-18-24,.pure-u-xl-19-24,.pure-u-xl-20-24,.pure-u-xl-21-24,.pure-u-xl-22-24,.pure-u-xl-23-24,.pure-u-xl-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-xl-1-24{width:4.1667%;*width:4.1357%}.pure-u-xl-1-12,.pure-u-xl-2-24{width:8.3333%;*width:8.3023%}.pure-u-xl-1-8,.pure-u-xl-3-24{width:12.5%;*width:12.469%}.pure-u-xl-1-6,.pure-u-xl-4-24{width:16.6667%;*width:16.6357%}.pure-u-xl-1-5{width:20%;*width:19.969%}.pure-u-xl-5-24{width:20.8333%;*width:20.8023%}.pure-u-xl-1-4,.pure-u-xl-6-24{width:25%;*width:24.969%}.pure-u-xl-7-24{width:29.1667%;*width:29.1357%}.pure-u-xl-1-3,.pure-u-xl-8-24{width:33.3333%;*width:33.3023%}.pure-u-xl-3-8,.pure-u-xl-9-24{width:37.5%;*width:37.469%}.pure-u-xl-2-5{width:40%;*width:39.969%}.pure-u-xl-5-12,.pure-u-xl-10-24{width:41.6667%;*width:41.6357%}.pure-u-xl-11-24{width:45.8333%;*width:45.8023%}.pure-u-xl-1-2,.pure-u-xl-12-24{width:50%;*width:49.969%}.pure-u-xl-13-24{width:54.1667%;*width:54.1357%}.pure-u-xl-7-12,.pure-u-xl-14-24{width:58.3333%;*width:58.3023%}.pure-u-xl-3-5{width:60%;*width:59.969%}.pure-u-xl-5-8,.pure-u-xl-15-24{width:62.5%;*width:62.469%}.pure-u-xl-2-3,.pure-u-xl-16-24{width:66.6667%;*width:66.6357%}.pure-u-xl-17-24{width:70.8333%;*width:70.8023%}.pure-u-xl-3-4,.pure-u-xl-18-24{width:75%;*width:74.969%}.pure-u-xl-19-24{width:79.1667%;*width:79.1357%}.pure-u-xl-4-5{width:80%;*width:79.969%}.pure-u-xl-5-6,.pure-u-xl-20-24{width:83.3333%;*width:83.3023%}.pure-u-xl-7-8,.pure-u-xl-21-24{width:87.5%;*width:87.469%}.pure-u-xl-11-12,.pure-u-xl-22-24{width:91.6667%;*width:91.6357%}.pure-u-xl-23-24{width:95.8333%;*width:95.8023%}.pure-u-xl-1,.pure-u-xl-1-1,.pure-u-xl-5-5,.pure-u-xl-24-24{width:100%}} \ No newline at end of file diff --git a/static/grids-responsive-min.css.1 b/static/grids-responsive-min.css.1 deleted file mode 100644 index 1df05db..0000000 --- a/static/grids-responsive-min.css.1 +++ /dev/null @@ -1,7 +0,0 @@ -/*! -Pure v0.6.0 -Copyright 2014 Yahoo! Inc. All rights reserved. -Licensed under the BSD License. -https://github.com/yahoo/pure/blob/master/LICENSE.md -*/ -@media screen and (min-width:35.5em){.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-1-2,.pure-u-sm-1-3,.pure-u-sm-2-3,.pure-u-sm-1-4,.pure-u-sm-3-4,.pure-u-sm-1-5,.pure-u-sm-2-5,.pure-u-sm-3-5,.pure-u-sm-4-5,.pure-u-sm-5-5,.pure-u-sm-1-6,.pure-u-sm-5-6,.pure-u-sm-1-8,.pure-u-sm-3-8,.pure-u-sm-5-8,.pure-u-sm-7-8,.pure-u-sm-1-12,.pure-u-sm-5-12,.pure-u-sm-7-12,.pure-u-sm-11-12,.pure-u-sm-1-24,.pure-u-sm-2-24,.pure-u-sm-3-24,.pure-u-sm-4-24,.pure-u-sm-5-24,.pure-u-sm-6-24,.pure-u-sm-7-24,.pure-u-sm-8-24,.pure-u-sm-9-24,.pure-u-sm-10-24,.pure-u-sm-11-24,.pure-u-sm-12-24,.pure-u-sm-13-24,.pure-u-sm-14-24,.pure-u-sm-15-24,.pure-u-sm-16-24,.pure-u-sm-17-24,.pure-u-sm-18-24,.pure-u-sm-19-24,.pure-u-sm-20-24,.pure-u-sm-21-24,.pure-u-sm-22-24,.pure-u-sm-23-24,.pure-u-sm-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-sm-1-24{width:4.1667%;*width:4.1357%}.pure-u-sm-1-12,.pure-u-sm-2-24{width:8.3333%;*width:8.3023%}.pure-u-sm-1-8,.pure-u-sm-3-24{width:12.5%;*width:12.469%}.pure-u-sm-1-6,.pure-u-sm-4-24{width:16.6667%;*width:16.6357%}.pure-u-sm-1-5{width:20%;*width:19.969%}.pure-u-sm-5-24{width:20.8333%;*width:20.8023%}.pure-u-sm-1-4,.pure-u-sm-6-24{width:25%;*width:24.969%}.pure-u-sm-7-24{width:29.1667%;*width:29.1357%}.pure-u-sm-1-3,.pure-u-sm-8-24{width:33.3333%;*width:33.3023%}.pure-u-sm-3-8,.pure-u-sm-9-24{width:37.5%;*width:37.469%}.pure-u-sm-2-5{width:40%;*width:39.969%}.pure-u-sm-5-12,.pure-u-sm-10-24{width:41.6667%;*width:41.6357%}.pure-u-sm-11-24{width:45.8333%;*width:45.8023%}.pure-u-sm-1-2,.pure-u-sm-12-24{width:50%;*width:49.969%}.pure-u-sm-13-24{width:54.1667%;*width:54.1357%}.pure-u-sm-7-12,.pure-u-sm-14-24{width:58.3333%;*width:58.3023%}.pure-u-sm-3-5{width:60%;*width:59.969%}.pure-u-sm-5-8,.pure-u-sm-15-24{width:62.5%;*width:62.469%}.pure-u-sm-2-3,.pure-u-sm-16-24{width:66.6667%;*width:66.6357%}.pure-u-sm-17-24{width:70.8333%;*width:70.8023%}.pure-u-sm-3-4,.pure-u-sm-18-24{width:75%;*width:74.969%}.pure-u-sm-19-24{width:79.1667%;*width:79.1357%}.pure-u-sm-4-5{width:80%;*width:79.969%}.pure-u-sm-5-6,.pure-u-sm-20-24{width:83.3333%;*width:83.3023%}.pure-u-sm-7-8,.pure-u-sm-21-24{width:87.5%;*width:87.469%}.pure-u-sm-11-12,.pure-u-sm-22-24{width:91.6667%;*width:91.6357%}.pure-u-sm-23-24{width:95.8333%;*width:95.8023%}.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-5-5,.pure-u-sm-24-24{width:100%}}@media screen and (min-width:48em){.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-1-2,.pure-u-md-1-3,.pure-u-md-2-3,.pure-u-md-1-4,.pure-u-md-3-4,.pure-u-md-1-5,.pure-u-md-2-5,.pure-u-md-3-5,.pure-u-md-4-5,.pure-u-md-5-5,.pure-u-md-1-6,.pure-u-md-5-6,.pure-u-md-1-8,.pure-u-md-3-8,.pure-u-md-5-8,.pure-u-md-7-8,.pure-u-md-1-12,.pure-u-md-5-12,.pure-u-md-7-12,.pure-u-md-11-12,.pure-u-md-1-24,.pure-u-md-2-24,.pure-u-md-3-24,.pure-u-md-4-24,.pure-u-md-5-24,.pure-u-md-6-24,.pure-u-md-7-24,.pure-u-md-8-24,.pure-u-md-9-24,.pure-u-md-10-24,.pure-u-md-11-24,.pure-u-md-12-24,.pure-u-md-13-24,.pure-u-md-14-24,.pure-u-md-15-24,.pure-u-md-16-24,.pure-u-md-17-24,.pure-u-md-18-24,.pure-u-md-19-24,.pure-u-md-20-24,.pure-u-md-21-24,.pure-u-md-22-24,.pure-u-md-23-24,.pure-u-md-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-md-1-24{width:4.1667%;*width:4.1357%}.pure-u-md-1-12,.pure-u-md-2-24{width:8.3333%;*width:8.3023%}.pure-u-md-1-8,.pure-u-md-3-24{width:12.5%;*width:12.469%}.pure-u-md-1-6,.pure-u-md-4-24{width:16.6667%;*width:16.6357%}.pure-u-md-1-5{width:20%;*width:19.969%}.pure-u-md-5-24{width:20.8333%;*width:20.8023%}.pure-u-md-1-4,.pure-u-md-6-24{width:25%;*width:24.969%}.pure-u-md-7-24{width:29.1667%;*width:29.1357%}.pure-u-md-1-3,.pure-u-md-8-24{width:33.3333%;*width:33.3023%}.pure-u-md-3-8,.pure-u-md-9-24{width:37.5%;*width:37.469%}.pure-u-md-2-5{width:40%;*width:39.969%}.pure-u-md-5-12,.pure-u-md-10-24{width:41.6667%;*width:41.6357%}.pure-u-md-11-24{width:45.8333%;*width:45.8023%}.pure-u-md-1-2,.pure-u-md-12-24{width:50%;*width:49.969%}.pure-u-md-13-24{width:54.1667%;*width:54.1357%}.pure-u-md-7-12,.pure-u-md-14-24{width:58.3333%;*width:58.3023%}.pure-u-md-3-5{width:60%;*width:59.969%}.pure-u-md-5-8,.pure-u-md-15-24{width:62.5%;*width:62.469%}.pure-u-md-2-3,.pure-u-md-16-24{width:66.6667%;*width:66.6357%}.pure-u-md-17-24{width:70.8333%;*width:70.8023%}.pure-u-md-3-4,.pure-u-md-18-24{width:75%;*width:74.969%}.pure-u-md-19-24{width:79.1667%;*width:79.1357%}.pure-u-md-4-5{width:80%;*width:79.969%}.pure-u-md-5-6,.pure-u-md-20-24{width:83.3333%;*width:83.3023%}.pure-u-md-7-8,.pure-u-md-21-24{width:87.5%;*width:87.469%}.pure-u-md-11-12,.pure-u-md-22-24{width:91.6667%;*width:91.6357%}.pure-u-md-23-24{width:95.8333%;*width:95.8023%}.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-5-5,.pure-u-md-24-24{width:100%}}@media screen and (min-width:64em){.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-1-2,.pure-u-lg-1-3,.pure-u-lg-2-3,.pure-u-lg-1-4,.pure-u-lg-3-4,.pure-u-lg-1-5,.pure-u-lg-2-5,.pure-u-lg-3-5,.pure-u-lg-4-5,.pure-u-lg-5-5,.pure-u-lg-1-6,.pure-u-lg-5-6,.pure-u-lg-1-8,.pure-u-lg-3-8,.pure-u-lg-5-8,.pure-u-lg-7-8,.pure-u-lg-1-12,.pure-u-lg-5-12,.pure-u-lg-7-12,.pure-u-lg-11-12,.pure-u-lg-1-24,.pure-u-lg-2-24,.pure-u-lg-3-24,.pure-u-lg-4-24,.pure-u-lg-5-24,.pure-u-lg-6-24,.pure-u-lg-7-24,.pure-u-lg-8-24,.pure-u-lg-9-24,.pure-u-lg-10-24,.pure-u-lg-11-24,.pure-u-lg-12-24,.pure-u-lg-13-24,.pure-u-lg-14-24,.pure-u-lg-15-24,.pure-u-lg-16-24,.pure-u-lg-17-24,.pure-u-lg-18-24,.pure-u-lg-19-24,.pure-u-lg-20-24,.pure-u-lg-21-24,.pure-u-lg-22-24,.pure-u-lg-23-24,.pure-u-lg-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-lg-1-24{width:4.1667%;*width:4.1357%}.pure-u-lg-1-12,.pure-u-lg-2-24{width:8.3333%;*width:8.3023%}.pure-u-lg-1-8,.pure-u-lg-3-24{width:12.5%;*width:12.469%}.pure-u-lg-1-6,.pure-u-lg-4-24{width:16.6667%;*width:16.6357%}.pure-u-lg-1-5{width:20%;*width:19.969%}.pure-u-lg-5-24{width:20.8333%;*width:20.8023%}.pure-u-lg-1-4,.pure-u-lg-6-24{width:25%;*width:24.969%}.pure-u-lg-7-24{width:29.1667%;*width:29.1357%}.pure-u-lg-1-3,.pure-u-lg-8-24{width:33.3333%;*width:33.3023%}.pure-u-lg-3-8,.pure-u-lg-9-24{width:37.5%;*width:37.469%}.pure-u-lg-2-5{width:40%;*width:39.969%}.pure-u-lg-5-12,.pure-u-lg-10-24{width:41.6667%;*width:41.6357%}.pure-u-lg-11-24{width:45.8333%;*width:45.8023%}.pure-u-lg-1-2,.pure-u-lg-12-24{width:50%;*width:49.969%}.pure-u-lg-13-24{width:54.1667%;*width:54.1357%}.pure-u-lg-7-12,.pure-u-lg-14-24{width:58.3333%;*width:58.3023%}.pure-u-lg-3-5{width:60%;*width:59.969%}.pure-u-lg-5-8,.pure-u-lg-15-24{width:62.5%;*width:62.469%}.pure-u-lg-2-3,.pure-u-lg-16-24{width:66.6667%;*width:66.6357%}.pure-u-lg-17-24{width:70.8333%;*width:70.8023%}.pure-u-lg-3-4,.pure-u-lg-18-24{width:75%;*width:74.969%}.pure-u-lg-19-24{width:79.1667%;*width:79.1357%}.pure-u-lg-4-5{width:80%;*width:79.969%}.pure-u-lg-5-6,.pure-u-lg-20-24{width:83.3333%;*width:83.3023%}.pure-u-lg-7-8,.pure-u-lg-21-24{width:87.5%;*width:87.469%}.pure-u-lg-11-12,.pure-u-lg-22-24{width:91.6667%;*width:91.6357%}.pure-u-lg-23-24{width:95.8333%;*width:95.8023%}.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-5-5,.pure-u-lg-24-24{width:100%}}@media screen and (min-width:80em){.pure-u-xl-1,.pure-u-xl-1-1,.pure-u-xl-1-2,.pure-u-xl-1-3,.pure-u-xl-2-3,.pure-u-xl-1-4,.pure-u-xl-3-4,.pure-u-xl-1-5,.pure-u-xl-2-5,.pure-u-xl-3-5,.pure-u-xl-4-5,.pure-u-xl-5-5,.pure-u-xl-1-6,.pure-u-xl-5-6,.pure-u-xl-1-8,.pure-u-xl-3-8,.pure-u-xl-5-8,.pure-u-xl-7-8,.pure-u-xl-1-12,.pure-u-xl-5-12,.pure-u-xl-7-12,.pure-u-xl-11-12,.pure-u-xl-1-24,.pure-u-xl-2-24,.pure-u-xl-3-24,.pure-u-xl-4-24,.pure-u-xl-5-24,.pure-u-xl-6-24,.pure-u-xl-7-24,.pure-u-xl-8-24,.pure-u-xl-9-24,.pure-u-xl-10-24,.pure-u-xl-11-24,.pure-u-xl-12-24,.pure-u-xl-13-24,.pure-u-xl-14-24,.pure-u-xl-15-24,.pure-u-xl-16-24,.pure-u-xl-17-24,.pure-u-xl-18-24,.pure-u-xl-19-24,.pure-u-xl-20-24,.pure-u-xl-21-24,.pure-u-xl-22-24,.pure-u-xl-23-24,.pure-u-xl-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-xl-1-24{width:4.1667%;*width:4.1357%}.pure-u-xl-1-12,.pure-u-xl-2-24{width:8.3333%;*width:8.3023%}.pure-u-xl-1-8,.pure-u-xl-3-24{width:12.5%;*width:12.469%}.pure-u-xl-1-6,.pure-u-xl-4-24{width:16.6667%;*width:16.6357%}.pure-u-xl-1-5{width:20%;*width:19.969%}.pure-u-xl-5-24{width:20.8333%;*width:20.8023%}.pure-u-xl-1-4,.pure-u-xl-6-24{width:25%;*width:24.969%}.pure-u-xl-7-24{width:29.1667%;*width:29.1357%}.pure-u-xl-1-3,.pure-u-xl-8-24{width:33.3333%;*width:33.3023%}.pure-u-xl-3-8,.pure-u-xl-9-24{width:37.5%;*width:37.469%}.pure-u-xl-2-5{width:40%;*width:39.969%}.pure-u-xl-5-12,.pure-u-xl-10-24{width:41.6667%;*width:41.6357%}.pure-u-xl-11-24{width:45.8333%;*width:45.8023%}.pure-u-xl-1-2,.pure-u-xl-12-24{width:50%;*width:49.969%}.pure-u-xl-13-24{width:54.1667%;*width:54.1357%}.pure-u-xl-7-12,.pure-u-xl-14-24{width:58.3333%;*width:58.3023%}.pure-u-xl-3-5{width:60%;*width:59.969%}.pure-u-xl-5-8,.pure-u-xl-15-24{width:62.5%;*width:62.469%}.pure-u-xl-2-3,.pure-u-xl-16-24{width:66.6667%;*width:66.6357%}.pure-u-xl-17-24{width:70.8333%;*width:70.8023%}.pure-u-xl-3-4,.pure-u-xl-18-24{width:75%;*width:74.969%}.pure-u-xl-19-24{width:79.1667%;*width:79.1357%}.pure-u-xl-4-5{width:80%;*width:79.969%}.pure-u-xl-5-6,.pure-u-xl-20-24{width:83.3333%;*width:83.3023%}.pure-u-xl-7-8,.pure-u-xl-21-24{width:87.5%;*width:87.469%}.pure-u-xl-11-12,.pure-u-xl-22-24{width:91.6667%;*width:91.6357%}.pure-u-xl-23-24{width:95.8333%;*width:95.8023%}.pure-u-xl-1,.pure-u-xl-1-1,.pure-u-xl-5-5,.pure-u-xl-24-24{width:100%}} \ No newline at end of file diff --git a/static/hsep.png b/static/hsep.png deleted file mode 100644 index f9b7c51b9c5b167ba14b3577641e566531bde2cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^`+%5{g9%8!?`qBhQrVs^jv*DdO8p)A4k&PFi~mpC z^#A`+Vebo$j$uMMjf+mzJd5&nNw~2jg|YRtkJ+9A6^}b_lg>=7lZpM^ub`v4eaQ#0 zRZ@491YcK$1x&EH(#N}Ao>S<)%Z?Kj>$A*T&TQYj-R|2jzWVx}k4zV4YDxO@5rFev_H nVdP?9X3${-5}ZKDz$DnyzexMo>o{(v2DxO@5rFev_H qVdP?9X3${-5}ZKDz$DVszes!AhB-~A8mpr#3eTS_;Rs@2um%9FtQyw< diff --git a/static/jquery-min.js b/static/jquery-min.js deleted file mode 100644 index 4c5be4c..0000000 --- a/static/jquery-min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v3.1.1 | (c) jQuery Foundation | jquery.org/license */ -!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):C.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/[^\x20\t\r\n\f]+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R), -a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,ka=/^$|\/(?:java|ecma)script/i,la={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};la.optgroup=la.option,la.tbody=la.tfoot=la.colgroup=la.caption=la.thead,la.th=la.td;function ma(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function na(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=ma(l.appendChild(f),"script"),j&&na(g),c){k=0;while(f=g[k++])ka.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var qa=d.documentElement,ra=/^key/,sa=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ta=/^([^.]*)(?:\.(.+)|)/;function ua(){return!0}function va(){return!1}function wa(){try{return d.activeElement}catch(a){}}function xa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)xa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=va;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(qa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,za=/\s*$/g;function Da(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Ea(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Fa(a){var b=Ba.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ga(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Aa.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ia(f,b,c,d)});if(m&&(e=pa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(ma(e,"script"),Ea),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=ma(h),f=ma(a),d=0,e=f.length;d0&&na(g,!i&&ma(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ja(this,a,!0)},remove:function(a){return Ja(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.appendChild(a)}})},prepend:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(ma(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!za.test(a)&&!la[(ja.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function Ya(a,b,c,d,e){return new Ya.prototype.init(a,b,c,d,e)}r.Tween=Ya,Ya.prototype={constructor:Ya,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Ya.propHooks[this.prop];return a&&a.get?a.get(this):Ya.propHooks._default.get(this)},run:function(a){var b,c=Ya.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ya.propHooks._default.set(this),this}},Ya.prototype.init.prototype=Ya.prototype,Ya.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Ya.propHooks.scrollTop=Ya.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Ya.prototype.init,r.fx.step={};var Za,$a,_a=/^(?:toggle|show|hide)$/,ab=/queueHooks$/;function bb(){$a&&(a.requestAnimationFrame(bb),r.fx.tick())}function cb(){return a.setTimeout(function(){Za=void 0}),Za=r.now()}function db(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ba[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function eb(a,b,c){for(var d,e=(hb.tweeners[b]||[]).concat(hb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?ib:void 0)), -void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),ib={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=jb[b]||r.find.attr;jb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=jb[g],jb[g]=e,e=null!=c(a,b,d)?g:null,jb[g]=f),e}});var kb=/^(?:input|select|textarea|button)$/i,lb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):kb.test(a.nodeName)||lb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function mb(a){var b=a.match(K)||[];return b.join(" ")}function nb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,nb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,nb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,nb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=nb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(nb(c))+" ").indexOf(b)>-1)return!0;return!1}});var ob=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ob,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:mb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ia.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,"$1"),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" - - - - - - -
-
- Flowers - - -
-
- - - - - - -
-
-
-
- -
-
- - - - - - - - - - - - - - - - - -
- - org2, login2 - - 2016-11-30
- RABO creditcard, - - 2001-03-17
- ABN AMRO creditcard, 5422 2300 0373 7907 - - 2001-03-17
- -
-
- -
-
-
- -
- - - - - -
- - - - - -
- - - - - - - - - - - - diff --git a/templates/common.html b/templates/common.html index f003e59..cae503e 100644 --- a/templates/common.html +++ b/templates/common.html @@ -13,7 +13,7 @@ Flowers -