lambda-cvs Mailing List for Lambda (Page 3)
Status: Pre-Alpha
Brought to you by:
ariejan
You can subscribe to this list here.
2004 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(7) |
Jul
(38) |
Aug
(5) |
Sep
|
Oct
|
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2005 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(11) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Ariejan de V. <ar...@us...> - 2004-07-07 10:38:02
|
Update of /cvsroot/lambda/lambda/includes In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2323/includes Modified Files: bootstrap.php Log Message: Added basic MySQL functions for PHP4/MySQL Index: bootstrap.php =================================================================== RCS file: /cvsroot/lambda/lambda/includes/bootstrap.php,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** bootstrap.php 21 Jun 2004 12:26:26 -0000 1.7 --- bootstrap.php 7 Jul 2004 10:37:50 -0000 1.8 *************** *** 46,67 **** require(LAMBDA_CLASS . "lambdaMySQLi.class.php"); - /* Parse the configuration options so they can be used with lambdaMySQLi */ - $mc = lambda_mysqli_parseConfig($config['mysql']); - /* Create instance of MySQLi Class */ ! $mysqli = @new lambdaMySQLi( $mc['hostname'], ! $mc['username'], ! $mc['password'], ! $mc['dbname'], ! $mc['port'], ! $mc['socket']); ! ! /* Verify MySQLi instance */ ! if(mysqli_connect_errno()) { ! /* Throw fatal error */ ! $handler->error(mysqli_connect_errno() . ": " . mysqli_connect_error(), true); ! } else { ! $handler->debug("Connected succesfully to MySQL", 2); ! } /* Include Component Handler */ --- 46,51 ---- require(LAMBDA_CLASS . "lambdaMySQLi.class.php"); /* Create instance of MySQLi Class */ ! $mysqli = @new lambdaMySQLi(); /* Include Component Handler */ |
From: Ariejan de V. <ar...@us...> - 2004-07-07 10:38:01
|
Update of /cvsroot/lambda/lambda/classes In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2323/classes Modified Files: lambdaMySQLi.class.php Log Message: Added basic MySQL functions for PHP4/MySQL Index: lambdaMySQLi.class.php =================================================================== RCS file: /cvsroot/lambda/lambda/classes/lambdaMySQLi.class.php,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** lambdaMySQLi.class.php 7 Jul 2004 10:13:16 -0000 1.5 --- lambdaMySQLi.class.php 7 Jul 2004 10:37:50 -0000 1.6 *************** *** 14,18 **** --- 14,121 ---- **/ class lambdaMySQLi { + /** + * @var array Configuration settings + **/ + var $config; + + /** + * @var object MySQL Database link + **/ + var $link; + + /** + * @var object Local reference to error handler + **/ + var $handler; + + /** + * @var int Number of performed queries + **/ + var $query_count; + + /** + * @var array Query history + **/ + var $query_history; + + /** + * Initialise the lambdaMySQLi class + **/ + function lambdaMySQLi() { + global $handler, $config; + + // Create local reference + $this->handler = $handler; + + // Copy configuration settings + $this->config = $config['mysql']; + + // Set default zero-values + $this->link = null; + $this->query_count = 0; + $this->query_history = array(); + } + /** + * Create a connection to the MySQL database + * + * @return bool true on successful connection, otherwise false + **/ + function connect() { + // Build the right hostname to use a non-default socket or port + $host = $this->config['hostname']; + + if(!empty($this->config['port'])) { + $host .= ":" . $this->config['port']; + } + elseif (!empty($this->config['socket'])) { + $host .= ":" . $this->config['socket']; + } + + // Try to establish a connection + // Assume the connection is successful. + $mylink = @mysql_connect($host, $this->config['username'], + $this->config['password'], true); + + // Select the proper database and check for errors + if(!@mysql_select_db($this->config['dbname'], $mylink)) { + $this->handler->error("Connection to MySQL failed", true); + return false; + } else { + $this->link = $mylink; + return true; + } + } + + /** + * Perform a query + * + * Perform a query and return the result or false + * + * @param string valid SQL query + * @return object MySQL Result or boolean + **/ + function query($sql) { + // Make sure we have a valid connection + if(!$this->link || !@$this->connect()) { + return false; + } + + // Increase query count + $this->query_count++; + + // Add to query history + $this->query_history[] = $sql; + + // Perform the query and return the result + $result = @mysql_query($sql, $this->link); + + if(!$result) { + $this->handler->warning("Error performing query"); + $this->handler->debug("Error performing query: $sql", 2); + } + + return $result; + } } \ No newline at end of file |
From: Ariejan de V. <ar...@us...> - 2004-07-07 10:13:33
|
Update of /cvsroot/lambda/lambda/classes In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30938 Modified Files: lambdaClient.class.php lambdaComponent.class.php lambdaError.class.php lambdaMySQLi.class.php lambdaObject.class.php lambdaTemplate.class.php Log Message: Adapted classes to PHP4 syntax Index: lambdaError.class.php =================================================================== RCS file: /cvsroot/lambda/lambda/classes/lambdaError.class.php,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** lambdaError.class.php 19 Jun 2004 10:25:22 -0000 1.3 --- lambdaError.class.php 7 Jul 2004 10:13:16 -0000 1.4 *************** *** 20,24 **** /* Constructor */ ! function __construct() { $this->setClassName("handler"); } --- 20,24 ---- /* Constructor */ ! function lambdaError() { $this->setClassName("handler"); } Index: lambdaObject.class.php =================================================================== RCS file: /cvsroot/lambda/lambda/classes/lambdaObject.class.php,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** lambdaObject.class.php 19 Jun 2004 10:25:22 -0000 1.3 --- lambdaObject.class.php 7 Jul 2004 10:13:16 -0000 1.4 *************** *** 13,22 **** * @package lambdaCore **/ ! abstract class lambdaObject { /** * @var string Descriptive name of this class **/ ! private $classname; /* --- 13,22 ---- * @package lambdaCore **/ ! class lambdaObject { /** * @var string Descriptive name of this class **/ ! var $classname; /* Index: lambdaComponent.class.php =================================================================== RCS file: /cvsroot/lambda/lambda/classes/lambdaComponent.class.php,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** lambdaComponent.class.php 21 Jun 2004 12:20:27 -0000 1.2 --- lambdaComponent.class.php 7 Jul 2004 10:13:16 -0000 1.3 *************** *** 13,52 **** * @package lambdaCore **/ ! abstract class lambdaComponent extends lambdaObject { /** * @var string Name of this component **/ ! protected $component_name; /** * @var string Version of this component **/ ! protected $component_version; /** * @var string Author of this component **/ ! protected $component_author; /** * @var string Copyright of this component **/ ! protected $component_copyright; /** * @var string URL or Email address of this component **/ ! protected $component_contact; /** * @var object Error handler reference **/ ! protected $handler; /** * @var object MySQLi reference **/ ! protected $mysqli; --- 13,52 ---- * @package lambdaCore **/ ! class lambdaComponent extends lambdaObject { /** * @var string Name of this component **/ ! var $component_name; /** * @var string Version of this component **/ ! var $component_version; /** * @var string Author of this component **/ ! var $component_author; /** * @var string Copyright of this component **/ ! var $component_copyright; /** * @var string URL or Email address of this component **/ ! var $component_contact; /** * @var object Error handler reference **/ ! var $handler; /** * @var object MySQLi reference **/ ! var $mysqli; *************** *** 57,61 **** * handler and the mysqli object. **/ ! function __construct() { global $handler, $mysqli; --- 57,61 ---- * handler and the mysqli object. **/ ! function lambdaComponent() { global $handler, $mysqli; Index: lambdaMySQLi.class.php =================================================================== RCS file: /cvsroot/lambda/lambda/classes/lambdaMySQLi.class.php,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** lambdaMySQLi.class.php 19 Jun 2004 10:25:22 -0000 1.4 --- lambdaMySQLi.class.php 7 Jul 2004 10:13:16 -0000 1.5 *************** *** 10,36 **** /** ! * Wrapper class for PHP5's mysqli class * @package lambdaCore **/ ! class lambdaMySQLi extends mysqli { ! } ! ! /* ! * Extra MySQLi functions ! */ ! ! /** ! * Parse the configuration array for use with mysqli ! * @param array Array with MySQLi configuration options ! * Replaced empty variables in config with null ! */ ! function lambda_mysqli_parseConfig($config) { ! while(list($key,$val) = each($config)) { ! if( empty($config[$key]) || !isset($config[$key])) { ! $config[$key] = null; ! } ! } ! return $config; ! } --- 10,18 ---- /** ! * Wrapper class for PHP's mysql functions * @package lambdaCore **/ ! class lambdaMySQLi { ! } \ No newline at end of file Index: lambdaClient.class.php =================================================================== RCS file: /cvsroot/lambda/lambda/classes/lambdaClient.class.php,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** lambdaClient.class.php 21 Jun 2004 12:24:58 -0000 1.4 --- lambdaClient.class.php 7 Jul 2004 10:13:16 -0000 1.5 *************** *** 18,37 **** * @var int Set to '0' for new or no client, otherwise set to a valid client ID **/ ! private $client_id; /** * @var array Associative array containing all data on this client. **/ ! private $data; /** * @var object Local reference to the error handler object **/ ! private $handler; /** * @var object Local reference to lambdaMySQLi **/ ! private $mysqli; /** --- 18,37 ---- * @var int Set to '0' for new or no client, otherwise set to a valid client ID **/ ! var $client_id; /** * @var array Associative array containing all data on this client. **/ ! var $data; /** * @var object Local reference to the error handler object **/ ! var $handler; /** * @var object Local reference to lambdaMySQLi **/ ! var $mysqli; /** *************** *** 45,49 **** * @param int Client ID or 0 for new client **/ ! function __construct($client_id = 0) { global $handler, $mysqli; --- 45,49 ---- * @param int Client ID or 0 for new client **/ ! function lambdaClient($client_id = 0) { global $handler, $mysqli; *************** *** 170,174 **** * @param object New valule for $name **/ ! function __set($name, $val) { /* Deny access for some properties */ $denied_properties = array('id', 'register_date'); --- 170,174 ---- * @param object New valule for $name **/ ! function set($name, $val) { /* Deny access for some properties */ $denied_properties = array('id', 'register_date'); *************** *** 198,202 **** * @return object Value of $data[$name] or null if that entry does not exist **/ ! function __get($name) { if(isset($this->data[$name])) { return $this->data[$name]; --- 198,202 ---- * @return object Value of $data[$name] or null if that entry does not exist **/ ! function get($name) { if(isset($this->data[$name])) { return $this->data[$name]; Index: lambdaTemplate.class.php =================================================================== RCS file: /cvsroot/lambda/lambda/classes/lambdaTemplate.class.php,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** lambdaTemplate.class.php 22 Jun 2004 21:20:55 -0000 1.5 --- lambdaTemplate.class.php 7 Jul 2004 10:13:16 -0000 1.6 *************** *** 19,43 **** * @var array Keys (tags) which will be replaced in this template, of the form {KEY} **/ ! private $keys; /** * @var array The strings that the keys will be replaced with **/ ! private $values; /** * @var string The (unprocessed) template data **/ ! private $templateData; /** * @var object Error handler reference **/ ! private $handler; /** * Sets the classname, sets up error handler **/ ! function __construct() { global $handler; $this->handler = $handler; --- 19,43 ---- * @var array Keys (tags) which will be replaced in this template, of the form {KEY} **/ ! var $keys; /** * @var array The strings that the keys will be replaced with **/ ! var $values; /** * @var string The (unprocessed) template data **/ ! var $templateData; /** * @var object Error handler reference **/ ! var $handler; /** * Sets the classname, sets up error handler **/ ! function lambdaTemplate() { global $handler; $this->handler = $handler; |
From: Ariejan de V. <ar...@us...> - 2004-07-07 10:08:24
|
Update of /cvsroot/lambda/lambda/includes In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29588 Modified Files: config.php-dist Log Message: Changed MySQL server from IP to hostname 'localhost' Index: config.php-dist =================================================================== RCS file: /cvsroot/lambda/lambda/includes/config.php-dist,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** config.php-dist 22 Jun 2004 12:53:52 -0000 1.4 --- config.php-dist 7 Jul 2004 10:08:08 -0000 1.5 *************** *** 25,29 **** /* Hostname or IP of your MySQL database */ ! $config['mysql']['hostname'] = '127.0.0.1'; /* Port of your MySQL database. Default is 3306. */ --- 25,29 ---- /* Hostname or IP of your MySQL database */ ! $config['mysql']['hostname'] = 'localhost'; /* Port of your MySQL database. Default is 3306. */ |
From: Ariejan de V. <ar...@us...> - 2004-06-22 21:21:03
|
Update of /cvsroot/lambda/lambda/classes In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3721 Modified Files: lambdaTemplate.class.php Log Message: - Changed methods addPair and delPair to 'assign' and 'unassign'. - Changed some formatting in my editor Index: lambdaTemplate.class.php =================================================================== RCS file: /cvsroot/lambda/lambda/classes/lambdaTemplate.class.php,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** lambdaTemplate.class.php 22 Jun 2004 12:56:44 -0000 1.4 --- lambdaTemplate.class.php 22 Jun 2004 21:20:55 -0000 1.5 *************** *** 4,7 **** --- 4,8 ---- * @package Lambda * @author Adam McMaster <ad...@la...> + * @author Ariejan de Vroom <ar...@la...> * @version $Id$ * @copyright Copyright (C) 2004 Project Lambda *************** *** 15,21 **** class lambdaTemplate extends lambdaObject { ! /** ! * @var array Keys (tags) which will be replaced in this template, of the form {KEY} ! **/ private $keys; --- 16,22 ---- class lambdaTemplate extends lambdaObject { ! /** ! * @var array Keys (tags) which will be replaced in this template, of the form {KEY} ! **/ private $keys; *************** *** 49,53 **** * @return bool TRUE if successful, FALSE if key already exists **/ ! function addPair($key,$value) { if(!in_array($key,$this->keys)) { array_push($this->keys,'/\{'.$key.'\}/'); /* Surround key with { and }, and the key*/ --- 50,54 ---- * @return bool TRUE if successful, FALSE if key already exists **/ ! function assign($key,$value) { if(!in_array($key,$this->keys)) { array_push($this->keys,'/\{'.$key.'\}/'); /* Surround key with { and }, and the key*/ *************** *** 66,70 **** * @return bool TRUE on success, FALSE if the key was not found **/ ! function delPair($key) { if($keyID = array_search($key,$this->keys)) { $this->keys[$keyID] = $this->values[$keyID] = NULL; --- 67,71 ---- * @return bool TRUE on success, FALSE if the key was not found **/ ! function unassign($key) { if($keyID = array_search($key,$this->keys)) { $this->keys[$keyID] = $this->values[$keyID] = NULL; |
From: Ariejan de V. <ar...@us...> - 2004-06-22 21:17:12
|
Update of /cvsroot/lambda/lambda/templates In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31489 Modified Files: head.tpl Log Message: Fixed line wrap Index: head.tpl =================================================================== RCS file: /cvsroot/lambda/lambda/templates/head.tpl,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** head.tpl 22 Jun 2004 12:52:24 -0000 1.1 --- head.tpl 22 Jun 2004 21:17:04 -0000 1.2 *************** *** 1,4 **** ! <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ! "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> --- 1,3 ---- ! <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> |
From: adam m. <ada...@us...> - 2004-06-22 12:56:52
|
Update of /cvsroot/lambda/lambda/classes In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11100/classes Modified Files: lambdaTemplate.class.php Log Message: Added lambdaTemplate class Index: lambdaTemplate.class.php =================================================================== RCS file: /cvsroot/lambda/lambda/classes/lambdaTemplate.class.php,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** lambdaTemplate.class.php 19 Jun 2004 10:25:22 -0000 1.3 --- lambdaTemplate.class.php 22 Jun 2004 12:56:44 -0000 1.4 *************** *** 3,7 **** /** * @package Lambda ! * @author Ariejan de Vroom <ar...@la...> * @version $Id$ * @copyright Copyright (C) 2004 Project Lambda --- 3,7 ---- /** * @package Lambda ! * @author Adam McMaster <ad...@la...> * @version $Id$ * @copyright Copyright (C) 2004 Project Lambda *************** *** 10,45 **** /** ! * Handles HTML output * @package lambdaCore **/ class lambdaTemplate extends lambdaObject { ! /** ! * Sets the classname ! **/ ! function __construct() { ! $this->setClassName("template"); ! } ! ! /** ! * Show HTML header ! **/ ! function showHeader() { ! print "<html>\n" ! ."<head>\n" ! ."<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\" />\n" ! ."<title>Project Lambda</title>\n" ! ."<link href=\"stylesheet.css\" rel=\"stylesheet\" type=\"text/css\" />\n" ! ."</head>\n" ! ."<body>\n"; ! } ! ! /** ! * Show HTML footer ! **/ ! function showFooter() { ! print "</body>" ! ."</html>"; ! } } --- 10,115 ---- /** ! * Handles data output * @package lambdaCore **/ class lambdaTemplate extends lambdaObject { ! /** ! * @var array Keys (tags) which will be replaced in this template, of the form {KEY} ! **/ ! private $keys; ! ! /** ! * @var array The strings that the keys will be replaced with ! **/ ! private $values; ! ! /** ! * @var string The (unprocessed) template data ! **/ ! private $templateData; ! ! /** ! * @var object Error handler reference ! **/ ! private $handler; ! ! /** ! * Sets the classname, sets up error handler ! **/ ! function __construct() { ! global $handler; ! $this->handler = $handler; ! $this->setClassName('template'); ! } + /** + * Adds a new template key/value pair + * + * @return bool TRUE if successful, FALSE if key already exists + **/ + function addPair($key,$value) { + if(!in_array($key,$this->keys)) { + array_push($this->keys,'/\{'.$key.'\}/'); /* Surround key with { and }, and the key*/ + /* must be in the form of a regex, /{$key}/ */ + array_push($this->values,$value); + return TRUE; + }else{ + $this->handler->warning('Key value "'.$key.'" already exists in this template, not adding again'); + return FALSE; + } + } + + /** + * Removes a key/value pair + * + * @return bool TRUE on success, FALSE if the key was not found + **/ + function delPair($key) { + if($keyID = array_search($key,$this->keys)) { + $this->keys[$keyID] = $this->values[$keyID] = NULL; + return TRUE; + }else{ + $this->handler->warning('Key "'.$key.'" not found in this template'); + return FALSE; + } + } + + /** + * Appends raw template data to $templateData from a template file + * + * This will first attempt to open $file for reading, if that fails + * an error will be displayed and the script will stop. Next the + * contents of the file are read, and again if that fails the script + * will stop after an error is displayed. + * + * For example, you could add head.tpl followed by body.tpl then + * foot.tpl; you can pick which template parts you need for a particular page. + * + * @return bool TRUE on success, FALSE on failure + **/ + function addFile($file) { + if($fp = fopen(LAMBDA_TEMPLATE . $file,r)) { + if($data = fread($fp,filesize(LAMBDA_TEMPLATE . $file))) { + $this->templateData .= $data; /* Append data to $templateData */ + fclose($fp); + return TRUE; + }else{ + fclose($fp); + $this->handler->error('Unable to read template data',TRUE); + return FALSE; /* In practice the script is killed before this, but */ + /* still return for completeness */ + } + }else{ + $this->handler->error('Unable to open template for reading',TRUE); + return FALSE; + } + } + + /** + * Prints template with data inserted into it + **/ + function output() { + print preg_replace($keys,$values,$templateData); + } } |
From: adam m. <ada...@us...> - 2004-06-22 12:54:00
|
Update of /cvsroot/lambda/lambda/includes In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8769/includes Modified Files: config.php-dist Log Message: Added lambdaTemplate class Index: config.php-dist =================================================================== RCS file: /cvsroot/lambda/lambda/includes/config.php-dist,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** config.php-dist 19 Jun 2004 10:25:22 -0000 1.3 --- config.php-dist 22 Jun 2004 12:53:52 -0000 1.4 *************** *** 57,60 **** --- 57,62 ---- define('LAMBDA_INCLUDE', LAMBDA_PATH . "includes/"); + /* Path to the templates directory */ + define('LAMBDA_TEMPLATE', LAMBDA_PATH . "templates/"); /** |
From: adam m. <ada...@us...> - 2004-06-22 12:52:32
|
Update of /cvsroot/lambda/lambda/templates In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6803 Added Files: foot.tpl head.tpl Log Message: Added new template files --- NEW FILE: head.tpl --- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>{TITLE}</title> <link rel="stylesheet" type="text/css" href="/style/main.css" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> --- NEW FILE: foot.tpl --- </body> </html> |
From: adam m. <ada...@us...> - 2004-06-22 12:47:31
|
Update of /cvsroot/lambda/lambda/templates In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3725/templates Log Message: Directory /cvsroot/lambda/lambda/templates added to the repository |
From: Ariejan de V. <ar...@us...> - 2004-06-22 07:32:23
|
Update of /cvsroot/lambda/lambda In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10039 Added Files: README Log Message: Added very basic README --- NEW FILE: README --- Project Lambda http://lambdahq.net 1. Introduction Project Lambda is an Open Source server management system. It allows you to host linux services (www,ftp,ssh,mysql,cvs,etc..) on multiple servers for multiple clients. 2. Installation For installation instructions you should refer to the Administration Manual. It can be found at http://lambdahq.net/admindoc 3. Support If you require support, please refer to our website and check there what your options are. http://lambdahq.net 4. Bug reports In case you found a bug, pleae report it at our SourceForge.net Bug tracker. http://sourceforge.net/tracker/?group_id=95841&atid=612796 |