Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 88

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 215

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 216

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 217

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 218

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 219

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 220
PK! TÍe 6 6libraries/Typography.phpnu„[µü¤ tags * * @var string */ public $block_elements = 'address|blockquote|div|dl|fieldset|form|h\d|hr|noscript|object|ol|p|pre|script|table|ul'; /** * Elements that should not have

and
tags within them. * * @var string */ public $skip_elements = 'p|pre|ol|ul|dl|object|table|h\d'; /** * Tags we want the parser to completely ignore when splitting the string. * * @var string */ public $inline_elements = 'a|abbr|acronym|b|bdo|big|br|button|cite|code|del|dfn|em|i|img|ins|input|label|map|kbd|q|samp|select|small|span|strong|sub|sup|textarea|tt|var'; /** * array of block level elements that require inner content to be within another block level element * * @var array */ public $inner_block_required = array('blockquote'); /** * the last block element parsed * * @var string */ public $last_block_element = ''; /** * whether or not to protect quotes within { curly braces } * * @var bool */ public $protect_braced_quotes = FALSE; /** * Auto Typography * * This function converts text, making it typographically correct: * - Converts double spaces into paragraphs. * - Converts single line breaks into
tags * - Converts single and double quotes into correctly facing curly quote entities. * - Converts three dots into ellipsis. * - Converts double dashes into em-dashes. * - Converts two spaces into entities * * @param string * @param bool whether to reduce more then two consecutive newlines to two * @return string */ public function auto_typography($str, $reduce_linebreaks = FALSE) { if ($str === '') { return ''; } // Standardize Newlines to make matching easier if (strpos($str, "\r") !== FALSE) { $str = str_replace(array("\r\n", "\r"), "\n", $str); } // Reduce line breaks. If there are more than two consecutive linebreaks // we'll compress them down to a maximum of two since there's no benefit to more. if ($reduce_linebreaks === TRUE) { $str = preg_replace("/\n\n+/", "\n\n", $str); } // HTML comment tags don't conform to patterns of normal tags, so pull them out separately, only if needed $html_comments = array(); if (strpos($str, '\n"; } return $r; } // -------------------------------------------------------------------- /** * Executes the Method * * @param object * @return mixed */ protected function _execute($m) { $methName = $m->method_name; // Check to see if it is a system call $system_call = (strpos($methName, 'system') === 0); if ($this->xss_clean === FALSE) { $m->xss_clean = FALSE; } //------------------------------------- // Valid Method //------------------------------------- if ( ! isset($this->methods[$methName]['function'])) { return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']); } //------------------------------------- // Check for Method (and Object) //------------------------------------- $method_parts = explode('.', $this->methods[$methName]['function']); $objectCall = ! empty($method_parts[1]); if ($system_call === TRUE) { if ( ! is_callable(array($this, $method_parts[1]))) { return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']); } } elseif (($objectCall && ! is_callable(array($method_parts[0], $method_parts[1]))) OR ( ! $objectCall && ! is_callable($this->methods[$methName]['function'])) ) { return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']); } //------------------------------------- // Checking Methods Signature //------------------------------------- if (isset($this->methods[$methName]['signature'])) { $sig = $this->methods[$methName]['signature']; for ($i = 0, $c = count($sig); $i < $c; $i++) { $current_sig = $sig[$i]; if (count($current_sig) === count($m->params)+1) { for ($n = 0, $mc = count($m->params); $n < $mc; $n++) { $p = $m->params[$n]; $pt = ($p->kindOf() === 'scalar') ? $p->scalarval() : $p->kindOf(); if ($pt !== $current_sig[$n+1]) { $pno = $n+1; $wanted = $current_sig[$n+1]; return new XML_RPC_Response(0, $this->xmlrpcerr['incorrect_params'], $this->xmlrpcstr['incorrect_params'] . ': Wanted '.$wanted.', got '.$pt.' at param '.$pno.')'); } } } } } //------------------------------------- // Calls the Function //------------------------------------- if ($objectCall === TRUE) { if ($method_parts[0] === 'this' && $system_call === TRUE) { return call_user_func(array($this, $method_parts[1]), $m); } elseif ($this->object === FALSE) { return get_instance()->{$method_parts[1]}($m); } return $this->object->{$method_parts[1]}($m); } return call_user_func($this->methods[$methName]['function'], $m); } // -------------------------------------------------------------------- /** * Server Function: List Methods * * @param mixed * @return object */ public function listMethods($m) { $v = new XML_RPC_Values(); $output = array(); foreach ($this->methods as $key => $value) { $output[] = new XML_RPC_Values($key, 'string'); } foreach ($this->system_methods as $key => $value) { $output[] = new XML_RPC_Values($key, 'string'); } $v->addArray($output); return new XML_RPC_Response($v); } // -------------------------------------------------------------------- /** * Server Function: Return Signature for Method * * @param mixed * @return object */ public function methodSignature($m) { $parameters = $m->output_parameters(); $method_name = $parameters[0]; if (isset($this->methods[$method_name])) { if ($this->methods[$method_name]['signature']) { $sigs = array(); $signature = $this->methods[$method_name]['signature']; for ($i = 0, $c = count($signature); $i < $c; $i++) { $cursig = array(); $inSig = $signature[$i]; for ($j = 0, $jc = count($inSig); $j < $jc; $j++) { $cursig[]= new XML_RPC_Values($inSig[$j], 'string'); } $sigs[] = new XML_RPC_Values($cursig, 'array'); } return new XML_RPC_Response(new XML_RPC_Values($sigs, 'array')); } return new XML_RPC_Response(new XML_RPC_Values('undef', 'string')); } return new XML_RPC_Response(0, $this->xmlrpcerr['introspect_unknown'], $this->xmlrpcstr['introspect_unknown']); } // -------------------------------------------------------------------- /** * Server Function: Doc String for Method * * @param mixed * @return object */ public function methodHelp($m) { $parameters = $m->output_parameters(); $method_name = $parameters[0]; if (isset($this->methods[$method_name])) { $docstring = isset($this->methods[$method_name]['docstring']) ? $this->methods[$method_name]['docstring'] : ''; return new XML_RPC_Response(new XML_RPC_Values($docstring, 'string')); } return new XML_RPC_Response(0, $this->xmlrpcerr['introspect_unknown'], $this->xmlrpcstr['introspect_unknown']); } // -------------------------------------------------------------------- /** * Server Function: Multi-call * * @param mixed * @return object */ public function multicall($m) { // Disabled return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']); $parameters = $m->output_parameters(); $calls = $parameters[0]; $result = array(); foreach ($calls as $value) { $m = new XML_RPC_Message($value[0]); $plist = ''; for ($i = 0, $c = count($value[1]); $i < $c; $i++) { $m->addParam(new XML_RPC_Values($value[1][$i], 'string')); } $attempt = $this->_execute($m); if ($attempt->faultCode() !== 0) { return $attempt; } $result[] = new XML_RPC_Values(array($attempt->value()), 'array'); } return new XML_RPC_Response(new XML_RPC_Values($result, 'array')); } // -------------------------------------------------------------------- /** * Multi-call Function: Error Handling * * @param mixed * @return object */ public function multicall_error($err) { $str = is_string($err) ? $this->xmlrpcstr["multicall_${err}"] : $err->faultString(); $code = is_string($err) ? $this->xmlrpcerr["multicall_${err}"] : $err->faultCode(); $struct['faultCode'] = new XML_RPC_Values($code, 'int'); $struct['faultString'] = new XML_RPC_Values($str, 'string'); return new XML_RPC_Values($struct, 'struct'); } // -------------------------------------------------------------------- /** * Multi-call Function: Processes method * * @param mixed * @return object */ public function do_multicall($call) { if ($call->kindOf() !== 'struct') { return $this->multicall_error('notstruct'); } elseif ( ! $methName = $call->me['struct']['methodName']) { return $this->multicall_error('nomethod'); } list($scalar_value, $scalar_type) = array(reset($methName->me), key($methName->me)); $scalar_type = $scalar_type === $this->xmlrpcI4 ? $this->xmlrpcInt : $scalar_type; if ($methName->kindOf() !== 'scalar' OR $scalar_type !== 'string') { return $this->multicall_error('notstring'); } elseif ($scalar_value === 'system.multicall') { return $this->multicall_error('recursion'); } elseif ( ! $params = $call->me['struct']['params']) { return $this->multicall_error('noparams'); } elseif ($params->kindOf() !== 'array') { return $this->multicall_error('notarray'); } list($b, $a) = array(reset($params->me), key($params->me)); $msg = new XML_RPC_Message($scalar_value); for ($i = 0, $numParams = count($b); $i < $numParams; $i++) { $msg->params[] = $params->me['array'][$i]; } $result = $this->_execute($msg); if ($result->faultCode() !== 0) { return $this->multicall_error($result); } return new XML_RPC_Values(array($result->value()), 'array'); } } PK!½·”ÏÓÓlibraries/Parser.phpnu„[µü¤CI =& get_instance(); log_message('info', 'Parser Class Initialized'); } // -------------------------------------------------------------------- /** * Parse a template * * Parses pseudo-variables contained in the specified template view, * replacing them with the data in the second param * * @param string * @param array * @param bool * @return string */ public function parse($template, $data, $return = FALSE) { $template = $this->CI->load->view($template, $data, TRUE); return $this->_parse($template, $data, $return); } // -------------------------------------------------------------------- /** * Parse a String * * Parses pseudo-variables contained in the specified string, * replacing them with the data in the second param * * @param string * @param array * @param bool * @return string */ public function parse_string($template, $data, $return = FALSE) { return $this->_parse($template, $data, $return); } // -------------------------------------------------------------------- /** * Parse a template * * Parses pseudo-variables contained in the specified template, * replacing them with the data in the second param * * @param string * @param array * @param bool * @return string */ protected function _parse($template, $data, $return = FALSE) { if ($template === '') { return FALSE; } $replace = array(); foreach ($data as $key => $val) { $replace = array_merge( $replace, is_array($val) ? $this->_parse_pair($key, $val, $template) : $this->_parse_single($key, (string) $val, $template) ); } unset($data); $template = strtr($template, $replace); if ($return === FALSE) { $this->CI->output->append_output($template); } return $template; } // -------------------------------------------------------------------- /** * Set the left/right variable delimiters * * @param string * @param string * @return void */ public function set_delimiters($l = '{', $r = '}') { $this->l_delim = $l; $this->r_delim = $r; } // -------------------------------------------------------------------- /** * Parse a single key/value * * @param string * @param string * @param string * @return string */ protected function _parse_single($key, $val, $string) { return array($this->l_delim.$key.$this->r_delim => (string) $val); } // -------------------------------------------------------------------- /** * Parse a tag pair * * Parses tag pairs: {some_tag} string... {/some_tag} * * @param string * @param array * @param string * @return string */ protected function _parse_pair($variable, $data, $string) { $replace = array(); preg_match_all( '#'.preg_quote($this->l_delim.$variable.$this->r_delim).'(.+?)'.preg_quote($this->l_delim.'/'.$variable.$this->r_delim).'#s', $string, $matches, PREG_SET_ORDER ); foreach ($matches as $match) { $str = ''; foreach ($data as $row) { $temp = array(); foreach ($row as $key => $val) { if (is_array($val)) { $pair = $this->_parse_pair($key, $val, $match[1]); if ( ! empty($pair)) { $temp = array_merge($temp, $pair); } continue; } $temp[$this->l_delim.$key.$this->r_delim] = $val; } $str .= strtr($match[1], $temp); } $replace[$match[0]] = $str; } return $replace; } } PK!ë4r]L L libraries/Driver.phpnu„[µü¤load_driver($child); } /** * Load driver * * Separate load_driver call to support explicit driver load by library or user * * @param string Driver name (w/o parent prefix) * @return object Child class */ public function load_driver($child) { // Get CodeIgniter instance and subclass prefix $prefix = config_item('subclass_prefix'); if ( ! isset($this->lib_name)) { // Get library name without any prefix $this->lib_name = str_replace(array('CI_', $prefix), '', get_class($this)); } // The child will be prefixed with the parent lib $child_name = $this->lib_name.'_'.$child; // See if requested child is a valid driver if ( ! in_array($child, $this->valid_drivers)) { // The requested driver isn't valid! $msg = 'Invalid driver requested: '.$child_name; log_message('error', $msg); show_error($msg); } // Get package paths and filename case variations to search $CI = get_instance(); $paths = $CI->load->get_package_paths(TRUE); // Is there an extension? $class_name = $prefix.$child_name; $found = class_exists($class_name, FALSE); if ( ! $found) { // Check for subclass file foreach ($paths as $path) { // Does the file exist? $file = $path.'libraries/'.$this->lib_name.'/drivers/'.$prefix.$child_name.'.php'; if (file_exists($file)) { // Yes - require base class from BASEPATH $basepath = BASEPATH.'libraries/'.$this->lib_name.'/drivers/'.$child_name.'.php'; if ( ! file_exists($basepath)) { $msg = 'Unable to load the requested class: CI_'.$child_name; log_message('error', $msg); show_error($msg); } // Include both sources and mark found include_once($basepath); include_once($file); $found = TRUE; break; } } } // Do we need to search for the class? if ( ! $found) { // Use standard class name $class_name = 'CI_'.$child_name; if ( ! class_exists($class_name, FALSE)) { // Check package paths foreach ($paths as $path) { // Does the file exist? $file = $path.'libraries/'.$this->lib_name.'/drivers/'.$child_name.'.php'; if (file_exists($file)) { // Include source include_once($file); break; } } } } // Did we finally find the class? if ( ! class_exists($class_name, FALSE)) { if (class_exists($child_name, FALSE)) { $class_name = $child_name; } else { $msg = 'Unable to load the requested driver: '.$class_name; log_message('error', $msg); show_error($msg); } } // Instantiate, decorate and add child $obj = new $class_name(); $obj->decorate($this); $this->$child = $obj; return $this->$child; } } // -------------------------------------------------------------------------- /** * CodeIgniter Driver Class * * This class enables you to create drivers for a Library based on the Driver Library. * It handles the drivers' access to the parent library * * @package CodeIgniter * @subpackage Libraries * @category Libraries * @author EllisLab Dev Team * @link */ class CI_Driver { /** * Instance of the parent class * * @var object */ protected $_parent; /** * List of methods in the parent class * * @var array */ protected $_methods = array(); /** * List of properties in the parent class * * @var array */ protected $_properties = array(); /** * Array of methods and properties for the parent class(es) * * @static * @var array */ protected static $_reflections = array(); /** * Decorate * * Decorates the child with the parent driver lib's methods and properties * * @param object * @return void */ public function decorate($parent) { $this->_parent = $parent; // Lock down attributes to what is defined in the class // and speed up references in magic methods $class_name = get_class($parent); if ( ! isset(self::$_reflections[$class_name])) { $r = new ReflectionObject($parent); foreach ($r->getMethods() as $method) { if ($method->isPublic()) { $this->_methods[] = $method->getName(); } } foreach ($r->getProperties() as $prop) { if ($prop->isPublic()) { $this->_properties[] = $prop->getName(); } } self::$_reflections[$class_name] = array($this->_methods, $this->_properties); } else { list($this->_methods, $this->_properties) = self::$_reflections[$class_name]; } } // -------------------------------------------------------------------- /** * __call magic method * * Handles access to the parent driver library's methods * * @param string * @param array * @return mixed */ public function __call($method, $args = array()) { if (in_array($method, $this->_methods)) { return call_user_func_array(array($this->_parent, $method), $args); } throw new BadMethodCallException('No such method: '.$method.'()'); } // -------------------------------------------------------------------- /** * __get magic method * * Handles reading of the parent driver library's properties * * @param string * @return mixed */ public function __get($var) { if (in_array($var, $this->_properties)) { return $this->_parent->$var; } } // -------------------------------------------------------------------- /** * __set magic method * * Handles writing to the parent driver library's properties * * @param string * @param array * @return mixed */ public function __set($var, $val) { if (in_array($var, $this->_properties)) { $this->_parent->$var = $val; } } } PK!iüyYÎ[Î[libraries/Encryption.phpnu„[µü¤ array( 'cbc' => 'cbc', 'ecb' => 'ecb', 'ofb' => 'nofb', 'ofb8' => 'ofb', 'cfb' => 'ncfb', 'cfb8' => 'cfb', 'ctr' => 'ctr', 'stream' => 'stream' ), 'openssl' => array( 'cbc' => 'cbc', 'ecb' => 'ecb', 'ofb' => 'ofb', 'cfb' => 'cfb', 'cfb8' => 'cfb8', 'ctr' => 'ctr', 'stream' => '', 'xts' => 'xts' ) ); /** * List of supported HMAC algorithms * * name => digest size pairs * * @var array */ protected $_digests = array( 'sha224' => 28, 'sha256' => 32, 'sha384' => 48, 'sha512' => 64 ); /** * mbstring.func_overload flag * * @var bool */ protected static $func_overload; // -------------------------------------------------------------------- /** * Class constructor * * @param array $params Configuration parameters * @return void */ public function __construct(array $params = array()) { $this->_drivers = array( 'mcrypt' => defined('MCRYPT_DEV_URANDOM'), 'openssl' => extension_loaded('openssl') ); if ( ! $this->_drivers['mcrypt'] && ! $this->_drivers['openssl']) { show_error('Encryption: Unable to find an available encryption driver.'); } isset(self::$func_overload) OR self::$func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload')); $this->initialize($params); if ( ! isset($this->_key) && self::strlen($key = config_item('encryption_key')) > 0) { $this->_key = $key; } log_message('info', 'Encryption Class Initialized'); } // -------------------------------------------------------------------- /** * Initialize * * @param array $params Configuration parameters * @return CI_Encryption */ public function initialize(array $params) { if ( ! empty($params['driver'])) { if (isset($this->_drivers[$params['driver']])) { if ($this->_drivers[$params['driver']]) { $this->_driver = $params['driver']; } else { log_message('error', "Encryption: Driver '".$params['driver']."' is not available."); } } else { log_message('error', "Encryption: Unknown driver '".$params['driver']."' cannot be configured."); } } if (empty($this->_driver)) { $this->_driver = ($this->_drivers['openssl'] === TRUE) ? 'openssl' : 'mcrypt'; log_message('debug', "Encryption: Auto-configured driver '".$this->_driver."'."); } empty($params['cipher']) && $params['cipher'] = $this->_cipher; empty($params['key']) OR $this->_key = $params['key']; $this->{'_'.$this->_driver.'_initialize'}($params); return $this; } // -------------------------------------------------------------------- /** * Initialize MCrypt * * @param array $params Configuration parameters * @return void */ protected function _mcrypt_initialize($params) { if ( ! empty($params['cipher'])) { $params['cipher'] = strtolower($params['cipher']); $this->_cipher_alias($params['cipher']); if ( ! in_array($params['cipher'], mcrypt_list_algorithms(), TRUE)) { log_message('error', 'Encryption: MCrypt cipher '.strtoupper($params['cipher']).' is not available.'); } else { $this->_cipher = $params['cipher']; } } if ( ! empty($params['mode'])) { $params['mode'] = strtolower($params['mode']); if ( ! isset($this->_modes['mcrypt'][$params['mode']])) { log_message('error', 'Encryption: MCrypt mode '.strtoupper($params['mode']).' is not available.'); } else { $this->_mode = $this->_modes['mcrypt'][$params['mode']]; } } if (isset($this->_cipher, $this->_mode)) { if (is_resource($this->_handle) && (strtolower(mcrypt_enc_get_algorithms_name($this->_handle)) !== $this->_cipher OR strtolower(mcrypt_enc_get_modes_name($this->_handle)) !== $this->_mode) ) { mcrypt_module_close($this->_handle); } if ($this->_handle = mcrypt_module_open($this->_cipher, '', $this->_mode, '')) { log_message('info', 'Encryption: MCrypt cipher '.strtoupper($this->_cipher).' initialized in '.strtoupper($this->_mode).' mode.'); } else { log_message('error', 'Encryption: Unable to initialize MCrypt with cipher '.strtoupper($this->_cipher).' in '.strtoupper($this->_mode).' mode.'); } } } // -------------------------------------------------------------------- /** * Initialize OpenSSL * * @param array $params Configuration parameters * @return void */ protected function _openssl_initialize($params) { if ( ! empty($params['cipher'])) { $params['cipher'] = strtolower($params['cipher']); $this->_cipher_alias($params['cipher']); $this->_cipher = $params['cipher']; } if ( ! empty($params['mode'])) { $params['mode'] = strtolower($params['mode']); if ( ! isset($this->_modes['openssl'][$params['mode']])) { log_message('error', 'Encryption: OpenSSL mode '.strtoupper($params['mode']).' is not available.'); } else { $this->_mode = $this->_modes['openssl'][$params['mode']]; } } if (isset($this->_cipher, $this->_mode)) { // This is mostly for the stream mode, which doesn't get suffixed in OpenSSL $handle = empty($this->_mode) ? $this->_cipher : $this->_cipher.'-'.$this->_mode; if ( ! in_array($handle, openssl_get_cipher_methods(), TRUE)) { $this->_handle = NULL; log_message('error', 'Encryption: Unable to initialize OpenSSL with method '.strtoupper($handle).'.'); } else { $this->_handle = $handle; log_message('info', 'Encryption: OpenSSL initialized with method '.strtoupper($handle).'.'); } } } // -------------------------------------------------------------------- /** * Create a random key * * @param int $length Output length * @return string */ public function create_key($length) { if (function_exists('random_bytes')) { try { return random_bytes((int) $length); } catch (Exception $e) { log_message('error', $e->getMessage()); return FALSE; } } elseif (defined('MCRYPT_DEV_URANDOM')) { return mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); } $is_secure = NULL; $key = openssl_random_pseudo_bytes($length, $is_secure); return ($is_secure === TRUE) ? $key : FALSE; } // -------------------------------------------------------------------- /** * Encrypt * * @param string $data Input data * @param array $params Input parameters * @return string */ public function encrypt($data, array $params = NULL) { if (($params = $this->_get_params($params)) === FALSE) { return FALSE; } isset($params['key']) OR $params['key'] = $this->hkdf($this->_key, 'sha512', NULL, self::strlen($this->_key), 'encryption'); if (($data = $this->{'_'.$this->_driver.'_encrypt'}($data, $params)) === FALSE) { return FALSE; } $params['base64'] && $data = base64_encode($data); if (isset($params['hmac_digest'])) { isset($params['hmac_key']) OR $params['hmac_key'] = $this->hkdf($this->_key, 'sha512', NULL, NULL, 'authentication'); return hash_hmac($params['hmac_digest'], $data, $params['hmac_key'], ! $params['base64']).$data; } return $data; } // -------------------------------------------------------------------- /** * Encrypt via MCrypt * * @param string $data Input data * @param array $params Input parameters * @return string */ protected function _mcrypt_encrypt($data, $params) { if ( ! is_resource($params['handle'])) { return FALSE; } // The greater-than-1 comparison is mostly a work-around for a bug, // where 1 is returned for ARCFour instead of 0. $iv = (($iv_size = mcrypt_enc_get_iv_size($params['handle'])) > 1) ? $this->create_key($iv_size) : NULL; if (mcrypt_generic_init($params['handle'], $params['key'], $iv) < 0) { if ($params['handle'] !== $this->_handle) { mcrypt_module_close($params['handle']); } return FALSE; } // Use PKCS#7 padding in order to ensure compatibility with OpenSSL // and other implementations outside of PHP. if (in_array(strtolower(mcrypt_enc_get_modes_name($params['handle'])), array('cbc', 'ecb'), TRUE)) { $block_size = mcrypt_enc_get_block_size($params['handle']); $pad = $block_size - (self::strlen($data) % $block_size); $data .= str_repeat(chr($pad), $pad); } // Work-around for yet another strange behavior in MCrypt. // // When encrypting in ECB mode, the IV is ignored. Yet // mcrypt_enc_get_iv_size() returns a value larger than 0 // even if ECB is used AND mcrypt_generic_init() complains // if you don't pass an IV with length equal to the said // return value. // // This probably would've been fine (even though still wasteful), // but OpenSSL isn't that dumb and we need to make the process // portable, so ... $data = (mcrypt_enc_get_modes_name($params['handle']) !== 'ECB') ? $iv.mcrypt_generic($params['handle'], $data) : mcrypt_generic($params['handle'], $data); mcrypt_generic_deinit($params['handle']); if ($params['handle'] !== $this->_handle) { mcrypt_module_close($params['handle']); } return $data; } // -------------------------------------------------------------------- /** * Encrypt via OpenSSL * * @param string $data Input data * @param array $params Input parameters * @return string */ protected function _openssl_encrypt($data, $params) { if (empty($params['handle'])) { return FALSE; } $iv = ($iv_size = openssl_cipher_iv_length($params['handle'])) ? $this->create_key($iv_size) : NULL; $data = openssl_encrypt( $data, $params['handle'], $params['key'], 1, // DO NOT TOUCH! $iv ); if ($data === FALSE) { return FALSE; } return $iv.$data; } // -------------------------------------------------------------------- /** * Decrypt * * @param string $data Encrypted data * @param array $params Input parameters * @return string */ public function decrypt($data, array $params = NULL) { if (($params = $this->_get_params($params)) === FALSE) { return FALSE; } if (isset($params['hmac_digest'])) { // This might look illogical, but it is done during encryption as well ... // The 'base64' value is effectively an inverted "raw data" parameter $digest_size = ($params['base64']) ? $this->_digests[$params['hmac_digest']] * 2 : $this->_digests[$params['hmac_digest']]; if (self::strlen($data) <= $digest_size) { return FALSE; } $hmac_input = self::substr($data, 0, $digest_size); $data = self::substr($data, $digest_size); isset($params['hmac_key']) OR $params['hmac_key'] = $this->hkdf($this->_key, 'sha512', NULL, NULL, 'authentication'); $hmac_check = hash_hmac($params['hmac_digest'], $data, $params['hmac_key'], ! $params['base64']); // Time-attack-safe comparison $diff = 0; for ($i = 0; $i < $digest_size; $i++) { $diff |= ord($hmac_input[$i]) ^ ord($hmac_check[$i]); } if ($diff !== 0) { return FALSE; } } if ($params['base64']) { $data = base64_decode($data); } isset($params['key']) OR $params['key'] = $this->hkdf($this->_key, 'sha512', NULL, self::strlen($this->_key), 'encryption'); return $this->{'_'.$this->_driver.'_decrypt'}($data, $params); } // -------------------------------------------------------------------- /** * Decrypt via MCrypt * * @param string $data Encrypted data * @param array $params Input parameters * @return string */ protected function _mcrypt_decrypt($data, $params) { if ( ! is_resource($params['handle'])) { return FALSE; } // The greater-than-1 comparison is mostly a work-around for a bug, // where 1 is returned for ARCFour instead of 0. if (($iv_size = mcrypt_enc_get_iv_size($params['handle'])) > 1) { if (mcrypt_enc_get_modes_name($params['handle']) !== 'ECB') { $iv = self::substr($data, 0, $iv_size); $data = self::substr($data, $iv_size); } else { // MCrypt is dumb and this is ignored, only size matters $iv = str_repeat("\x0", $iv_size); } } else { $iv = NULL; } if (mcrypt_generic_init($params['handle'], $params['key'], $iv) < 0) { if ($params['handle'] !== $this->_handle) { mcrypt_module_close($params['handle']); } return FALSE; } $data = mdecrypt_generic($params['handle'], $data); // Remove PKCS#7 padding, if necessary if (in_array(strtolower(mcrypt_enc_get_modes_name($params['handle'])), array('cbc', 'ecb'), TRUE)) { $data = self::substr($data, 0, -ord($data[self::strlen($data)-1])); } mcrypt_generic_deinit($params['handle']); if ($params['handle'] !== $this->_handle) { mcrypt_module_close($params['handle']); } return $data; } // -------------------------------------------------------------------- /** * Decrypt via OpenSSL * * @param string $data Encrypted data * @param array $params Input parameters * @return string */ protected function _openssl_decrypt($data, $params) { if ($iv_size = openssl_cipher_iv_length($params['handle'])) { $iv = self::substr($data, 0, $iv_size); $data = self::substr($data, $iv_size); } else { $iv = NULL; } return empty($params['handle']) ? FALSE : openssl_decrypt( $data, $params['handle'], $params['key'], 1, // DO NOT TOUCH! $iv ); } // -------------------------------------------------------------------- /** * Get params * * @param array $params Input parameters * @return array */ protected function _get_params($params) { if (empty($params)) { return isset($this->_cipher, $this->_mode, $this->_key, $this->_handle) ? array( 'handle' => $this->_handle, 'cipher' => $this->_cipher, 'mode' => $this->_mode, 'key' => NULL, 'base64' => TRUE, 'hmac_digest' => 'sha512', 'hmac_key' => NULL ) : FALSE; } elseif ( ! isset($params['cipher'], $params['mode'], $params['key'])) { return FALSE; } if (isset($params['mode'])) { $params['mode'] = strtolower($params['mode']); if ( ! isset($this->_modes[$this->_driver][$params['mode']])) { return FALSE; } $params['mode'] = $this->_modes[$this->_driver][$params['mode']]; } if (isset($params['hmac']) && $params['hmac'] === FALSE) { $params['hmac_digest'] = $params['hmac_key'] = NULL; } else { if ( ! isset($params['hmac_key'])) { return FALSE; } elseif (isset($params['hmac_digest'])) { $params['hmac_digest'] = strtolower($params['hmac_digest']); if ( ! isset($this->_digests[$params['hmac_digest']])) { return FALSE; } } else { $params['hmac_digest'] = 'sha512'; } } $params = array( 'handle' => NULL, 'cipher' => $params['cipher'], 'mode' => $params['mode'], 'key' => $params['key'], 'base64' => isset($params['raw_data']) ? ! $params['raw_data'] : FALSE, 'hmac_digest' => $params['hmac_digest'], 'hmac_key' => $params['hmac_key'] ); $this->_cipher_alias($params['cipher']); $params['handle'] = ($params['cipher'] !== $this->_cipher OR $params['mode'] !== $this->_mode) ? $this->{'_'.$this->_driver.'_get_handle'}($params['cipher'], $params['mode']) : $this->_handle; return $params; } // -------------------------------------------------------------------- /** * Get MCrypt handle * * @param string $cipher Cipher name * @param string $mode Encryption mode * @return resource */ protected function _mcrypt_get_handle($cipher, $mode) { return mcrypt_module_open($cipher, '', $mode, ''); } // -------------------------------------------------------------------- /** * Get OpenSSL handle * * @param string $cipher Cipher name * @param string $mode Encryption mode * @return string */ protected function _openssl_get_handle($cipher, $mode) { // OpenSSL methods aren't suffixed with '-stream' for this mode return ($mode === 'stream') ? $cipher : $cipher.'-'.$mode; } // -------------------------------------------------------------------- /** * Cipher alias * * Tries to translate cipher names between MCrypt and OpenSSL's "dialects". * * @param string $cipher Cipher name * @return void */ protected function _cipher_alias(&$cipher) { static $dictionary; if (empty($dictionary)) { $dictionary = array( 'mcrypt' => array( 'aes-128' => 'rijndael-128', 'aes-192' => 'rijndael-128', 'aes-256' => 'rijndael-128', 'des3-ede3' => 'tripledes', 'bf' => 'blowfish', 'cast5' => 'cast-128', 'rc4' => 'arcfour', 'rc4-40' => 'arcfour' ), 'openssl' => array( 'rijndael-128' => 'aes-128', 'tripledes' => 'des-ede3', 'blowfish' => 'bf', 'cast-128' => 'cast5', 'arcfour' => 'rc4-40', 'rc4' => 'rc4-40' ) ); // Notes: // // - Rijndael-128 is, at the same time all three of AES-128, // AES-192 and AES-256. The only difference between them is // the key size. Rijndael-192, Rijndael-256 on the other hand // also have different block sizes and are NOT AES-compatible. // // - Blowfish is said to be supporting key sizes between // 4 and 56 bytes, but it appears that between MCrypt and // OpenSSL, only those of 16 and more bytes are compatible. // Also, don't know what MCrypt's 'blowfish-compat' is. // // - CAST-128/CAST5 produces a longer cipher when encrypted via // OpenSSL, but (strangely enough) can be decrypted by either // extension anyway. // Also, it appears that OpenSSL uses 16 rounds regardless of // the key size, while RFC2144 says that for key sizes lower // than 11 bytes, only 12 rounds should be used. This makes // it portable only with keys of between 11 and 16 bytes. // // - RC4 (ARCFour) has a strange implementation under OpenSSL. // Its 'rc4-40' cipher method seems to work flawlessly, yet // there's another one, 'rc4' that only works with a 16-byte key. // // - DES is compatible, but doesn't need an alias. // // Other seemingly matching ciphers between MCrypt, OpenSSL: // // - RC2 is NOT compatible and only an obscure forum post // confirms that it is MCrypt's fault. } if (isset($dictionary[$this->_driver][$cipher])) { $cipher = $dictionary[$this->_driver][$cipher]; } } // -------------------------------------------------------------------- /** * HKDF * * @link https://tools.ietf.org/rfc/rfc5869.txt * @param $key Input key * @param $digest A SHA-2 hashing algorithm * @param $salt Optional salt * @param $length Output length (defaults to the selected digest size) * @param $info Optional context/application-specific info * @return string A pseudo-random key */ public function hkdf($key, $digest = 'sha512', $salt = NULL, $length = NULL, $info = '') { if ( ! isset($this->_digests[$digest])) { return FALSE; } if (empty($length) OR ! is_int($length)) { $length = $this->_digests[$digest]; } elseif ($length > (255 * $this->_digests[$digest])) { return FALSE; } self::strlen($salt) OR $salt = str_repeat("\0", $this->_digests[$digest]); $prk = hash_hmac($digest, $key, $salt, TRUE); $key = ''; for ($key_block = '', $block_index = 1; self::strlen($key) < $length; $block_index++) { $key_block = hash_hmac($digest, $key_block.$info.chr($block_index), $prk, TRUE); $key .= $key_block; } return self::substr($key, 0, $length); } // -------------------------------------------------------------------- /** * __get() magic * * @param string $key Property name * @return mixed */ public function __get($key) { // Because aliases if ($key === 'mode') { return array_search($this->_mode, $this->_modes[$this->_driver], TRUE); } elseif (in_array($key, array('cipher', 'driver', 'drivers', 'digests'), TRUE)) { return $this->{'_'.$key}; } return NULL; } // -------------------------------------------------------------------- /** * Byte-safe strlen() * * @param string $str * @return int */ protected static function strlen($str) { return (self::$func_overload) ? mb_strlen($str, '8bit') : strlen($str); } // -------------------------------------------------------------------- /** * Byte-safe substr() * * @param string $str * @param int $start * @param int $length * @return string */ protected static function substr($str, $start, $length = NULL) { if (self::$func_overload) { // mb_substr($str, $start, null, '8bit') returns an empty // string on PHP 5.3 isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start); return mb_substr($str, $start, $length, '8bit'); } return isset($length) ? substr($str, $start, $length) : substr($str, $start); } } PK!1ftæÚ’Ú’libraries/Form_validation.phpnu„[µü¤'; /** * End tag for error wrapping * * @var string */ protected $_error_suffix = '

'; /** * Custom error message * * @var string */ protected $error_string = ''; /** * Whether the form data has been validated as safe * * @var bool */ protected $_safe_form_data = FALSE; /** * Custom data to validate * * @var array */ public $validation_data = array(); /** * Initialize Form_Validation class * * @param array $rules * @return void */ public function __construct($rules = array()) { $this->CI =& get_instance(); // applies delimiters set in config file. if (isset($rules['error_prefix'])) { $this->_error_prefix = $rules['error_prefix']; unset($rules['error_prefix']); } if (isset($rules['error_suffix'])) { $this->_error_suffix = $rules['error_suffix']; unset($rules['error_suffix']); } // Validation rules can be stored in a config file. $this->_config_rules = $rules; // Automatically load the form helper $this->CI->load->helper('form'); log_message('info', 'Form Validation Class Initialized'); } // -------------------------------------------------------------------- /** * Set Rules * * This function takes an array of field names and validation * rules as input, any custom error messages, validates the info, * and stores it * * @param mixed $field * @param string $label * @param mixed $rules * @param array $errors * @return CI_Form_validation */ public function set_rules($field, $label = '', $rules = array(), $errors = array()) { // No reason to set rules if we have no POST data // or a validation array has not been specified if ($this->CI->input->method() !== 'post' && empty($this->validation_data)) { return $this; } // If an array was passed via the first parameter instead of individual string // values we cycle through it and recursively call this function. if (is_array($field)) { foreach ($field as $row) { // Houston, we have a problem... if ( ! isset($row['field'], $row['rules'])) { continue; } // If the field label wasn't passed we use the field name $label = isset($row['label']) ? $row['label'] : $row['field']; // Add the custom error message array $errors = (isset($row['errors']) && is_array($row['errors'])) ? $row['errors'] : array(); // Here we go! $this->set_rules($row['field'], $label, $row['rules'], $errors); } return $this; } // No fields or no rules? Nothing to do... if ( ! is_string($field) OR $field === '' OR empty($rules)) { return $this; } elseif ( ! is_array($rules)) { // BC: Convert pipe-separated rules string to an array if ( ! is_string($rules)) { return $this; } $rules = preg_split('/\|(?![^\[]*\])/', $rules); } // If the field label wasn't passed we use the field name $label = ($label === '') ? $field : $label; $indexes = array(); // Is the field name an array? If it is an array, we break it apart // into its components so that we can fetch the corresponding POST data later if (($is_array = (bool) preg_match_all('/\[(.*?)\]/', $field, $matches)) === TRUE) { sscanf($field, '%[^[][', $indexes[0]); for ($i = 0, $c = count($matches[0]); $i < $c; $i++) { if ($matches[1][$i] !== '') { $indexes[] = $matches[1][$i]; } } } // Build our master array $this->_field_data[$field] = array( 'field' => $field, 'label' => $label, 'rules' => $rules, 'errors' => $errors, 'is_array' => $is_array, 'keys' => $indexes, 'postdata' => NULL, 'error' => '' ); return $this; } // -------------------------------------------------------------------- /** * By default, form validation uses the $_POST array to validate * * If an array is set through this method, then this array will * be used instead of the $_POST array * * Note that if you are validating multiple arrays, then the * reset_validation() function should be called after validating * each array due to the limitations of CI's singleton * * @param array $data * @return CI_Form_validation */ public function set_data(array $data) { if ( ! empty($data)) { $this->validation_data = $data; } return $this; } // -------------------------------------------------------------------- /** * Set Error Message * * Lets users set their own error messages on the fly. Note: * The key name has to match the function name that it corresponds to. * * @param array * @param string * @return CI_Form_validation */ public function set_message($lang, $val = '') { if ( ! is_array($lang)) { $lang = array($lang => $val); } $this->_error_messages = array_merge($this->_error_messages, $lang); return $this; } // -------------------------------------------------------------------- /** * Set The Error Delimiter * * Permits a prefix/suffix to be added to each error message * * @param string * @param string * @return CI_Form_validation */ public function set_error_delimiters($prefix = '

', $suffix = '

') { $this->_error_prefix = $prefix; $this->_error_suffix = $suffix; return $this; } // -------------------------------------------------------------------- /** * Get Error Message * * Gets the error message associated with a particular field * * @param string $field Field name * @param string $prefix HTML start tag * @param string $suffix HTML end tag * @return string */ public function error($field, $prefix = '', $suffix = '') { if (empty($this->_field_data[$field]['error'])) { return ''; } if ($prefix === '') { $prefix = $this->_error_prefix; } if ($suffix === '') { $suffix = $this->_error_suffix; } return $prefix.$this->_field_data[$field]['error'].$suffix; } // -------------------------------------------------------------------- /** * Get Array of Error Messages * * Returns the error messages as an array * * @return array */ public function error_array() { return $this->_error_array; } // -------------------------------------------------------------------- /** * Error String * * Returns the error messages as a string, wrapped in the error delimiters * * @param string * @param string * @return string */ public function error_string($prefix = '', $suffix = '') { // No errors, validation passes! if (count($this->_error_array) === 0) { return ''; } if ($prefix === '') { $prefix = $this->_error_prefix; } if ($suffix === '') { $suffix = $this->_error_suffix; } // Generate the error string $str = ''; foreach ($this->_error_array as $val) { if ($val !== '') { $str .= $prefix.$val.$suffix."\n"; } } return $str; } // -------------------------------------------------------------------- /** * Run the Validator * * This function does all the work. * * @param string $group * @return bool */ public function run($group = '') { $validation_array = empty($this->validation_data) ? $_POST : $this->validation_data; // Does the _field_data array containing the validation rules exist? // If not, we look to see if they were assigned via a config file if (count($this->_field_data) === 0) { // No validation rules? We're done... if (count($this->_config_rules) === 0) { return FALSE; } if (empty($group)) { // Is there a validation rule for the particular URI being accessed? $group = trim($this->CI->uri->ruri_string(), '/'); isset($this->_config_rules[$group]) OR $group = $this->CI->router->class.'/'.$this->CI->router->method; } $this->set_rules(isset($this->_config_rules[$group]) ? $this->_config_rules[$group] : $this->_config_rules); // Were we able to set the rules correctly? if (count($this->_field_data) === 0) { log_message('debug', 'Unable to find validation rules'); return FALSE; } } // Load the language file containing error messages $this->CI->lang->load('form_validation'); // Cycle through the rules for each field and match the corresponding $validation_data item foreach ($this->_field_data as $field => &$row) { // Fetch the data from the validation_data array item and cache it in the _field_data array. // Depending on whether the field name is an array or a string will determine where we get it from. if ($row['is_array'] === TRUE) { $this->_field_data[$field]['postdata'] = $this->_reduce_array($validation_array, $row['keys']); } elseif (isset($validation_array[$field])) { $this->_field_data[$field]['postdata'] = $validation_array[$field]; } } // Execute validation rules // Note: A second foreach (for now) is required in order to avoid false-positives // for rules like 'matches', which correlate to other validation fields. foreach ($this->_field_data as $field => &$row) { // Don't try to validate if we have no rules set if (empty($row['rules'])) { continue; } $this->_execute($row, $row['rules'], $row['postdata']); } // Did we end up with any errors? $total_errors = count($this->_error_array); if ($total_errors > 0) { $this->_safe_form_data = TRUE; } // Now we need to re-set the POST data with the new, processed data empty($this->validation_data) && $this->_reset_post_array(); return ($total_errors === 0); } // -------------------------------------------------------------------- /** * Prepare rules * * Re-orders the provided rules in order of importance, so that * they can easily be executed later without weird checks ... * * "Callbacks" are given the highest priority (always called), * followed by 'required' (called if callbacks didn't fail), * and then every next rule depends on the previous one passing. * * @param array $rules * @return array */ protected function _prepare_rules($rules) { $new_rules = array(); $callbacks = array(); foreach ($rules as &$rule) { // Let 'required' always be the first (non-callback) rule if ($rule === 'required') { array_unshift($new_rules, 'required'); } // 'isset' is a kind of a weird alias for 'required' ... elseif ($rule === 'isset' && (empty($new_rules) OR $new_rules[0] !== 'required')) { array_unshift($new_rules, 'isset'); } // The old/classic 'callback_'-prefixed rules elseif (is_string($rule) && strncmp('callback_', $rule, 9) === 0) { $callbacks[] = $rule; } // Proper callables elseif (is_callable($rule)) { $callbacks[] = $rule; } // "Named" callables; i.e. array('name' => $callable) elseif (is_array($rule) && isset($rule[0], $rule[1]) && is_callable($rule[1])) { $callbacks[] = $rule; } // Everything else goes at the end of the queue else { $new_rules[] = $rule; } } return array_merge($callbacks, $new_rules); } // -------------------------------------------------------------------- /** * Traverse a multidimensional $_POST array index until the data is found * * @param array * @param array * @param int * @return mixed */ protected function _reduce_array($array, $keys, $i = 0) { if (is_array($array) && isset($keys[$i])) { return isset($array[$keys[$i]]) ? $this->_reduce_array($array[$keys[$i]], $keys, ($i+1)) : NULL; } // NULL must be returned for empty fields return ($array === '') ? NULL : $array; } // -------------------------------------------------------------------- /** * Re-populate the _POST array with our finalized and processed data * * @return void */ protected function _reset_post_array() { foreach ($this->_field_data as $field => $row) { if ($row['postdata'] !== NULL) { if ($row['is_array'] === FALSE) { isset($_POST[$field]) && $_POST[$field] = is_array($row['postdata']) ? NULL : $row['postdata']; } else { // start with a reference $post_ref =& $_POST; // before we assign values, make a reference to the right POST key if (count($row['keys']) === 1) { $post_ref =& $post_ref[current($row['keys'])]; } else { foreach ($row['keys'] as $val) { $post_ref =& $post_ref[$val]; } } $post_ref = $row['postdata']; } } } } // -------------------------------------------------------------------- /** * Executes the Validation routines * * @param array * @param array * @param mixed * @param int * @return mixed */ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) { // If the $_POST data is an array we will run a recursive call // // Note: We MUST check if the array is empty or not! // Otherwise empty arrays will always pass validation. if (is_array($postdata) && ! empty($postdata)) { foreach ($postdata as $key => $val) { $this->_execute($row, $rules, $val, $key); } return; } $rules = $this->_prepare_rules($rules); foreach ($rules as $rule) { $_in_array = FALSE; // We set the $postdata variable with the current data in our master array so that // each cycle of the loop is dealing with the processed data from the last cycle if ($row['is_array'] === TRUE && is_array($this->_field_data[$row['field']]['postdata'])) { // We shouldn't need this safety, but just in case there isn't an array index // associated with this cycle we'll bail out if ( ! isset($this->_field_data[$row['field']]['postdata'][$cycles])) { continue; } $postdata = $this->_field_data[$row['field']]['postdata'][$cycles]; $_in_array = TRUE; } else { // If we get an array field, but it's not expected - then it is most likely // somebody messing with the form on the client side, so we'll just consider // it an empty field $postdata = is_array($this->_field_data[$row['field']]['postdata']) ? NULL : $this->_field_data[$row['field']]['postdata']; } // Is the rule a callback? $callback = $callable = FALSE; if (is_string($rule)) { if (strpos($rule, 'callback_') === 0) { $rule = substr($rule, 9); $callback = TRUE; } } elseif (is_callable($rule)) { $callable = TRUE; } elseif (is_array($rule) && isset($rule[0], $rule[1]) && is_callable($rule[1])) { // We have a "named" callable, so save the name $callable = $rule[0]; $rule = $rule[1]; } // Strip the parameter (if exists) from the rule // Rules can contain a parameter: max_length[5] $param = FALSE; if ( ! $callable && preg_match('/(.*?)\[(.*)\]/', $rule, $match)) { $rule = $match[1]; $param = $match[2]; } // Ignore empty, non-required inputs with a few exceptions ... if ( ($postdata === NULL OR $postdata === '') && $callback === FALSE && $callable === FALSE && ! in_array($rule, array('required', 'isset', 'matches'), TRUE) ) { continue; } // Call the function that corresponds to the rule if ($callback OR $callable !== FALSE) { if ($callback) { if ( ! method_exists($this->CI, $rule)) { log_message('debug', 'Unable to find callback validation rule: '.$rule); $result = FALSE; } else { // Run the function and grab the result $result = $this->CI->$rule($postdata, $param); } } else { $result = is_array($rule) ? $rule[0]->{$rule[1]}($postdata) : $rule($postdata); // Is $callable set to a rule name? if ($callable !== FALSE) { $rule = $callable; } } // Re-assign the result to the master data array if ($_in_array === TRUE) { $this->_field_data[$row['field']]['postdata'][$cycles] = is_bool($result) ? $postdata : $result; } else { $this->_field_data[$row['field']]['postdata'] = is_bool($result) ? $postdata : $result; } } elseif ( ! method_exists($this, $rule)) { // If our own wrapper function doesn't exist we see if a native PHP function does. // Users can use any native PHP function call that has one param. if (function_exists($rule)) { // Native PHP functions issue warnings if you pass them more parameters than they use $result = ($param !== FALSE) ? $rule($postdata, $param) : $rule($postdata); if ($_in_array === TRUE) { $this->_field_data[$row['field']]['postdata'][$cycles] = is_bool($result) ? $postdata : $result; } else { $this->_field_data[$row['field']]['postdata'] = is_bool($result) ? $postdata : $result; } } else { log_message('debug', 'Unable to find validation rule: '.$rule); $result = FALSE; } } else { $result = $this->$rule($postdata, $param); if ($_in_array === TRUE) { $this->_field_data[$row['field']]['postdata'][$cycles] = is_bool($result) ? $postdata : $result; } else { $this->_field_data[$row['field']]['postdata'] = is_bool($result) ? $postdata : $result; } } // Did the rule test negatively? If so, grab the error. if ($result === FALSE) { // Callable rules might not have named error messages if ( ! is_string($rule)) { $line = $this->CI->lang->line('form_validation_error_message_not_set').'(Anonymous function)'; } else { $line = $this->_get_error_message($rule, $row['field']); } // Is the parameter we are inserting into the error message the name // of another field? If so we need to grab its "field label" if (isset($this->_field_data[$param], $this->_field_data[$param]['label'])) { $param = $this->_translate_fieldname($this->_field_data[$param]['label']); } // Build the error message $message = $this->_build_error_msg($line, $this->_translate_fieldname($row['label']), $param); // Save the error message $this->_field_data[$row['field']]['error'] = $message; if ( ! isset($this->_error_array[$row['field']])) { $this->_error_array[$row['field']] = $message; } return; } } } // -------------------------------------------------------------------- /** * Get the error message for the rule * * @param string $rule The rule name * @param string $field The field name * @return string */ protected function _get_error_message($rule, $field) { // check if a custom message is defined through validation config row. if (isset($this->_field_data[$field]['errors'][$rule])) { return $this->_field_data[$field]['errors'][$rule]; } // check if a custom message has been set using the set_message() function elseif (isset($this->_error_messages[$rule])) { return $this->_error_messages[$rule]; } elseif (FALSE !== ($line = $this->CI->lang->line('form_validation_'.$rule))) { return $line; } // DEPRECATED support for non-prefixed keys, lang file again elseif (FALSE !== ($line = $this->CI->lang->line($rule, FALSE))) { return $line; } return $this->CI->lang->line('form_validation_error_message_not_set').'('.$rule.')'; } // -------------------------------------------------------------------- /** * Translate a field name * * @param string the field name * @return string */ protected function _translate_fieldname($fieldname) { // Do we need to translate the field name? We look for the prefix 'lang:' to determine this // If we find one, but there's no translation for the string - just return it if (sscanf($fieldname, 'lang:%s', $line) === 1 && FALSE === ($fieldname = $this->CI->lang->line($line, FALSE))) { return $line; } return $fieldname; } // -------------------------------------------------------------------- /** * Build an error message using the field and param. * * @param string The error message line * @param string A field's human name * @param mixed A rule's optional parameter * @return string */ protected function _build_error_msg($line, $field = '', $param = '') { // Check for %s in the string for legacy support. if (strpos($line, '%s') !== FALSE) { return sprintf($line, $field, $param); } return str_replace(array('{field}', '{param}'), array($field, $param), $line); } // -------------------------------------------------------------------- /** * Checks if the rule is present within the validator * * Permits you to check if a rule is present within the validator * * @param string the field name * @return bool */ public function has_rule($field) { return isset($this->_field_data[$field]); } // -------------------------------------------------------------------- /** * Get the value from a form * * Permits you to repopulate a form field with the value it was submitted * with, or, if that value doesn't exist, with the default * * @param string the field name * @param string * @return string */ public function set_value($field = '', $default = '') { if ( ! isset($this->_field_data[$field], $this->_field_data[$field]['postdata'])) { return $default; } // If the data is an array output them one at a time. // E.g: form_input('name[]', set_value('name[]'); if (is_array($this->_field_data[$field]['postdata'])) { return array_shift($this->_field_data[$field]['postdata']); } return $this->_field_data[$field]['postdata']; } // -------------------------------------------------------------------- /** * Set Select * * Enables pull-down lists to be set to the value the user * selected in the event of an error * * @param string * @param string * @param bool * @return string */ public function set_select($field = '', $value = '', $default = FALSE) { if ( ! isset($this->_field_data[$field], $this->_field_data[$field]['postdata'])) { return ($default === TRUE && count($this->_field_data) === 0) ? ' selected="selected"' : ''; } $field = $this->_field_data[$field]['postdata']; $value = (string) $value; if (is_array($field)) { // Note: in_array('', array(0)) returns TRUE, do not use it foreach ($field as &$v) { if ($value === $v) { return ' selected="selected"'; } } return ''; } elseif (($field === '' OR $value === '') OR ($field !== $value)) { return ''; } return ' selected="selected"'; } // -------------------------------------------------------------------- /** * Set Radio * * Enables radio buttons to be set to the value the user * selected in the event of an error * * @param string * @param string * @param bool * @return string */ public function set_radio($field = '', $value = '', $default = FALSE) { if ( ! isset($this->_field_data[$field], $this->_field_data[$field]['postdata'])) { return ($default === TRUE && count($this->_field_data) === 0) ? ' checked="checked"' : ''; } $field = $this->_field_data[$field]['postdata']; $value = (string) $value; if (is_array($field)) { // Note: in_array('', array(0)) returns TRUE, do not use it foreach ($field as &$v) { if ($value === $v) { return ' checked="checked"'; } } return ''; } elseif (($field === '' OR $value === '') OR ($field !== $value)) { return ''; } return ' checked="checked"'; } // -------------------------------------------------------------------- /** * Set Checkbox * * Enables checkboxes to be set to the value the user * selected in the event of an error * * @param string * @param string * @param bool * @return string */ public function set_checkbox($field = '', $value = '', $default = FALSE) { // Logic is exactly the same as for radio fields return $this->set_radio($field, $value, $default); } // -------------------------------------------------------------------- /** * Required * * @param string * @return bool */ public function required($str) { return is_array($str) ? (empty($str) === FALSE) : (trim($str) !== ''); } // -------------------------------------------------------------------- /** * Performs a Regular Expression match test. * * @param string * @param string regex * @return bool */ public function regex_match($str, $regex) { return (bool) preg_match($regex, $str); } // -------------------------------------------------------------------- /** * Match one field to another * * @param string $str string to compare against * @param string $field * @return bool */ public function matches($str, $field) { return isset($this->_field_data[$field], $this->_field_data[$field]['postdata']) ? ($str === $this->_field_data[$field]['postdata']) : FALSE; } // -------------------------------------------------------------------- /** * Differs from another field * * @param string * @param string field * @return bool */ public function differs($str, $field) { return ! (isset($this->_field_data[$field]) && $this->_field_data[$field]['postdata'] === $str); } // -------------------------------------------------------------------- /** * Is Unique * * Check if the input value doesn't already exist * in the specified database field. * * @param string $str * @param string $field * @return bool */ public function is_unique($str, $field) { sscanf($field, '%[^.].%[^.]', $table, $field); return isset($this->CI->db) ? ($this->CI->db->limit(1)->get_where($table, array($field => $str))->num_rows() === 0) : FALSE; } // -------------------------------------------------------------------- /** * Minimum Length * * @param string * @param string * @return bool */ public function min_length($str, $val) { if ( ! is_numeric($val)) { return FALSE; } return ($val <= mb_strlen($str)); } // -------------------------------------------------------------------- /** * Max Length * * @param string * @param string * @return bool */ public function max_length($str, $val) { if ( ! is_numeric($val)) { return FALSE; } return ($val >= mb_strlen($str)); } // -------------------------------------------------------------------- /** * Exact Length * * @param string * @param string * @return bool */ public function exact_length($str, $val) { if ( ! is_numeric($val)) { return FALSE; } return (mb_strlen($str) === (int) $val); } // -------------------------------------------------------------------- /** * Valid URL * * @param string $str * @return bool */ public function valid_url($str) { if (empty($str)) { return FALSE; } elseif (preg_match('/^(?:([^:]*)\:)?\/\/(.+)$/', $str, $matches)) { if (empty($matches[2])) { return FALSE; } elseif ( ! in_array(strtolower($matches[1]), array('http', 'https'), TRUE)) { return FALSE; } $str = $matches[2]; } // Apparently, FILTER_VALIDATE_URL doesn't reject digit-only names for some reason ... // See https://github.com/bcit-ci/CodeIgniter/issues/5755 if (ctype_digit($str)) { return FALSE; } // PHP 7 accepts IPv6 addresses within square brackets as hostnames, // but it appears that the PR that came in with https://bugs.php.net/bug.php?id=68039 // was never merged into a PHP 5 branch ... https://3v4l.org/8PsSN if (preg_match('/^\[([^\]]+)\]/', $str, $matches) && ! is_php('7') && filter_var($matches[1], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== FALSE) { $str = 'ipv6.host'.substr($str, strlen($matches[1]) + 2); } return (filter_var('http://'.$str, FILTER_VALIDATE_URL) !== FALSE); } // -------------------------------------------------------------------- /** * Valid Email * * @param string * @return bool */ public function valid_email($str) { if (function_exists('idn_to_ascii') && preg_match('#\A([^@]+)@(.+)\z#', $str, $matches)) { $domain = defined('INTL_IDNA_VARIANT_UTS46') ? idn_to_ascii($matches[2], 0, INTL_IDNA_VARIANT_UTS46) : idn_to_ascii($matches[2]); if ($domain !== FALSE) { $str = $matches[1].'@'.$domain; } } return (bool) filter_var($str, FILTER_VALIDATE_EMAIL); } // -------------------------------------------------------------------- /** * Valid Emails * * @param string * @return bool */ public function valid_emails($str) { if (strpos($str, ',') === FALSE) { return $this->valid_email(trim($str)); } foreach (explode(',', $str) as $email) { if (trim($email) !== '' && $this->valid_email(trim($email)) === FALSE) { return FALSE; } } return TRUE; } // -------------------------------------------------------------------- /** * Validate IP Address * * @param string * @param string 'ipv4' or 'ipv6' to validate a specific IP format * @return bool */ public function valid_ip($ip, $which = '') { return $this->CI->input->valid_ip($ip, $which); } // -------------------------------------------------------------------- /** * Alpha * * @param string * @return bool */ public function alpha($str) { return ctype_alpha($str); } // -------------------------------------------------------------------- /** * Alpha-numeric * * @param string * @return bool */ public function alpha_numeric($str) { return ctype_alnum((string) $str); } // -------------------------------------------------------------------- /** * Alpha-numeric w/ spaces * * @param string * @return bool */ public function alpha_numeric_spaces($str) { return (bool) preg_match('/^[A-Z0-9 ]+$/i', $str); } // -------------------------------------------------------------------- /** * Alpha-numeric with underscores and dashes * * @param string * @return bool */ public function alpha_dash($str) { return (bool) preg_match('/^[a-z0-9_-]+$/i', $str); } // -------------------------------------------------------------------- /** * Numeric * * @param string * @return bool */ public function numeric($str) { return (bool) preg_match('/^[\-+]?[0-9]*\.?[0-9]+$/', $str); } // -------------------------------------------------------------------- /** * Integer * * @param string * @return bool */ public function integer($str) { return (bool) preg_match('/^[\-+]?[0-9]+$/', $str); } // -------------------------------------------------------------------- /** * Decimal number * * @param string * @return bool */ public function decimal($str) { return (bool) preg_match('/^[\-+]?[0-9]+\.[0-9]+$/', $str); } // -------------------------------------------------------------------- /** * Greater than * * @param string * @param int * @return bool */ public function greater_than($str, $min) { return is_numeric($str) ? ($str > $min) : FALSE; } // -------------------------------------------------------------------- /** * Equal to or Greater than * * @param string * @param int * @return bool */ public function greater_than_equal_to($str, $min) { return is_numeric($str) ? ($str >= $min) : FALSE; } // -------------------------------------------------------------------- /** * Less than * * @param string * @param int * @return bool */ public function less_than($str, $max) { return is_numeric($str) ? ($str < $max) : FALSE; } // -------------------------------------------------------------------- /** * Equal to or Less than * * @param string * @param int * @return bool */ public function less_than_equal_to($str, $max) { return is_numeric($str) ? ($str <= $max) : FALSE; } // -------------------------------------------------------------------- /** * Value should be within an array of values * * @param string * @param string * @return bool */ public function in_list($value, $list) { return in_array($value, explode(',', $list), TRUE); } // -------------------------------------------------------------------- /** * Is a Natural number (0,1,2,3, etc.) * * @param string * @return bool */ public function is_natural($str) { return ctype_digit((string) $str); } // -------------------------------------------------------------------- /** * Is a Natural number, but not a zero (1,2,3, etc.) * * @param string * @return bool */ public function is_natural_no_zero($str) { return ($str != 0 && ctype_digit((string) $str)); } // -------------------------------------------------------------------- /** * Valid Base64 * * Tests a string for characters outside of the Base64 alphabet * as defined by RFC 2045 http://www.faqs.org/rfcs/rfc2045 * * @param string * @return bool */ public function valid_base64($str) { return (base64_encode(base64_decode($str)) === $str); } // -------------------------------------------------------------------- /** * Prep data for form * * This function allows HTML to be safely shown in a form. * Special characters are converted. * * @deprecated 3.0.6 Not used anywhere within the framework and pretty much useless * @param mixed $data Input data * @return mixed */ public function prep_for_form($data) { if ($this->_safe_form_data === FALSE OR empty($data)) { return $data; } if (is_array($data)) { foreach ($data as $key => $val) { $data[$key] = $this->prep_for_form($val); } return $data; } return str_replace(array("'", '"', '<', '>'), array(''', '"', '<', '>'), stripslashes($data)); } // -------------------------------------------------------------------- /** * Prep URL * * @param string * @return string */ public function prep_url($str = '') { if ($str === 'http://' OR $str === '') { return ''; } if (strpos($str, 'http://') !== 0 && strpos($str, 'https://') !== 0) { return 'http://'.$str; } return $str; } // -------------------------------------------------------------------- /** * Strip Image Tags * * @param string * @return string */ public function strip_image_tags($str) { return $this->CI->security->strip_image_tags($str); } // -------------------------------------------------------------------- /** * Convert PHP tags to entities * * @param string * @return string */ public function encode_php_tags($str) { return str_replace(array(''), array('<?', '?>'), $str); } // -------------------------------------------------------------------- /** * Reset validation vars * * Prevents subsequent validation routines from being affected by the * results of any previous validation routine due to the CI singleton. * * @return CI_Form_validation */ public function reset_validation() { $this->_field_data = array(); $this->_error_array = array(); $this->_error_messages = array(); $this->error_string = ''; return $this; } } PK!Œé~¨¨libraries/Image_lib.phpnu„[µü¤ 0) { $this->initialize($props); } /** * A work-around for some improperly formatted, but * usable JPEGs; known to be produced by Samsung * smartphones' front-facing cameras. * * @see https://github.com/bcit-ci/CodeIgniter/issues/4967 * @see https://bugs.php.net/bug.php?id=72404 */ ini_set('gd.jpeg_ignore_warning', 1); log_message('info', 'Image Lib Class Initialized'); } // -------------------------------------------------------------------- /** * Initialize image properties * * Resets values in case this class is used in a loop * * @return void */ public function clear() { $props = array('thumb_marker', 'library_path', 'source_image', 'new_image', 'width', 'height', 'rotation_angle', 'x_axis', 'y_axis', 'wm_text', 'wm_overlay_path', 'wm_font_path', 'wm_shadow_color', 'source_folder', 'dest_folder', 'mime_type', 'orig_width', 'orig_height', 'image_type', 'size_str', 'full_src_path', 'full_dst_path'); foreach ($props as $val) { $this->$val = ''; } $this->image_library = 'gd2'; $this->dynamic_output = FALSE; $this->quality = 90; $this->create_thumb = FALSE; $this->thumb_marker = '_thumb'; $this->maintain_ratio = TRUE; $this->master_dim = 'auto'; $this->wm_type = 'text'; $this->wm_x_transp = 4; $this->wm_y_transp = 4; $this->wm_font_size = 17; $this->wm_vrt_alignment = 'B'; $this->wm_hor_alignment = 'C'; $this->wm_padding = 0; $this->wm_hor_offset = 0; $this->wm_vrt_offset = 0; $this->wm_font_color = '#ffffff'; $this->wm_shadow_distance = 2; $this->wm_opacity = 50; $this->create_fnc = 'imagecreatetruecolor'; $this->copy_fnc = 'imagecopyresampled'; $this->error_msg = array(); $this->wm_use_drop_shadow = FALSE; $this->wm_use_truetype = FALSE; } // -------------------------------------------------------------------- /** * initialize image preferences * * @param array * @return bool */ public function initialize($props = array()) { // Convert array elements into class variables if (count($props) > 0) { foreach ($props as $key => $val) { if (property_exists($this, $key)) { if (in_array($key, array('wm_font_color', 'wm_shadow_color'), TRUE)) { if (preg_match('/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i', $val, $matches)) { /* $matches[1] contains our hex color value, but it might be * both in the full 6-length format or the shortened 3-length * value. * We'll later need the full version, so we keep it if it's * already there and if not - we'll convert to it. We can * access string characters by their index as in an array, * so we'll do that and use concatenation to form the final * value: */ $val = (strlen($matches[1]) === 6) ? '#'.$matches[1] : '#'.$matches[1][0].$matches[1][0].$matches[1][1].$matches[1][1].$matches[1][2].$matches[1][2]; } else { continue; } } elseif (in_array($key, array('width', 'height'), TRUE) && ! ctype_digit((string) $val)) { continue; } $this->$key = $val; } } } // Is there a source image? If not, there's no reason to continue if ($this->source_image === '') { $this->set_error('imglib_source_image_required'); return FALSE; } /* Is getimagesize() available? * * We use it to determine the image properties (width/height). * Note: We need to figure out how to determine image * properties using ImageMagick and NetPBM */ if ( ! function_exists('getimagesize')) { $this->set_error('imglib_gd_required_for_props'); return FALSE; } $this->image_library = strtolower($this->image_library); /* Set the full server path * * The source image may or may not contain a path. * Either way, we'll try use realpath to generate the * full server path in order to more reliably read it. */ if (($full_source_path = realpath($this->source_image)) !== FALSE) { $full_source_path = str_replace('\\', '/', $full_source_path); } else { $full_source_path = $this->source_image; } $x = explode('/', $full_source_path); $this->source_image = end($x); $this->source_folder = str_replace($this->source_image, '', $full_source_path); // Set the Image Properties if ( ! $this->get_image_properties($this->source_folder.$this->source_image)) { return FALSE; } /* * Assign the "new" image name/path * * If the user has set a "new_image" name it means * we are making a copy of the source image. If not * it means we are altering the original. We'll * set the destination filename and path accordingly. */ if ($this->new_image === '') { $this->dest_image = $this->source_image; $this->dest_folder = $this->source_folder; } elseif (strpos($this->new_image, '/') === FALSE && strpos($this->new_image, '\\') === FALSE) { $this->dest_image = $this->new_image; $this->dest_folder = $this->source_folder; } else { // Is there a file name? if ( ! preg_match('#\.(jpg|jpeg|gif|png)$#i', $this->new_image)) { $this->dest_image = $this->source_image; $this->dest_folder = $this->new_image; } else { $x = explode('/', str_replace('\\', '/', $this->new_image)); $this->dest_image = end($x); $this->dest_folder = str_replace($this->dest_image, '', $this->new_image); } $this->dest_folder = realpath($this->dest_folder).'/'; } /* Compile the finalized filenames/paths * * We'll create two master strings containing the * full server path to the source image and the * full server path to the destination image. * We'll also split the destination image name * so we can insert the thumbnail marker if needed. */ if ($this->create_thumb === FALSE OR $this->thumb_marker === '') { $this->thumb_marker = ''; } $xp = $this->explode_name($this->dest_image); $filename = $xp['name']; $file_ext = $xp['ext']; $this->full_src_path = $this->source_folder.$this->source_image; $this->full_dst_path = $this->dest_folder.$filename.$this->thumb_marker.$file_ext; /* Should we maintain image proportions? * * When creating thumbs or copies, the target width/height * might not be in correct proportion with the source * image's width/height. We'll recalculate it here. */ if ($this->maintain_ratio === TRUE && ($this->width !== 0 OR $this->height !== 0)) { $this->image_reproportion(); } /* Was a width and height specified? * * If the destination width/height was not submitted we * will use the values from the actual file */ if ($this->width === '') { $this->width = $this->orig_width; } if ($this->height === '') { $this->height = $this->orig_height; } // Set the quality $this->quality = trim(str_replace('%', '', $this->quality)); if ($this->quality === '' OR $this->quality === 0 OR ! ctype_digit($this->quality)) { $this->quality = 90; } // Set the x/y coordinates is_numeric($this->x_axis) OR $this->x_axis = 0; is_numeric($this->y_axis) OR $this->y_axis = 0; // Watermark-related Stuff... if ($this->wm_overlay_path !== '') { $this->wm_overlay_path = str_replace('\\', '/', realpath($this->wm_overlay_path)); } if ($this->wm_shadow_color !== '') { $this->wm_use_drop_shadow = TRUE; } elseif ($this->wm_use_drop_shadow === TRUE && $this->wm_shadow_color === '') { $this->wm_use_drop_shadow = FALSE; } if ($this->wm_font_path !== '') { $this->wm_use_truetype = TRUE; } return TRUE; } // -------------------------------------------------------------------- /** * Image Resize * * This is a wrapper function that chooses the proper * resize function based on the protocol specified * * @return bool */ public function resize() { $protocol = ($this->image_library === 'gd2') ? 'image_process_gd' : 'image_process_'.$this->image_library; return $this->$protocol('resize'); } // -------------------------------------------------------------------- /** * Image Crop * * This is a wrapper function that chooses the proper * cropping function based on the protocol specified * * @return bool */ public function crop() { $protocol = ($this->image_library === 'gd2') ? 'image_process_gd' : 'image_process_'.$this->image_library; return $this->$protocol('crop'); } // -------------------------------------------------------------------- /** * Image Rotate * * This is a wrapper function that chooses the proper * rotation function based on the protocol specified * * @return bool */ public function rotate() { // Allowed rotation values $degs = array(90, 180, 270, 'vrt', 'hor'); if ($this->rotation_angle === '' OR ! in_array($this->rotation_angle, $degs)) { $this->set_error('imglib_rotation_angle_required'); return FALSE; } // Reassign the width and height if ($this->rotation_angle === 90 OR $this->rotation_angle === 270) { $this->width = $this->orig_height; $this->height = $this->orig_width; } else { $this->width = $this->orig_width; $this->height = $this->orig_height; } // Choose resizing function if ($this->image_library === 'imagemagick' OR $this->image_library === 'netpbm') { $protocol = 'image_process_'.$this->image_library; return $this->$protocol('rotate'); } return ($this->rotation_angle === 'hor' OR $this->rotation_angle === 'vrt') ? $this->image_mirror_gd() : $this->image_rotate_gd(); } // -------------------------------------------------------------------- /** * Image Process Using GD/GD2 * * This function will resize or crop * * @param string * @return bool */ public function image_process_gd($action = 'resize') { $v2_override = FALSE; // If the target width/height match the source, AND if the new file name is not equal to the old file name // we'll simply make a copy of the original with the new name... assuming dynamic rendering is off. if ($this->dynamic_output === FALSE && $this->orig_width === $this->width && $this->orig_height === $this->height) { if ($this->source_image !== $this->new_image && @copy($this->full_src_path, $this->full_dst_path)) { chmod($this->full_dst_path, $this->file_permissions); } return TRUE; } // Let's set up our values based on the action if ($action === 'crop') { // Reassign the source width/height if cropping $this->orig_width = $this->width; $this->orig_height = $this->height; // GD 2.0 has a cropping bug so we'll test for it if ($this->gd_version() !== FALSE) { $gd_version = str_replace('0', '', $this->gd_version()); $v2_override = ($gd_version == 2); } } else { // If resizing the x/y axis must be zero $this->x_axis = 0; $this->y_axis = 0; } // Create the image handle if ( ! ($src_img = $this->image_create_gd())) { return FALSE; } /* Create the image * * Old conditional which users report cause problems with shared GD libs who report themselves as "2.0 or greater" * it appears that this is no longer the issue that it was in 2004, so we've removed it, retaining it in the comment * below should that ever prove inaccurate. * * if ($this->image_library === 'gd2' && function_exists('imagecreatetruecolor') && $v2_override === FALSE) */ if ($this->image_library === 'gd2' && function_exists('imagecreatetruecolor')) { $create = 'imagecreatetruecolor'; $copy = 'imagecopyresampled'; } else { $create = 'imagecreate'; $copy = 'imagecopyresized'; } $dst_img = $create($this->width, $this->height); if ($this->image_type === 3) // png we can actually preserve transparency { imagealphablending($dst_img, FALSE); imagesavealpha($dst_img, TRUE); } $copy($dst_img, $src_img, 0, 0, $this->x_axis, $this->y_axis, $this->width, $this->height, $this->orig_width, $this->orig_height); // Show the image if ($this->dynamic_output === TRUE) { $this->image_display_gd($dst_img); } elseif ( ! $this->image_save_gd($dst_img)) // Or save it { return FALSE; } // Kill the file handles imagedestroy($dst_img); imagedestroy($src_img); if ($this->dynamic_output !== TRUE) { chmod($this->full_dst_path, $this->file_permissions); } return TRUE; } // -------------------------------------------------------------------- /** * Image Process Using ImageMagick * * This function will resize, crop or rotate * * @param string * @return bool */ public function image_process_imagemagick($action = 'resize') { // Do we have a vaild library path? if ($this->library_path === '') { $this->set_error('imglib_libpath_invalid'); return FALSE; } if ( ! preg_match('/convert$/i', $this->library_path)) { $this->library_path = rtrim($this->library_path, '/').'/convert'; } // Execute the command $cmd = $this->library_path.' -quality '.$this->quality; if ($action === 'crop') { $cmd .= ' -crop '.$this->width.'x'.$this->height.'+'.$this->x_axis.'+'.$this->y_axis; } elseif ($action === 'rotate') { $cmd .= ($this->rotation_angle === 'hor' OR $this->rotation_angle === 'vrt') ? ' -flop' : ' -rotate '.$this->rotation_angle; } else // Resize { if($this->maintain_ratio === TRUE) { $cmd .= ' -resize '.$this->width.'x'.$this->height; } else { $cmd .= ' -resize '.$this->width.'x'.$this->height.'\!'; } } $cmd .= ' '.escapeshellarg($this->full_src_path).' '.escapeshellarg($this->full_dst_path).' 2>&1'; $retval = 1; // exec() might be disabled if (function_usable('exec')) { @exec($cmd, $output, $retval); } // Did it work? if ($retval > 0) { $this->set_error('imglib_image_process_failed'); return FALSE; } chmod($this->full_dst_path, $this->file_permissions); return TRUE; } // -------------------------------------------------------------------- /** * Image Process Using NetPBM * * This function will resize, crop or rotate * * @param string * @return bool */ public function image_process_netpbm($action = 'resize') { if ($this->library_path === '') { $this->set_error('imglib_libpath_invalid'); return FALSE; } // Build the resizing command switch ($this->image_type) { case 1 : $cmd_in = 'giftopnm'; $cmd_out = 'ppmtogif'; break; case 2 : $cmd_in = 'jpegtopnm'; $cmd_out = 'ppmtojpeg'; break; case 3 : $cmd_in = 'pngtopnm'; $cmd_out = 'ppmtopng'; break; } if ($action === 'crop') { $cmd_inner = 'pnmcut -left '.$this->x_axis.' -top '.$this->y_axis.' -width '.$this->width.' -height '.$this->height; } elseif ($action === 'rotate') { switch ($this->rotation_angle) { case 90: $angle = 'r270'; break; case 180: $angle = 'r180'; break; case 270: $angle = 'r90'; break; case 'vrt': $angle = 'tb'; break; case 'hor': $angle = 'lr'; break; } $cmd_inner = 'pnmflip -'.$angle.' '; } else // Resize { $cmd_inner = 'pnmscale -xysize '.$this->width.' '.$this->height; } $cmd = $this->library_path.$cmd_in.' '.escapeshellarg($this->full_src_path).' | '.$cmd_inner.' | '.$cmd_out.' > '.$this->dest_folder.'netpbm.tmp'; $retval = 1; // exec() might be disabled if (function_usable('exec')) { @exec($cmd, $output, $retval); } // Did it work? if ($retval > 0) { $this->set_error('imglib_image_process_failed'); return FALSE; } // With NetPBM we have to create a temporary image. // If you try manipulating the original it fails so // we have to rename the temp file. copy($this->dest_folder.'netpbm.tmp', $this->full_dst_path); unlink($this->dest_folder.'netpbm.tmp'); chmod($this->full_dst_path, $this->file_permissions); return TRUE; } // -------------------------------------------------------------------- /** * Image Rotate Using GD * * @return bool */ public function image_rotate_gd() { // Create the image handle if ( ! ($src_img = $this->image_create_gd())) { return FALSE; } // Set the background color // This won't work with transparent PNG files so we are // going to have to figure out how to determine the color // of the alpha channel in a future release. $white = imagecolorallocate($src_img, 255, 255, 255); // Rotate it! $dst_img = imagerotate($src_img, $this->rotation_angle, $white); // Show the image if ($this->dynamic_output === TRUE) { $this->image_display_gd($dst_img); } elseif ( ! $this->image_save_gd($dst_img)) // ... or save it { return FALSE; } // Kill the file handles imagedestroy($dst_img); imagedestroy($src_img); chmod($this->full_dst_path, $this->file_permissions); return TRUE; } // -------------------------------------------------------------------- /** * Create Mirror Image using GD * * This function will flip horizontal or vertical * * @return bool */ public function image_mirror_gd() { if ( ! $src_img = $this->image_create_gd()) { return FALSE; } $width = $this->orig_width; $height = $this->orig_height; if ($this->rotation_angle === 'hor') { for ($i = 0; $i < $height; $i++) { $left = 0; $right = $width - 1; while ($left < $right) { $cl = imagecolorat($src_img, $left, $i); $cr = imagecolorat($src_img, $right, $i); imagesetpixel($src_img, $left, $i, $cr); imagesetpixel($src_img, $right, $i, $cl); $left++; $right--; } } } else { for ($i = 0; $i < $width; $i++) { $top = 0; $bottom = $height - 1; while ($top < $bottom) { $ct = imagecolorat($src_img, $i, $top); $cb = imagecolorat($src_img, $i, $bottom); imagesetpixel($src_img, $i, $top, $cb); imagesetpixel($src_img, $i, $bottom, $ct); $top++; $bottom--; } } } // Show the image if ($this->dynamic_output === TRUE) { $this->image_display_gd($src_img); } elseif ( ! $this->image_save_gd($src_img)) // ... or save it { return FALSE; } // Kill the file handles imagedestroy($src_img); chmod($this->full_dst_path, $this->file_permissions); return TRUE; } // -------------------------------------------------------------------- /** * Image Watermark * * This is a wrapper function that chooses the type * of watermarking based on the specified preference. * * @return bool */ public function watermark() { return ($this->wm_type === 'overlay') ? $this->overlay_watermark() : $this->text_watermark(); } // -------------------------------------------------------------------- /** * Watermark - Graphic Version * * @return bool */ public function overlay_watermark() { if ( ! function_exists('imagecolortransparent')) { $this->set_error('imglib_gd_required'); return FALSE; } // Fetch source image properties $this->get_image_properties(); // Fetch watermark image properties $props = $this->get_image_properties($this->wm_overlay_path, TRUE); $wm_img_type = $props['image_type']; $wm_width = $props['width']; $wm_height = $props['height']; // Create two image resources $wm_img = $this->image_create_gd($this->wm_overlay_path, $wm_img_type); $src_img = $this->image_create_gd($this->full_src_path); // Reverse the offset if necessary // When the image is positioned at the bottom // we don't want the vertical offset to push it // further down. We want the reverse, so we'll // invert the offset. Same with the horizontal // offset when the image is at the right $this->wm_vrt_alignment = strtoupper($this->wm_vrt_alignment[0]); $this->wm_hor_alignment = strtoupper($this->wm_hor_alignment[0]); if ($this->wm_vrt_alignment === 'B') $this->wm_vrt_offset = $this->wm_vrt_offset * -1; if ($this->wm_hor_alignment === 'R') $this->wm_hor_offset = $this->wm_hor_offset * -1; // Set the base x and y axis values $x_axis = $this->wm_hor_offset + $this->wm_padding; $y_axis = $this->wm_vrt_offset + $this->wm_padding; // Set the vertical position if ($this->wm_vrt_alignment === 'M') { $y_axis += ($this->orig_height / 2) - ($wm_height / 2); } elseif ($this->wm_vrt_alignment === 'B') { $y_axis += $this->orig_height - $wm_height; } // Set the horizontal position if ($this->wm_hor_alignment === 'C') { $x_axis += ($this->orig_width / 2) - ($wm_width / 2); } elseif ($this->wm_hor_alignment === 'R') { $x_axis += $this->orig_width - $wm_width; } // Build the finalized image if ($wm_img_type === 3 && function_exists('imagealphablending')) { @imagealphablending($src_img, TRUE); } // Set RGB values for text and shadow $rgba = imagecolorat($wm_img, $this->wm_x_transp, $this->wm_y_transp); $alpha = ($rgba & 0x7F000000) >> 24; // make a best guess as to whether we're dealing with an image with alpha transparency or no/binary transparency if ($alpha > 0) { // copy the image directly, the image's alpha transparency being the sole determinant of blending imagecopy($src_img, $wm_img, $x_axis, $y_axis, 0, 0, $wm_width, $wm_height); } else { // set our RGB value from above to be transparent and merge the images with the specified opacity imagecolortransparent($wm_img, imagecolorat($wm_img, $this->wm_x_transp, $this->wm_y_transp)); imagecopymerge($src_img, $wm_img, $x_axis, $y_axis, 0, 0, $wm_width, $wm_height, $this->wm_opacity); } // We can preserve transparency for PNG images if ($this->image_type === 3) { imagealphablending($src_img, FALSE); imagesavealpha($src_img, TRUE); } // Output the image if ($this->dynamic_output === TRUE) { $this->image_display_gd($src_img); } elseif ( ! $this->image_save_gd($src_img)) // ... or save it { return FALSE; } imagedestroy($src_img); imagedestroy($wm_img); return TRUE; } // -------------------------------------------------------------------- /** * Watermark - Text Version * * @return bool */ public function text_watermark() { if ( ! ($src_img = $this->image_create_gd())) { return FALSE; } if ($this->wm_use_truetype === TRUE && ! file_exists($this->wm_font_path)) { $this->set_error('imglib_missing_font'); return FALSE; } // Fetch source image properties $this->get_image_properties(); // Reverse the vertical offset // When the image is positioned at the bottom // we don't want the vertical offset to push it // further down. We want the reverse, so we'll // invert the offset. Note: The horizontal // offset flips itself automatically if ($this->wm_vrt_alignment === 'B') { $this->wm_vrt_offset = $this->wm_vrt_offset * -1; } if ($this->wm_hor_alignment === 'R') { $this->wm_hor_offset = $this->wm_hor_offset * -1; } // Set font width and height // These are calculated differently depending on // whether we are using the true type font or not if ($this->wm_use_truetype === TRUE) { if (empty($this->wm_font_size)) { $this->wm_font_size = 17; } if (function_exists('imagettfbbox')) { $temp = imagettfbbox($this->wm_font_size, 0, $this->wm_font_path, $this->wm_text); $temp = $temp[2] - $temp[0]; $fontwidth = $temp / strlen($this->wm_text); } else { $fontwidth = $this->wm_font_size - ($this->wm_font_size / 4); } $fontheight = $this->wm_font_size; $this->wm_vrt_offset += $this->wm_font_size; } else { $fontwidth = imagefontwidth($this->wm_font_size); $fontheight = imagefontheight($this->wm_font_size); } // Set base X and Y axis values $x_axis = $this->wm_hor_offset + $this->wm_padding; $y_axis = $this->wm_vrt_offset + $this->wm_padding; if ($this->wm_use_drop_shadow === FALSE) { $this->wm_shadow_distance = 0; } $this->wm_vrt_alignment = strtoupper($this->wm_vrt_alignment[0]); $this->wm_hor_alignment = strtoupper($this->wm_hor_alignment[0]); // Set vertical alignment if ($this->wm_vrt_alignment === 'M') { $y_axis += ($this->orig_height / 2) + ($fontheight / 2); } elseif ($this->wm_vrt_alignment === 'B') { $y_axis += $this->orig_height - $fontheight - $this->wm_shadow_distance - ($fontheight / 2); } // Set horizontal alignment if ($this->wm_hor_alignment === 'R') { $x_axis += $this->orig_width - ($fontwidth * strlen($this->wm_text)) - $this->wm_shadow_distance; } elseif ($this->wm_hor_alignment === 'C') { $x_axis += floor(($this->orig_width - ($fontwidth * strlen($this->wm_text))) / 2); } if ($this->wm_use_drop_shadow) { // Offset from text $x_shad = $x_axis + $this->wm_shadow_distance; $y_shad = $y_axis + $this->wm_shadow_distance; /* Set RGB values for shadow * * First character is #, so we don't really need it. * Get the rest of the string and split it into 2-length * hex values: */ $drp_color = str_split(substr($this->wm_shadow_color, 1, 6), 2); $drp_color = imagecolorclosest($src_img, hexdec($drp_color[0]), hexdec($drp_color[1]), hexdec($drp_color[2])); // Add the shadow to the source image if ($this->wm_use_truetype) { imagettftext($src_img, $this->wm_font_size, 0, $x_shad, $y_shad, $drp_color, $this->wm_font_path, $this->wm_text); } else { imagestring($src_img, $this->wm_font_size, $x_shad, $y_shad, $this->wm_text, $drp_color); } } /* Set RGB values for text * * First character is #, so we don't really need it. * Get the rest of the string and split it into 2-length * hex values: */ $txt_color = str_split(substr($this->wm_font_color, 1, 6), 2); $txt_color = imagecolorclosest($src_img, hexdec($txt_color[0]), hexdec($txt_color[1]), hexdec($txt_color[2])); // Add the text to the source image if ($this->wm_use_truetype) { imagettftext($src_img, $this->wm_font_size, 0, $x_axis, $y_axis, $txt_color, $this->wm_font_path, $this->wm_text); } else { imagestring($src_img, $this->wm_font_size, $x_axis, $y_axis, $this->wm_text, $txt_color); } // We can preserve transparency for PNG images if ($this->image_type === 3) { imagealphablending($src_img, FALSE); imagesavealpha($src_img, TRUE); } // Output the final image if ($this->dynamic_output === TRUE) { $this->image_display_gd($src_img); } else { $this->image_save_gd($src_img); } imagedestroy($src_img); return TRUE; } // -------------------------------------------------------------------- /** * Create Image - GD * * This simply creates an image resource handle * based on the type of image being processed * * @param string * @param string * @return resource */ public function image_create_gd($path = '', $image_type = '') { if ($path === '') { $path = $this->full_src_path; } if ($image_type === '') { $image_type = $this->image_type; } switch ($image_type) { case 1: if ( ! function_exists('imagecreatefromgif')) { $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_gif_not_supported')); return FALSE; } return imagecreatefromgif($path); case 2: if ( ! function_exists('imagecreatefromjpeg')) { $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_jpg_not_supported')); return FALSE; } return imagecreatefromjpeg($path); case 3: if ( ! function_exists('imagecreatefrompng')) { $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_png_not_supported')); return FALSE; } return imagecreatefrompng($path); default: $this->set_error(array('imglib_unsupported_imagecreate')); return FALSE; } } // -------------------------------------------------------------------- /** * Write image file to disk - GD * * Takes an image resource as input and writes the file * to the specified destination * * @param resource * @return bool */ public function image_save_gd($resource) { switch ($this->image_type) { case 1: if ( ! function_exists('imagegif')) { $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_gif_not_supported')); return FALSE; } if ( ! @imagegif($resource, $this->full_dst_path)) { $this->set_error('imglib_save_failed'); return FALSE; } break; case 2: if ( ! function_exists('imagejpeg')) { $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_jpg_not_supported')); return FALSE; } if ( ! @imagejpeg($resource, $this->full_dst_path, $this->quality)) { $this->set_error('imglib_save_failed'); return FALSE; } break; case 3: if ( ! function_exists('imagepng')) { $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_png_not_supported')); return FALSE; } if ( ! @imagepng($resource, $this->full_dst_path)) { $this->set_error('imglib_save_failed'); return FALSE; } break; default: $this->set_error(array('imglib_unsupported_imagecreate')); return FALSE; break; } return TRUE; } // -------------------------------------------------------------------- /** * Dynamically outputs an image * * @param resource * @return void */ public function image_display_gd($resource) { header('Content-Disposition: filename='.$this->source_image.';'); header('Content-Type: '.$this->mime_type); header('Content-Transfer-Encoding: binary'); header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT'); switch ($this->image_type) { case 1 : imagegif($resource); break; case 2 : imagejpeg($resource, NULL, $this->quality); break; case 3 : imagepng($resource); break; default: echo 'Unable to display the image'; break; } } // -------------------------------------------------------------------- /** * Re-proportion Image Width/Height * * When creating thumbs, the desired width/height * can end up warping the image due to an incorrect * ratio between the full-sized image and the thumb. * * This function lets us re-proportion the width/height * if users choose to maintain the aspect ratio when resizing. * * @return void */ public function image_reproportion() { if (($this->width === 0 && $this->height === 0) OR $this->orig_width === 0 OR $this->orig_height === 0 OR ( ! ctype_digit((string) $this->width) && ! ctype_digit((string) $this->height)) OR ! ctype_digit((string) $this->orig_width) OR ! ctype_digit((string) $this->orig_height)) { return; } // Sanitize $this->width = (int) $this->width; $this->height = (int) $this->height; if ($this->master_dim !== 'width' && $this->master_dim !== 'height') { if ($this->width > 0 && $this->height > 0) { $this->master_dim = ((($this->orig_height/$this->orig_width) - ($this->height/$this->width)) < 0) ? 'width' : 'height'; } else { $this->master_dim = ($this->height === 0) ? 'width' : 'height'; } } elseif (($this->master_dim === 'width' && $this->width === 0) OR ($this->master_dim === 'height' && $this->height === 0)) { return; } if ($this->master_dim === 'width') { $this->height = (int) ceil($this->width*$this->orig_height/$this->orig_width); } else { $this->width = (int) ceil($this->orig_width*$this->height/$this->orig_height); } } // -------------------------------------------------------------------- /** * Get image properties * * A helper function that gets info about the file * * @param string * @param bool * @return mixed */ public function get_image_properties($path = '', $return = FALSE) { // For now we require GD but we should // find a way to determine this using IM or NetPBM if ($path === '') { $path = $this->full_src_path; } if ( ! file_exists($path)) { $this->set_error('imglib_invalid_path'); return FALSE; } $vals = getimagesize($path); if ($vals === FALSE) { $this->set_error('imglib_invalid_image'); return FALSE; } $types = array(1 => 'gif', 2 => 'jpeg', 3 => 'png'); $mime = isset($types[$vals[2]]) ? 'image/'.$types[$vals[2]] : 'image/jpg'; if ($return === TRUE) { return array( 'width' => $vals[0], 'height' => $vals[1], 'image_type' => $vals[2], 'size_str' => $vals[3], 'mime_type' => $mime ); } $this->orig_width = $vals[0]; $this->orig_height = $vals[1]; $this->image_type = $vals[2]; $this->size_str = $vals[3]; $this->mime_type = $mime; return TRUE; } // -------------------------------------------------------------------- /** * Size calculator * * This function takes a known width x height and * recalculates it to a new size. Only one * new variable needs to be known * * $props = array( * 'width' => $width, * 'height' => $height, * 'new_width' => 40, * 'new_height' => '' * ); * * @param array * @return array */ public function size_calculator($vals) { if ( ! is_array($vals)) { return; } $allowed = array('new_width', 'new_height', 'width', 'height'); foreach ($allowed as $item) { if (empty($vals[$item])) { $vals[$item] = 0; } } if ($vals['width'] === 0 OR $vals['height'] === 0) { return $vals; } if ($vals['new_width'] === 0) { $vals['new_width'] = ceil($vals['width']*$vals['new_height']/$vals['height']); } elseif ($vals['new_height'] === 0) { $vals['new_height'] = ceil($vals['new_width']*$vals['height']/$vals['width']); } return $vals; } // -------------------------------------------------------------------- /** * Explode source_image * * This is a helper function that extracts the extension * from the source_image. This function lets us deal with * source_images with multiple periods, like: my.cool.jpg * It returns an associative array with two elements: * $array['ext'] = '.jpg'; * $array['name'] = 'my.cool'; * * @param array * @return array */ public function explode_name($source_image) { $ext = strrchr($source_image, '.'); $name = ($ext === FALSE) ? $source_image : substr($source_image, 0, -strlen($ext)); return array('ext' => $ext, 'name' => $name); } // -------------------------------------------------------------------- /** * Is GD Installed? * * @return bool */ public function gd_loaded() { if ( ! extension_loaded('gd')) { /* As it is stated in the PHP manual, dl() is not always available * and even if so - it could generate an E_WARNING message on failure */ return (function_exists('dl') && @dl('gd.so')); } return TRUE; } // -------------------------------------------------------------------- /** * Get GD version * * @return mixed */ public function gd_version() { if (function_exists('gd_info')) { $gd_version = @gd_info(); return preg_replace('/\D/', '', $gd_version['GD Version']); } return FALSE; } // -------------------------------------------------------------------- /** * Set error message * * @param string * @return void */ public function set_error($msg) { $CI =& get_instance(); $CI->lang->load('imglib'); if (is_array($msg)) { foreach ($msg as $val) { $msg = ($CI->lang->line($val) === FALSE) ? $val : $CI->lang->line($val); $this->error_msg[] = $msg; log_message('error', $msg); } } else { $msg = ($CI->lang->line($msg) === FALSE) ? $msg : $CI->lang->line($msg); $this->error_msg[] = $msg; log_message('error', $msg); } } // -------------------------------------------------------------------- /** * Show error messages * * @param string * @param string * @return string */ public function display_errors($open = '

', $close = '

') { return (count($this->error_msg) > 0) ? $open.implode($close.$open, $this->error_msg).$close : ''; } } PK!»Çø áá+libraries/Cache/drivers/Cache_memcached.phpnu„[µü¤ array( 'host' => '127.0.0.1', 'port' => 11211, 'weight' => 1 ) ); // ------------------------------------------------------------------------ /** * Class constructor * * Setup Memcache(d) * * @return void */ public function __construct() { // Try to load memcached server info from the config file. $CI =& get_instance(); $defaults = $this->_config['default']; if ($CI->config->load('memcached', TRUE, TRUE)) { $this->_config = $CI->config->config['memcached']; } if (class_exists('Memcached', FALSE)) { $this->_memcached = new Memcached(); } elseif (class_exists('Memcache', FALSE)) { $this->_memcached = new Memcache(); } else { log_message('error', 'Cache: Failed to create Memcache(d) object; extension not loaded?'); return; } foreach ($this->_config as $cache_server) { isset($cache_server['hostname']) OR $cache_server['hostname'] = $defaults['host']; isset($cache_server['port']) OR $cache_server['port'] = $defaults['port']; isset($cache_server['weight']) OR $cache_server['weight'] = $defaults['weight']; if ($this->_memcached instanceof Memcache) { // Third parameter is persistence and defaults to TRUE. $this->_memcached->addServer( $cache_server['hostname'], $cache_server['port'], TRUE, $cache_server['weight'] ); } elseif ($this->_memcached instanceof Memcached) { $this->_memcached->addServer( $cache_server['hostname'], $cache_server['port'], $cache_server['weight'] ); } } } // ------------------------------------------------------------------------ /** * Fetch from cache * * @param string $id Cache ID * @return mixed Data on success, FALSE on failure */ public function get($id) { $data = $this->_memcached->get($id); return is_array($data) ? $data[0] : $data; } // ------------------------------------------------------------------------ /** * Save * * @param string $id Cache ID * @param mixed $data Data being cached * @param int $ttl Time to live * @param bool $raw Whether to store the raw value * @return bool TRUE on success, FALSE on failure */ public function save($id, $data, $ttl = 60, $raw = FALSE) { if ($raw !== TRUE) { $data = array($data, time(), $ttl); } if ($this->_memcached instanceof Memcached) { return $this->_memcached->set($id, $data, $ttl); } elseif ($this->_memcached instanceof Memcache) { return $this->_memcached->set($id, $data, 0, $ttl); } return FALSE; } // ------------------------------------------------------------------------ /** * Delete from Cache * * @param mixed $id key to be deleted. * @return bool true on success, false on failure */ public function delete($id) { return $this->_memcached->delete($id); } // ------------------------------------------------------------------------ /** * Increment a raw value * * @param string $id Cache ID * @param int $offset Step/value to add * @return mixed New value on success or FALSE on failure */ public function increment($id, $offset = 1) { if (($result = $this->_memcached->increment($id, $offset)) === FALSE) { return $this->_memcached->add($id, $offset) ? $offset : FALSE; } return $result; } // ------------------------------------------------------------------------ /** * Decrement a raw value * * @param string $id Cache ID * @param int $offset Step/value to reduce by * @return mixed New value on success or FALSE on failure */ public function decrement($id, $offset = 1) { if (($result = $this->_memcached->decrement($id, $offset)) === FALSE) { return $this->_memcached->add($id, 0) ? 0 : FALSE; } return $result; } // ------------------------------------------------------------------------ /** * Clean the Cache * * @return bool false on failure/true on success */ public function clean() { return $this->_memcached->flush(); } // ------------------------------------------------------------------------ /** * Cache Info * * @return mixed array on success, false on failure */ public function cache_info() { return $this->_memcached->getStats(); } // ------------------------------------------------------------------------ /** * Get Cache Metadata * * @param mixed $id key to get cache metadata on * @return mixed FALSE on failure, array on success. */ public function get_metadata($id) { $stored = $this->_memcached->get($id); if (count($stored) !== 3) { return FALSE; } list($data, $time, $ttl) = $stored; return array( 'expire' => $time + $ttl, 'mtime' => $time, 'data' => $data ); } // ------------------------------------------------------------------------ /** * Is supported * * Returns FALSE if memcached is not supported on the system. * If it is, we setup the memcached object & return TRUE * * @return bool */ public function is_supported() { return (extension_loaded('memcached') OR extension_loaded('memcache')); } // ------------------------------------------------------------------------ /** * Class destructor * * Closes the connection to Memcache(d) if present. * * @return void */ public function __destruct() { if ($this->_memcached instanceof Memcache) { $this->_memcached->close(); } elseif ($this->_memcached instanceof Memcached && method_exists($this->_memcached, 'quit')) { $this->_memcached->quit(); } } } PK!ܰJ'óó'libraries/Cache/drivers/Cache_dummy.phpnu„[µü¤load->helper('file'); $path = $CI->config->item('cache_path'); $this->_cache_path = ($path === '') ? APPPATH.'cache/' : $path; } // ------------------------------------------------------------------------ /** * Fetch from cache * * @param string $id Cache ID * @return mixed Data on success, FALSE on failure */ public function get($id) { $data = $this->_get($id); return is_array($data) ? $data['data'] : FALSE; } // ------------------------------------------------------------------------ /** * Save into cache * * @param string $id Cache ID * @param mixed $data Data to store * @param int $ttl Time to live in seconds * @param bool $raw Whether to store the raw value (unused) * @return bool TRUE on success, FALSE on failure */ public function save($id, $data, $ttl = 60, $raw = FALSE) { $contents = array( 'time' => time(), 'ttl' => $ttl, 'data' => $data ); if (write_file($this->_cache_path.$id, serialize($contents))) { chmod($this->_cache_path.$id, 0640); return TRUE; } return FALSE; } // ------------------------------------------------------------------------ /** * Delete from Cache * * @param mixed unique identifier of item in cache * @return bool true on success/false on failure */ public function delete($id) { return is_file($this->_cache_path.$id) ? unlink($this->_cache_path.$id) : FALSE; } // ------------------------------------------------------------------------ /** * Increment a raw value * * @param string $id Cache ID * @param int $offset Step/value to add * @return New value on success, FALSE on failure */ public function increment($id, $offset = 1) { $data = $this->_get($id); if ($data === FALSE) { $data = array('data' => 0, 'ttl' => 60); } elseif ( ! is_int($data['data'])) { return FALSE; } $new_value = $data['data'] + $offset; return $this->save($id, $new_value, $data['ttl']) ? $new_value : FALSE; } // ------------------------------------------------------------------------ /** * Decrement a raw value * * @param string $id Cache ID * @param int $offset Step/value to reduce by * @return New value on success, FALSE on failure */ public function decrement($id, $offset = 1) { $data = $this->_get($id); if ($data === FALSE) { $data = array('data' => 0, 'ttl' => 60); } elseif ( ! is_int($data['data'])) { return FALSE; } $new_value = $data['data'] - $offset; return $this->save($id, $new_value, $data['ttl']) ? $new_value : FALSE; } // ------------------------------------------------------------------------ /** * Clean the Cache * * @return bool false on failure/true on success */ public function clean() { return delete_files($this->_cache_path, FALSE, TRUE); } // ------------------------------------------------------------------------ /** * Cache Info * * Not supported by file-based caching * * @param string user/filehits * @return mixed FALSE */ public function cache_info($type = NULL) { return get_dir_file_info($this->_cache_path); } // ------------------------------------------------------------------------ /** * Get Cache Metadata * * @param mixed key to get cache metadata on * @return mixed FALSE on failure, array on success. */ public function get_metadata($id) { if ( ! is_file($this->_cache_path.$id)) { return FALSE; } $data = unserialize(file_get_contents($this->_cache_path.$id)); if (is_array($data)) { $mtime = filemtime($this->_cache_path.$id); if ( ! isset($data['ttl'], $data['time'])) { return FALSE; } return array( 'expire' => $data['time'] + $data['ttl'], 'mtime' => $mtime ); } return FALSE; } // ------------------------------------------------------------------------ /** * Is supported * * In the file driver, check to see that the cache directory is indeed writable * * @return bool */ public function is_supported() { return is_really_writable($this->_cache_path); } // ------------------------------------------------------------------------ /** * Get all data * * Internal method to get all the relevant data about a cache item * * @param string $id Cache ID * @return mixed Data array on success or FALSE on failure */ protected function _get($id) { if ( ! is_file($this->_cache_path.$id)) { return FALSE; } $data = unserialize(file_get_contents($this->_cache_path.$id)); if ($data['ttl'] > 0 && time() > $data['time'] + $data['ttl']) { file_exists($this->_cache_path.$id) && unlink($this->_cache_path.$id); return FALSE; } return $data; } } PK!õ¶™Óûû'libraries/Cache/drivers/Cache_redis.phpnu„[µü¤ * @link */ class CI_Cache_redis extends CI_Driver { /** * Default config * * @static * @var array */ protected static $_default_config = array( 'socket_type' => 'tcp', 'host' => '127.0.0.1', 'password' => NULL, 'port' => 6379, 'timeout' => 0 ); /** * Redis connection * * @var Redis */ protected $_redis; /** * An internal cache for storing keys of serialized values. * * @var array */ protected $_serialized = array(); /** * del()/delete() method name depending on phpRedis version * * @var string */ protected static $_delete_name; // ------------------------------------------------------------------------ /** * Class constructor * * Setup Redis * * Loads Redis config file if present. Will halt execution * if a Redis connection can't be established. * * @return void * @see Redis::connect() */ public function __construct() { if ( ! $this->is_supported()) { log_message('error', 'Cache: Failed to create Redis object; extension not loaded?'); return; } isset(static::$_delete_name) OR static::$_delete_name = version_compare(phpversion('phpredis'), '5', '>=') ? 'del' : 'delete'; $CI =& get_instance(); if ($CI->config->load('redis', TRUE, TRUE)) { $config = array_merge(self::$_default_config, $CI->config->item('redis')); } else { $config = self::$_default_config; } $this->_redis = new Redis(); try { if ($config['socket_type'] === 'unix') { $success = $this->_redis->connect($config['socket']); } else // tcp socket { $success = $this->_redis->connect($config['host'], $config['port'], $config['timeout']); } if ( ! $success) { log_message('error', 'Cache: Redis connection failed. Check your configuration.'); } if (isset($config['password']) && ! $this->_redis->auth($config['password'])) { log_message('error', 'Cache: Redis authentication failed.'); } } catch (RedisException $e) { log_message('error', 'Cache: Redis connection refused ('.$e->getMessage().')'); } } // ------------------------------------------------------------------------ /** * Get cache * * @param string $key Cache ID * @return mixed */ public function get($key) { $value = $this->_redis->get($key); if ($value !== FALSE && $this->_redis->sIsMember('_ci_redis_serialized', $key)) { return unserialize($value); } return $value; } // ------------------------------------------------------------------------ /** * Save cache * * @param string $id Cache ID * @param mixed $data Data to save * @param int $ttl Time to live in seconds * @param bool $raw Whether to store the raw value (unused) * @return bool TRUE on success, FALSE on failure */ public function save($id, $data, $ttl = 60, $raw = FALSE) { if (is_array($data) OR is_object($data)) { if ( ! $this->_redis->sIsMember('_ci_redis_serialized', $id) && ! $this->_redis->sAdd('_ci_redis_serialized', $id)) { return FALSE; } isset($this->_serialized[$id]) OR $this->_serialized[$id] = TRUE; $data = serialize($data); } else { $this->_redis->sRemove('_ci_redis_serialized', $id); } return $this->_redis->set($id, $data, $ttl); } // ------------------------------------------------------------------------ /** * Delete from cache * * @param string $key Cache key * @return bool */ public function delete($key) { if ($this->_redis->{static::$_delete_name}($key) !== 1) { return FALSE; } $this->_redis->sRemove('_ci_redis_serialized', $key); return TRUE; } // ------------------------------------------------------------------------ /** * Increment a raw value * * @param string $id Cache ID * @param int $offset Step/value to add * @return mixed New value on success or FALSE on failure */ public function increment($id, $offset = 1) { return $this->_redis->incrBy($id, $offset); } // ------------------------------------------------------------------------ /** * Decrement a raw value * * @param string $id Cache ID * @param int $offset Step/value to reduce by * @return mixed New value on success or FALSE on failure */ public function decrement($id, $offset = 1) { return $this->_redis->decrBy($id, $offset); } // ------------------------------------------------------------------------ /** * Clean cache * * @return bool * @see Redis::flushDB() */ public function clean() { return $this->_redis->flushDB(); } // ------------------------------------------------------------------------ /** * Get cache driver info * * @param string $type Not supported in Redis. * Only included in order to offer a * consistent cache API. * @return array * @see Redis::info() */ public function cache_info($type = NULL) { return $this->_redis->info(); } // ------------------------------------------------------------------------ /** * Get cache metadata * * @param string $key Cache key * @return array */ public function get_metadata($key) { $value = $this->get($key); if ($value !== FALSE) { return array( 'expire' => time() + $this->_redis->ttl($key), 'data' => $value ); } return FALSE; } // ------------------------------------------------------------------------ /** * Check if Redis driver is supported * * @return bool */ public function is_supported() { return extension_loaded('redis'); } // ------------------------------------------------------------------------ /** * Class destructor * * Closes the connection to Redis if present. * * @return void */ public function __destruct() { if ($this->_redis) { $this->_redis->close(); } } } PK!¤Hù%libraries/Cache/drivers/Cache_apc.phpnu„[µü¤is_supported()) { log_message('error', 'Cache: Failed to initialize APC; extension not loaded/enabled?'); } } // ------------------------------------------------------------------------ /** * Get * * Look for a value in the cache. If it exists, return the data * if not, return FALSE * * @param string * @return mixed value that is stored/FALSE on failure */ public function get($id) { $success = FALSE; $data = apc_fetch($id, $success); return ($success === TRUE) ? $data : FALSE; } // ------------------------------------------------------------------------ /** * Cache Save * * @param string $id Cache ID * @param mixed $data Data to store * @param int $ttl Length of time (in seconds) to cache the data * @param bool $raw Whether to store the raw value (unused) * @return bool TRUE on success, FALSE on failure */ public function save($id, $data, $ttl = 60, $raw = FALSE) { return apc_store($id, $data, (int) $ttl); } // ------------------------------------------------------------------------ /** * Delete from Cache * * @param mixed unique identifier of the item in the cache * @return bool true on success/false on failure */ public function delete($id) { return apc_delete($id); } // ------------------------------------------------------------------------ /** * Increment a raw value * * @param string $id Cache ID * @param int $offset Step/value to add * @return mixed New value on success or FALSE on failure */ public function increment($id, $offset = 1) { return apc_inc($id, $offset); } // ------------------------------------------------------------------------ /** * Decrement a raw value * * @param string $id Cache ID * @param int $offset Step/value to reduce by * @return mixed New value on success or FALSE on failure */ public function decrement($id, $offset = 1) { return apc_dec($id, $offset); } // ------------------------------------------------------------------------ /** * Clean the cache * * @return bool false on failure/true on success */ public function clean() { return apc_clear_cache('user'); } // ------------------------------------------------------------------------ /** * Cache Info * * @param string user/filehits * @return mixed array on success, false on failure */ public function cache_info($type = NULL) { return apc_cache_info($type); } // ------------------------------------------------------------------------ /** * Get Cache Metadata * * @param mixed key to get cache metadata on * @return mixed array on success/false on failure */ public function get_metadata($id) { $cache_info = apc_cache_info('user', FALSE); if (empty($cache_info) OR empty($cache_info['cache_list'])) { return FALSE; } foreach ($cache_info['cache_list'] as &$entry) { if ($entry['info'] !== $id) { continue; } $success = FALSE; $metadata = array( 'expire' => ($entry['ttl'] ? $entry['mtime'] + $entry['ttl'] : 0), 'mtime' => $entry['ttl'], 'data' => apc_fetch($id, $success) ); return ($success === TRUE) ? $metadata : FALSE; } return FALSE; } // ------------------------------------------------------------------------ /** * is_supported() * * Check to see if APC is available on this system, bail if it isn't. * * @return bool */ public function is_supported() { return (extension_loaded('apc') && ini_get('apc.enabled')); } } PK!‹‰KÃÃ*libraries/Cache/drivers/Cache_wincache.phpnu„[µü¤is_supported()) { log_message('error', 'Cache: Failed to initialize Wincache; extension not loaded/enabled?'); } } // ------------------------------------------------------------------------ /** * Get * * Look for a value in the cache. If it exists, return the data, * if not, return FALSE * * @param string $id Cache Ide * @return mixed Value that is stored/FALSE on failure */ public function get($id) { $success = FALSE; $data = wincache_ucache_get($id, $success); // Success returned by reference from wincache_ucache_get() return ($success) ? $data : FALSE; } // ------------------------------------------------------------------------ /** * Cache Save * * @param string $id Cache ID * @param mixed $data Data to store * @param int $ttl Time to live (in seconds) * @param bool $raw Whether to store the raw value (unused) * @return bool true on success/false on failure */ public function save($id, $data, $ttl = 60, $raw = FALSE) { return wincache_ucache_set($id, $data, $ttl); } // ------------------------------------------------------------------------ /** * Delete from Cache * * @param mixed unique identifier of the item in the cache * @return bool true on success/false on failure */ public function delete($id) { return wincache_ucache_delete($id); } // ------------------------------------------------------------------------ /** * Increment a raw value * * @param string $id Cache ID * @param int $offset Step/value to add * @return mixed New value on success or FALSE on failure */ public function increment($id, $offset = 1) { $success = FALSE; $value = wincache_ucache_inc($id, $offset, $success); return ($success === TRUE) ? $value : FALSE; } // ------------------------------------------------------------------------ /** * Decrement a raw value * * @param string $id Cache ID * @param int $offset Step/value to reduce by * @return mixed New value on success or FALSE on failure */ public function decrement($id, $offset = 1) { $success = FALSE; $value = wincache_ucache_dec($id, $offset, $success); return ($success === TRUE) ? $value : FALSE; } // ------------------------------------------------------------------------ /** * Clean the cache * * @return bool false on failure/true on success */ public function clean() { return wincache_ucache_clear(); } // ------------------------------------------------------------------------ /** * Cache Info * * @return mixed array on success, false on failure */ public function cache_info() { return wincache_ucache_info(TRUE); } // ------------------------------------------------------------------------ /** * Get Cache Metadata * * @param mixed key to get cache metadata on * @return mixed array on success/false on failure */ public function get_metadata($id) { if ($stored = wincache_ucache_info(FALSE, $id)) { $age = $stored['ucache_entries'][1]['age_seconds']; $ttl = $stored['ucache_entries'][1]['ttl_seconds']; $hitcount = $stored['ucache_entries'][1]['hitcount']; return array( 'expire' => $ttl - $age, 'hitcount' => $hitcount, 'age' => $age, 'ttl' => $ttl ); } return FALSE; } // ------------------------------------------------------------------------ /** * is_supported() * * Check to see if WinCache is available on this system, bail if it isn't. * * @return bool */ public function is_supported() { return (extension_loaded('wincache') && ini_get('wincache.ucenabled')); } } PK!®ò(ƒƒ"libraries/Cache/drivers/index.htmlnu„[µü¤ 403 Forbidden

Directory access is forbidden.

PK!”F¡ƒƒlibraries/Cache/Cache.phpnu„[µü¤_adapter = $config['adapter']; isset($config['backup']) && $this->_backup_driver = $config['backup']; isset($config['key_prefix']) && $this->key_prefix = $config['key_prefix']; // If the specified adapter isn't available, check the backup. if ( ! $this->is_supported($this->_adapter)) { if ( ! $this->is_supported($this->_backup_driver)) { // Backup isn't supported either. Default to 'Dummy' driver. log_message('error', 'Cache adapter "'.$this->_adapter.'" and backup "'.$this->_backup_driver.'" are both unavailable. Cache is now using "Dummy" adapter.'); $this->_adapter = 'dummy'; } else { // Backup is supported. Set it to primary. log_message('debug', 'Cache adapter "'.$this->_adapter.'" is unavailable. Falling back to "'.$this->_backup_driver.'" backup adapter.'); $this->_adapter = $this->_backup_driver; } } } // ------------------------------------------------------------------------ /** * Get * * Look for a value in the cache. If it exists, return the data * if not, return FALSE * * @param string $id * @return mixed value matching $id or FALSE on failure */ public function get($id) { return $this->{$this->_adapter}->get($this->key_prefix.$id); } // ------------------------------------------------------------------------ /** * Cache Save * * @param string $id Cache ID * @param mixed $data Data to store * @param int $ttl Cache TTL (in seconds) * @param bool $raw Whether to store the raw value * @return bool TRUE on success, FALSE on failure */ public function save($id, $data, $ttl = 60, $raw = FALSE) { return $this->{$this->_adapter}->save($this->key_prefix.$id, $data, $ttl, $raw); } // ------------------------------------------------------------------------ /** * Delete from Cache * * @param string $id Cache ID * @return bool TRUE on success, FALSE on failure */ public function delete($id) { return $this->{$this->_adapter}->delete($this->key_prefix.$id); } // ------------------------------------------------------------------------ /** * Increment a raw value * * @param string $id Cache ID * @param int $offset Step/value to add * @return mixed New value on success or FALSE on failure */ public function increment($id, $offset = 1) { return $this->{$this->_adapter}->increment($this->key_prefix.$id, $offset); } // ------------------------------------------------------------------------ /** * Decrement a raw value * * @param string $id Cache ID * @param int $offset Step/value to reduce by * @return mixed New value on success or FALSE on failure */ public function decrement($id, $offset = 1) { return $this->{$this->_adapter}->decrement($this->key_prefix.$id, $offset); } // ------------------------------------------------------------------------ /** * Clean the cache * * @return bool TRUE on success, FALSE on failure */ public function clean() { return $this->{$this->_adapter}->clean(); } // ------------------------------------------------------------------------ /** * Cache Info * * @param string $type = 'user' user/filehits * @return mixed array containing cache info on success OR FALSE on failure */ public function cache_info($type = 'user') { return $this->{$this->_adapter}->cache_info($type); } // ------------------------------------------------------------------------ /** * Get Cache Metadata * * @param string $id key to get cache metadata on * @return mixed cache item metadata */ public function get_metadata($id) { return $this->{$this->_adapter}->get_metadata($this->key_prefix.$id); } // ------------------------------------------------------------------------ /** * Is the requested driver supported in this environment? * * @param string $driver The driver to test * @return array */ public function is_supported($driver) { static $support; if ( ! isset($support, $support[$driver])) { $support[$driver] = $this->{$driver}->is_supported(); } return $support[$driver]; } } PK!®ò(ƒƒlibraries/Cache/index.htmlnu„[µü¤ 403 Forbidden

Directory access is forbidden.

PK!⟧9'Û'Ûlibraries/Email.phpnu„[µü¤ '1 (Highest)', 2 => '2 (High)', 3 => '3 (Normal)', 4 => '4 (Low)', 5 => '5 (Lowest)' ); /** * mbstring.func_overload flag * * @var bool */ protected static $func_overload; // -------------------------------------------------------------------- /** * Constructor - Sets Email Preferences * * The constructor can be passed an array of config values * * @param array $config = array() * @return void */ public function __construct(array $config = array()) { $this->charset = config_item('charset'); $this->initialize($config); $this->_safe_mode = ( ! is_php('5.4') && ini_get('safe_mode')); isset(self::$func_overload) OR self::$func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload')); log_message('info', 'Email Class Initialized'); } // -------------------------------------------------------------------- /** * Initialize preferences * * @param array $config * @return CI_Email */ public function initialize(array $config = array()) { $this->clear(); foreach ($config as $key => $val) { if (isset($this->$key)) { $method = 'set_'.$key; if (method_exists($this, $method)) { $this->$method($val); } else { $this->$key = $val; } } } $this->charset = strtoupper($this->charset); $this->_smtp_auth = isset($this->smtp_user[0], $this->smtp_pass[0]); return $this; } // -------------------------------------------------------------------- /** * Initialize the Email Data * * @param bool * @return CI_Email */ public function clear($clear_attachments = FALSE) { $this->_subject = ''; $this->_body = ''; $this->_finalbody = ''; $this->_header_str = ''; $this->_replyto_flag = FALSE; $this->_recipients = array(); $this->_cc_array = array(); $this->_bcc_array = array(); $this->_headers = array(); $this->_debug_msg = array(); $this->set_header('Date', $this->_set_date()); if ($clear_attachments !== FALSE) { $this->_attachments = array(); } return $this; } // -------------------------------------------------------------------- /** * Set FROM * * @param string $from * @param string $name * @param string $return_path = NULL Return-Path * @return CI_Email */ public function from($from, $name = '', $return_path = NULL) { if (preg_match('/\<(.*)\>/', $from, $match)) { $from = $match[1]; } if ($this->validate) { $this->validate_email($this->_str_to_array($from)); if ($return_path) { $this->validate_email($this->_str_to_array($return_path)); } } // prepare the display name if ($name !== '') { // only use Q encoding if there are characters that would require it if ( ! preg_match('/[\200-\377]/', $name)) { // add slashes for non-printing characters, slashes, and double quotes, and surround it in double quotes $name = '"'.addcslashes($name, "\0..\37\177'\"\\").'"'; } else { $name = $this->_prep_q_encoding($name); } } $this->set_header('From', $name.' <'.$from.'>'); isset($return_path) OR $return_path = $from; $this->set_header('Return-Path', '<'.$return_path.'>'); return $this; } // -------------------------------------------------------------------- /** * Set Reply-to * * @param string * @param string * @return CI_Email */ public function reply_to($replyto, $name = '') { if (preg_match('/\<(.*)\>/', $replyto, $match)) { $replyto = $match[1]; } if ($this->validate) { $this->validate_email($this->_str_to_array($replyto)); } if ($name !== '') { // only use Q encoding if there are characters that would require it if ( ! preg_match('/[\200-\377]/', $name)) { // add slashes for non-printing characters, slashes, and double quotes, and surround it in double quotes $name = '"'.addcslashes($name, "\0..\37\177'\"\\").'"'; } else { $name = $this->_prep_q_encoding($name); } } $this->set_header('Reply-To', $name.' <'.$replyto.'>'); $this->_replyto_flag = TRUE; return $this; } // -------------------------------------------------------------------- /** * Set Recipients * * @param string * @return CI_Email */ public function to($to) { $to = $this->_str_to_array($to); $to = $this->clean_email($to); if ($this->validate) { $this->validate_email($to); } if ($this->_get_protocol() !== 'mail') { $this->set_header('To', implode(', ', $to)); } $this->_recipients = $to; return $this; } // -------------------------------------------------------------------- /** * Set CC * * @param string * @return CI_Email */ public function cc($cc) { $cc = $this->clean_email($this->_str_to_array($cc)); if ($this->validate) { $this->validate_email($cc); } $this->set_header('Cc', implode(', ', $cc)); if ($this->_get_protocol() === 'smtp') { $this->_cc_array = $cc; } return $this; } // -------------------------------------------------------------------- /** * Set BCC * * @param string * @param string * @return CI_Email */ public function bcc($bcc, $limit = '') { if ($limit !== '' && is_numeric($limit)) { $this->bcc_batch_mode = TRUE; $this->bcc_batch_size = $limit; } $bcc = $this->clean_email($this->_str_to_array($bcc)); if ($this->validate) { $this->validate_email($bcc); } if ($this->_get_protocol() === 'smtp' OR ($this->bcc_batch_mode && count($bcc) > $this->bcc_batch_size)) { $this->_bcc_array = $bcc; } else { $this->set_header('Bcc', implode(', ', $bcc)); } return $this; } // -------------------------------------------------------------------- /** * Set Email Subject * * @param string * @return CI_Email */ public function subject($subject) { $subject = $this->_prep_q_encoding($subject); $this->set_header('Subject', $subject); return $this; } // -------------------------------------------------------------------- /** * Set Body * * @param string * @return CI_Email */ public function message($body) { $this->_body = rtrim(str_replace("\r", '', $body)); /* strip slashes only if magic quotes is ON if we do it with magic quotes OFF, it strips real, user-inputted chars. NOTE: In PHP 5.4 get_magic_quotes_gpc() will always return 0 and it will probably not exist in future versions at all. */ if ( ! is_php('5.4') && get_magic_quotes_gpc()) { $this->_body = stripslashes($this->_body); } return $this; } // -------------------------------------------------------------------- /** * Assign file attachments * * @param string $file Can be local path, URL or buffered content * @param string $disposition = 'attachment' * @param string $newname = NULL * @param string $mime = '' * @return CI_Email */ public function attach($file, $disposition = '', $newname = NULL, $mime = '') { if ($mime === '') { if (strpos($file, '://') === FALSE && ! file_exists($file)) { $this->_set_error_message('lang:email_attachment_missing', $file); return FALSE; } if ( ! $fp = @fopen($file, 'rb')) { $this->_set_error_message('lang:email_attachment_unreadable', $file); return FALSE; } $file_content = stream_get_contents($fp); $mime = $this->_mime_types(pathinfo($file, PATHINFO_EXTENSION)); fclose($fp); } else { $file_content =& $file; // buffered file } $this->_attachments[] = array( 'name' => array($file, $newname), 'disposition' => empty($disposition) ? 'attachment' : $disposition, // Can also be 'inline' Not sure if it matters 'type' => $mime, 'content' => chunk_split(base64_encode($file_content)), 'multipart' => 'mixed' ); return $this; } // -------------------------------------------------------------------- /** * Set and return attachment Content-ID * * Useful for attached inline pictures * * @param string $filename * @return string */ public function attachment_cid($filename) { for ($i = 0, $c = count($this->_attachments); $i < $c; $i++) { if ($this->_attachments[$i]['name'][0] === $filename) { $this->_attachments[$i]['multipart'] = 'related'; $this->_attachments[$i]['cid'] = uniqid(basename($this->_attachments[$i]['name'][0]).'@'); return $this->_attachments[$i]['cid']; } } return FALSE; } // -------------------------------------------------------------------- /** * Add a Header Item * * @param string * @param string * @return CI_Email */ public function set_header($header, $value) { $this->_headers[$header] = str_replace(array("\n", "\r"), '', $value); return $this; } // -------------------------------------------------------------------- /** * Convert a String to an Array * * @param string * @return array */ protected function _str_to_array($email) { if ( ! is_array($email)) { return (strpos($email, ',') !== FALSE) ? preg_split('/[\s,]/', $email, -1, PREG_SPLIT_NO_EMPTY) : (array) trim($email); } return $email; } // -------------------------------------------------------------------- /** * Set Multipart Value * * @param string * @return CI_Email */ public function set_alt_message($str) { $this->alt_message = (string) $str; return $this; } // -------------------------------------------------------------------- /** * Set Mailtype * * @param string * @return CI_Email */ public function set_mailtype($type = 'text') { $this->mailtype = ($type === 'html') ? 'html' : 'text'; return $this; } // -------------------------------------------------------------------- /** * Set Wordwrap * * @param bool * @return CI_Email */ public function set_wordwrap($wordwrap = TRUE) { $this->wordwrap = (bool) $wordwrap; return $this; } // -------------------------------------------------------------------- /** * Set Protocol * * @param string * @return CI_Email */ public function set_protocol($protocol = 'mail') { $this->protocol = in_array($protocol, $this->_protocols, TRUE) ? strtolower($protocol) : 'mail'; return $this; } // -------------------------------------------------------------------- /** * Set Priority * * @param int * @return CI_Email */ public function set_priority($n = 3) { $this->priority = preg_match('/^[1-5]$/', $n) ? (int) $n : 3; return $this; } // -------------------------------------------------------------------- /** * Set Newline Character * * @param string * @return CI_Email */ public function set_newline($newline = "\n") { $this->newline = in_array($newline, array("\n", "\r\n", "\r")) ? $newline : "\n"; return $this; } // -------------------------------------------------------------------- /** * Set CRLF * * @param string * @return CI_Email */ public function set_crlf($crlf = "\n") { $this->crlf = ($crlf !== "\n" && $crlf !== "\r\n" && $crlf !== "\r") ? "\n" : $crlf; return $this; } // -------------------------------------------------------------------- /** * Get the Message ID * * @return string */ protected function _get_message_id() { $from = str_replace(array('>', '<'), '', $this->_headers['Return-Path']); return '<'.uniqid('').strstr($from, '@').'>'; } // -------------------------------------------------------------------- /** * Get Mail Protocol * * @return mixed */ protected function _get_protocol() { $this->protocol = strtolower($this->protocol); in_array($this->protocol, $this->_protocols, TRUE) OR $this->protocol = 'mail'; return $this->protocol; } // -------------------------------------------------------------------- /** * Get Mail Encoding * * @return string */ protected function _get_encoding() { in_array($this->_encoding, $this->_bit_depths) OR $this->_encoding = '8bit'; foreach ($this->_base_charsets as $charset) { if (strpos($this->charset, $charset) === 0) { $this->_encoding = '7bit'; } } return $this->_encoding; } // -------------------------------------------------------------------- /** * Get content type (text/html/attachment) * * @return string */ protected function _get_content_type() { if ($this->mailtype === 'html') { return empty($this->_attachments) ? 'html' : 'html-attach'; } elseif ($this->mailtype === 'text' && ! empty($this->_attachments)) { return 'plain-attach'; } return 'plain'; } // -------------------------------------------------------------------- /** * Set RFC 822 Date * * @return string */ protected function _set_date() { $timezone = date('Z'); $operator = ($timezone[0] === '-') ? '-' : '+'; $timezone = abs($timezone); $timezone = floor($timezone/3600) * 100 + ($timezone % 3600) / 60; return sprintf('%s %s%04d', date('D, j M Y H:i:s'), $operator, $timezone); } // -------------------------------------------------------------------- /** * Mime message * * @return string */ protected function _get_mime_message() { return 'This is a multi-part message in MIME format.'.$this->newline.'Your email application may not support this format.'; } // -------------------------------------------------------------------- /** * Validate Email Address * * @param string * @return bool */ public function validate_email($email) { if ( ! is_array($email)) { $this->_set_error_message('lang:email_must_be_array'); return FALSE; } foreach ($email as $val) { if ( ! $this->valid_email($val)) { $this->_set_error_message('lang:email_invalid_address', $val); return FALSE; } } return TRUE; } // -------------------------------------------------------------------- /** * Email Validation * * @param string * @return bool */ public function valid_email($email) { if (function_exists('idn_to_ascii') && strpos($email, '@')) { list($account, $domain) = explode('@', $email, 2); $domain = defined('INTL_IDNA_VARIANT_UTS46') ? idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) : idn_to_ascii($domain); if ($domain !== FALSE) { $email = $account.'@'.$domain; } } return (bool) filter_var($email, FILTER_VALIDATE_EMAIL); } // -------------------------------------------------------------------- /** * Clean Extended Email Address: Joe Smith * * @param string * @return string */ public function clean_email($email) { if ( ! is_array($email)) { return preg_match('/\<(.*)\>/', $email, $match) ? $match[1] : $email; } $clean_email = array(); foreach ($email as $addy) { $clean_email[] = preg_match('/\<(.*)\>/', $addy, $match) ? $match[1] : $addy; } return $clean_email; } // -------------------------------------------------------------------- /** * Build alternative plain text message * * Provides the raw message for use in plain-text headers of * HTML-formatted emails. * If the user hasn't specified his own alternative message * it creates one by stripping the HTML * * @return string */ protected function _get_alt_message() { if ( ! empty($this->alt_message)) { return ($this->wordwrap) ? $this->word_wrap($this->alt_message, 76) : $this->alt_message; } $body = preg_match('/\(.*)\<\/body\>/si', $this->_body, $match) ? $match[1] : $this->_body; $body = str_replace("\t", '', preg_replace('# '.$message.PHP_EOL; } // -------------------------------------------------------------------- /** * Byte-safe strlen() * * @param string $str * @return int */ protected static function strlen($str) { return (self::$func_overload) ? mb_strlen($str, '8bit') : strlen($str); } // -------------------------------------------------------------------- /** * Byte-safe substr() * * @param string $str * @param int $start * @param int $length * @return string */ protected static function substr($str, $start, $length = NULL) { if (self::$func_overload) { // mb_substr($str, $start, null, '8bit') returns an empty // string on PHP 5.3 isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start); return mb_substr($str, $start, $length, '8bit'); } return isset($length) ? substr($str, $start, $length) : substr($str, $start); } } PK!(@Ëõa3a3core/Router.phpnu„[µü¤config =& load_class('Config', 'core'); $this->uri =& load_class('URI', 'core'); $this->enable_query_strings = ( ! is_cli() && $this->config->item('enable_query_strings') === TRUE); // If a directory override is configured, it has to be set before any dynamic routing logic is_array($routing) && isset($routing['directory']) && $this->set_directory($routing['directory']); $this->_set_routing(); // Set any routing overrides that may exist in the main index file if (is_array($routing)) { empty($routing['controller']) OR $this->set_class($routing['controller']); empty($routing['function']) OR $this->set_method($routing['function']); } log_message('info', 'Router Class Initialized'); } // -------------------------------------------------------------------- /** * Set route mapping * * Determines what should be served based on the URI request, * as well as any "routes" that have been set in the routing config file. * * @return void */ protected function _set_routing() { // Load the routes.php file. It would be great if we could // skip this for enable_query_strings = TRUE, but then // default_controller would be empty ... if (file_exists(APPPATH.'config/routes.php')) { include(APPPATH.'config/routes.php'); } if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/routes.php')) { include(APPPATH.'config/'.ENVIRONMENT.'/routes.php'); } // Validate & get reserved routes if (isset($route) && is_array($route)) { isset($route['default_controller']) && $this->default_controller = $route['default_controller']; isset($route['translate_uri_dashes']) && $this->translate_uri_dashes = $route['translate_uri_dashes']; unset($route['default_controller'], $route['translate_uri_dashes']); $this->routes = $route; } // Are query strings enabled in the config file? Normally CI doesn't utilize query strings // since URI segments are more search-engine friendly, but they can optionally be used. // If this feature is enabled, we will gather the directory/class/method a little differently if ($this->enable_query_strings) { // If the directory is set at this time, it means an override exists, so skip the checks if ( ! isset($this->directory)) { $_d = $this->config->item('directory_trigger'); $_d = isset($_GET[$_d]) ? trim($_GET[$_d], " \t\n\r\0\x0B/") : ''; if ($_d !== '') { $this->uri->filter_uri($_d); $this->set_directory($_d); } } $_c = trim($this->config->item('controller_trigger')); if ( ! empty($_GET[$_c])) { $this->uri->filter_uri($_GET[$_c]); $this->set_class($_GET[$_c]); $_f = trim($this->config->item('function_trigger')); if ( ! empty($_GET[$_f])) { $this->uri->filter_uri($_GET[$_f]); $this->set_method($_GET[$_f]); } $this->uri->rsegments = array( 1 => $this->class, 2 => $this->method ); } else { $this->_set_default_controller(); } // Routing rules don't apply to query strings and we don't need to detect // directories, so we're done here return; } // Is there anything to parse? if ($this->uri->uri_string !== '') { $this->_parse_routes(); } else { $this->_set_default_controller(); } } // -------------------------------------------------------------------- /** * Set request route * * Takes an array of URI segments as input and sets the class/method * to be called. * * @used-by CI_Router::_parse_routes() * @param array $segments URI segments * @return void */ protected function _set_request($segments = array()) { $segments = $this->_validate_request($segments); // If we don't have any segments left - try the default controller; // WARNING: Directories get shifted out of the segments array! if (empty($segments)) { $this->_set_default_controller(); return; } if ($this->translate_uri_dashes === TRUE) { $segments[0] = str_replace('-', '_', $segments[0]); if (isset($segments[1])) { $segments[1] = str_replace('-', '_', $segments[1]); } } $this->set_class($segments[0]); if (isset($segments[1])) { $this->set_method($segments[1]); } else { $segments[1] = 'index'; } array_unshift($segments, NULL); unset($segments[0]); $this->uri->rsegments = $segments; } // -------------------------------------------------------------------- /** * Set default controller * * @return void */ protected function _set_default_controller() { if (empty($this->default_controller)) { show_error('Unable to determine what should be displayed. A default route has not been specified in the routing file.'); } // Is the method being specified? if (sscanf($this->default_controller, '%[^/]/%s', $class, $method) !== 2) { $method = 'index'; } if ( ! file_exists(APPPATH.'controllers/'.$this->directory.ucfirst($class).'.php')) { // This will trigger 404 later return; } $this->set_class($class); $this->set_method($method); // Assign routed segments, index starting from 1 $this->uri->rsegments = array( 1 => $class, 2 => $method ); log_message('debug', 'No URI present. Default controller set.'); } // -------------------------------------------------------------------- /** * Validate request * * Attempts validate the URI request and determine the controller path. * * @used-by CI_Router::_set_request() * @param array $segments URI segments * @return mixed URI segments */ protected function _validate_request($segments) { $c = count($segments); $directory_override = isset($this->directory); // Loop through our segments and return as soon as a controller // is found or when such a directory doesn't exist while ($c-- > 0) { $test = $this->directory .ucfirst($this->translate_uri_dashes === TRUE ? str_replace('-', '_', $segments[0]) : $segments[0]); if ( ! file_exists(APPPATH.'controllers/'.$test.'.php') && $directory_override === FALSE && is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]) ) { $this->set_directory(array_shift($segments), TRUE); continue; } return $segments; } // This means that all segments were actually directories return $segments; } // -------------------------------------------------------------------- /** * Parse Routes * * Matches any routes that may exist in the config/routes.php file * against the URI to determine if the class/method need to be remapped. * * @return void */ protected function _parse_routes() { // Turn the segment array into a URI string $uri = implode('/', $this->uri->segments); // Get HTTP verb $http_verb = isset($_SERVER['REQUEST_METHOD']) ? strtolower($_SERVER['REQUEST_METHOD']) : 'cli'; // Loop through the route array looking for wildcards foreach ($this->routes as $key => $val) { // Check if route format is using HTTP verbs if (is_array($val)) { $val = array_change_key_case($val, CASE_LOWER); if (isset($val[$http_verb])) { $val = $val[$http_verb]; } else { continue; } } // Convert wildcards to RegEx $key = str_replace(array(':any', ':num'), array('[^/]+', '[0-9]+'), $key); // Does the RegEx match? if (preg_match('#^'.$key.'$#', $uri, $matches)) { // Are we using callbacks to process back-references? if ( ! is_string($val) && is_callable($val)) { // Remove the original string from the matches array. array_shift($matches); // Execute the callback using the values in matches as its parameters. $val = call_user_func_array($val, $matches); } // Are we using the default routing method for back-references? elseif (strpos($val, '$') !== FALSE && strpos($key, '(') !== FALSE) { $val = preg_replace('#^'.$key.'$#', $val, $uri); } $this->_set_request(explode('/', $val)); return; } } // If we got this far it means we didn't encounter a // matching route so we'll set the site default route $this->_set_request(array_values($this->uri->segments)); } // -------------------------------------------------------------------- /** * Set class name * * @param string $class Class name * @return void */ public function set_class($class) { $this->class = str_replace(array('/', '.'), '', $class); } // -------------------------------------------------------------------- /** * Fetch the current class * * @deprecated 3.0.0 Read the 'class' property instead * @return string */ public function fetch_class() { return $this->class; } // -------------------------------------------------------------------- /** * Set method name * * @param string $method Method name * @return void */ public function set_method($method) { $this->method = $method; } // -------------------------------------------------------------------- /** * Fetch the current method * * @deprecated 3.0.0 Read the 'method' property instead * @return string */ public function fetch_method() { return $this->method; } // -------------------------------------------------------------------- /** * Set directory name * * @param string $dir Directory name * @param bool $append Whether we're appending rather than setting the full value * @return void */ public function set_directory($dir, $append = FALSE) { if ($append !== TRUE OR empty($this->directory)) { $this->directory = str_replace('.', '', trim($dir, '/')).'/'; } else { $this->directory .= str_replace('.', '', trim($dir, '/')).'/'; } } // -------------------------------------------------------------------- /** * Fetch directory * * Feches the sub-directory (if any) that contains the requested * controller class. * * @deprecated 3.0.0 Read the 'directory' property instead * @return string */ public function fetch_directory() { return $this->directory; } } PK! Èã¨ÞqÞqcore/Security.phpnu„[µü¤', '<', '>', "'", '"', '&', '$', '#', '{', '}', '[', ']', '=', ';', '?', '%20', '%22', '%3c', // < '%253c', // < '%3e', // > '%0e', // > '%28', // ( '%29', // ) '%2528', // ( '%26', // & '%24', // $ '%3f', // ? '%3b', // ; '%3d' // = ); /** * Character set * * Will be overridden by the constructor. * * @var string */ public $charset = 'UTF-8'; /** * XSS Hash * * Random Hash for protecting URLs. * * @var string */ protected $_xss_hash; /** * CSRF Hash * * Random hash for Cross Site Request Forgery protection cookie * * @var string */ protected $_csrf_hash; /** * CSRF Expire time * * Expiration time for Cross Site Request Forgery protection cookie. * Defaults to two hours (in seconds). * * @var int */ protected $_csrf_expire = 7200; /** * CSRF Token name * * Token name for Cross Site Request Forgery protection cookie. * * @var string */ protected $_csrf_token_name = 'ci_csrf_token'; /** * CSRF Cookie name * * Cookie name for Cross Site Request Forgery protection cookie. * * @var string */ protected $_csrf_cookie_name = 'ci_csrf_token'; /** * List of never allowed strings * * @var array */ protected $_never_allowed_str = array( 'document.cookie' => '[removed]', '(document).cookie' => '[removed]', 'document.write' => '[removed]', '(document).write' => '[removed]', '.parentNode' => '[removed]', '.innerHTML' => '[removed]', '-moz-binding' => '[removed]', '' => '-->', ' '<![CDATA[', '' => '<comment>', '<%' => '<%' ); /** * List of never allowed regex replacements * * @var array */ protected $_never_allowed_regex = array( 'javascript\s*:', '(\(?document\)?|\(?window\)?(\.document)?)\.(location|on\w*)', 'expression\s*(\(|&\#40;)', // CSS and IE 'vbscript\s*:', // IE, surprise! 'wscript\s*:', // IE 'jscript\s*:', // IE 'vbs\s*:', // IE 'Redirect\s+30\d', "([\"'])?data\s*:[^\\1]*?base64[^\\1]*?,[^\\1]*?\\1?" ); /** * Class constructor * * @return void */ public function __construct() { // Is CSRF protection enabled? if (config_item('csrf_protection')) { // CSRF config foreach (array('csrf_expire', 'csrf_token_name', 'csrf_cookie_name') as $key) { if (NULL !== ($val = config_item($key))) { $this->{'_'.$key} = $val; } } // Append application specific cookie prefix if ($cookie_prefix = config_item('cookie_prefix')) { $this->_csrf_cookie_name = $cookie_prefix.$this->_csrf_cookie_name; } // Set the CSRF hash $this->_csrf_set_hash(); } $this->charset = strtoupper(config_item('charset')); log_message('info', 'Security Class Initialized'); } // -------------------------------------------------------------------- /** * CSRF Verify * * @return CI_Security */ public function csrf_verify() { // If it's not a POST request we will set the CSRF cookie if (strtoupper($_SERVER['REQUEST_METHOD']) !== 'POST') { return $this->csrf_set_cookie(); } // Check if URI has been whitelisted from CSRF checks if ($exclude_uris = config_item('csrf_exclude_uris')) { $uri = load_class('URI', 'core'); foreach ($exclude_uris as $excluded) { if (preg_match('#^'.$excluded.'$#i'.(UTF8_ENABLED ? 'u' : ''), $uri->uri_string())) { return $this; } } } // Check CSRF token validity, but don't error on mismatch just yet - we'll want to regenerate $valid = isset($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name]) && is_string($_POST[$this->_csrf_token_name]) && is_string($_COOKIE[$this->_csrf_cookie_name]) && hash_equals($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name]); // We kill this since we're done and we don't want to pollute the _POST array unset($_POST[$this->_csrf_token_name]); // Regenerate on every submission? if (config_item('csrf_regenerate')) { // Nothing should last forever unset($_COOKIE[$this->_csrf_cookie_name]); $this->_csrf_hash = NULL; } $this->_csrf_set_hash(); $this->csrf_set_cookie(); if ($valid !== TRUE) { $this->csrf_show_error(); } log_message('info', 'CSRF token verified'); return $this; } // -------------------------------------------------------------------- /** * CSRF Set Cookie * * @codeCoverageIgnore * @return CI_Security */ public function csrf_set_cookie() { $expire = time() + $this->_csrf_expire; $secure_cookie = (bool) config_item('cookie_secure'); if ($secure_cookie && ! is_https()) { return FALSE; } setcookie( $this->_csrf_cookie_name, $this->_csrf_hash, $expire, config_item('cookie_path'), config_item('cookie_domain'), $secure_cookie, config_item('cookie_httponly') ); log_message('info', 'CSRF cookie sent'); return $this; } // -------------------------------------------------------------------- /** * Show CSRF Error * * @return void */ public function csrf_show_error() { show_error('The action you have requested is not allowed.', 403); } // -------------------------------------------------------------------- /** * Get CSRF Hash * * @see CI_Security::$_csrf_hash * @return string CSRF hash */ public function get_csrf_hash() { return $this->_csrf_hash; } // -------------------------------------------------------------------- /** * Get CSRF Token Name * * @see CI_Security::$_csrf_token_name * @return string CSRF token name */ public function get_csrf_token_name() { return $this->_csrf_token_name; } // -------------------------------------------------------------------- /** * XSS Clean * * Sanitizes data so that Cross Site Scripting Hacks can be * prevented. This method does a fair amount of work but * it is extremely thorough, designed to prevent even the * most obscure XSS attempts. Nothing is ever 100% foolproof, * of course, but I haven't been able to get anything passed * the filter. * * Note: Should only be used to deal with data upon submission. * It's not something that should be used for general * runtime processing. * * @link http://channel.bitflux.ch/wiki/XSS_Prevention * Based in part on some code and ideas from Bitflux. * * @link http://ha.ckers.org/xss.html * To help develop this script I used this great list of * vulnerabilities along with a few other hacks I've * harvested from examining vulnerabilities in other programs. * * @param string|string[] $str Input data * @param bool $is_image Whether the input is an image * @return string */ public function xss_clean($str, $is_image = FALSE) { // Is the string an array? if (is_array($str)) { foreach ($str as $key => &$value) { $str[$key] = $this->xss_clean($value); } return $str; } // Remove Invisible Characters $str = remove_invisible_characters($str); /* * URL Decode * * Just in case stuff like this is submitted: * * Google * * Note: Use rawurldecode() so it does not remove plus signs */ if (stripos($str, '%') !== false) { do { $oldstr = $str; $str = rawurldecode($str); $str = preg_replace_callback('#%(?:\s*[0-9a-f]){2,}#i', array($this, '_urldecodespaces'), $str); } while ($oldstr !== $str); unset($oldstr); } /* * Convert character entities to ASCII * * This permits our tests below to work reliably. * We only convert entities that are within tags since * these are the ones that will pose security problems. */ $str = preg_replace_callback("/[^a-z0-9>]+[a-z0-9]+=([\'\"]).*?\\1/si", array($this, '_convert_attribute'), $str); $str = preg_replace_callback('/<\w+.*/si', array($this, '_decode_entity'), $str); // Remove Invisible Characters Again! $str = remove_invisible_characters($str); /* * Convert all tabs to spaces * * This prevents strings like this: ja vascript * NOTE: we deal with spaces between characters later. * NOTE: preg_replace was found to be amazingly slow here on * large blocks of data, so we use str_replace. */ $str = str_replace("\t", ' ', $str); // Capture converted string for later comparison $converted_string = $str; // Remove Strings that are never allowed $str = $this->_do_never_allowed($str); /* * Makes PHP tags safe * * Note: XML tags are inadvertently replaced too: * * '), array('<?', '?>'), $str); } /* * Compact any exploded words * * This corrects words like: j a v a s c r i p t * These words are compacted back to their correct state. */ $words = array( 'javascript', 'expression', 'vbscript', 'jscript', 'wscript', 'vbs', 'script', 'base64', 'applet', 'alert', 'document', 'write', 'cookie', 'window', 'confirm', 'prompt', 'eval' ); foreach ($words as $word) { $word = implode('\s*', str_split($word)).'\s*'; // We only want to do this when it is followed by a non-word character // That way valid stuff like "dealer to" does not become "dealerto" $str = preg_replace_callback('#('.substr($word, 0, -3).')(\W)#is', array($this, '_compact_exploded_words'), $str); } /* * Remove disallowed Javascript in links or img tags * We used to do some version comparisons and use of stripos(), * but it is dog slow compared to these simplified non-capturing * preg_match(), especially if the pattern exists in the string * * Note: It was reported that not only space characters, but all in * the following pattern can be parsed as separators between a tag name * and its attributes: [\d\s"\'`;,\/\=\(\x00\x0B\x09\x0C] * ... however, remove_invisible_characters() above already strips the * hex-encoded ones, so we'll skip them below. */ do { $original = $str; if (preg_match('/]+([^>]*?)(?:>|$)#si', array($this, '_js_link_removal'), $str); } if (preg_match('/]*?)(?:\s?/?>|$)#si', array($this, '_js_img_removal'), $str); } if (preg_match('/script|xss/i', $str)) { $str = preg_replace('##si', '[removed]', $str); } } while ($original !== $str); unset($original); /* * Sanitize naughty HTML elements * * If a tag containing any of the words in the list * below is found, the tag gets converted to entities. * * So this: * Becomes: <blink> */ $pattern = '#' .'<((?/*\s*)((?[a-z0-9]+)(?=[^a-z0-9]|$)|.+)' // tag start and name, followed by a non-tag character .'[^\s\042\047a-z0-9>/=]*' // a valid attribute character immediately after the tag would count as a separator // optional attributes .'(?(?:[\s\042\047/=]*' // non-attribute characters, excluding > (tag close) for obvious reasons .'[^\s\042\047>/=]+' // attribute characters // optional attribute-value .'(?:\s*=' // attribute-value separator .'(?:[^\s\042\047=><`]+|\s*\042[^\042]*\042|\s*\047[^\047]*\047|\s*(?U:[^\s\042\047=><`]*))' // single, double or non-quoted value .')?' // end optional attribute-value group .')*)' // end optional attributes group .'[^>]*)(?\>)?#isS'; // Note: It would be nice to optimize this for speed, BUT // only matching the naughty elements here results in // false positives and in turn - vulnerabilities! do { $old_str = $str; $str = preg_replace_callback($pattern, array($this, '_sanitize_naughty_html'), $str); } while ($old_str !== $str); unset($old_str); /* * Sanitize naughty scripting elements * * Similar to above, only instead of looking for * tags it looks for PHP and JavaScript commands * that are disallowed. Rather than removing the * code, it simply converts the parenthesis to entities * rendering the code un-executable. * * For example: eval('some code') * Becomes: eval('some code') */ $str = preg_replace( '#(alert|prompt|confirm|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', '\\1\\2(\\3)', $str ); // Same thing, but for "tag functions" (e.g. eval`some code`) // See https://github.com/bcit-ci/CodeIgniter/issues/5420 $str = preg_replace( '#(alert|prompt|confirm|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)`(.*?)`#si', '\\1\\2`\\3`', $str ); // Final clean up // This adds a bit of extra precaution in case // something got through the above filters $str = $this->_do_never_allowed($str); /* * Images are Handled in a Special Way * - Essentially, we want to know that after all of the character * conversion is done whether any unwanted, likely XSS, code was found. * If not, we return TRUE, as the image is clean. * However, if the string post-conversion does not matched the * string post-removal of XSS, then it fails, as there was unwanted XSS * code found and removed/changed during processing. */ if ($is_image === TRUE) { return ($str === $converted_string); } return $str; } // -------------------------------------------------------------------- /** * XSS Hash * * Generates the XSS hash if needed and returns it. * * @see CI_Security::$_xss_hash * @return string XSS hash */ public function xss_hash() { if ($this->_xss_hash === NULL) { $rand = $this->get_random_bytes(16); $this->_xss_hash = ($rand === FALSE) ? md5(uniqid(mt_rand(), TRUE)) : bin2hex($rand); } return $this->_xss_hash; } // -------------------------------------------------------------------- /** * Get random bytes * * @param int $length Output length * @return string */ public function get_random_bytes($length) { if (empty($length) OR ! ctype_digit((string) $length)) { return FALSE; } if (function_exists('random_bytes')) { try { // The cast is required to avoid TypeError return random_bytes((int) $length); } catch (Exception $e) { // If random_bytes() can't do the job, we can't either ... // There's no point in using fallbacks. log_message('error', $e->getMessage()); return FALSE; } } // Unfortunately, none of the following PRNGs is guaranteed to exist ... if (defined('MCRYPT_DEV_URANDOM') && ($output = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM)) !== FALSE) { return $output; } if (is_readable('/dev/urandom') && ($fp = fopen('/dev/urandom', 'rb')) !== FALSE) { // Try not to waste entropy ... is_php('5.4') && stream_set_chunk_size($fp, $length); $output = fread($fp, $length); fclose($fp); if ($output !== FALSE) { return $output; } } if (function_exists('openssl_random_pseudo_bytes')) { return openssl_random_pseudo_bytes($length); } return FALSE; } // -------------------------------------------------------------------- /** * HTML Entities Decode * * A replacement for html_entity_decode() * * The reason we are not using html_entity_decode() by itself is because * while it is not technically correct to leave out the semicolon * at the end of an entity most browsers will still interpret the entity * correctly. html_entity_decode() does not convert entities without * semicolons, so we are left with our own little solution here. Bummer. * * @link http://php.net/html-entity-decode * * @param string $str Input * @param string $charset Character set * @return string */ public function entity_decode($str, $charset = NULL) { if (strpos($str, '&') === FALSE) { return $str; } static $_entities; isset($charset) OR $charset = $this->charset; $flag = is_php('5.4') ? ENT_COMPAT | ENT_HTML5 : ENT_COMPAT; if ( ! isset($_entities)) { $_entities = array_map('strtolower', get_html_translation_table(HTML_ENTITIES, $flag, $charset)); // If we're not on PHP 5.4+, add the possibly dangerous HTML 5 // entities to the array manually if ($flag === ENT_COMPAT) { $_entities[':'] = ':'; $_entities['('] = '('; $_entities[')'] = ')'; $_entities["\n"] = ' '; $_entities["\t"] = ' '; } } do { $str_compare = $str; // Decode standard entities, avoiding false positives if (preg_match_all('/&[a-z]{2,}(?![a-z;])/i', $str, $matches)) { $replace = array(); $matches = array_unique(array_map('strtolower', $matches[0])); foreach ($matches as &$match) { if (($char = array_search($match.';', $_entities, TRUE)) !== FALSE) { $replace[$match] = $char; } } $str = str_replace(array_keys($replace), array_values($replace), $str); } // Decode numeric & UTF16 two byte entities $str = html_entity_decode( preg_replace('/(&#(?:x0*[0-9a-f]{2,5}(?![0-9a-f;])|(?:0*\d{2,4}(?![0-9;]))))/iS', '$1;', $str), $flag, $charset ); if ($flag === ENT_COMPAT) { $str = str_replace(array_values($_entities), array_keys($_entities), $str); } } while ($str_compare !== $str); return $str; } // -------------------------------------------------------------------- /** * Sanitize Filename * * @param string $str Input file name * @param bool $relative_path Whether to preserve paths * @return string */ public function sanitize_filename($str, $relative_path = FALSE) { $bad = $this->filename_bad_chars; if ( ! $relative_path) { $bad[] = './'; $bad[] = '/'; } $str = remove_invisible_characters($str, FALSE); do { $old = $str; $str = str_replace($bad, '', $str); } while ($old !== $str); return stripslashes($str); } // ---------------------------------------------------------------- /** * Strip Image Tags * * @param string $str * @return string */ public function strip_image_tags($str) { return preg_replace( array( '##i', '#`]+)).*?\>#i' ), '\\2', $str ); } // ---------------------------------------------------------------- /** * URL-decode taking spaces into account * * @see https://github.com/bcit-ci/CodeIgniter/issues/4877 * @param array $matches * @return string */ protected function _urldecodespaces($matches) { $input = $matches[0]; $nospaces = preg_replace('#\s+#', '', $input); return ($nospaces === $input) ? $input : rawurldecode($nospaces); } // ---------------------------------------------------------------- /** * Compact Exploded Words * * Callback method for xss_clean() to remove whitespace from * things like 'j a v a s c r i p t'. * * @used-by CI_Security::xss_clean() * @param array $matches * @return string */ protected function _compact_exploded_words($matches) { return preg_replace('/\s+/s', '', $matches[1]).$matches[2]; } // -------------------------------------------------------------------- /** * Sanitize Naughty HTML * * Callback method for xss_clean() to remove naughty HTML elements. * * @used-by CI_Security::xss_clean() * @param array $matches * @return string */ protected function _sanitize_naughty_html($matches) { static $naughty_tags = array( 'alert', 'area', 'prompt', 'confirm', 'applet', 'audio', 'basefont', 'base', 'behavior', 'bgsound', 'blink', 'body', 'embed', 'expression', 'form', 'frameset', 'frame', 'head', 'html', 'ilayer', 'iframe', 'input', 'button', 'select', 'isindex', 'layer', 'link', 'meta', 'keygen', 'object', 'plaintext', 'style', 'script', 'textarea', 'title', 'math', 'video', 'svg', 'xml', 'xss' ); static $evil_attributes = array( 'on\w+', 'style', 'xmlns', 'formaction', 'form', 'xlink:href', 'FSCommand', 'seekSegmentTime' ); // First, escape unclosed tags if (empty($matches['closeTag'])) { return '<'.$matches[1]; } // Is the element that we caught naughty? If so, escape it elseif (in_array(strtolower($matches['tagName']), $naughty_tags, TRUE)) { return '<'.$matches[1].'>'; } // For other tags, see if their attributes are "evil" and strip those elseif (isset($matches['attributes'])) { // We'll store the already filtered attributes here $attributes = array(); // Attribute-catching pattern $attributes_pattern = '#' .'(?[^\s\042\047>/=]+)' // attribute characters // optional attribute-value .'(?:\s*=(?[^\s\042\047=><`]+|\s*\042[^\042]*\042|\s*\047[^\047]*\047|\s*(?U:[^\s\042\047=><`]*)))' // attribute-value separator .'#i'; // Blacklist pattern for evil attribute names $is_evil_pattern = '#^('.implode('|', $evil_attributes).')$#i'; // Each iteration filters a single attribute do { // Strip any non-alpha characters that may precede an attribute. // Browsers often parse these incorrectly and that has been a // of numerous XSS issues we've had. $matches['attributes'] = preg_replace('#^[^a-z]+#i', '', $matches['attributes']); if ( ! preg_match($attributes_pattern, $matches['attributes'], $attribute, PREG_OFFSET_CAPTURE)) { // No (valid) attribute found? Discard everything else inside the tag break; } if ( // Is it indeed an "evil" attribute? preg_match($is_evil_pattern, $attribute['name'][0]) // Or does it have an equals sign, but no value and not quoted? Strip that too! OR (trim($attribute['value'][0]) === '') ) { $attributes[] = 'xss=removed'; } else { $attributes[] = $attribute[0][0]; } $matches['attributes'] = substr($matches['attributes'], $attribute[0][1] + strlen($attribute[0][0])); } while ($matches['attributes'] !== ''); $attributes = empty($attributes) ? '' : ' '.implode(' ', $attributes); return '<'.$matches['slash'].$matches['tagName'].$attributes.'>'; } return $matches[0]; } // -------------------------------------------------------------------- /** * JS Link Removal * * Callback method for xss_clean() to sanitize links. * * This limits the PCRE backtracks, making it more performance friendly * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in * PHP 5.2+ on link-heavy strings. * * @used-by CI_Security::xss_clean() * @param array $match * @return string */ protected function _js_link_removal($match) { return str_replace( $match[1], preg_replace( '#href=.*?(?:(?:alert|prompt|confirm)(?:\(|&\#40;|`|&\#96;)|javascript:|livescript:|mocha:|charset=|window\.|\(?document\)?\.|\.cookie|_filter_attributes($match[1]) ), $match[0] ); } // -------------------------------------------------------------------- /** * JS Image Removal * * Callback method for xss_clean() to sanitize image tags. * * This limits the PCRE backtracks, making it more performance friendly * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in * PHP 5.2+ on image tag heavy strings. * * @used-by CI_Security::xss_clean() * @param array $match * @return string */ protected function _js_img_removal($match) { return str_replace( $match[1], preg_replace( '#src=.*?(?:(?:alert|prompt|confirm|eval)(?:\(|&\#40;|`|&\#96;)|javascript:|livescript:|mocha:|charset=|window\.|\(?document\)?\.|\.cookie|_filter_attributes($match[1]) ), $match[0] ); } // -------------------------------------------------------------------- /** * Attribute Conversion * * @used-by CI_Security::xss_clean() * @param array $match * @return string */ protected function _convert_attribute($match) { return str_replace(array('>', '<', '\\'), array('>', '<', '\\\\'), $match[0]); } // -------------------------------------------------------------------- /** * Filter Attributes * * Filters tag attributes for consistency and safety. * * @used-by CI_Security::_js_img_removal() * @used-by CI_Security::_js_link_removal() * @param string $str * @return string */ protected function _filter_attributes($str) { $out = ''; if (preg_match_all('#\s*[a-z\-]+\s*=\s*(\042|\047)([^\\1]*?)\\1#is', $str, $matches)) { foreach ($matches[0] as $match) { $out .= preg_replace('#/\*.*?\*/#s', '', $match); } } return $out; } // -------------------------------------------------------------------- /** * HTML Entity Decode Callback * * @used-by CI_Security::xss_clean() * @param array $match * @return string */ protected function _decode_entity($match) { // Protect GET variables in URLs // 901119URL5918AMP18930PROTECT8198 $match = preg_replace('|\&([a-z\_0-9\-]+)\=([a-z\_0-9\-/]+)|i', $this->xss_hash().'\\1=\\2', $match[0]); // Decode, then un-protect URL GET vars return str_replace( $this->xss_hash(), '&', $this->entity_decode($match, $this->charset) ); } // -------------------------------------------------------------------- /** * Do Never Allowed * * @used-by CI_Security::xss_clean() * @param string * @return string */ protected function _do_never_allowed($str) { $str = str_replace(array_keys($this->_never_allowed_str), $this->_never_allowed_str, $str); foreach ($this->_never_allowed_regex as $regex) { $str = preg_replace('#'.$regex.'#is', '[removed]', $str); } return $str; } // -------------------------------------------------------------------- /** * Set CSRF Hash and Cookie * * @return string */ protected function _csrf_set_hash() { if ($this->_csrf_hash === NULL) { // If the cookie exists we will use its value. // We don't necessarily want to regenerate it with // each page load since a page could contain embedded // sub-pages causing this feature to fail if (isset($_COOKIE[$this->_csrf_cookie_name]) && is_string($_COOKIE[$this->_csrf_cookie_name]) && preg_match('#^[0-9a-f]{32}$#iS', $_COOKIE[$this->_csrf_cookie_name]) === 1) { return $this->_csrf_hash = $_COOKIE[$this->_csrf_cookie_name]; } $rand = $this->get_random_bytes(16); $this->_csrf_hash = ($rand === FALSE) ? md5(uniqid(mt_rand(), TRUE)) : bin2hex($rand); } return $this->_csrf_hash; } } PK!—E¦U>$>$core/Config.phpnu„[µü¤config =& get_config(); // Set the base_url automatically if none was provided if (empty($this->config['base_url'])) { if (isset($_SERVER['SERVER_ADDR'])) { if (strpos($_SERVER['SERVER_ADDR'], ':') !== FALSE) { $server_addr = '['.$_SERVER['SERVER_ADDR'].']'; } else { $server_addr = $_SERVER['SERVER_ADDR']; } $base_url = (is_https() ? 'https' : 'http').'://'.$server_addr .substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'], basename($_SERVER['SCRIPT_FILENAME']))); } else { $base_url = 'http://localhost/'; } $this->set_item('base_url', $base_url); } log_message('info', 'Config Class Initialized'); } // -------------------------------------------------------------------- /** * Load Config File * * @param string $file Configuration file name * @param bool $use_sections Whether configuration values should be loaded into their own section * @param bool $fail_gracefully Whether to just return FALSE or display an error message * @return bool TRUE if the file was loaded correctly or FALSE on failure */ public function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE) { $file = ($file === '') ? 'config' : str_replace('.php', '', $file); $loaded = FALSE; foreach ($this->_config_paths as $path) { foreach (array($file, ENVIRONMENT.DIRECTORY_SEPARATOR.$file) as $location) { $file_path = $path.'config/'.$location.'.php'; if (in_array($file_path, $this->is_loaded, TRUE)) { return TRUE; } if ( ! file_exists($file_path)) { continue; } include($file_path); if ( ! isset($config) OR ! is_array($config)) { if ($fail_gracefully === TRUE) { return FALSE; } show_error('Your '.$file_path.' file does not appear to contain a valid configuration array.'); } if ($use_sections === TRUE) { $this->config[$file] = isset($this->config[$file]) ? array_merge($this->config[$file], $config) : $config; } else { $this->config = array_merge($this->config, $config); } $this->is_loaded[] = $file_path; $config = NULL; $loaded = TRUE; log_message('debug', 'Config file loaded: '.$file_path); } } if ($loaded === TRUE) { return TRUE; } elseif ($fail_gracefully === TRUE) { return FALSE; } show_error('The configuration file '.$file.'.php does not exist.'); } // -------------------------------------------------------------------- /** * Fetch a config file item * * @param string $item Config item name * @param string $index Index name * @return string|null The configuration item or NULL if the item doesn't exist */ public function item($item, $index = '') { if ($index == '') { return isset($this->config[$item]) ? $this->config[$item] : NULL; } return isset($this->config[$index], $this->config[$index][$item]) ? $this->config[$index][$item] : NULL; } // -------------------------------------------------------------------- /** * Fetch a config file item with slash appended (if not empty) * * @param string $item Config item name * @return string|null The configuration item or NULL if the item doesn't exist */ public function slash_item($item) { if ( ! isset($this->config[$item])) { return NULL; } elseif (trim($this->config[$item]) === '') { return ''; } return rtrim($this->config[$item], '/').'/'; } // -------------------------------------------------------------------- /** * Site URL * * Returns base_url . index_page [. uri_string] * * @uses CI_Config::_uri_string() * * @param string|string[] $uri URI string or an array of segments * @param string $protocol * @return string */ public function site_url($uri = '', $protocol = NULL) { $base_url = $this->slash_item('base_url'); if (isset($protocol)) { // For protocol-relative links if ($protocol === '') { $base_url = substr($base_url, strpos($base_url, '//')); } else { $base_url = $protocol.substr($base_url, strpos($base_url, '://')); } } if (empty($uri)) { return $base_url.$this->item('index_page'); } $uri = $this->_uri_string($uri); if ($this->item('enable_query_strings') === FALSE) { $suffix = isset($this->config['url_suffix']) ? $this->config['url_suffix'] : ''; if ($suffix !== '') { if (($offset = strpos($uri, '?')) !== FALSE) { $uri = substr($uri, 0, $offset).$suffix.substr($uri, $offset); } else { $uri .= $suffix; } } return $base_url.$this->slash_item('index_page').$uri; } elseif (strpos($uri, '?') === FALSE) { $uri = '?'.$uri; } return $base_url.$this->item('index_page').$uri; } // ------------------------------------------------------------- /** * Base URL * * Returns base_url [. uri_string] * * @uses CI_Config::_uri_string() * * @param string|string[] $uri URI string or an array of segments * @param string $protocol * @return string */ public function base_url($uri = '', $protocol = NULL) { $base_url = $this->slash_item('base_url'); if (isset($protocol)) { // For protocol-relative links if ($protocol === '') { $base_url = substr($base_url, strpos($base_url, '//')); } else { $base_url = $protocol.substr($base_url, strpos($base_url, '://')); } } return $base_url.$this->_uri_string($uri); } // ------------------------------------------------------------- /** * Build URI string * * @used-by CI_Config::site_url() * @used-by CI_Config::base_url() * * @param string|string[] $uri URI string or an array of segments * @return string */ protected function _uri_string($uri) { if ($this->item('enable_query_strings') === FALSE) { is_array($uri) && $uri = implode('/', $uri); return ltrim($uri, '/'); } elseif (is_array($uri)) { return http_build_query($uri); } return $uri; } // -------------------------------------------------------------------- /** * System URL * * @deprecated 3.0.0 Encourages insecure practices * @return string */ public function system_url() { $x = explode('/', preg_replace('|/*(.+?)/*$|', '\\1', BASEPATH)); return $this->slash_item('base_url').end($x).'/'; } // -------------------------------------------------------------------- /** * Set a config file item * * @param string $item Config item key * @param string $value Config item value * @return void */ public function set_item($item, $value) { $this->config[$item] = $value; } } PK!Çoô6@@ core/Utf8.phpnu„[µü¤is_ascii($str) === FALSE) { if (MB_ENABLED) { $str = mb_convert_encoding($str, 'UTF-8', 'UTF-8'); } elseif (ICONV_ENABLED) { $str = @iconv('UTF-8', 'UTF-8//IGNORE', $str); } } return $str; } // -------------------------------------------------------------------- /** * Remove ASCII control characters * * Removes all ASCII control characters except horizontal tabs, * line feeds, and carriage returns, as all others can cause * problems in XML. * * @param string $str String to clean * @return string */ public function safe_ascii_for_xml($str) { return remove_invisible_characters($str, FALSE); } // -------------------------------------------------------------------- /** * Convert to UTF-8 * * Attempts to convert a string to UTF-8. * * @param string $str Input string * @param string $encoding Input encoding * @return string $str encoded in UTF-8 or FALSE on failure */ public function convert_to_utf8($str, $encoding) { if (MB_ENABLED) { return mb_convert_encoding($str, 'UTF-8', $encoding); } elseif (ICONV_ENABLED) { return @iconv($encoding, 'UTF-8', $str); } return FALSE; } // -------------------------------------------------------------------- /** * Is ASCII? * * Tests if a string is standard 7-bit ASCII or not. * * @param string $str String to check * @return bool */ public function is_ascii($str) { return (preg_match('/[^\x00-\x7F]/S', $str) === 0); } } PK!΂¢žò>ò>core/CodeIgniter.phpnu„[µü¤ '_ENV', 'G' => '_GET', 'P' => '_POST', 'C' => '_COOKIE', 'S' => '_SERVER') as $key => $superglobal) { if (strpos($_registered, $key) === FALSE) { continue; } foreach (array_keys($$superglobal) as $var) { if (isset($GLOBALS[$var]) && ! in_array($var, $_protected, TRUE)) { $GLOBALS[$var] = NULL; } } } } } /* * ------------------------------------------------------ * Define a custom error handler so we can log PHP errors * ------------------------------------------------------ */ set_error_handler('_error_handler'); set_exception_handler('_exception_handler'); register_shutdown_function('_shutdown_handler'); /* * ------------------------------------------------------ * Set the subclass_prefix * ------------------------------------------------------ * * Normally the "subclass_prefix" is set in the config file. * The subclass prefix allows CI to know if a core class is * being extended via a library in the local application * "libraries" folder. Since CI allows config items to be * overridden via data set in the main index.php file, * before proceeding we need to know if a subclass_prefix * override exists. If so, we will set this value now, * before any classes are loaded * Note: Since the config file data is cached it doesn't * hurt to load it here. */ if ( ! empty($assign_to_config['subclass_prefix'])) { get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix'])); } /* * ------------------------------------------------------ * Should we use a Composer autoloader? * ------------------------------------------------------ */ if ($composer_autoload = config_item('composer_autoload')) { if ($composer_autoload === TRUE) { file_exists(APPPATH.'vendor/autoload.php') ? require_once(APPPATH.'vendor/autoload.php') : log_message('error', '$config[\'composer_autoload\'] is set to TRUE but '.APPPATH.'vendor/autoload.php was not found.'); } elseif (file_exists($composer_autoload)) { require_once($composer_autoload); } else { log_message('error', 'Could not find the specified $config[\'composer_autoload\'] path: '.$composer_autoload); } } /* * ------------------------------------------------------ * Start the timer... tick tock tick tock... * ------------------------------------------------------ */ $BM =& load_class('Benchmark', 'core'); $BM->mark('total_execution_time_start'); $BM->mark('loading_time:_base_classes_start'); /* * ------------------------------------------------------ * Instantiate the hooks class * ------------------------------------------------------ */ $EXT =& load_class('Hooks', 'core'); /* * ------------------------------------------------------ * Is there a "pre_system" hook? * ------------------------------------------------------ */ $EXT->call_hook('pre_system'); /* * ------------------------------------------------------ * Instantiate the config class * ------------------------------------------------------ * * Note: It is important that Config is loaded first as * most other classes depend on it either directly or by * depending on another class that uses it. * */ $CFG =& load_class('Config', 'core'); // Do we have any manually set config items in the index.php file? if (isset($assign_to_config) && is_array($assign_to_config)) { foreach ($assign_to_config as $key => $value) { $CFG->set_item($key, $value); } } /* * ------------------------------------------------------ * Important charset-related stuff * ------------------------------------------------------ * * Configure mbstring and/or iconv if they are enabled * and set MB_ENABLED and ICONV_ENABLED constants, so * that we don't repeatedly do extension_loaded() or * function_exists() calls. * * Note: UTF-8 class depends on this. It used to be done * in it's constructor, but it's _not_ class-specific. * */ $charset = strtoupper(config_item('charset')); ini_set('default_charset', $charset); if (extension_loaded('mbstring')) { define('MB_ENABLED', TRUE); // mbstring.internal_encoding is deprecated starting with PHP 5.6 // and it's usage triggers E_DEPRECATED messages. @ini_set('mbstring.internal_encoding', $charset); // This is required for mb_convert_encoding() to strip invalid characters. // That's utilized by CI_Utf8, but it's also done for consistency with iconv. mb_substitute_character('none'); } else { define('MB_ENABLED', FALSE); } // There's an ICONV_IMPL constant, but the PHP manual says that using // iconv's predefined constants is "strongly discouraged". if (extension_loaded('iconv')) { define('ICONV_ENABLED', TRUE); // iconv.internal_encoding is deprecated starting with PHP 5.6 // and it's usage triggers E_DEPRECATED messages. @ini_set('iconv.internal_encoding', $charset); } else { define('ICONV_ENABLED', FALSE); } if (is_php('5.6')) { ini_set('php.internal_encoding', $charset); } /* * ------------------------------------------------------ * Load compatibility features * ------------------------------------------------------ */ require_once(BASEPATH.'core/compat/mbstring.php'); require_once(BASEPATH.'core/compat/hash.php'); require_once(BASEPATH.'core/compat/password.php'); require_once(BASEPATH.'core/compat/standard.php'); /* * ------------------------------------------------------ * Instantiate the UTF-8 class * ------------------------------------------------------ */ $UNI =& load_class('Utf8', 'core'); /* * ------------------------------------------------------ * Instantiate the URI class * ------------------------------------------------------ */ $URI =& load_class('URI', 'core'); /* * ------------------------------------------------------ * Instantiate the routing class and set the routing * ------------------------------------------------------ */ $RTR =& load_class('Router', 'core', isset($routing) ? $routing : NULL); /* * ------------------------------------------------------ * Instantiate the output class * ------------------------------------------------------ */ $OUT =& load_class('Output', 'core'); /* * ------------------------------------------------------ * Is there a valid cache file? If so, we're done... * ------------------------------------------------------ */ if ($EXT->call_hook('cache_override') === FALSE && $OUT->_display_cache($CFG, $URI) === TRUE) { exit; } /* * ----------------------------------------------------- * Load the security class for xss and csrf support * ----------------------------------------------------- */ $SEC =& load_class('Security', 'core'); /* * ------------------------------------------------------ * Load the Input class and sanitize globals * ------------------------------------------------------ */ $IN =& load_class('Input', 'core'); /* * ------------------------------------------------------ * Load the Language class * ------------------------------------------------------ */ $LANG =& load_class('Lang', 'core'); /* * ------------------------------------------------------ * Load the app controller and local controller * ------------------------------------------------------ * */ // Load the base controller class require_once BASEPATH.'core/Controller.php'; /** * Reference to the CI_Controller method. * * Returns current CI instance object * * @return CI_Controller */ function &get_instance() { return CI_Controller::get_instance(); } if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php')) { require_once APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'; } // Set a mark point for benchmarking $BM->mark('loading_time:_base_classes_end'); /* * ------------------------------------------------------ * Sanity checks * ------------------------------------------------------ * * The Router class has already validated the request, * leaving us with 3 options here: * * 1) an empty class name, if we reached the default * controller, but it didn't exist; * 2) a query string which doesn't go through a * file_exists() check * 3) a regular request for a non-existing page * * We handle all of these as a 404 error. * * Furthermore, none of the methods in the app controller * or the loader class can be called via the URI, nor can * controller methods that begin with an underscore. */ $e404 = FALSE; $class = ucfirst($RTR->class); $method = $RTR->method; if (empty($class) OR ! file_exists(APPPATH.'controllers/'.$RTR->directory.$class.'.php')) { $e404 = TRUE; } else { require_once(APPPATH.'controllers/'.$RTR->directory.$class.'.php'); if ( ! class_exists($class, FALSE) OR $method[0] === '_' OR method_exists('CI_Controller', $method)) { $e404 = TRUE; } elseif (method_exists($class, '_remap')) { $params = array($method, array_slice($URI->rsegments, 2)); $method = '_remap'; } elseif ( ! method_exists($class, $method)) { $e404 = TRUE; } /** * DO NOT CHANGE THIS, NOTHING ELSE WORKS! * * - method_exists() returns true for non-public methods, which passes the previous elseif * - is_callable() returns false for PHP 4-style constructors, even if there's a __construct() * - method_exists($class, '__construct') won't work because CI_Controller::__construct() is inherited * - People will only complain if this doesn't work, even though it is documented that it shouldn't. * * ReflectionMethod::isConstructor() is the ONLY reliable check, * knowing which method will be executed as a constructor. */ elseif ( ! is_callable(array($class, $method))) { $reflection = new ReflectionMethod($class, $method); if ( ! $reflection->isPublic() OR $reflection->isConstructor()) { $e404 = TRUE; } } } if ($e404) { if ( ! empty($RTR->routes['404_override'])) { if (sscanf($RTR->routes['404_override'], '%[^/]/%s', $error_class, $error_method) !== 2) { $error_method = 'index'; } $error_class = ucfirst($error_class); if ( ! class_exists($error_class, FALSE)) { if (file_exists(APPPATH.'controllers/'.$RTR->directory.$error_class.'.php')) { require_once(APPPATH.'controllers/'.$RTR->directory.$error_class.'.php'); $e404 = ! class_exists($error_class, FALSE); } // Were we in a directory? If so, check for a global override elseif ( ! empty($RTR->directory) && file_exists(APPPATH.'controllers/'.$error_class.'.php')) { require_once(APPPATH.'controllers/'.$error_class.'.php'); if (($e404 = ! class_exists($error_class, FALSE)) === FALSE) { $RTR->directory = ''; } } } else { $e404 = FALSE; } } // Did we reset the $e404 flag? If so, set the rsegments, starting from index 1 if ( ! $e404) { $class = $error_class; $method = $error_method; $URI->rsegments = array( 1 => $class, 2 => $method ); } else { show_404($RTR->directory.$class.'/'.$method); } } if ($method !== '_remap') { $params = array_slice($URI->rsegments, 2); } /* * ------------------------------------------------------ * Is there a "pre_controller" hook? * ------------------------------------------------------ */ $EXT->call_hook('pre_controller'); /* * ------------------------------------------------------ * Instantiate the requested controller * ------------------------------------------------------ */ // Mark a start point so we can benchmark the controller $BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start'); $CI = new $class(); /* * ------------------------------------------------------ * Is there a "post_controller_constructor" hook? * ------------------------------------------------------ */ $EXT->call_hook('post_controller_constructor'); /* * ------------------------------------------------------ * Call the requested method * ------------------------------------------------------ */ call_user_func_array(array(&$CI, $method), $params); // Mark a benchmark end point $BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end'); /* * ------------------------------------------------------ * Is there a "post_controller" hook? * ------------------------------------------------------ */ $EXT->call_hook('post_controller'); /* * ------------------------------------------------------ * Send the final rendered output to the browser * ------------------------------------------------------ */ if ($EXT->call_hook('display_override') === FALSE) { $OUT->_display(); } /* * ------------------------------------------------------ * Is there a "post_system" hook? * ------------------------------------------------------ */ $EXT->call_hook('post_system'); PK!(²ÊHHcore/compat/mbstring.phpnu„[µü¤ 0, 'algoName' => 'unknown', 'options' => array()) : array('algo' => 1, 'algoName' => 'bcrypt', 'options' => array('cost' => $hash)); } } // ------------------------------------------------------------------------ if ( ! function_exists('password_hash')) { /** * password_hash() * * @link http://php.net/password_hash * @param string $password * @param int $algo * @param array $options * @return mixed */ function password_hash($password, $algo, array $options = array()) { static $func_overload; isset($func_overload) OR $func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload')); if ($algo !== 1) { trigger_error('password_hash(): Unknown hashing algorithm: '.(int) $algo, E_USER_WARNING); return NULL; } if (isset($options['cost']) && ($options['cost'] < 4 OR $options['cost'] > 31)) { trigger_error('password_hash(): Invalid bcrypt cost parameter specified: '.(int) $options['cost'], E_USER_WARNING); return NULL; } if (isset($options['salt']) && ($saltlen = ($func_overload ? mb_strlen($options['salt'], '8bit') : strlen($options['salt']))) < 22) { trigger_error('password_hash(): Provided salt is too short: '.$saltlen.' expecting 22', E_USER_WARNING); return NULL; } elseif ( ! isset($options['salt'])) { if (function_exists('random_bytes')) { try { $options['salt'] = random_bytes(16); } catch (Exception $e) { log_message('error', 'compat/password: Error while trying to use random_bytes(): '.$e->getMessage()); return FALSE; } } elseif (defined('MCRYPT_DEV_URANDOM')) { $options['salt'] = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); } elseif (DIRECTORY_SEPARATOR === '/' && (is_readable($dev = '/dev/arandom') OR is_readable($dev = '/dev/urandom'))) { if (($fp = fopen($dev, 'rb')) === FALSE) { log_message('error', 'compat/password: Unable to open '.$dev.' for reading.'); return FALSE; } // Try not to waste entropy ... is_php('5.4') && stream_set_chunk_size($fp, 16); $options['salt'] = ''; for ($read = 0; $read < 16; $read = ($func_overload) ? mb_strlen($options['salt'], '8bit') : strlen($options['salt'])) { if (($read = fread($fp, 16 - $read)) === FALSE) { log_message('error', 'compat/password: Error while reading from '.$dev.'.'); return FALSE; } $options['salt'] .= $read; } fclose($fp); } elseif (function_exists('openssl_random_pseudo_bytes')) { $is_secure = NULL; $options['salt'] = openssl_random_pseudo_bytes(16, $is_secure); if ($is_secure !== TRUE) { log_message('error', 'compat/password: openssl_random_pseudo_bytes() set the $cryto_strong flag to FALSE'); return FALSE; } } else { log_message('error', 'compat/password: No CSPRNG available.'); return FALSE; } $options['salt'] = str_replace('+', '.', rtrim(base64_encode($options['salt']), '=')); } elseif ( ! preg_match('#^[a-zA-Z0-9./]+$#D', $options['salt'])) { $options['salt'] = str_replace('+', '.', rtrim(base64_encode($options['salt']), '=')); } isset($options['cost']) OR $options['cost'] = 10; return (strlen($password = crypt($password, sprintf('$2y$%02d$%s', $options['cost'], $options['salt']))) === 60) ? $password : FALSE; } } // ------------------------------------------------------------------------ if ( ! function_exists('password_needs_rehash')) { /** * password_needs_rehash() * * @link http://php.net/password_needs_rehash * @param string $hash * @param int $algo * @param array $options * @return bool */ function password_needs_rehash($hash, $algo, array $options = array()) { $info = password_get_info($hash); if ($algo !== $info['algo']) { return TRUE; } elseif ($algo === 1) { $options['cost'] = isset($options['cost']) ? (int) $options['cost'] : 10; return ($info['options']['cost'] !== $options['cost']); } // Odd at first glance, but according to a comment in PHP's own unit tests, // because it is an unknown algorithm - it's valid and therefore doesn't // need rehashing. return FALSE; } } // ------------------------------------------------------------------------ if ( ! function_exists('password_verify')) { /** * password_verify() * * @link http://php.net/password_verify * @param string $password * @param string $hash * @return bool */ function password_verify($password, $hash) { if (strlen($hash) !== 60 OR strlen($password = crypt($password, $hash)) !== 60) { return FALSE; } $compare = 0; for ($i = 0; $i < 60; $i++) { $compare |= (ord($password[$i]) ^ ord($hash[$i])); } return ($compare === 0); } } PK!®ò(ƒƒcore/compat/index.htmlnu„[µü¤ 403 Forbidden

Directory access is forbidden.

PK!ç?ëÊÊcore/compat/hash.phpnu„[µü¤ 32, 'haval128,3' => 128, 'haval160,3' => 128, 'haval192,3' => 128, 'haval224,3' => 128, 'haval256,3' => 128, 'haval128,4' => 128, 'haval160,4' => 128, 'haval192,4' => 128, 'haval224,4' => 128, 'haval256,4' => 128, 'haval128,5' => 128, 'haval160,5' => 128, 'haval192,5' => 128, 'haval224,5' => 128, 'haval256,5' => 128, 'md2' => 16, 'md4' => 64, 'md5' => 64, 'ripemd128' => 64, 'ripemd160' => 64, 'ripemd256' => 64, 'ripemd320' => 64, 'salsa10' => 64, 'salsa20' => 64, 'sha1' => 64, 'sha224' => 64, 'sha256' => 64, 'sha384' => 128, 'sha512' => 128, 'snefru' => 32, 'snefru256' => 32, 'tiger128,3' => 64, 'tiger160,3' => 64, 'tiger192,3' => 64, 'tiger128,4' => 64, 'tiger160,4' => 64, 'tiger192,4' => 64, 'whirlpool' => 64 ); if (isset($block_sizes[$algo], $password[$block_sizes[$algo]])) { $password = hash($algo, $password, TRUE); } $hash = ''; // Note: Blocks are NOT 0-indexed for ($bc = (int) ceil($length / $hash_length), $bi = 1; $bi <= $bc; $bi++) { $key = $derived_key = hash_hmac($algo, $salt.pack('N', $bi), $password, TRUE); for ($i = 1; $i < $iterations; $i++) { $derived_key ^= $key = hash_hmac($algo, $key, $password, TRUE); } $hash .= $derived_key; } // This is not RFC-compatible, but we're aiming for natural PHP compatibility if ( ! $raw_output) { $hash = bin2hex($hash); } return defined('MB_OVERLOAD_STRING') ? mb_substr($hash, 0, $length, '8bit') : substr($hash, 0, $length); } } PK!ÍROÝ»R»Rcore/Output.phpnu„[µü¤_zlib_oc = (bool) ini_get('zlib.output_compression'); $this->_compress_output = ( $this->_zlib_oc === FALSE && config_item('compress_output') === TRUE && extension_loaded('zlib') ); isset(self::$func_overload) OR self::$func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload')); // Get mime types for later $this->mimes =& get_mimes(); log_message('info', 'Output Class Initialized'); } // -------------------------------------------------------------------- /** * Get Output * * Returns the current output string. * * @return string */ public function get_output() { return $this->final_output; } // -------------------------------------------------------------------- /** * Set Output * * Sets the output string. * * @param string $output Output data * @return CI_Output */ public function set_output($output) { $this->final_output = $output; return $this; } // -------------------------------------------------------------------- /** * Append Output * * Appends data onto the output string. * * @param string $output Data to append * @return CI_Output */ public function append_output($output) { $this->final_output .= $output; return $this; } // -------------------------------------------------------------------- /** * Set Header * * Lets you set a server header which will be sent with the final output. * * Note: If a file is cached, headers will not be sent. * @todo We need to figure out how to permit headers to be cached. * * @param string $header Header * @param bool $replace Whether to replace the old header value, if already set * @return CI_Output */ public function set_header($header, $replace = TRUE) { // If zlib.output_compression is enabled it will compress the output, // but it will not modify the content-length header to compensate for // the reduction, causing the browser to hang waiting for more data. // We'll just skip content-length in those cases. if ($this->_zlib_oc && strncasecmp($header, 'content-length', 14) === 0) { return $this; } $this->headers[] = array($header, $replace); return $this; } // -------------------------------------------------------------------- /** * Set Content-Type Header * * @param string $mime_type Extension of the file we're outputting * @param string $charset Character set (default: NULL) * @return CI_Output */ public function set_content_type($mime_type, $charset = NULL) { if (strpos($mime_type, '/') === FALSE) { $extension = ltrim($mime_type, '.'); // Is this extension supported? if (isset($this->mimes[$extension])) { $mime_type =& $this->mimes[$extension]; if (is_array($mime_type)) { $mime_type = current($mime_type); } } } $this->mime_type = $mime_type; if (empty($charset)) { $charset = config_item('charset'); } $header = 'Content-Type: '.$mime_type .(empty($charset) ? '' : '; charset='.$charset); $this->headers[] = array($header, TRUE); return $this; } // -------------------------------------------------------------------- /** * Get Current Content-Type Header * * @return string 'text/html', if not already set */ public function get_content_type() { for ($i = 0, $c = count($this->headers); $i < $c; $i++) { if (sscanf($this->headers[$i][0], 'Content-Type: %[^;]', $content_type) === 1) { return $content_type; } } return 'text/html'; } // -------------------------------------------------------------------- /** * Get Header * * @param string $header * @return string */ public function get_header($header) { // Combine headers already sent with our batched headers $headers = array_merge( // We only need [x][0] from our multi-dimensional array array_map('array_shift', $this->headers), headers_list() ); if (empty($headers) OR empty($header)) { return NULL; } // Count backwards, in order to get the last matching header for ($c = count($headers) - 1; $c > -1; $c--) { if (strncasecmp($header, $headers[$c], $l = self::strlen($header)) === 0) { return trim(self::substr($headers[$c], $l+1)); } } return NULL; } // -------------------------------------------------------------------- /** * Set HTTP Status Header * * As of version 1.7.2, this is an alias for common function * set_status_header(). * * @param int $code Status code (default: 200) * @param string $text Optional message * @return CI_Output */ public function set_status_header($code = 200, $text = '') { set_status_header($code, $text); return $this; } // -------------------------------------------------------------------- /** * Enable/disable Profiler * * @param bool $val TRUE to enable or FALSE to disable * @return CI_Output */ public function enable_profiler($val = TRUE) { $this->enable_profiler = is_bool($val) ? $val : TRUE; return $this; } // -------------------------------------------------------------------- /** * Set Profiler Sections * * Allows override of default/config settings for * Profiler section display. * * @param array $sections Profiler sections * @return CI_Output */ public function set_profiler_sections($sections) { if (isset($sections['query_toggle_count'])) { $this->_profiler_sections['query_toggle_count'] = (int) $sections['query_toggle_count']; unset($sections['query_toggle_count']); } foreach ($sections as $section => $enable) { $this->_profiler_sections[$section] = ($enable !== FALSE); } return $this; } // -------------------------------------------------------------------- /** * Set Cache * * @param int $time Cache expiration time in minutes * @return CI_Output */ public function cache($time) { $this->cache_expiration = is_numeric($time) ? $time : 0; return $this; } // -------------------------------------------------------------------- /** * Display Output * * Processes and sends finalized output data to the browser along * with any server headers and profile data. It also stops benchmark * timers so the page rendering speed and memory usage can be shown. * * Note: All "view" data is automatically put into $this->final_output * by controller class. * * @uses CI_Output::$final_output * @param string $output Output data override * @return void */ public function _display($output = '') { // Note: We use load_class() because we can't use $CI =& get_instance() // since this function is sometimes called by the caching mechanism, // which happens before the CI super object is available. $BM =& load_class('Benchmark', 'core'); $CFG =& load_class('Config', 'core'); // Grab the super object if we can. if (class_exists('CI_Controller', FALSE)) { $CI =& get_instance(); } // -------------------------------------------------------------------- // Set the output data if ($output === '') { $output =& $this->final_output; } // -------------------------------------------------------------------- // Do we need to write a cache file? Only if the controller does not have its // own _output() method and we are not dealing with a cache file, which we // can determine by the existence of the $CI object above if ($this->cache_expiration > 0 && isset($CI) && ! method_exists($CI, '_output')) { $this->_write_cache($output); } // -------------------------------------------------------------------- // Parse out the elapsed time and memory usage, // then swap the pseudo-variables with the data $elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end'); if ($this->parse_exec_vars === TRUE) { $memory = round(memory_get_usage() / 1024 / 1024, 2).'MB'; $output = str_replace(array('{elapsed_time}', '{memory_usage}'), array($elapsed, $memory), $output); } // -------------------------------------------------------------------- // Is compression requested? if (isset($CI) // This means that we're not serving a cache file, if we were, it would already be compressed && $this->_compress_output === TRUE && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) { ob_start('ob_gzhandler'); } // -------------------------------------------------------------------- // Are there any server headers to send? if (count($this->headers) > 0) { foreach ($this->headers as $header) { @header($header[0], $header[1]); } } // -------------------------------------------------------------------- // Does the $CI object exist? // If not we know we are dealing with a cache file so we'll // simply echo out the data and exit. if ( ! isset($CI)) { if ($this->_compress_output === TRUE) { if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) { header('Content-Encoding: gzip'); header('Content-Length: '.self::strlen($output)); } else { // User agent doesn't support gzip compression, // so we'll have to decompress our cache $output = gzinflate(self::substr($output, 10, -8)); } } echo $output; log_message('info', 'Final output sent to browser'); log_message('debug', 'Total execution time: '.$elapsed); return; } // -------------------------------------------------------------------- // Do we need to generate profile data? // If so, load the Profile class and run it. if ($this->enable_profiler === TRUE) { $CI->load->library('profiler'); if ( ! empty($this->_profiler_sections)) { $CI->profiler->set_sections($this->_profiler_sections); } // If the output data contains closing and tags // we will remove them and add them back after we insert the profile data $output = preg_replace('|.*?|is', '', $output, -1, $count).$CI->profiler->run(); if ($count > 0) { $output .= ''; } } // Does the controller contain a function named _output()? // If so send the output there. Otherwise, echo it. if (method_exists($CI, '_output')) { $CI->_output($output); } else { echo $output; // Send it to the browser! } log_message('info', 'Final output sent to browser'); log_message('debug', 'Total execution time: '.$elapsed); } // -------------------------------------------------------------------- /** * Write Cache * * @param string $output Output data to cache * @return void */ public function _write_cache($output) { $CI =& get_instance(); $path = $CI->config->item('cache_path'); $cache_path = ($path === '') ? APPPATH.'cache/' : $path; if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path)) { log_message('error', 'Unable to write cache file: '.$cache_path); return; } $uri = $CI->config->item('base_url') .$CI->config->item('index_page') .$CI->uri->uri_string(); if (($cache_query_string = $CI->config->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING'])) { if (is_array($cache_query_string)) { $uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string))); } else { $uri .= '?'.$_SERVER['QUERY_STRING']; } } $cache_path .= md5($uri); if ( ! $fp = @fopen($cache_path, 'w+b')) { log_message('error', 'Unable to write cache file: '.$cache_path); return; } if ( ! flock($fp, LOCK_EX)) { log_message('error', 'Unable to secure a file lock for file at: '.$cache_path); fclose($fp); return; } // If output compression is enabled, compress the cache // itself, so that we don't have to do that each time // we're serving it if ($this->_compress_output === TRUE) { $output = gzencode($output); if ($this->get_header('content-type') === NULL) { $this->set_content_type($this->mime_type); } } $expire = time() + ($this->cache_expiration * 60); // Put together our serialized info. $cache_info = serialize(array( 'expire' => $expire, 'headers' => $this->headers )); $output = $cache_info.'ENDCI--->'.$output; for ($written = 0, $length = self::strlen($output); $written < $length; $written += $result) { if (($result = fwrite($fp, self::substr($output, $written))) === FALSE) { break; } } flock($fp, LOCK_UN); fclose($fp); if ( ! is_int($result)) { @unlink($cache_path); log_message('error', 'Unable to write the complete cache content at: '.$cache_path); return; } chmod($cache_path, 0640); log_message('debug', 'Cache file written: '.$cache_path); // Send HTTP cache-control headers to browser to match file cache settings. $this->set_cache_header($_SERVER['REQUEST_TIME'], $expire); } // -------------------------------------------------------------------- /** * Update/serve cached output * * @uses CI_Config * @uses CI_URI * * @param object &$CFG CI_Config class instance * @param object &$URI CI_URI class instance * @return bool TRUE on success or FALSE on failure */ public function _display_cache(&$CFG, &$URI) { $cache_path = ($CFG->item('cache_path') === '') ? APPPATH.'cache/' : $CFG->item('cache_path'); // Build the file path. The file name is an MD5 hash of the full URI $uri = $CFG->item('base_url').$CFG->item('index_page').$URI->uri_string; if (($cache_query_string = $CFG->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING'])) { if (is_array($cache_query_string)) { $uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string))); } else { $uri .= '?'.$_SERVER['QUERY_STRING']; } } $filepath = $cache_path.md5($uri); if ( ! file_exists($filepath) OR ! $fp = @fopen($filepath, 'rb')) { return FALSE; } flock($fp, LOCK_SH); $cache = (filesize($filepath) > 0) ? fread($fp, filesize($filepath)) : ''; flock($fp, LOCK_UN); fclose($fp); // Look for embedded serialized file info. if ( ! preg_match('/^(.*)ENDCI--->/', $cache, $match)) { return FALSE; } $cache_info = unserialize($match[1]); $expire = $cache_info['expire']; $last_modified = filemtime($filepath); // Has the file expired? if ($_SERVER['REQUEST_TIME'] >= $expire && is_really_writable($cache_path)) { // If so we'll delete it. @unlink($filepath); log_message('debug', 'Cache file has expired. File deleted.'); return FALSE; } // Send the HTTP cache control headers $this->set_cache_header($last_modified, $expire); // Add headers from cache file. foreach ($cache_info['headers'] as $header) { $this->set_header($header[0], $header[1]); } // Display the cache $this->_display(self::substr($cache, self::strlen($match[0]))); log_message('debug', 'Cache file is current. Sending it to browser.'); return TRUE; } // -------------------------------------------------------------------- /** * Delete cache * * @param string $uri URI string * @return bool */ public function delete_cache($uri = '') { $CI =& get_instance(); $cache_path = $CI->config->item('cache_path'); if ($cache_path === '') { $cache_path = APPPATH.'cache/'; } if ( ! is_dir($cache_path)) { log_message('error', 'Unable to find cache path: '.$cache_path); return FALSE; } if (empty($uri)) { $uri = $CI->uri->uri_string(); if (($cache_query_string = $CI->config->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING'])) { if (is_array($cache_query_string)) { $uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string))); } else { $uri .= '?'.$_SERVER['QUERY_STRING']; } } } $cache_path .= md5($CI->config->item('base_url').$CI->config->item('index_page').ltrim($uri, '/')); if ( ! @unlink($cache_path)) { log_message('error', 'Unable to delete cache file for '.$uri); return FALSE; } return TRUE; } // -------------------------------------------------------------------- /** * Set Cache Header * * Set the HTTP headers to match the server-side file cache settings * in order to reduce bandwidth. * * @param int $last_modified Timestamp of when the page was last modified * @param int $expiration Timestamp of when should the requested page expire from cache * @return void */ public function set_cache_header($last_modified, $expiration) { $max_age = $expiration - $_SERVER['REQUEST_TIME']; if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $last_modified <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { $this->set_status_header(304); exit; } header('Pragma: public'); header('Cache-Control: max-age='.$max_age.', public'); header('Expires: '.gmdate('D, d M Y H:i:s', $expiration).' GMT'); header('Last-modified: '.gmdate('D, d M Y H:i:s', $last_modified).' GMT'); } // -------------------------------------------------------------------- /** * Byte-safe strlen() * * @param string $str * @return int */ protected static function strlen($str) { return (self::$func_overload) ? mb_strlen($str, '8bit') : strlen($str); } // -------------------------------------------------------------------- /** * Byte-safe substr() * * @param string $str * @param int $start * @param int $length * @return string */ protected static function substr($str, $start, $length = NULL) { if (self::$func_overload) { // mb_substr($str, $start, null, '8bit') returns an empty // string on PHP 5.3 isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start); return mb_substr($str, $start, $length, '8bit'); } return isset($length) ? substr($str, $start, $length) : substr($str, $start); } } PK!Dkb;b; core/URI.phpnu„[µü¤config =& load_class('Config', 'core'); // If query strings are enabled, we don't need to parse any segments. // However, they don't make sense under CLI. if (is_cli() OR $this->config->item('enable_query_strings') !== TRUE) { $this->_permitted_uri_chars = $this->config->item('permitted_uri_chars'); // If it's a CLI request, ignore the configuration if (is_cli()) { $uri = $this->_parse_argv(); } else { $protocol = $this->config->item('uri_protocol'); empty($protocol) && $protocol = 'REQUEST_URI'; switch ($protocol) { case 'AUTO': // For BC purposes only case 'REQUEST_URI': $uri = $this->_parse_request_uri(); break; case 'QUERY_STRING': $uri = $this->_parse_query_string(); break; case 'PATH_INFO': default: $uri = isset($_SERVER[$protocol]) ? $_SERVER[$protocol] : $this->_parse_request_uri(); break; } } $this->_set_uri_string($uri); } log_message('info', 'URI Class Initialized'); } // -------------------------------------------------------------------- /** * Set URI String * * @param string $str * @return void */ protected function _set_uri_string($str) { // Filter out control characters and trim slashes $this->uri_string = trim(remove_invisible_characters($str, FALSE), '/'); if ($this->uri_string !== '') { // Remove the URL suffix, if present if (($suffix = (string) $this->config->item('url_suffix')) !== '') { $slen = strlen($suffix); if (substr($this->uri_string, -$slen) === $suffix) { $this->uri_string = substr($this->uri_string, 0, -$slen); } } $this->segments[0] = NULL; // Populate the segments array foreach (explode('/', trim($this->uri_string, '/')) as $val) { $val = trim($val); // Filter segments for security $this->filter_uri($val); if ($val !== '') { $this->segments[] = $val; } } unset($this->segments[0]); } } // -------------------------------------------------------------------- /** * Parse REQUEST_URI * * Will parse REQUEST_URI and automatically detect the URI from it, * while fixing the query string if necessary. * * @return string */ protected function _parse_request_uri() { if ( ! isset($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME'])) { return ''; } // parse_url() returns false if no host is present, but the path or query string // contains a colon followed by a number $uri = parse_url('http://dummy'.$_SERVER['REQUEST_URI']); $query = isset($uri['query']) ? $uri['query'] : ''; $uri = isset($uri['path']) ? $uri['path'] : ''; if (isset($_SERVER['SCRIPT_NAME'][0])) { if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0) { $uri = (string) substr($uri, strlen($_SERVER['SCRIPT_NAME'])); } elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0) { $uri = (string) substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME']))); } } // This section ensures that even on servers that require the URI to be in the query string (Nginx) a correct // URI is found, and also fixes the QUERY_STRING server var and $_GET array. if (trim($uri, '/') === '' && strncmp($query, '/', 1) === 0) { $query = explode('?', $query, 2); $uri = $query[0]; $_SERVER['QUERY_STRING'] = isset($query[1]) ? $query[1] : ''; } else { $_SERVER['QUERY_STRING'] = $query; } parse_str($_SERVER['QUERY_STRING'], $_GET); if ($uri === '/' OR $uri === '') { return '/'; } // Do some final cleaning of the URI and return it return $this->_remove_relative_directory($uri); } // -------------------------------------------------------------------- /** * Parse QUERY_STRING * * Will parse QUERY_STRING and automatically detect the URI from it. * * @return string */ protected function _parse_query_string() { $uri = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING'); if (trim($uri, '/') === '') { return ''; } elseif (strncmp($uri, '/', 1) === 0) { $uri = explode('?', $uri, 2); $_SERVER['QUERY_STRING'] = isset($uri[1]) ? $uri[1] : ''; $uri = $uri[0]; } parse_str($_SERVER['QUERY_STRING'], $_GET); return $this->_remove_relative_directory($uri); } // -------------------------------------------------------------------- /** * Parse CLI arguments * * Take each command line argument and assume it is a URI segment. * * @return string */ protected function _parse_argv() { $args = array_slice($_SERVER['argv'], 1); return $args ? implode('/', $args) : ''; } // -------------------------------------------------------------------- /** * Remove relative directory (../) and multi slashes (///) * * Do some final cleaning of the URI and return it, currently only used in self::_parse_request_uri() * * @param string $uri * @return string */ protected function _remove_relative_directory($uri) { $uris = array(); $tok = strtok($uri, '/'); while ($tok !== FALSE) { if (( ! empty($tok) OR $tok === '0') && $tok !== '..') { $uris[] = $tok; } $tok = strtok('/'); } return implode('/', $uris); } // -------------------------------------------------------------------- /** * Filter URI * * Filters segments for malicious characters. * * @param string $str * @return void */ public function filter_uri(&$str) { if ( ! empty($str) && ! empty($this->_permitted_uri_chars) && ! preg_match('/^['.$this->_permitted_uri_chars.']+$/i'.(UTF8_ENABLED ? 'u' : ''), $str)) { show_error('The URI you submitted has disallowed characters.', 400); } } // -------------------------------------------------------------------- /** * Fetch URI Segment * * @see CI_URI::$segments * @param int $n Index * @param mixed $no_result What to return if the segment index is not found * @return mixed */ public function segment($n, $no_result = NULL) { return isset($this->segments[$n]) ? $this->segments[$n] : $no_result; } // -------------------------------------------------------------------- /** * Fetch URI "routed" Segment * * Returns the re-routed URI segment (assuming routing rules are used) * based on the index provided. If there is no routing, will return * the same result as CI_URI::segment(). * * @see CI_URI::$rsegments * @see CI_URI::segment() * @param int $n Index * @param mixed $no_result What to return if the segment index is not found * @return mixed */ public function rsegment($n, $no_result = NULL) { return isset($this->rsegments[$n]) ? $this->rsegments[$n] : $no_result; } // -------------------------------------------------------------------- /** * URI to assoc * * Generates an associative array of URI data starting at the supplied * segment index. For example, if this is your URI: * * example.com/user/search/name/joe/location/UK/gender/male * * You can use this method to generate an array with this prototype: * * array ( * name => joe * location => UK * gender => male * ) * * @param int $n Index (default: 3) * @param array $default Default values * @return array */ public function uri_to_assoc($n = 3, $default = array()) { return $this->_uri_to_assoc($n, $default, 'segment'); } // -------------------------------------------------------------------- /** * Routed URI to assoc * * Identical to CI_URI::uri_to_assoc(), only it uses the re-routed * segment array. * * @see CI_URI::uri_to_assoc() * @param int $n Index (default: 3) * @param array $default Default values * @return array */ public function ruri_to_assoc($n = 3, $default = array()) { return $this->_uri_to_assoc($n, $default, 'rsegment'); } // -------------------------------------------------------------------- /** * Internal URI-to-assoc * * Generates a key/value pair from the URI string or re-routed URI string. * * @used-by CI_URI::uri_to_assoc() * @used-by CI_URI::ruri_to_assoc() * @param int $n Index (default: 3) * @param array $default Default values * @param string $which Array name ('segment' or 'rsegment') * @return array */ protected function _uri_to_assoc($n = 3, $default = array(), $which = 'segment') { if ( ! is_numeric($n)) { return $default; } if (isset($this->keyval[$which], $this->keyval[$which][$n])) { return $this->keyval[$which][$n]; } $total_segments = "total_{$which}s"; $segment_array = "{$which}_array"; if ($this->$total_segments() < $n) { return (count($default) === 0) ? array() : array_fill_keys($default, NULL); } $segments = array_slice($this->$segment_array(), ($n - 1)); $i = 0; $lastval = ''; $retval = array(); foreach ($segments as $seg) { if ($i % 2) { $retval[$lastval] = $seg; } else { $retval[$seg] = NULL; $lastval = $seg; } $i++; } if (count($default) > 0) { foreach ($default as $val) { if ( ! array_key_exists($val, $retval)) { $retval[$val] = NULL; } } } // Cache the array for reuse isset($this->keyval[$which]) OR $this->keyval[$which] = array(); $this->keyval[$which][$n] = $retval; return $retval; } // -------------------------------------------------------------------- /** * Assoc to URI * * Generates a URI string from an associative array. * * @param array $array Input array of key/value pairs * @return string URI string */ public function assoc_to_uri($array) { $temp = array(); foreach ((array) $array as $key => $val) { $temp[] = $key; $temp[] = $val; } return implode('/', $temp); } // -------------------------------------------------------------------- /** * Slash segment * * Fetches an URI segment with a slash. * * @param int $n Index * @param string $where Where to add the slash ('trailing' or 'leading') * @return string */ public function slash_segment($n, $where = 'trailing') { return $this->_slash_segment($n, $where, 'segment'); } // -------------------------------------------------------------------- /** * Slash routed segment * * Fetches an URI routed segment with a slash. * * @param int $n Index * @param string $where Where to add the slash ('trailing' or 'leading') * @return string */ public function slash_rsegment($n, $where = 'trailing') { return $this->_slash_segment($n, $where, 'rsegment'); } // -------------------------------------------------------------------- /** * Internal Slash segment * * Fetches an URI Segment and adds a slash to it. * * @used-by CI_URI::slash_segment() * @used-by CI_URI::slash_rsegment() * * @param int $n Index * @param string $where Where to add the slash ('trailing' or 'leading') * @param string $which Array name ('segment' or 'rsegment') * @return string */ protected function _slash_segment($n, $where = 'trailing', $which = 'segment') { $leading = $trailing = '/'; if ($where === 'trailing') { $leading = ''; } elseif ($where === 'leading') { $trailing = ''; } return $leading.$this->$which($n).$trailing; } // -------------------------------------------------------------------- /** * Segment Array * * @return array CI_URI::$segments */ public function segment_array() { return $this->segments; } // -------------------------------------------------------------------- /** * Routed Segment Array * * @return array CI_URI::$rsegments */ public function rsegment_array() { return $this->rsegments; } // -------------------------------------------------------------------- /** * Total number of segments * * @return int */ public function total_segments() { return count($this->segments); } // -------------------------------------------------------------------- /** * Total number of routed segments * * @return int */ public function total_rsegments() { return count($this->rsegments); } // -------------------------------------------------------------------- /** * Fetch URI string * * @return string CI_URI::$uri_string */ public function uri_string() { return $this->uri_string; } // -------------------------------------------------------------------- /** * Fetch Re-routed URI string * * @return string */ public function ruri_string() { return ltrim(load_class('Router', 'core')->directory, '/').implode('/', $this->rsegments); } } PK!çt#:X:Xcore/Input.phpnu„[µü¤_allow_get_array = (config_item('allow_get_array') !== FALSE); $this->_enable_xss = (config_item('global_xss_filtering') === TRUE); $this->_enable_csrf = (config_item('csrf_protection') === TRUE); $this->_standardize_newlines = (bool) config_item('standardize_newlines'); $this->security =& load_class('Security', 'core'); // Do we need the UTF-8 class? if (UTF8_ENABLED === TRUE) { $this->uni =& load_class('Utf8', 'core'); } // Sanitize global arrays $this->_sanitize_globals(); // CSRF Protection check if ($this->_enable_csrf === TRUE && ! is_cli()) { $this->security->csrf_verify(); } log_message('info', 'Input Class Initialized'); } // -------------------------------------------------------------------- /** * Fetch from array * * Internal method used to retrieve values from global arrays. * * @param array &$array $_GET, $_POST, $_COOKIE, $_SERVER, etc. * @param mixed $index Index for item to be fetched from $array * @param bool $xss_clean Whether to apply XSS filtering * @return mixed */ protected function _fetch_from_array(&$array, $index = NULL, $xss_clean = NULL) { is_bool($xss_clean) OR $xss_clean = $this->_enable_xss; // If $index is NULL, it means that the whole $array is requested isset($index) OR $index = array_keys($array); // allow fetching multiple keys at once if (is_array($index)) { $output = array(); foreach ($index as $key) { $output[$key] = $this->_fetch_from_array($array, $key, $xss_clean); } return $output; } if (isset($array[$index])) { $value = $array[$index]; } elseif (($count = preg_match_all('/(?:^[^\[]+)|\[[^]]*\]/', $index, $matches)) > 1) // Does the index contain array notation { $value = $array; for ($i = 0; $i < $count; $i++) { $key = trim($matches[0][$i], '[]'); if ($key === '') // Empty notation will return the value as array { break; } if (isset($value[$key])) { $value = $value[$key]; } else { return NULL; } } } else { return NULL; } return ($xss_clean === TRUE) ? $this->security->xss_clean($value) : $value; } // -------------------------------------------------------------------- /** * Fetch an item from the GET array * * @param mixed $index Index for item to be fetched from $_GET * @param bool $xss_clean Whether to apply XSS filtering * @return mixed */ public function get($index = NULL, $xss_clean = NULL) { return $this->_fetch_from_array($_GET, $index, $xss_clean); } // -------------------------------------------------------------------- /** * Fetch an item from the POST array * * @param mixed $index Index for item to be fetched from $_POST * @param bool $xss_clean Whether to apply XSS filtering * @return mixed */ public function post($index = NULL, $xss_clean = NULL) { return $this->_fetch_from_array($_POST, $index, $xss_clean); } // -------------------------------------------------------------------- /** * Fetch an item from POST data with fallback to GET * * @param string $index Index for item to be fetched from $_POST or $_GET * @param bool $xss_clean Whether to apply XSS filtering * @return mixed */ public function post_get($index, $xss_clean = NULL) { return isset($_POST[$index]) ? $this->post($index, $xss_clean) : $this->get($index, $xss_clean); } // -------------------------------------------------------------------- /** * Fetch an item from GET data with fallback to POST * * @param string $index Index for item to be fetched from $_GET or $_POST * @param bool $xss_clean Whether to apply XSS filtering * @return mixed */ public function get_post($index, $xss_clean = NULL) { return isset($_GET[$index]) ? $this->get($index, $xss_clean) : $this->post($index, $xss_clean); } // -------------------------------------------------------------------- /** * Fetch an item from the COOKIE array * * @param mixed $index Index for item to be fetched from $_COOKIE * @param bool $xss_clean Whether to apply XSS filtering * @return mixed */ public function cookie($index = NULL, $xss_clean = NULL) { return $this->_fetch_from_array($_COOKIE, $index, $xss_clean); } // -------------------------------------------------------------------- /** * Fetch an item from the SERVER array * * @param mixed $index Index for item to be fetched from $_SERVER * @param bool $xss_clean Whether to apply XSS filtering * @return mixed */ public function server($index, $xss_clean = NULL) { return $this->_fetch_from_array($_SERVER, $index, $xss_clean); } // ------------------------------------------------------------------------ /** * Fetch an item from the php://input stream * * Useful when you need to access PUT, DELETE or PATCH request data. * * @param string $index Index for item to be fetched * @param bool $xss_clean Whether to apply XSS filtering * @return mixed */ public function input_stream($index = NULL, $xss_clean = NULL) { // Prior to PHP 5.6, the input stream can only be read once, // so we'll need to check if we have already done that first. if ( ! is_array($this->_input_stream)) { // $this->raw_input_stream will trigger __get(). parse_str($this->raw_input_stream, $this->_input_stream); is_array($this->_input_stream) OR $this->_input_stream = array(); } return $this->_fetch_from_array($this->_input_stream, $index, $xss_clean); } // ------------------------------------------------------------------------ /** * Set cookie * * Accepts an arbitrary number of parameters (up to 7) or an associative * array in the first parameter containing all the values. * * @param string|mixed[] $name Cookie name or an array containing parameters * @param string $value Cookie value * @param int $expire Cookie expiration time in seconds * @param string $domain Cookie domain (e.g.: '.yourdomain.com') * @param string $path Cookie path (default: '/') * @param string $prefix Cookie name prefix * @param bool $secure Whether to only transfer cookies via SSL * @param bool $httponly Whether to only makes the cookie accessible via HTTP (no javascript) * @return void */ public function set_cookie($name, $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = NULL, $httponly = NULL) { if (is_array($name)) { // always leave 'name' in last place, as the loop will break otherwise, due to $$item foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'secure', 'httponly', 'name') as $item) { if (isset($name[$item])) { $$item = $name[$item]; } } } if ($prefix === '' && config_item('cookie_prefix') !== '') { $prefix = config_item('cookie_prefix'); } if ($domain == '' && config_item('cookie_domain') != '') { $domain = config_item('cookie_domain'); } if ($path === '/' && config_item('cookie_path') !== '/') { $path = config_item('cookie_path'); } $secure = ($secure === NULL && config_item('cookie_secure') !== NULL) ? (bool) config_item('cookie_secure') : (bool) $secure; $httponly = ($httponly === NULL && config_item('cookie_httponly') !== NULL) ? (bool) config_item('cookie_httponly') : (bool) $httponly; if ( ! is_numeric($expire)) { $expire = time() - 86500; } else { $expire = ($expire > 0) ? time() + $expire : 0; } setcookie($prefix.$name, $value, $expire, $path, $domain, $secure, $httponly); } // -------------------------------------------------------------------- /** * Fetch the IP Address * * Determines and validates the visitor's IP address. * * @return string IP address */ public function ip_address() { if ($this->ip_address !== FALSE) { return $this->ip_address; } $proxy_ips = config_item('proxy_ips'); if ( ! empty($proxy_ips) && ! is_array($proxy_ips)) { $proxy_ips = explode(',', str_replace(' ', '', $proxy_ips)); } $this->ip_address = $this->server('REMOTE_ADDR'); if ($proxy_ips) { foreach (array('HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'HTTP_X_CLIENT_IP', 'HTTP_X_CLUSTER_CLIENT_IP') as $header) { if (($spoof = $this->server($header)) !== NULL) { // Some proxies typically list the whole chain of IP // addresses through which the client has reached us. // e.g. client_ip, proxy_ip1, proxy_ip2, etc. sscanf($spoof, '%[^,]', $spoof); if ( ! $this->valid_ip($spoof)) { $spoof = NULL; } else { break; } } } if ($spoof) { for ($i = 0, $c = count($proxy_ips); $i < $c; $i++) { // Check if we have an IP address or a subnet if (strpos($proxy_ips[$i], '/') === FALSE) { // An IP address (and not a subnet) is specified. // We can compare right away. if ($proxy_ips[$i] === $this->ip_address) { $this->ip_address = $spoof; break; } continue; } // We have a subnet ... now the heavy lifting begins isset($separator) OR $separator = $this->valid_ip($this->ip_address, 'ipv6') ? ':' : '.'; // If the proxy entry doesn't match the IP protocol - skip it if (strpos($proxy_ips[$i], $separator) === FALSE) { continue; } // Convert the REMOTE_ADDR IP address to binary, if needed if ( ! isset($ip, $sprintf)) { if ($separator === ':') { // Make sure we're have the "full" IPv6 format $ip = explode(':', str_replace('::', str_repeat(':', 9 - substr_count($this->ip_address, ':')), $this->ip_address ) ); for ($j = 0; $j < 8; $j++) { $ip[$j] = intval($ip[$j], 16); } $sprintf = '%016b%016b%016b%016b%016b%016b%016b%016b'; } else { $ip = explode('.', $this->ip_address); $sprintf = '%08b%08b%08b%08b'; } $ip = vsprintf($sprintf, $ip); } // Split the netmask length off the network address sscanf($proxy_ips[$i], '%[^/]/%d', $netaddr, $masklen); // Again, an IPv6 address is most likely in a compressed form if ($separator === ':') { $netaddr = explode(':', str_replace('::', str_repeat(':', 9 - substr_count($netaddr, ':')), $netaddr)); for ($j = 0; $j < 8; $j++) { $netaddr[$j] = intval($netaddr[$j], 16); } } else { $netaddr = explode('.', $netaddr); } // Convert to binary and finally compare if (strncmp($ip, vsprintf($sprintf, $netaddr), $masklen) === 0) { $this->ip_address = $spoof; break; } } } } if ( ! $this->valid_ip($this->ip_address)) { return $this->ip_address = '0.0.0.0'; } return $this->ip_address; } // -------------------------------------------------------------------- /** * Validate IP Address * * @param string $ip IP address * @param string $which IP protocol: 'ipv4' or 'ipv6' * @return bool */ public function valid_ip($ip, $which = '') { switch (strtolower($which)) { case 'ipv4': $which = FILTER_FLAG_IPV4; break; case 'ipv6': $which = FILTER_FLAG_IPV6; break; default: $which = NULL; break; } return (bool) filter_var($ip, FILTER_VALIDATE_IP, $which); } // -------------------------------------------------------------------- /** * Fetch User Agent string * * @return string|null User Agent string or NULL if it doesn't exist */ public function user_agent($xss_clean = NULL) { return $this->_fetch_from_array($_SERVER, 'HTTP_USER_AGENT', $xss_clean); } // -------------------------------------------------------------------- /** * Sanitize Globals * * Internal method serving for the following purposes: * * - Unsets $_GET data, if query strings are not enabled * - Cleans POST, COOKIE and SERVER data * - Standardizes newline characters to PHP_EOL * * @return void */ protected function _sanitize_globals() { // Is $_GET data allowed? If not we'll set the $_GET to an empty array if ($this->_allow_get_array === FALSE) { $_GET = array(); } elseif (is_array($_GET)) { foreach ($_GET as $key => $val) { $_GET[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); } } // Clean $_POST Data if (is_array($_POST)) { foreach ($_POST as $key => $val) { $_POST[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); } } // Clean $_COOKIE Data if (is_array($_COOKIE)) { // Also get rid of specially treated cookies that might be set by a server // or silly application, that are of no use to a CI application anyway // but that when present will trip our 'Disallowed Key Characters' alarm // http://www.ietf.org/rfc/rfc2109.txt // note that the key names below are single quoted strings, and are not PHP variables unset( $_COOKIE['$Version'], $_COOKIE['$Path'], $_COOKIE['$Domain'] ); foreach ($_COOKIE as $key => $val) { if (($cookie_key = $this->_clean_input_keys($key)) !== FALSE) { $_COOKIE[$cookie_key] = $this->_clean_input_data($val); } else { unset($_COOKIE[$key]); } } } // Sanitize PHP_SELF $_SERVER['PHP_SELF'] = strip_tags($_SERVER['PHP_SELF']); log_message('debug', 'Global POST, GET and COOKIE data sanitized'); } // -------------------------------------------------------------------- /** * Clean Input Data * * Internal method that aids in escaping data and * standardizing newline characters to PHP_EOL. * * @param string|string[] $str Input string(s) * @return string */ protected function _clean_input_data($str) { if (is_array($str)) { $new_array = array(); foreach (array_keys($str) as $key) { $new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($str[$key]); } return $new_array; } /* We strip slashes if magic quotes is on to keep things consistent NOTE: In PHP 5.4 get_magic_quotes_gpc() will always return 0 and it will probably not exist in future versions at all. */ if ( ! is_php('5.4') && get_magic_quotes_gpc()) { $str = stripslashes($str); } // Clean UTF-8 if supported if (UTF8_ENABLED === TRUE) { $str = $this->uni->clean_string($str); } // Remove control characters $str = remove_invisible_characters($str, FALSE); // Standardize newlines if needed if ($this->_standardize_newlines === TRUE) { return preg_replace('/(?:\r\n|[\r\n])/', PHP_EOL, $str); } return $str; } // -------------------------------------------------------------------- /** * Clean Keys * * Internal method that helps to prevent malicious users * from trying to exploit keys we make sure that keys are * only named with alpha-numeric text and a few other items. * * @param string $str Input string * @param bool $fatal Whether to terminate script exection * or to return FALSE if an invalid * key is encountered * @return string|bool */ protected function _clean_input_keys($str, $fatal = TRUE) { if ( ! preg_match('/^[a-z0-9:_\/|-]+$/i', $str)) { if ($fatal === TRUE) { return FALSE; } else { set_status_header(503); echo 'Disallowed Key Characters.'; exit(7); // EXIT_USER_INPUT } } // Clean UTF-8 if supported if (UTF8_ENABLED === TRUE) { return $this->uni->clean_string($str); } return $str; } // -------------------------------------------------------------------- /** * Request Headers * * @param bool $xss_clean Whether to apply XSS filtering * @return array */ public function request_headers($xss_clean = FALSE) { // If header is already defined, return it immediately if ( ! empty($this->headers)) { return $this->_fetch_from_array($this->headers, NULL, $xss_clean); } // In Apache, you can simply call apache_request_headers() if (function_exists('apache_request_headers')) { $this->headers = apache_request_headers(); } else { isset($_SERVER['CONTENT_TYPE']) && $this->headers['Content-Type'] = $_SERVER['CONTENT_TYPE']; foreach ($_SERVER as $key => $val) { if (sscanf($key, 'HTTP_%s', $header) === 1) { // take SOME_HEADER and turn it into Some-Header $header = str_replace('_', ' ', strtolower($header)); $header = str_replace(' ', '-', ucwords($header)); $this->headers[$header] = $_SERVER[$key]; } } } return $this->_fetch_from_array($this->headers, NULL, $xss_clean); } // -------------------------------------------------------------------- /** * Get Request Header * * Returns the value of a single member of the headers class member * * @param string $index Header name * @param bool $xss_clean Whether to apply XSS filtering * @return string|null The requested header on success or NULL on failure */ public function get_request_header($index, $xss_clean = FALSE) { static $headers; if ( ! isset($headers)) { empty($this->headers) && $this->request_headers(); foreach ($this->headers as $key => $value) { $headers[strtolower($key)] = $value; } } $index = strtolower($index); if ( ! isset($headers[$index])) { return NULL; } return ($xss_clean === TRUE) ? $this->security->xss_clean($headers[$index]) : $headers[$index]; } // -------------------------------------------------------------------- /** * Is AJAX request? * * Test to see if a request contains the HTTP_X_REQUESTED_WITH header. * * @return bool */ public function is_ajax_request() { return ( ! empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'); } // -------------------------------------------------------------------- /** * Is CLI request? * * Test to see if a request was made from the command line. * * @deprecated 3.0.0 Use is_cli() instead * @return bool */ public function is_cli_request() { return is_cli(); } // -------------------------------------------------------------------- /** * Get Request Method * * Return the request method * * @param bool $upper Whether to return in upper or lower case * (default: FALSE) * @return string */ public function method($upper = FALSE) { return ($upper) ? strtoupper($this->server('REQUEST_METHOD')) : strtolower($this->server('REQUEST_METHOD')); } // ------------------------------------------------------------------------ /** * Magic __get() * * Allows read access to protected properties * * @param string $name * @return mixed */ public function __get($name) { if ($name === 'raw_input_stream') { isset($this->_raw_input_stream) OR $this->_raw_input_stream = file_get_contents('php://input'); return $this->_raw_input_stream; } elseif ($name === 'ip_address') { return $this->ip_address; } } } PK!sÉ‘[[ core/Lang.phpnu„[µü¤load($value, $idiom, $return, $add_suffix, $alt_path); } return; } $langfile = str_replace('.php', '', $langfile); if ($add_suffix === TRUE) { $langfile = preg_replace('/_lang$/', '', $langfile).'_lang'; } $langfile .= '.php'; if (empty($idiom) OR ! preg_match('/^[a-z_-]+$/i', $idiom)) { $config =& get_config(); $idiom = empty($config['language']) ? 'english' : $config['language']; } if ($return === FALSE && isset($this->is_loaded[$langfile]) && $this->is_loaded[$langfile] === $idiom) { return; } // Load the base file, so any others found can override it $basepath = BASEPATH.'language/'.$idiom.'/'.$langfile; if (($found = file_exists($basepath)) === TRUE) { include($basepath); } // Do we have an alternative path to look in? if ($alt_path !== '') { $alt_path .= 'language/'.$idiom.'/'.$langfile; if (file_exists($alt_path)) { include($alt_path); $found = TRUE; } } else { foreach (get_instance()->load->get_package_paths(TRUE) as $package_path) { $package_path .= 'language/'.$idiom.'/'.$langfile; if ($basepath !== $package_path && file_exists($package_path)) { include($package_path); $found = TRUE; break; } } } if ($found !== TRUE) { show_error('Unable to load the requested language file: language/'.$idiom.'/'.$langfile); } if ( ! isset($lang) OR ! is_array($lang)) { log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile); if ($return === TRUE) { return array(); } return; } if ($return === TRUE) { return $lang; } $this->is_loaded[$langfile] = $idiom; $this->language = array_merge($this->language, $lang); log_message('info', 'Language file loaded: language/'.$idiom.'/'.$langfile); return TRUE; } // -------------------------------------------------------------------- /** * Language line * * Fetches a single line of text from the language array * * @param string $line Language line key * @param bool $log_errors Whether to log an error message if the line is not found * @return string Translation */ public function line($line, $log_errors = TRUE) { $value = isset($this->language[$line]) ? $this->language[$line] : FALSE; // Because killer robots like unicorns! if ($value === FALSE && $log_errors === TRUE) { log_message('error', 'Could not find the language line "'.$line.'"'); } return $value; } } PK!jGßyXXcore/Exceptions.phpnu„[µü¤ 'Error', E_WARNING => 'Warning', E_PARSE => 'Parsing Error', E_NOTICE => 'Notice', E_CORE_ERROR => 'Core Error', E_CORE_WARNING => 'Core Warning', E_COMPILE_ERROR => 'Compile Error', E_COMPILE_WARNING => 'Compile Warning', E_USER_ERROR => 'User Error', E_USER_WARNING => 'User Warning', E_USER_NOTICE => 'User Notice', E_STRICT => 'Runtime Notice' ); /** * Class constructor * * @return void */ public function __construct() { $this->ob_level = ob_get_level(); // Note: Do not log messages from this constructor. } // -------------------------------------------------------------------- /** * Exception Logger * * Logs PHP generated error messages * * @param int $severity Log level * @param string $message Error message * @param string $filepath File path * @param int $line Line number * @return void */ public function log_exception($severity, $message, $filepath, $line) { $severity = isset($this->levels[$severity]) ? $this->levels[$severity] : $severity; log_message('error', 'Severity: '.$severity.' --> '.$message.' '.$filepath.' '.$line); } // -------------------------------------------------------------------- /** * 404 Error Handler * * @uses CI_Exceptions::show_error() * * @param string $page Page URI * @param bool $log_error Whether to log the error * @return void */ public function show_404($page = '', $log_error = TRUE) { if (is_cli()) { $heading = 'Not Found'; $message = 'The controller/method pair you requested was not found.'; } else { $heading = '404 Page Not Found'; $message = 'The page you requested was not found.'; } // By default we log this, but allow a dev to skip it if ($log_error) { log_message('error', $heading.': '.$page); } echo $this->show_error($heading, $message, 'error_404', 404); exit(4); // EXIT_UNKNOWN_FILE } // -------------------------------------------------------------------- /** * General Error Page * * Takes an error message as input (either as a string or an array) * and displays it using the specified template. * * @param string $heading Page heading * @param string|string[] $message Error message * @param string $template Template name * @param int $status_code (default: 500) * * @return string Error page output */ public function show_error($heading, $message, $template = 'error_general', $status_code = 500) { $templates_path = config_item('error_views_path'); if (empty($templates_path)) { $templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR; } if (is_cli()) { $message = "\t".(is_array($message) ? implode("\n\t", $message) : $message); $template = 'cli'.DIRECTORY_SEPARATOR.$template; } else { set_status_header($status_code); $message = '

'.(is_array($message) ? implode('

', $message) : $message).'

'; $template = 'html'.DIRECTORY_SEPARATOR.$template; } if (ob_get_level() > $this->ob_level + 1) { ob_end_flush(); } ob_start(); include($templates_path.$template.'.php'); $buffer = ob_get_contents(); ob_end_clean(); return $buffer; } // -------------------------------------------------------------------- public function show_exception($exception) { $templates_path = config_item('error_views_path'); if (empty($templates_path)) { $templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR; } $message = $exception->getMessage(); if (empty($message)) { $message = '(null)'; } if (is_cli()) { $templates_path .= 'cli'.DIRECTORY_SEPARATOR; } else { $templates_path .= 'html'.DIRECTORY_SEPARATOR; } if (ob_get_level() > $this->ob_level + 1) { ob_end_flush(); } ob_start(); include($templates_path.'error_exception.php'); $buffer = ob_get_contents(); ob_end_clean(); echo $buffer; } // -------------------------------------------------------------------- /** * Native PHP error handler * * @param int $severity Error level * @param string $message Error message * @param string $filepath File path * @param int $line Line number * @return void */ public function show_php_error($severity, $message, $filepath, $line) { $templates_path = config_item('error_views_path'); if (empty($templates_path)) { $templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR; } $severity = isset($this->levels[$severity]) ? $this->levels[$severity] : $severity; // For safety reasons we don't show the full file path in non-CLI requests if ( ! is_cli()) { $filepath = str_replace('\\', '/', $filepath); if (FALSE !== strpos($filepath, '/')) { $x = explode('/', $filepath); $filepath = $x[count($x)-2].'/'.end($x); } $template = 'html'.DIRECTORY_SEPARATOR.'error_php'; } else { $template = 'cli'.DIRECTORY_SEPARATOR.'error_php'; } if (ob_get_level() > $this->ob_level + 1) { ob_end_flush(); } ob_start(); include($templates_path.$template.'.php'); $buffer = ob_get_contents(); ob_end_clean(); echo $buffer; } } PK!å6Ò¯¯core/Benchmark.phpnu„[µü¤marker[$name] = microtime(TRUE); } // -------------------------------------------------------------------- /** * Elapsed time * * Calculates the time difference between two marked points. * * If the first parameter is empty this function instead returns the * {elapsed_time} pseudo-variable. This permits the full system * execution time to be shown in a template. The output class will * swap the real value for this variable. * * @param string $point1 A particular marked point * @param string $point2 A particular marked point * @param int $decimals Number of decimal places * * @return string Calculated elapsed time on success, * an '{elapsed_string}' if $point1 is empty * or an empty string if $point1 is not found. */ public function elapsed_time($point1 = '', $point2 = '', $decimals = 4) { if ($point1 === '') { return '{elapsed_time}'; } if ( ! isset($this->marker[$point1])) { return ''; } if ( ! isset($this->marker[$point2])) { $this->marker[$point2] = microtime(TRUE); } return number_format($this->marker[$point2] - $this->marker[$point1], $decimals); } // -------------------------------------------------------------------- /** * Memory Usage * * Simply returns the {memory_usage} marker. * * This permits it to be put it anywhere in a template * without the memory being calculated until the end. * The output class will swap the real value for this variable. * * @return string '{memory_usage}' */ public function memory_usage() { return '{memory_usage}'; } } PK!´cBÄ Ä core/Model.phpnu„[µü¤$key; } } PK!®ò(ƒƒcore/index.htmlnu„[µü¤ 403 Forbidden

Directory access is forbidden.

PK!¯H's¹U¹Ucore/Common.phpnu„[µü¤='); } return $_is_php[$version]; } } // ------------------------------------------------------------------------ if ( ! function_exists('is_really_writable')) { /** * Tests for file writability * * is_writable() returns TRUE on Windows servers when you really can't write to * the file, based on the read-only attribute. is_writable() is also unreliable * on Unix servers if safe_mode is on. * * @link https://bugs.php.net/bug.php?id=54709 * @param string * @return bool */ function is_really_writable($file) { // If we're on a Unix server with safe_mode off we call is_writable if (DIRECTORY_SEPARATOR === '/' && (is_php('5.4') OR ! ini_get('safe_mode'))) { return is_writable($file); } /* For Windows servers and safe_mode "on" installations we'll actually * write a file then read it. Bah... */ if (is_dir($file)) { $file = rtrim($file, '/').'/'.md5(mt_rand()); if (($fp = @fopen($file, 'ab')) === FALSE) { return FALSE; } fclose($fp); @chmod($file, 0777); @unlink($file); return TRUE; } elseif ( ! is_file($file) OR ($fp = @fopen($file, 'ab')) === FALSE) { return FALSE; } fclose($fp); return TRUE; } } // ------------------------------------------------------------------------ if ( ! function_exists('load_class')) { /** * Class registry * * This function acts as a singleton. If the requested class does not * exist it is instantiated and set to a static variable. If it has * previously been instantiated the variable is returned. * * @param string the class name being requested * @param string the directory where the class should be found * @param mixed an optional argument to pass to the class constructor * @return object */ function &load_class($class, $directory = 'libraries', $param = NULL) { static $_classes = array(); // Does the class exist? If so, we're done... if (isset($_classes[$class])) { return $_classes[$class]; } $name = FALSE; // Look for the class first in the local application/libraries folder // then in the native system/libraries folder foreach (array(APPPATH, BASEPATH) as $path) { if (file_exists($path.$directory.'/'.$class.'.php')) { $name = 'CI_'.$class; if (class_exists($name, FALSE) === FALSE) { require_once($path.$directory.'/'.$class.'.php'); } break; } } // Is the request a class extension? If so we load it too if (file_exists(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php')) { $name = config_item('subclass_prefix').$class; if (class_exists($name, FALSE) === FALSE) { require_once(APPPATH.$directory.'/'.$name.'.php'); } } // Did we find the class? if ($name === FALSE) { // Note: We use exit() rather than show_error() in order to avoid a // self-referencing loop with the Exceptions class set_status_header(503); echo 'Unable to locate the specified class: '.$class.'.php'; exit(5); // EXIT_UNK_CLASS } // Keep track of what we just loaded is_loaded($class); $_classes[$class] = isset($param) ? new $name($param) : new $name(); return $_classes[$class]; } } // -------------------------------------------------------------------- if ( ! function_exists('is_loaded')) { /** * Keeps track of which libraries have been loaded. This function is * called by the load_class() function above * * @param string * @return array */ function &is_loaded($class = '') { static $_is_loaded = array(); if ($class !== '') { $_is_loaded[strtolower($class)] = $class; } return $_is_loaded; } } // ------------------------------------------------------------------------ if ( ! function_exists('get_config')) { /** * Loads the main config.php file * * This function lets us grab the config file even if the Config class * hasn't been instantiated yet * * @param array * @return array */ function &get_config(Array $replace = array()) { static $config; if (empty($config)) { $file_path = APPPATH.'config/config.php'; $found = FALSE; if (file_exists($file_path)) { $found = TRUE; require($file_path); } // Is the config file in the environment folder? if (file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php')) { require($file_path); } elseif ( ! $found) { set_status_header(503); echo 'The configuration file does not exist.'; exit(3); // EXIT_CONFIG } // Does the $config array exist in the file? if ( ! isset($config) OR ! is_array($config)) { set_status_header(503); echo 'Your config file does not appear to be formatted correctly.'; exit(3); // EXIT_CONFIG } } // Are any values being dynamically added or replaced? foreach ($replace as $key => $val) { $config[$key] = $val; } return $config; } } // ------------------------------------------------------------------------ if ( ! function_exists('config_item')) { /** * Returns the specified config item * * @param string * @return mixed */ function config_item($item) { static $_config; if (empty($_config)) { // references cannot be directly assigned to static variables, so we use an array $_config[0] =& get_config(); } return isset($_config[0][$item]) ? $_config[0][$item] : NULL; } } // ------------------------------------------------------------------------ if ( ! function_exists('get_mimes')) { /** * Returns the MIME types array from config/mimes.php * * @return array */ function &get_mimes() { static $_mimes; if (empty($_mimes)) { $_mimes = file_exists(APPPATH.'config/mimes.php') ? include(APPPATH.'config/mimes.php') : array(); if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) { $_mimes = array_merge($_mimes, include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')); } } return $_mimes; } } // ------------------------------------------------------------------------ if ( ! function_exists('is_https')) { /** * Is HTTPS? * * Determines if the application is accessed via an encrypted * (HTTPS) connection. * * @return bool */ function is_https() { if ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') { return TRUE; } elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https') { return TRUE; } elseif ( ! empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') { return TRUE; } return FALSE; } } // ------------------------------------------------------------------------ if ( ! function_exists('is_cli')) { /** * Is CLI? * * Test to see if a request was made from the command line. * * @return bool */ function is_cli() { return (PHP_SAPI === 'cli' OR defined('STDIN')); } } // ------------------------------------------------------------------------ if ( ! function_exists('show_error')) { /** * Error Handler * * This function lets us invoke the exception class and * display errors using the standard error template located * in application/views/errors/error_general.php * This function will send the error page directly to the * browser and exit. * * @param string * @param int * @param string * @return void */ function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered') { $status_code = abs($status_code); if ($status_code < 100) { $exit_status = $status_code + 9; // 9 is EXIT__AUTO_MIN $status_code = 500; } else { $exit_status = 1; // EXIT_ERROR } $_error =& load_class('Exceptions', 'core'); echo $_error->show_error($heading, $message, 'error_general', $status_code); exit($exit_status); } } // ------------------------------------------------------------------------ if ( ! function_exists('show_404')) { /** * 404 Page Handler * * This function is similar to the show_error() function above * However, instead of the standard error template it displays * 404 errors. * * @param string * @param bool * @return void */ function show_404($page = '', $log_error = TRUE) { $_error =& load_class('Exceptions', 'core'); $_error->show_404($page, $log_error); exit(4); // EXIT_UNKNOWN_FILE } } // ------------------------------------------------------------------------ if ( ! function_exists('log_message')) { /** * Error Logging Interface * * We use this as a simple mechanism to access the logging * class and send messages to be logged. * * @param string the error level: 'error', 'debug' or 'info' * @param string the error message * @return void */ function log_message($level, $message) { static $_log; if ($_log === NULL) { // references cannot be directly assigned to static variables, so we use an array $_log[0] =& load_class('Log', 'core'); } $_log[0]->write_log($level, $message); } } // ------------------------------------------------------------------------ if ( ! function_exists('set_status_header')) { /** * Set HTTP Status Header * * @param int the status code * @param string * @return void */ function set_status_header($code = 200, $text = '') { if (is_cli()) { return; } if (empty($code) OR ! is_numeric($code)) { show_error('Status codes must be numeric', 500); } if (empty($text)) { is_int($code) OR $code = (int) $code; $stati = array( 100 => 'Continue', 101 => 'Switching Protocols', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 422 => 'Unprocessable Entity', 426 => 'Upgrade Required', 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported', 511 => 'Network Authentication Required', ); if (isset($stati[$code])) { $text = $stati[$code]; } else { show_error('No status text available. Please check your status code number or supply your own message text.', 500); } } if (strpos(PHP_SAPI, 'cgi') === 0) { header('Status: '.$code.' '.$text, TRUE); return; } $server_protocol = (isset($_SERVER['SERVER_PROTOCOL']) && in_array($_SERVER['SERVER_PROTOCOL'], array('HTTP/1.0', 'HTTP/1.1', 'HTTP/2'), TRUE)) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1'; header($server_protocol.' '.$code.' '.$text, TRUE, $code); } } // -------------------------------------------------------------------- if ( ! function_exists('_error_handler')) { /** * Error Handler * * This is the custom error handler that is declared at the (relative) * top of CodeIgniter.php. The main reason we use this is to permit * PHP errors to be logged in our own log files since the user may * not have access to server logs. Since this function effectively * intercepts PHP errors, however, we also need to display errors * based on the current error_reporting level. * We do that with the use of a PHP error template. * * @param int $severity * @param string $message * @param string $filepath * @param int $line * @return void */ function _error_handler($severity, $message, $filepath, $line) { $is_error = (((E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity); // When an error occurred, set the status header to '500 Internal Server Error' // to indicate to the client something went wrong. // This can't be done within the $_error->show_php_error method because // it is only called when the display_errors flag is set (which isn't usually // the case in a production environment) or when errors are ignored because // they are above the error_reporting threshold. if ($is_error) { set_status_header(500); } // Should we ignore the error? We'll get the current error_reporting // level and add its bits with the severity bits to find out. if (($severity & error_reporting()) !== $severity) { return; } $_error =& load_class('Exceptions', 'core'); $_error->log_exception($severity, $message, $filepath, $line); // Should we display the error? if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors'))) { $_error->show_php_error($severity, $message, $filepath, $line); } // If the error is fatal, the execution of the script should be stopped because // errors can't be recovered from. Halting the script conforms with PHP's // default error handling. See http://www.php.net/manual/en/errorfunc.constants.php if ($is_error) { exit(1); // EXIT_ERROR } } } // ------------------------------------------------------------------------ if ( ! function_exists('_exception_handler')) { /** * Exception Handler * * Sends uncaught exceptions to the logger and displays them * only if display_errors is On so that they don't show up in * production environments. * * @param Exception $exception * @return void */ function _exception_handler($exception) { $_error =& load_class('Exceptions', 'core'); $_error->log_exception('error', 'Exception: '.$exception->getMessage(), $exception->getFile(), $exception->getLine()); is_cli() OR set_status_header(500); // Should we display the error? if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors'))) { $_error->show_exception($exception); } exit(1); // EXIT_ERROR } } // ------------------------------------------------------------------------ if ( ! function_exists('_shutdown_handler')) { /** * Shutdown Handler * * This is the shutdown handler that is declared at the top * of CodeIgniter.php. The main reason we use this is to simulate * a complete custom exception handler. * * E_STRICT is purposively neglected because such events may have * been caught. Duplication or none? None is preferred for now. * * @link http://insomanic.me.uk/post/229851073/php-trick-catching-fatal-errors-e-error-with-a * @return void */ function _shutdown_handler() { $last_error = error_get_last(); if (isset($last_error) && ($last_error['type'] & (E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING))) { _error_handler($last_error['type'], $last_error['message'], $last_error['file'], $last_error['line']); } } } // -------------------------------------------------------------------- if ( ! function_exists('remove_invisible_characters')) { /** * Remove Invisible Characters * * This prevents sandwiching null characters * between ascii characters, like Java\0script. * * @param string * @param bool * @return string */ function remove_invisible_characters($str, $url_encoded = TRUE) { $non_displayables = array(); // every control character except newline (dec 10), // carriage return (dec 13) and horizontal tab (dec 09) if ($url_encoded) { $non_displayables[] = '/%0[0-8bcef]/i'; // url encoded 00-08, 11, 12, 14, 15 $non_displayables[] = '/%1[0-9a-f]/i'; // url encoded 16-31 $non_displayables[] = '/%7f/i'; // url encoded 127 } $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 do { $str = preg_replace($non_displayables, '', $str, -1, $count); } while ($count); return $str; } } // ------------------------------------------------------------------------ if ( ! function_exists('html_escape')) { /** * Returns HTML escaped variable. * * @param mixed $var The input string or array of strings to be escaped. * @param bool $double_encode $double_encode set to FALSE prevents escaping twice. * @return mixed The escaped string or array of strings as a result. */ function html_escape($var, $double_encode = TRUE) { if (empty($var)) { return $var; } if (is_array($var)) { foreach (array_keys($var) as $key) { $var[$key] = html_escape($var[$key], $double_encode); } return $var; } return htmlspecialchars($var, ENT_QUOTES, config_item('charset'), $double_encode); } } // ------------------------------------------------------------------------ if ( ! function_exists('_stringify_attributes')) { /** * Stringify attributes for use in HTML tags. * * Helper function used to convert a string, array, or object * of attributes to a string. * * @param mixed string, array, object * @param bool * @return string */ function _stringify_attributes($attributes, $js = FALSE) { $atts = NULL; if (empty($attributes)) { return $atts; } if (is_string($attributes)) { return ' '.$attributes; } $attributes = (array) $attributes; foreach ($attributes as $key => $val) { $atts .= ($js) ? $key.'='.$val.',' : ' '.$key.'="'.$val.'"'; } return rtrim($atts, ','); } } // ------------------------------------------------------------------------ if ( ! function_exists('function_usable')) { /** * Function usable * * Executes a function_exists() check, and if the Suhosin PHP * extension is loaded - checks whether the function that is * checked might be disabled in there as well. * * This is useful as function_exists() will return FALSE for * functions disabled via the *disable_functions* php.ini * setting, but not for *suhosin.executor.func.blacklist* and * *suhosin.executor.disable_eval*. These settings will just * terminate script execution if a disabled function is executed. * * The above described behavior turned out to be a bug in Suhosin, * but even though a fix was committed for 0.9.34 on 2012-02-12, * that version is yet to be released. This function will therefore * be just temporary, but would probably be kept for a few years. * * @link http://www.hardened-php.net/suhosin/ * @param string $function_name Function to check for * @return bool TRUE if the function exists and is safe to call, * FALSE otherwise. */ function function_usable($function_name) { static $_suhosin_func_blacklist; if (function_exists($function_name)) { if ( ! isset($_suhosin_func_blacklist)) { $_suhosin_func_blacklist = extension_loaded('suhosin') ? explode(',', trim(ini_get('suhosin.executor.func.blacklist'))) : array(); } return ! in_array($function_name, $_suhosin_func_blacklist, TRUE); } return FALSE; } } PK!+˹lmmcore/Hooks.phpnu„[µü¤item('enable_hooks') === FALSE) { return; } // Grab the "hooks" definition file. if (file_exists(APPPATH.'config/hooks.php')) { include(APPPATH.'config/hooks.php'); } if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/hooks.php')) { include(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'); } // If there are no hooks, we're done. if ( ! isset($hook) OR ! is_array($hook)) { return; } $this->hooks =& $hook; $this->enabled = TRUE; } // -------------------------------------------------------------------- /** * Call Hook * * Calls a particular hook. Called by CodeIgniter.php. * * @uses CI_Hooks::_run_hook() * * @param string $which Hook name * @return bool TRUE on success or FALSE on failure */ public function call_hook($which = '') { if ( ! $this->enabled OR ! isset($this->hooks[$which])) { return FALSE; } if (is_array($this->hooks[$which]) && ! isset($this->hooks[$which]['function'])) { foreach ($this->hooks[$which] as $val) { $this->_run_hook($val); } } else { $this->_run_hook($this->hooks[$which]); } return TRUE; } // -------------------------------------------------------------------- /** * Run Hook * * Runs a particular hook * * @param array $data Hook details * @return bool TRUE on success or FALSE on failure */ protected function _run_hook($data) { // Closures/lambda functions and array($object, 'method') callables if (is_callable($data)) { is_array($data) ? $data[0]->{$data[1]}() : $data(); return TRUE; } elseif ( ! is_array($data)) { return FALSE; } // ----------------------------------- // Safety - Prevents run-away loops // ----------------------------------- // If the script being called happens to have the same // hook call within it a loop can happen if ($this->_in_progress === TRUE) { return; } // ----------------------------------- // Set file path // ----------------------------------- if ( ! isset($data['filepath'], $data['filename'])) { return FALSE; } $filepath = APPPATH.$data['filepath'].'/'.$data['filename']; if ( ! file_exists($filepath)) { return FALSE; } // Determine and class and/or function names $class = empty($data['class']) ? FALSE : $data['class']; $function = empty($data['function']) ? FALSE : $data['function']; $params = isset($data['params']) ? $data['params'] : ''; if (empty($function)) { return FALSE; } // Set the _in_progress flag $this->_in_progress = TRUE; // Call the requested class and/or function if ($class !== FALSE) { // The object is stored? if (isset($this->_objects[$class])) { if (method_exists($this->_objects[$class], $function)) { $this->_objects[$class]->$function($params); } else { return $this->_in_progress = FALSE; } } else { class_exists($class, FALSE) OR require_once($filepath); if ( ! class_exists($class, FALSE) OR ! method_exists($class, $function)) { return $this->_in_progress = FALSE; } // Store the object and execute the method $this->_objects[$class] = new $class(); $this->_objects[$class]->$function($params); } } else { function_exists($function) OR require_once($filepath); if ( ! function_exists($function)) { return $this->_in_progress = FALSE; } $function($params); } $this->_in_progress = FALSE; return TRUE; } } PK!ñwÌnÖ1Ö1fonts/texb.ttfnu„[µü¤ € OS/2M'B¬VcmapÙSãk glyf‚ää”head׆0À6hhea ø "ð$hmtx{¦”×øöloca†XPÄümaxp¤ name.Ñ, # post§Y8X& ¶¼š3%š3 fz‡€Meta ûŒýŒ3yw@ÿÿÿ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ybcgmkl}f€{t~npjae|dirsuvwxo‚ƒzhqð®€.~¡£§¬±·»¿ÆØßæø1S '28¡¿ÀÎOQ   ! 2 ×!!!!!!5!™!½!Á!Ó!Õ""""" """""%"+"<"@"C"E"M"`"e"}"ƒ"‡"Ž"™"¥"Ä"Æ"Ù# #*$"%³%¹%½%Ã%Ë%á&c&oøÿûÿÿ ¡£§«±¶»¿Æ×ßæ÷1R '27£ÀÁQ   2 ×!!!!!!5!!¼!À!Ð!Õ""""" """""%"'"<"@"B"E"M"`"d"z"‚"†"Ž"‘"¢"Ä"Æ"Ø##)$"%³%¹%½%Ã%Ë%à&`&møüûÿÿÿâÿÀÿ¿ÿ¼ÿ¹ÿµÿ±ÿ®ÿ«ÿ¥ÿŽÿˆÿxÿ@ÿ ý…ý„ýƒý€ýkýaý]ýýü´ýüÒüÄüÃàbà[àYàãà?ààààßÿßçßßkßiß[ßZß0ß-ß,ß*ß&ß%ßßßßßÞúÞÞÞÎÞÊÞÈÞÂÞÀÞ¸ÞšÞ™ÞˆÞZÞ=ÝFÛ¶Û±Û®Û©Û¢ÛŽÛÛ{šTLRR"„l{19:;|<}>?@A~{‚ƒ|}!!%!!ü Àü@û ÀÄÿÿ ¦1R376767676767676767676'&'"72767676767676'&'&X:'*       ’ AB  | ¥!%7' +,]¼\.œ & - e4cÅI#)) '†ûš 0QS0   (2„ýÝœ°(Q3276745676567676767676'&'"!67676767676'&#373b7   $LR# Õ #RL$   7Þ !(:tu:_)9?)[ !BC!)Sq99qS)!CB! [)?9)_:ut:(! ƒþj'–ð#'+"#"3733767677676767676767167633!76767676767676776767656763";!33276'4'&###!6767767656763;23276'&'&###6767676'&#'#!6767767676#2+!##"3633!!''#!676767676767656763!À#  QÜ< &1 Rÿ#C# @  -   K(. ' U  ""j+S %7 qþ¦#   QÜ< &1 Rÿ#A$ @ #2  KþØ. ' U    jþÕS %7 rY    MþÛ    M%¦Lu))4 lÚt: ? 2((O–J+)!L˜S)~S (7nm7d (9Lu))4 jØw< ? / &l¦&K—W+~S JZ@c !(9""N(""N(‚ÿއ³"'&'&'76767676'&33527676767676'&'&'&'&'2"3276'4'&'&'&'&'&'"'#"'&7455#&'&'&'&7476767676767#1:"!$'ZVn¡{ µ8 ',+>  #NI`%a-7%!"ƒ,&CBS) F5:"%?J#FCb  a L06 7~ a!,#$?i  $RXLDfIE$ýþ ˆ )>)*#*#"" V;6ii{Ãl\O;;É#8 #31#,9"6!aIEMÊþM4;J Gû#ë!)/8`B ‚ÿ‡+r“–Çè7676777676567767677676'&'&'&'&'&&'&#767676767676'&'&'%6'&'&5454547676773276767676'&'&'&'&'&#&6'&'&54545476767ð 3‹ˆ""'9 4T¤n88oH$!F“I J61bdÊ …J’1( ASMX*-“‰G)5(&-aNN& 'Tq:2,þîn>#)25(% "/lž8 :/1 < w" ª  ;>O  n>#)25(% "/3  +h×GH\.*Z»bLF>€$‚X­a»:'#  2L 1$ 57Y&+(,""H>5+/!F Xu58!5"ƒ Š OgeD4!("6?‡ F2"&ªý»"#2\$#Äe  UýJNM36 J Š OgeD4!("6?‡ F2"&bÿß±ªá 77676767676723&767676765#'&'&'&'&'5676767676776767676767767235'2"#&''&'&'&'&'&'&''&767636767677676767676'&'&'&'&'&7&'&'&'&'&'&7676#'&'&'&5&767674367¹   "9 #(%)–›     !IBÀg  a-.1]X  Rˆ    '(= M˜ß)   pC  C/;+ !7%! ,93?SDF&   ·  0,@!&     –  ()-/   G:FD B# ±  .te  :   p/'$3 ]Â/aa   !¡P   L;JE 7%!(&23+( 02I3>2D/2.1 ¡  #$$%, k?9;"     æ  @7<3%%ENOD¤Á623677676767676'&'&'&'&'&7276767¼  ') ,$%!'/Y-^ %*# €- <860( #(*/:B?E?2D'0n+ ÞýûG76'&'&'&'&'&'&'&'&'&767767676767676'&'"Ý <54-Ç L5CHX   J:5%E r"    2<:CþÕþxxwÄ¡p\dK   Nf^nÑÿ>@OI,Ô1+.(  ýÿ¶L3"32767676767676'&'&'&'&'&'&'&'&š  H94(H#     @96/½+4?CO ÿ  H_Wh¼ó03haþ´î1,.(    6@?H&|˜•_V\OaQUD  •pÈ&'&'&'&'&'&'&&'&3"76776767676767677676'&'&'&'&'&''76'&'&#&'&'&'&'&'&'67676767676727676'&667676767676'&%/ 0   a  4343  a   0 /  J8 / 0   a  3443  a   0 /  J8 { & $  o'        'o  $ & $H4?)8 V+ & $  o'        'o  $ & $H4?)8 V+‚þí¥L!##";!767676'455!3327676'&'&'&+!5456'&'&VýÕN    L..L    NýÕ=ýÑL    N,/L    NýÔ§þr?0%7676767676'&'&'&'&#"7276767µ Z + #"P *:2'D,.G )‚u)%*r&$#!,ZE-. d+!5!sý+ÇǨÿþì@ 72367676767676'&'&9AC  ~ ? /RT0  &/†|ýÿ' 37676767676767676767476Ð'A1'M*6mm6!   !)!--_¶—N"  WO ¢r]¼h5„þøþø„'OO' 2X7op7ßÀu¹)T4 ,X \ÿé=BDx32727676767667654'&5&'&'&'&'&#&'&6'&'&'&5&5545474767676767673 F;@-s 9 % !!41)&P?‹ 4^ & KCB  .08OBB #"0 ?  0{ìKEAi4[)$-   4)- /)BU~706/`?G'(B3&6J¢ @9 #!rI,J 4ƒ8 !  (6X*7JFB) ¥R^‰b &)0C61!* @H]D+,(IZ% @XC2;!#%5#535#5456'&+&!?77APå-ý‚ÇÇÇ B#@€›K6 !gþ(ŒÐC!>ÝaaÝa¶§(  T,Q Àa#C *Cßý‚1°T)rÿç$T”%2367654'&'&7676767676767676'&'&'&2376767676'&'&6#"'&'&'&&'#&32767676767676736'&'&'&'J&Dt   4LGS %$04*(!"EopÄAAT5*1é« Iglp}uN6   #.)1=&   E“`L Â=!*U$h!(58:#   &g…­tu  )  ”  $!  qþ§x!   E+^2f q6c2`ÿé8@T‰#47676767623276'&'&'&273676767674'&'&'&'&'&#&763#"'&'&'&'45&'&76767z b¹P,Qu AK|†nxOŽ ^{òqI5//$PDDe:I .*'Î ?'$/,%# (/?¸)tR,$*!™ + "-] m ];D 27b³þÝLTÊ{¡$%-hž()kXU,&V3¤  5 g,( *)^5€TB)/ƒÿé{jc36767676763763636332767654547676767676767676767676'&5"'&'&#"'&#"'"'&'&5#Ë(a  5 hª”  G![=B [:$JI &*&+ ÂŽ[)g!,! aj€þÚc8'   R,w~ˆˆSR:N(!+ C!_0á†0T -1,2  % aÿè:@P‰Ä#767676'&'&'&'&'&'&'6767656'&'&'&'&'&6&7"''&'&'&'&'&'&'&'&'&'&547676767276723'&'&'&'&76767676767663j+!#)-KÀ !52ÚrY,+: S$C(W"€[ E  ,#É $>œ-  W  !1$#C s j   5#` )”)0!¶?  #¢    #)IY^K|*~cJB>53&  0)MkO@1 1Wu94(%# ( Mr!qW    %" Mý| 51  ^}!#H<  aÿé9Bp¡3'&'&'&'&'67676767676'&'&23676767676766'&'&'&'&37676767676'"'&'&'&'545&554567676767676767 b !   \ J9¸ND(%&#±  #vE^Ve,")#LBC*6 @@b(.+/ #.)' Ù?85 3"(.  _! pþê^    %f%e)&‚ ±BCHA6ân@ 13BU}*-jYX-  ' )&>$N E-\-!0Í K7-6 ¨ÿþì A72767676767676'&'&72367676767676'&'&9AB  ~ AC  ~ Ž 0QS0  &/†ý± /RT0  &/†¥þqò X72767676767676'&'&767676767676'&'&'&'&#"72767679AB  ~ h   # [ P  j".PŽ 0QS0  &/†ü‹*532- ‰NEn$x:*8 ÀÿLc³Z67676767676767676767656'&76'4'&'&'&''&'&'&'&'&''&'&'‘:)2e†B9si4C}2 $10+C~ ~ëd%F„@=G9I ?7=t8}›â C+01#O•&F›SQQRQ"?  ÿ0>!61!:"3 >=o/"A"%+$ 7 ;Âm> 3"&G !I)(&'% ƒÝ¦$:;!!27676'&#!!#'"32;!!27656'&#!!#'"¸4) Eï )+1 ,½üàþýT 4( Eí#(+0-¼üãþüT ! 5,4 þ86+3 ÄÿLg³Z76767767767676767676'&'&'&'&''$''&'&'&–:)2e†B9rj4C|3 $10+C ~ëd%F„@=G9I ?7=t8}þeâ ~C+01#O•&F›SQQRQ"?  0>!61!:"3 >=o/"A"%+$ 7 ;Âm> 3"&G !I)(&'% ƒÿÿÖœ`6723276'4545&7676767676767676'&'&'&37676'&'72767676767676'&'&%Z‰?   )   +(3J/oFcXGÈnD ($# XØAB  |  @ $ !% 6:=?9\ & 6 0%## 1+(# ,!:KƒF+ c>^ 0&i ü2 0QS0   (2„‚ÿó¥šÈÿ7676767674565&'&'&'&%&%2767676767767676'&'&'&'&'&'&47%6'&'&'&7655456'&'&'&#"'"'1&'&'&'&'&'&767676676#"'&'&'&'&5&7676767767™ 6\!!+ ();Ãþª67:494F?B8Y@= Õix][[Y $  gnknm[hY601(²gª‡IAD6e2-  !&(  4<8?_RX># ¶n‘UM9-þïSA !'(+7<5+'(#±      ! % (²У #"#1\ˆ{”% E8 5! $R 0V    !$A%2.5;=ö|K % Ù 8  ?Ô‘(  /)>09A:qU/"& T ˜p‡7775"'&'&&'&776767676776743676;!#%5+'&'5&'&'&''&''&'&'&'&'&'&'&#"6##!7?T]µì(*    q† RÂ7þ&/)Sq6""  ()('AKAN 3UÊ     þ)0k5 aaa =.   DÆaa As eɈ)QR)   Q0a\/£µž¹/,0, Ç/ &KK&55&u€-O~;Nb3#!2#6767676767676'4'&'&'&'&'�'&'&'&'!!!236##!! %#"#!OÞÞ³Ñx%! WLm'  {B  S +'0q½±þ·ýCé3‰5, €HŸþýHYþèR/G'"E™ þÆ}aûEa@ ! aB: &G17wY",ýƒ,)4ªM+ýaU!I@U ´M)‚ÿè$–˜##"76767676765454'&##'"'&'&'&'&'&'&7676%6763732767676'&55454'&#"#1"''&'&'&'&'&'&'&" 17n`gPìºÇm''•vkIQ   %#3ˆÈNNE;?/z=o# /",%eRQ/          [l9” *-CÇþ®þÜÂÐ94MUi."  =53(m!/{î!&H6µv× DB_ , ?K       , OÿþŠ!C3#!76767676767676'%&'&'&!336'##OÞÞ·vW9KBH>SBE.. þÛHTPW=]výJõß9-L>G60#!Š9J@Q.9à}aûEa';u&aa&u>=ª˜ÁV &a+û'raûPaa(D  "F?F"  D'\ H©œSÿçÄ•%376'45535%!#&'"#&'&'&76767676767676763732767676'4555456'&#"##&''&'&'&'&'&'"76767667=&C £{ÿþ&1s!ês !"14D?JÔ‘;,,     .0131:.>þÑ»<,+#ÊWvo~`Qk  m    Z@aa¶K E‰|çGUB-<2B9<,/m->=G   U [     ³9JGRpxþÎÁS52)  Oã}$3#%5#!#7%5#35%3!35%OÞÞ5’Þ”Þ’5ÞÞ’þéþËÞýlÞ’þéþË}aûEaaIý·aa»aaýïaD8}3#%5#35%'Déé?–ééþÁþá–}aûEaa»a'ÿè9}K!'&'&'&'&&'67676'4'&727676767676'45535%\  /E' 7 y/&J/Eˆ!', 60àN ¦züþ™}aý1Þ Q'    -Oj/dI5L%,­aOÓ}•3#%5#54'&76?6767##%5#"''&'&'&'&'&'&'&'&'&'&'&''&74?67677676767767635%2235%OÞÞ5’Þ&g  ! 6b1 %I;år#0 & #F{=(+ }-[D"G  %$'L¡þð "####J“h3"`.Þ’þéþË}aûEaa,X  U   + "F€A%"aa'2 -\¡Q39  h&K9;aa>{U+S"aO%}#3#!7#+!5%'OÞÞ˜-a   R‡*/’þžþß’}aûEa™™B< R»aRi}§36#775"'&'&&'&74=332367676767676767676767676767673#7%5#35!#"#"#&'&'&'&'&'&'&'&'&'&'&'&'&#"##!RÞ*D$,5nÏë5,$D*  "")Qu=!& 35 "EE"  Þ‹ (ÞÞþ”\#,UU++UU,#[þ”}aüä; aa :ß_%LK%Zµþú‚2:0<<@-n9;s(L˜˜L"DC" ûDaa»a ;"ED"^¾½^>=    >=^½¾^"DE"; Oã~…36#775"'&'&&'&74=332323276'&555545&767767635'2'&'&'&'&'&'&'&'&'&'&'&##!OÞ*D$,5nÏë5,$D*  5idȰX B! '   0J$,5nÏë5,$J0 ,W':tœN1@  fþ–}aüä; aa  7Ô4   ?{uìÏh%M' 0 /Ðߺ.  aa  (¤ýy0h0Dˆ¸[:K%  ƒÿåe–0u#"7676764'&'&'&'&'&'&'&"6#&'&'&'&'&'&'&'&'&5&54767767676767T fY^Gc62 μ,YZl^eOé!$CLtm„!%!&9 F>@/! 04 ! !`$ Ž&/"6”+.D_ˆ~“ þûª &(@¿WxhrYfB>S !3#'Oo"),$#K6þöv   _­9r 1' u  PÆ}!=3#%5#!236767676'&'&'&'&%2#!32##PÞÞ5’Þþ‰$ C?! &ŽþégýAõü.h> . >h/ú}aûEaa O [rmZ#QýB]& 9™ $<'&€þqr—Z›´767676767654'&'&#"'&''6776767$4'&'&'&'&'&%&76767677#&'&'&'&'&&'&'&'5&5476767676767676'&7676769  #;?bN $1F`MB)<ýg8* /[%"_1 -Sÿ✗â&'&'&'&'&'&'&'&'&'&'&'&'&'&5454'&#"#"3"76776767762&7676767676'&'&'&'&''&'&'&'&'&'&'&547676767676233"3327654=4'&'&#"® $"%CC×q   JFi9gWAC&*#$ I5E;()fX"0    !FBõr )dO° I&+1&) =—"&0"E2/ >N   # !   „$#$#m[W- ' $  X  "34A  Lõ (0   ˜Zc§{6%  "#. b  !?;M j÷6 #Uf,36767676767633!%5!323/!  a=C…4qþÇ€`´þÇf;‘D3a  úfƒóy&,z7<û\aa¤F5l0&yóƒOÿçÄ}h3767676767656'455545&767767635'2'#'&'&'&'&76535%OÞ1$@;O5<8>PIõ‘H 0J$,5nÏë5,$D*" )7B?ØJ  Þ’þéþË}aýv*ÞfJ:6& b…(R”Ü8  aa  5ÌþQL&937*    “*2_À?;a5ÿî¿}x;277276767677767676767476767767635'2#''''35''5‹# YCSG &g})= -­W '-Y¬î&$  '$II$   (w°8ÀþÇø}}a  ,4)6Ä—»¢8A3E& IDŠ.e‰À?@ aa ,Y R££R23  *Z }=a2ÿì P}Ü37676767676767676767677676767676777676767476767"767635'2#''''35'';2#&'&'&'&'&'&'&'&'35''2° H?HB   " ].    ( K !/.†C+  )BR¦ù;-    $F- &u{+ÄþÊðx"  %G)   6-- !ÄþÉïx}a  'NM'½¦º¨<< 1 6)Q#(Sîx55+ GHCHC3hB!à B>z*:uZ¯pD aa A3[·v; O( 4d/=p6aa  "!  \ºl6 G$; ,ŠF:ts:!Z)aF°}í;66#775"'&#&#&'&'&'&7767676767676767767673#%5+'&''&'&'&'&'&'&'&'&'&'&''&5477676767676767676716767767635%233&'&'&'&'&''&'&'35''e(1`F# $%pB  *5FjÐBF   B:   7q7©>þ‘' &Kp9 $76 -4GjÐþñBF    3+     $G ©þÁþ€}aB…b0    00$•T   aa    +VL&'    !J™Qaa +4hœM!"  '.$FG$ aa   "D92b %a(Ì}m33#7%5#54'&7676767676767676767676767656767767635'2'''''35%'(' ] R Þ0Ý C@C@ "    #!)-Z¯î! )  !BB! 'FÆH$¬þ¾þþ‚}a'ˆþ~w"-bþ¿aa>c    +a^a^%1 aa )0`a0  :f!i5a‚ÿÿ(~j347676767676767633373!77#"##67676767676776767676'4514'&##!¼ a   ^Ƀ”&00=zŸR%K $Îb a   iä‹™$00GŒGc3 #Éü·}pæ™+) ^4 #GF#Y³ìu6o)   ¤-w$'54#! i3 #GF#gÏÏgM   þY!5#35!QÖÖþ¯ø{ {uýï3'7676'&'&'&'&'&&'&''&'&'&'&¸C )^ÑH$I,!1 -/8p2"Bn9 / B+ *d3ìþ+þ¢¯Y°EkOG   7mp8Šw:Q£†MBLDB4þ…3#!!4ÖÖQþ¯{øö{ >‘Ž #&67676??55?77L=u^2 ; +qú–ZH>/[ñ‰4V'¿Ž$Ï    F*© '—J*Es4þÿÄý‰dþ32;!327676'&#!##'"ù3( >ØÜê$)-'§ý!ïM þ6+1 …¿éŽ6&776767676767676'"#7676'&"Ñ  ') ,$%!'/Y-^ %*# Ï- <860( #(*/:B?E?2D'0n+ @ÿðxŸ²52767636"767676767;76767654554'&#"#"'&'&'&'&7655476'&'&'&'&#""376'&'&''&'&'45&76767676767276767e : p8 65g]"V9 9" GQ G7  %K @Q>1 & +       9ý j1|(+I@' -,;) þ˜¡ ? &)6',  JÿôÎŽE232767576767677632&76767654'&'&"#6#'&'&'&'4'&'&74=45&7676767676767J'  G   &+&-åwer~ÚTOM-=yy=tR6 d #'B<6"'&I2&5 `òËu $&/!  BS% )"'šFLÿôÑŽCw322&'&'&'&"#767676767%5"'&'&'&'&7655"#6'"'&'&'&'&545767676767×$! !!#%',(-þîNj%106[Y2.0+w'  =yy=€[D%135,#pf "}a Nþ° »t˜´}*    e a5 àç ýÒ ? (’Ò?(:µ&4 Q  @ÿñöŸKY!33232767654'&'&'&'&'&'&767676767676'&'"#"'&'&5%!4767676GPó8 16X,3/5! Ä~œKyAA!! <03 +   JY¬M*ìþ &@„h@9¿   gMT) hƒß‘s¹ $(3%  &{Dp,C) c>gG?u*0Wƒ™D#3#775#35#545&76767676767636363276'&'&'&'&'&ŽeÃö²íø#  #;!D "-3(&âFŽaý4aaÌaˆ ˆ;   3"'#U#"ž2g¦Aþd†¦¤Ìõ77676767654'&'&'&'&'&'&'&'&##'&'&767677676'&'&'&''&'567676763367676'&'"#'&'&'&'&'&&6"##&'&'&545&76767671633 #2"'&'&'&'&76767ñH17 g©$.A9‡j‘ '!-[Ž9g<)1!  $!"60•Xt  (,3  €;:  MOgVM,P    . $ ]7 Y.; 0Š sÒc=+ #0a,3wG<(-3E >$ìü¶aaV H$)(' /*X þaaɪGN _pf ¾ aM <72767676767676'&'&2322#75#"#4AB  | Ì& ŽØ´`€;lƒ; 0QS0   (2„ýùa &þaa8 ÿŽþd* j72767676767676'&'&232''56767676'&#"37676767676'&5"#xAB  | Í%'  " 5q  Z6$% :Q pV <?~~? 0QS0   (2„ýùa 1ÏýÝe=&N%&:+# !' QÁ"[ J³Žš232#775#5545&767636767""#75"3"'"#&'&'&'&'&'&'&'&'&'&'&'56767676767676767676767635'2"#J' Žc¸ÓŽ 0  --    ÞžR´• %@;  , *+  ´×   3c )=yy=}a >ìü¶aa¹3  (   78 aa. 'OH%   $!" aa  )L § a[Ž232#775#"#a) Že½ØŽ=yy=}a >ìü¶aa- \}£†2322#775#45&7676767676#775#45&7676767676#775#456'&'&'&'&#&'&'&'&'&#5"#\ # ŽgÁÝŽ(56.ˆa %þ aaV H$)(' /*X þaaV H$)(' /*X þaaÅ ¢E. a ] ? á [îšR2322#775#45&7676767676#775#456'&'&'&"#5"#[ # ŽgÁÝŽ(56Ÿ *€âÓ~z  A%&-g€¦yN.+ J =³$%%$ ™>) '!,A„ÀG(JþrÏ›8u23223#775#37676767676'&'&'&5"#62'&'&'&'&'&'&74=45&7676767672767J) ŽgÁÝŽ"5:;6U  ]+  2"· .,À= JŠšD2322#775#4767676767633276'&'&'&'&#&#5"#J # ŽeÃö²5a'$?0#, 9EUB 9rq9ˆa %þ aa^/N<‡'8/",%?$ /##ë KÿðR¥§#'&'&'&'&'&'&'&#1"76767677632276767654'&'&'&'&'&'&'4567676767676733276'455456'&"#"''&'&'&'"##&©  ];\ L¦##X, #StH   . ES‚KfD(:6?CX- T )&`5  4 3; Ÿ,Ez2,7 #*!17   - Ç 3"   9N‹mK, #; % - &œ &  ,ÿï;#37676767676'&5#'&'455!5!#Z ,· ¦,8yF  a'  W .þÒa33ú4Jþ- •?R: !'QŒ8  R$? q·a†[ÿôî™t32323276767676747673%5"#"'"'&'&7455"#2322'"'&'&'&'&'&545"#[5  '*i'./,,$ l # 5JÍ+ #  Cg 3 6MÆ.ˆa @þæ ?A   Ÿ a ( –H a $nà 8(%& , !C k 6ÿö¤Žm376772767676767676767767672767635'23'&'&'&'&'&'&'35''6^  j4  !,  +-3.5  ·¥    5  $ .- nÞ­ZŽa .Aàu8)1   [/emcmaa"#6r.K'D 0``0Ga3ÿôqŽÁ376767676767676767676767673767676767676767676767676767635'2#'''35''3763#/35''3Y  AA "           % 5&0)   ³¯   ' 8q,sÍ™PW  !IM sݧWŽa  2LPžžP%%+  $""67>3  2?94 "#  &€\xe-&)aa  01aK&!C#‰k3aa  "E9C<   R³¼Oa.¯ŽÀ376#775"'&'&3&'4776767676767673#75#'&'&5&'&'&'&'&'&/&54776767676767676767672767635'2#&'&'&'&'35''8g22    !C"  #JŠ»    2    &E"OاXg  A* !4 !$JŠ»   8    "?OاXŽa   ;;! %K&aa  8    +O-aa   'L2 '; aa #?   &H(a-þf¤ŽŒ“3762'"'6767676'&'&76767677676767677676767676767"763235'23''35''&'&'6b ;K$  g„  QT &–UMG3&  #HG#C!  1 ·¥  #6 !7¯ná«Z€! Ža  # #>{P#$##    ;”( \Gz 2/L'T32L–•L’B  aa#!Gt+B"?vsaûB4´ŽK34767676767233#;!7###67677676767676'&'&+!{ a5§f_$I'6H"#$ " •z a =£ae v!Dz= ‘ýžŽ`³S$$a0^2$Fº\,//!)v$D/X( ™+XP $%"žýþü¤6767676767676'45545476767676323276'4'&##"##7"#"323332767676'4'&#"#"'&'&'&'&765456'&'&'&'&'&'&'Ë N+Š  Ò‡-%+$?+0  7/E    }6 Fƒ(*    z*+N -!> ,U.d(   (-;&R þèI#?/( T1o þ¯ .&""B   S)] < ?!-ýý… %7276765455456'&1>"#CBþàû&ô 7C!Üó 7C þû¢#"#";27767676767676'&54'&7676767672327676765&'&#"#&#&'&'&'&745456'&'&'&'&'&'&#"'&3233Î N+‹  ^ -%+$?+0  7/E    }6 D„!()    {*+N -!= þÒU.e'  (-;&R I#?/( T1n N 0%!!D  !S)] þÄ ?!-Į՗!367676767675''&Ä6 W¯t;Vn6 FˆFGfä2 -8&{2   +- tÄþV  T72767676767676'&'&72767676'&'&'&'&'&''&'&5&'&'"YAB  |     ™ 6&(     0QS0   (2„þ3/)V+ZoJ~)) '‹#&4&?]¼\.-F#& |ÿïž­±Æ#'"373&#"767676767677637676767654'&'&+"'&'&'&'6545376545456'&+45476767676323&76'&'&'&'&"#"'&'&7676p  l98B:9$7*:$#[L &*~\bPI7:    "3I\­ ¦  -– +IÁG B<z €á54Q>E% 4.A & &.+1ø ! þ{ *A9#   &/2D    8 2u  (7‚7 +ª !QK" t2..'™  +/D "$#> âýˆ   ›þg ™ É'&'&'&'2767654'&#"376'&'&'&'&'&'67676767676767654'&'&'&'&'&'&'&'&7676"3276'4'&'&'&#&'&'&'&'&'&7676767676•  *¼ 61## H2R-/ "*/'E Ê++˜lƒ &%'  *¼ 61## H2R-/ "*/'E Ê++˜lƒ &%'„ `%  `% 7 (( }W  .07,0sC.!;>"6!1Ÿ3Rd—.* (( }W  .07,0sC.!;>"6!1Ÿ3Rd—.*6 `‰.+*" `‰.+*"ÿú<Rš376'4'&'&'&'&'&'&'&'&'&'&5476767676767676767656'&7676'&'&'&'&'&'&'&'&'&'&54767676767676769S* "6&N   &  44   ##   02Ž" #Ff3  &*B!.` &  $#'/#4     ,YA    [#DE#* **./ !    '$8  )j74 zv¡ø.7676515456'&'&'&+!#'&3633!#A !" BÓýg™$9 #˜ƒ{þÒ!D"??:q K ; ‚ÿ°¨ÖV!##";!!"'&773!337676'&##!!3327676'&'&'&+!5456'&'&'&VýÕN    L.þDbG-8'(ábù8;'7öþÔ.L    NýÕý§;  =Y,N    LýÑ‚þp]N7676'453327676'45337654'&"##!'"3ÿ. #¤h $+©þéK8$KCH>6,/!M! oÒ"#5!Äý_W *J .ýúéá 3  3)#')0pˆULz5  ¨^ì  72367676767676'&'&9AC  ~ Ÿ /RT0  &/†P‘SŸ327767676?6776'&'#&'&'&'&'&'&'&5&336767676767677676'&/&'&'&'&''&‚%        ;z#   $&$&',$þû   ! $   45  #" Ž'   &"C<     4>.C!   H–*'  -.,./6,[   #.:     &J4; #EF#*  #..)) ƒþfÛ 72767676767676'&'&"#"'&'&'455&76767676767676765456'&"767676767676'&#ýAB  | 1 .;*";      '#- -9 4X7?!/$rK3'$<:%!   0QS0   (2„úó  4; U… 9 %)+((0.)&  B_4//  % 4JD+($ T}Š•36#775"'&'&&'&7767767767674767633!#!7#"##32#3#2##32'3'!!77?3|ž , 'PO( ( !!(-^´ì%$ fQ $G    D¦7'a#7 hÚf“BYz* aa *zYBŽÌjeA(!% $a+úê`þ¾&w/8}a, 4k^¼¼^ ?_0 aa  7Sª 'ýîaIéÈQ [C (S?S( CH G¥œSaý¸0Zq"€ÿ„¦ùiÌ#&''&'&'&'&'&33676767677$6767676'&'&'&'&'&'&''&5&77676767675&'&'&''&'&'&'&5576%2#"'&'&'&'&''&5477676767676767676767676767§)  %%&&hhþÁÎÜ  %&.49CC)  F3272999 ¸ "%>   , Ê/ 88:x¼[ 'X~~m:LZi|nc 7me4!AD"  ù<#  °½þ¶`]624/5-/&+R^0<  "195.*03= 2  -#E‡;D!  7 >LGAà .+1I3    #d    ~Ek!' !/:L>D(3 %    $j,+;) þ»$rDSB/;L"J 5   -  ::4"ƒÿJ¦¶ >_3276767656'&'&'&'&32;!!27676'&#!!#'"3276767656'&'&'&'&…# ¥ W=ý33( Eí#(+1 ,½üàþýT Í# ¥ W=µ  #ª' 9kT7 ýˆ6+4 þŽ  #ª' 9kT7 ?ÿ'kirŒ¢'%&'&'&'&'&"676?6767$76'&'&'&'&'&''&5&?6767''&'&'&'&545&7676'&''?77à Dþµ !(, {dn?KS     + J  .-HQ F +É QÀ] +E«;6 80 *?¦>9 T¿=i-kn 16`t“u  %# w-Âo’œs,r  þ¾(þÊ•  :X+¹P~5=q%@ µOt '‡3b.aM™2322#75#"#h& ŽØ´`€;lƒ;ˆa &þaa8 ©ÿè •i§!7#"##3323#+3233'!'&'&'&767676!63"#"'&'&'&'&'&'&'&7767676767»7'a"4 eÔˆ¯Y;Cv.aa.vC;Y»Ž²Q %a+ý¯’jD.\n765Æ–K=?,#ž.:9A˜½))7n\.Gm˜húì 6e$  *&%*'A;<.5'$  ²%/ 7Ié¿P  ^H? (:?:( ?TF¥œS Q)78F6>%:,5(:þ€)h3+D.  /7KEP$%$&h_1’  @ÿòë p¨º%37676767676'&'&'&'&'&5!33767654'5&'&'&'&&'&'&'&'&'&#&76767676762"'"#&'&'&'&'&5476767676767!4767676Ö 3;7=F>C:/%%%*(0)+¯N% æx Zf¬?C# " G!   n )(ìlH"22;BKFLMDJ= *þa C69U!$1- c 6&#+  íþ& 2Aq`;    $#.)  ' ˆAc!(   '–R\  ', J ‘|¶r6** 'Å!#9:~ ,œB    X 1!{C  þ­$ nCV@2;K 7ÿͰŠ7676767676767645!7676'4'&'&'&#"#"'&'&'&74553323276'45476'&'&'&###!#'&7676767623] ' l  0=f\>?  $+2#*Å/  pþ¬Ö6'Q>(  (U ŽH$:. '6c '†9ÐK*A4f;LAB_    &K %L½  9 r  5  ™W!5!™ûgWJJ 2W!5! 2öÎWJJ¿†Ž6m&776767676767676'"#7676'&"!&776767676767676'"#7676'&"k  &) ,$%!'/Y-^ %*#   &) ,$%!'/Y-^ %*# Ï- ;77/) #(*/:B?E?2D'0n+ - ;77/) #(*/:B?E?2D'0n+ KÁ²6m23677676767676'&'&'&'&'&7276767!23677676767676'&'&'&'&'&7276767c  &) ,$%!'/Y-^ %*#   &) ,$%!'/Y-^ %*# €- ;77/) #(*/:B?E?2D'0n+ - ;77/) #(*/:B?E?2D'0n+ ƒþY”›Š&'&'&'&7676727674767676767654756'&'&''&'76765&'&'&'&4776767676'4'&'&'&í- e: D3š  %  %  š3D ;g)   !0_­  1 !0RG 8$o:&M! ®ySK4838  :;9;9KTy­ !M&:o$8 GR0! 1  9(_2)!V0\*8‚þe•›eÈ&'&'&'&7676776''&'&'76765&'&'&'&67676767676'&'&'&'&&''&'&76776776'&'&''76767656'&67676767676'&'&'&'&í- e: D3š   !0d /  š3D ;g)   !0d / $ €%H4Z $   !0d 0$ Z4H%€ $   !0d 0ì  1 !0RG &%9&# !\Ax#&3 GR0! 1  &%9&# !\Ax#&3üg: S, , '$;%" !\Bz%&C , ,S :'$;%" !\Bz%&CZÿ黦U…6763676&'&'&'&7$767656''&'&'#&'&7676'4'6'&'&'&'&'&'&74545&76767673(|!¯w" "'0.7->tbhE^ %@;H1<0A †n¤@ZWd7V¦_#rH%BITIE)& 98D XY #GÐa%2,7kÝ :#..0Xy»-*,&?51 ®÷OJ=ÁK42 f&307 i #U/"+þ~ .+NGY:(B,=)' Ié èI Åýÿôj'?37276747767676767676767676'&'&'&'&¦çq  a?j6% "T- D-\0  -8jÑÃb(}> $  !j]‘:t: '  Ùêï D*H*% ;   2bÆ`&:   !5'Ne2¹sZ¬ EÛq <"  ("9¾ä¤ýfÍg4E##‚ÿî° l›Ê376767676767676'&5&'&'&'&'&'&#&'&''&'&'&'&'&767676767676#"'&'&'&'&'&'&''&54776767676767676"#'&'&767676767x$$(+M]Wa.(-(NDD0 w—¾¨"$$(+M]Wa.(-(NDD0 w—¾¨":'WSl¢µ   >AHLOû*0y“   OT_d¯wk1)3*:# $* $1 /.B!"=A QE%"J ~ $* $1 /.B!"=A QE%"J ~Eþà gHE Ê %  >). 6-§  O/5 rf“_L þZ#¦h27676'4'&#"727676767676767676767676767676"3276'&'&'&'&"'ÿJ&B&AikWU,)" %Z>J&B&AikWT,)" #a>þÍ$W-#.&aŠFCe/g¶‹¬—Mš1 Q'ˆ/ 0$W-#.&aŠFCe/g¶‹¬—Mš1 Q' ’5/þ¥òÁ''#!#"#763!76767676767676767725676;!337654'&###!6767677676776763!3327676'&#!6767767676767676"+!##&3633!—+ ^þµf':$:Og  G"   7>   #†»w8%¢þ- ]X\-:%9Pþš   8  #f   (('( "þ?w8%¢è¦3i>  = ##@£T&   A‚”J+ $; 5j  =4 „C!BB! !b %]^]^K+   #;Àþkd—Zx67676767676767676767656'&76'4'&'&'&''&'&'&'&'&''&'&'32;!327676'&#!+&‘:)2e†B9rj4C}2 $10+C~ ~ëd%F„@=G9I ?7=t8}›â C+01#O•&F›SQQRQ"?  —4' <Øàê#)-'¨ý#ïMã0>!61!:"3 >=o/"A"%+$ 7 ;Âm> 3"&G !I)(&'% ü6*0Äþkg—Zx76767767767676767676'&'&'&'&''$''&'&'&32;!327676'&#!+&–:)2e†B9si4C|3 %00+C ~ëd%F„@=G9I ?7=t8}þeâ ~C*11#O•&F›SQQRQ"?  ûd4' <Øàê#)-'¨ý#ïMä0>!61!:"3 >=o/"A"%+$ 7 ;Âm> 3"&G !I)(&'% ü6*0@Ñ™\#3#775#!336#775#!54547676'7456'&'"'&#""ؘ˜Že½ØŽ.N Že½ØŽþ”þÔ<§34*  k KGk) °~1%+ Žaý4aaÌ !|ýíaa@ ¥`-m1s‹`FB8 (*ž@Ñš6Z#3#775#!#775#"#'"'&'&'&'&"!545&7676ؘ˜Že½ØŽ¯Že½ØŽ7    +!f5%+„  þF 0Å./" Žaý4aaÌý4aa-3 '.-\£¸ #  $¢¨ C ŠIÿ´ÞKq76777676737636767676/'&'&'567677776'&'&'&'"'&''&= Vþõ2*4 V  V 5* 8þõV V 9 *5þõV þ„D/$>X !Vþõ2 7 V   Vþõ9*6 V!!V 7*9þõV  |D/ ,:þìX"ﱦ%6767&'&'&'&''&u $J A8l, "C.  ! ! ,U Lt( $  èL67676767767767"è   i:$8²þà >*S*_ !  9e J3c. >‘Ž #&67676??55?77L=u^2 ; +qú–ZH>/[ñ‰4V'¿Ž$Ï    F*© '—J*Es4þÿĮ՗!367676767675''&Ä6 W¯t;Vn6 FˆFGfä2 -8&{2   +- t£röÜ!5!£Sü­ÜjjḎ)7676765#'&'&'&'&'&5#á !"QOJGɉU JŽ)*('  ljƒ/+¥[¨Oê 72767676767676'&'&9AB  |  0QS0   (2„ÏgÊ A32767676767676'&'&!32767676767676'&'&[ r  s É  z  q  %{   %/z  $€  #-w ƒHo¡ C767676'4'&'&'&&632#"'&'&'&'&'&767677cD!<=e+/ G+. /`@'  & 2# ")Ÿ #*L/1),A4(9J--  -±36767676767676'&!6767676767676'&Q&%$ 4™)  ˆQ&%$ 4™)  S5 %"! /%ˆK  éc+ J  %6&"&Äý‰dþ32;!327676'&#!##'"ù3( >ØÜê$)-'§ý!ïM þ6+1 %<•8+27767767676767'"#> !%>0__0u )!!4gf4 3  <   ^     6þYì±/727767676767676767676š!-49nÞào,, Q%!;"3*oßßo&% R¥O*U^/¸þ’þ¹$HH$ )N;#a8UE¹op¹>> &T ÿUÿï±³+Kjº676767676767676'&'&%33676767654'&'&##&!33276767654'&'&##&376'&'&'&'&'&'&76767676767476'&##'&Þ "# |&    þè 1+$1 = 31 %"0 þ— )G´"   *  q è ""p !-3X,& ¦&' "%&"!õ3?C!& %II%> =",(¸$   *+[Z‰0%% T ˜p‡7775"'&'&&'&776767676776743676;!#%5+'&'5&'&'&''&''&'&'&'&'&'&'&#"6##!7?T]µì(*    q† RÂ7þ&/)Sq6""  ()('AKAN 3UÊ     þ)0k5 aaa =.   DÆaa As eɈ)QR)   Q0a\/£µž¹/,0, Ç/ &KK&55&u€-Oÿÿ~Uh|3#2763632323632#6767676767676'4'&'&'&'&'�'&'&'&'!"#"#"'"'&#!236##!! %#"#!OÞÞ(BEY%7*S4(>U§Òw%! WLm'  {B  S +'0q¼œþÐ2‰O17%YEB(é3‰5, €HŸþýHYþèR/G'"E™ þÆ}aûEa@ ! aB: &G17wY",ýƒ,)4ªM+ýaU!I@U ´M)O%r3#7%5!3233'!%'OÞÞ’!bþë²N 'a)ýÑÕþþ’raûPaa°V J«§Hsÿÿ:™=[;)3276''&'&'&'&'&&'&'&'&'&'&'"!67676767676776767676767¹&  B"J–§T,0 G0yX  5,hÑs: ) L"JR1ü   *ST)C! —8 s;‚þüþÜ’&KT*     .]L&¶lÉd#G#4 þÜ<þ&U--I‘‘Iu9  OÉrO3#7%!7#6##323###3323'!%'OÞÞ’Õ³7'a"2 +&.Lwká¶D; ~) aa )~ ;D±XA!³R $a+ýpÕþþ’raûPaIé »P BI %M?M% I  X Bq'œS‚ÿÿ(~j347676767676767633373!77#"##67676767676776767676'4514'&##!¼ a   ^Ƀ”&00=zŸR%K $Îb a   iä‹™$00GŒGc3 #Éü·}pæ™+) ^4 #GF#Y³ìu6o)   ¤-w$'54#! i3 #GF#gÏÏgM   Oã}$3#%5#!#7%5#35%3!35%OÞÞ5’Þ”Þ’5ÞÞ’þéþËÞýlÞ’þéþË}aûEaaIý·aa»aaýïa‚ÿä§–,er#"767676&'&'&'&'&'&&6#"'&'&'&'&'&&767676767672735!3#!5#r n_eMH1.á¿/eeygqTå‹U‰|š$99 !KBE2! ³!"##75B1†w,;9A Hþ«aaaýía”.1IE^XgVYþ±Å§ ).IÈTþ½tGAJ "#6#,*/CQ>Y\OþÑ   €Kc60ì€/"  þ8þ}FFƒFFD8}3#%5#35%'Déé?–ééþÁþá–}aûEaa»aOÓ}•3#%5#54'&76?6767##%5#"''&'&'&'&'&'&'&'&'&'&'&''&74?67677676767767635%2235%OÞÞ5’Þ&g  ! 6b1 %I;år#0 & #F{=(+ }-[D"G  %$'L¡þð "####J“h3"`.Þ’þéþË}aûEaa,X  U   + "F€A%"aa'2 -\¡Q39  h&K9;aa>{U+S"aR˜€7775"'&'&&'&7767676767676767676767#%5+"'&''&'&'&'&'&'&'&'&'&'&'4'&'&#"6#"#RU§ë& %!/   ;:  .]#$Ä;ô{" .]]. / %(5lC"    )A aaa $G+Mš™M(8  4'1*xó\+d/aa 'M/yòòy%|=   KHAHBþç¯X ?A! Ri}§36#775"'&'&&'&74=332367676767676767676767676767673#7%5#35!#"#"#&'&'&'&'&'&'&'&'&'&'&'&'&#"##!RÞ*D$,5nÏë5,$D*  "")Qu=!& 35 "EE"  Þ‹ (ÞÞþ”\#,UU++UU,#[þ”}aüä; aa :ß_%LK%Zµþú‚2:0<<@-n9;s(L˜˜L"DC" ûDaa»a ;"ED"^¾½^>=    >=^½¾^"DE"; Oã~…36#775"'&'&&'&74=332323276'&555545&767767635'2'&'&'&'&'&'&'&'&'&'&'&##!OÞ*D$,5nÏë5,$D*  5idȰX B! '   0J$,5nÏë5,$J0 ,W':tœN1@  fþ–}aüä; aa  7Ô4   ?{uìÏh%M' 0 /Ðߺ.  aa  (¤ýy0h0Dˆ¸[:K%  ÿw¿f-:h34767676767%2363!233#3/!35!3#!5#!?#6###!"3"''&'&'&'&'&5#‚ a þ\ÆBaK6$1)"   a úãÅaÑaaý/aå 7 a   +K1ý ‘E;) afOâe&!  !&eâOþ:þ]__£__þ jïSSïj!+""+!ƒÿåe–0u#"7676764'&'&'&'&'&'&'&"6#&'&'&'&'&'&'&'&'&5&54767767676767T fY^Gc62 μ,YZl^eOé!$CLtm„!%!&9 F>@/! 04 ! !`$ Ž&/"6”+.D_ˆ~“ þûª &(@¿WxhrYfB>S !3#'Oo"),$#K6þöv   _­9r 1' u  Oãr3#%5#!#7%5#35'!!%OÞÞ5’Þ”Þ’5ÞÞþ€þþê|þ~raûPaa°ûPaa°aPÆ},H3#%5#!236767676'&'&'&'&%2#"#"#"'"'&#32##PÞÞ5’Þþ‰$ C?! &Žþç T2ƒQ1:&ZED)õü.h> . >h/ú}aûEaa O [rmZ#QýB]& 9™ $<'&‚!}z!7#'#!67676767674'&'&'&'&'&'&'&'!323'!+""3"33!â(a$qJ…$M9\Yþ”A-  % (NW, 1)8h=7!wBr#a+ûÝÍ8    YPYR#" != 9rr9  *&7ú!TÁ½Q5( -0ak5!:1V¿œS "  !'ocmc+,  5 3ee3 Uf/36767676767633!%5!323/!%!  a=C…4qþÇ€`´þÇf;‘D3a  þHÔþâþGfƒóy&,z7<û\aa¤F5l0&y󃦕‚%!7%5!45&767676767672'32323676'&'&'&'&#"#&'&'&'&'&'&'&#&23232767676767677632þë¦DbþëK &*.( (/  + >=N$'|cW7  4T`x#"'$N=> +  /( #1,)!Saaaþ Q($#–`(     K75^R€   |S]57K     )k¯#Fþƒ"}Nl…!!%5!52767676767$7456'&%&'&'&'&'!5%'2#"'&'&'&'&'&767676716763¬ :8664c>F k·1 þëY:¢þë6(&# 'þú#%6þ§þÆ¢  a.-  1n   þõ  r* ",` }aØ .KVc]*Øaa×  iØ¿\  ×aüu96h (%8#Drý‘ $L8Q$(V1= F°}í;66#775"'&#&#&'&'&'&7767676767676767767673#%5+'&''&'&'&'&'&'&'&'&'&'&''&5477676767676767676716767767635%233&'&'&'&'&''&'&'35''e(1`F# $%pB  *5FjÐBF   B:   7q7©>þ‘' &Kp9 $76 -4GjÐþñBF    3+     $G ©þÁþ€}aB…b0    00$•T   aa    +VL&'    !J™Qaa +4hœM!"  '.$FG$ aa   "D92b %aÿåß}!&'&'&'&'&'&'&'&'##"3"!%5!5545&7672367676767676767676767676767674745&###"'"!5%'î2l #'!‚ãÑ) )  "6LDT'þëY:¢þë )3.1+8"  $5r—` 3r"þ§þÆ¢}aütT¼5g3(! + #E &$,.$8&" Ùaa£'  :NHU3W+&$ A§%"»R Žai;” %"'&#&'&'&5&'&'#!327676514'5&'&'&''&'&'&'&767676767676767621233!77#"#'677656'&'&'&'&'&'"#" UC,  a.MK        %  (,)-><?$ 3   LM.a  ,CU+Ò `X0718EQ&#ß›=N$'|cW7  4T`x#"'$N=> +  /( #1,)!S  "*† /YA-   "*† /[?- ùJaaþ Q($#–`(     K75^R€   |S]57K     )k¯#Fþaÿñµ²å676767767676'&3236767656'##"##'&'&'&'&'&'477676767676767676767654'&'&#'"&'&'&'&'&'&'&767676767676#2'"'&'&'5&76767676767,( -_5 (£'$;FY@/* ! /(% #  ,?      #28ªc 8865*)&"  þfRLA/  =; 3c7,C,O ÿ +_2%ˆ U == 0üØ w2.C. (   NLOM *    )?   1#+   „%"(8E 0.äj  % ù 1+N   e/ 2(E78vB, YÿæÈµ/ï767676767676767676'&'&'&27676766767676767676716'&"'&'&'&'&'&'&767677676'&'&'&'&'&&'&'4'&767676767676767676767476'&''&'&'&'&#"'®   '!%" Y#   þ C 7F=K ˆ|(‘‚   3638 C&o“ 2#"'a,   # *$ w((    -!"""CH;*šZ 3  ÿ  & %" &, M./ ýå 12pL &+ A:     !%   K('2  :      '( "  ? =]&+% þ[7´,²37676767676767676'&'&12767676767676777676767676332765554'&'&'&&'&'&#&767`  :)N_$   þ„        #19,> €&  3  R+)3#RjXI$  #>.;N3 %J ÿ    ;*L?U $H G# þÚ"#><  '/3.5U$ _ |Xm6 !*+*+7o¼a^*D"_}ñp+"%?-"(   -!5&   ;~ÿï@³+{676767676767676'&'&376'&'&'&'&'&'&76767676767476'&##'&Þ "# |&    D )G´"   *  q è ""p !-3X,& O3?C!& %II%> =",(¸$   *+[Z‰0%% Fÿó8³+KkÔ676767676767676'&'&%33676767654'&'&##&!#23676767654'&'&##&7676767676'4'&'&'&'&'&'&'&'&'&'&7676765476'&'&'&#&Ï ."# |&    þè 1+'2 =:' &1 ýÒ4 $    t¸ .(-&›,þ3ºF 2$##*0rl 3> è-""p !-3X,( ¦&' !&' "Ð$&2+ $(&*$H! /),"|  ƒðPOE?@7CýÕ(@  L^=A3B@.8&\ `Í9'& %aÿñ•È%3236767656'##"##'&'&'&'&'&'477676767676767676767654'&'&#'"&'&'&'&'&'&'&767676767676#2'"'&'&'5&76767676767gFY@/* ! /(% #  ,?      #28ªc 8865*)&"  þfRLA/  =; 3c7,C,O × w2.C. (   NLOM *    )?   1#+   „%"(8E 0.äj  % ù 1+N   e/ 2(E78vB, þA;™QÐ776767676'&'&'&'&'&'676'&'&'&'&#"#7676'&5&'&'&'&'&5&56''&'&'&'&76767676767676776323"'&'&'&''&'&7455456767676767676767676767Æ!; ¥A?A8<*oRhSHcß‹a  !He  ¼a     + O  K(   \ 84I%$)'GLBA  )#.""##‰"N!.{³•vhš‰_'}X“ ,Y"þ.ÖkEEEDU)7V64646C!¢H$!&1&+  , *>ƒ%%RLG6 / ;TFhH`PN$+'&! ?þ»º¡Ž&'&'&'&'&'&'&'&'&#7332767656767676763676'&5&'&5&'&'&'&7676767676567676767276'&'&—   QmF2+   %! B.?oMWg<,V21w]   ä# ©+=6M   !W€ [^"! d h<„r   ˜E&K.#7 <µ    bÿóù¡l˜""7$767676'&'&'&''&'&'&'&7676'776767676'&''&'&'&'&'&#"23'"'&'&'&'&'4767676767676·"c §$,).BDv nc‘”g . $!m¼-  !%!'JGLHH:o !/(7  p "K2!4;DE " _ k£ëx ½+4/7!"01ŽshBDg 1' S     L3A;;34  F eicB(- d9AI;E9'! YÿæÈ¥¿27676766767676767676716'&"'&'&'&'&'&'&767677676'&'&'&'&'&&'&'4'&767676767676767676767476'&''&'&'&'&#"'° C 7F=K ˆ|(‘‚   3638 C&o“ 2#"'a,   # *$ w((    -!"""CH;*šZ 3  ä 12pL &+ A:     !%   K('2  :      '( "  ? =]&+% ^þLü§š372"#767676'&'&'&'&'&'"'&'&'&'&'&74767676%6767676767676'4'&'&'&'&#&'&'&55&'&"327676777«+8 W37 1  .336 ,.<- c/GKb!#…T-  Nä& #!® -'@‹&     "3*E)=4/bP=,E!  #C jt|€k G  $f]2?AB¡/7‚OPCC’±  &)!5  U $gU*þ[7¦…12767676767676777676767676332765554'&'&'&&'&'&#&767ä        #19,> €&  3  R+)3#RjXI$  #>.;N3 %J Ù"#><  '/3.5U$ _ |Xm6 !*+*+7o¼a^*D"_}ñp+"%?-"(   -!5&   ;ÿóøœ£À#7674'&''&'&'4'&'&''&'&'&'&'&'&=456'&'&'&#276'&547676767676767667'&#&'&'&'&7676’     /—a{jP   e%3,8$&(  6&)"@•#!1    @JHŠ 4(5+E?<.uø‹ZB&(0~6&  Ÿ '/,€R< ),j&! $$E8qV K) 0?ˆÝ w4cO *1% ( "2" ] ?? -žOM )&:•5@‚(=,;?Kˆ  T 5F\f~ÿï@›O376'&'&'&'&'&'&76767676767476'&##'&š )G´"   *  q ™3?C!& %II%> =",(¸$   *+[Z‰0%% <ÿæ›Æ®±´4765&'&'&'&32767676747636#236767676767676776776767676'&'&&'&5476745676767676767676767676177ø??jP8 + #  -   ($'$7   )NP)/9?g_;  -$Eb  )#(# + ¤!,6$ƒJéÙ""†PQ2 "'@! 5^%+   .#‡ 'QS'-%,#!tGMB B 8"*     $ ©!)7$…<%>ÿõY“ƒ32767167676'&'&'&'&'&'&'&&'&'&'&'&'"#&763"332767676767676767676767i   LE?H .+ ./OnJ9w–##  &95.%   7CÊr e "=;!   )PŠ> ×`à  11   )$7 "%"%‰”ƒ”!A% VFTJ6 VþcïÄÀÃ733676767767327676767676'#"#"'&'&'&7676767676765456'&"#'&'&'&'&567676'45&76'&'&'&'&'&'&'&55#3ß%&,7>‹c  !$/  1#  "   (   U <  1M~& $ & 8#y  7$Ü+ ( c   1"&/)8 , '2 e]*) 3I"~ *&]OdB0'¾-4$3Z2›"<FA   #"+'À“*&(! w #QO]U`ÿñö©T&''&'&76367676767676767676'&'&'&Q7¤VE  T;?   _>L$ 5!&  #Ó&%%#©V!(."  V^ek!#"#   PN^b"&#'l`7 +1 ž [þF÷ªÉ4'&'&'&232767"#"767676767676767676'&'&'&'&'&'"'&'&'&'&'&'&767676767667676'&#&'&'&76767676767676676'&'&7#† &6@'$5# 8 O  -!% p-;9A?Œ_3D#&0!% \(/  A $296;#X?" % 1MODS_ V.&+$)Y ;qJ!= 7-P<>&2%0(ÏŸ> #.&'  HVs< $'+/£x0"!)'   "!' : ;AkU   *+..#  -h'  8   !;Z   *bÿòyœ L767676&'&'&'&'&63'&'&'&'5&767676776767O 'D:@1ž˜€ËEF>::4Ã`rÜ'f V   `Õ. LB¸™ (‚ÞÙ‚m  !|¨yŽS .‰!#.'&þä*v$ 'Laþe÷›4ad7767676'&'&'&#&7676'&'&'&'6&'&'&5&767676767676767677Ï "$gz²x“)€È£y( 2 't96"-þ k?"2)S¶&$, I,= 3`Vb)þ… 1e|àOL;26(}V'&.gÜþù=4:0 *k1J M8JE/ .KA3g3(T6&!ýÓ_ÿ7´šT!727676765&'&'&'&'&'"#"'#&'&'&'&'&7676767632765&'&'&'&"33W ,1 %"©%>a!A +WF!A:r.>K+6=1E -+)þÐ~@q''+M¡ )9'w?)  ')0[;4 R0!  >Àcx¨z!cÿôüEr6$3376'4=4'&+"767676'&'&'&'&'%6'&'&'&'&'&'&'&7676767676767¾ þû6.   :ºç7:%HBE>"mmyà*+20ïh?_ þ·# @þê+%U5  <Œ% º.0"…& y¬«y…—\r‘h     RnþÐ%@T  - [8ÿòÕ]7676'4'&'&'&#"#"'&'&'&7455!3376'4=4'&##!#'"767676763Ú 2=f\>?  $+1#-M  mþ³ &B1 ) (¦Å @Ûli=LAB^   (P%L½ t f 5 $ Nÿó8¥h7676767676'4'&'&'&'&'&'&'&'&'&'&7676765476'&'&'&#&Æ4 $    t¸ .(-&›,þ3ºF 2$##*0rl 3> ¾$&2+ $(&*$H! /),"|  ƒðPOE?@7CýÕ(@  L^=A3B@.8&\ `Í9'& %aþ@ü´{œ7676'&'&'&'&'&527676767676767676'&'&'&'&'&'&'&767676767676'&'&3374'&547676767676p Wg !4.2,!7#!  ]TqlI6YG¦& !& ;kDLD%%k½)q)6[G/5 /)7&#)& )QAJ%IY; $%$&)3HFL%(26 ›ULB1`BS"C‡J%!&ZÈPE( " uVNb]k -($!s&Š:tt:!d8J07d*0L684/,aþ^º¢î%76767656'&'&'&'&'&'&'&#'&'&'&'&'&'&'&'&'&56767676767676767676767676'&'&#'&&'&'&'&'&'&'&'&'&'&7636763767476767676767676767£  "/8U(  =/  & *ŠE"   "4J   54    "/8U(  =/  & *‰F"   "4J   54  L  +704-'":     Fj   9?Îk3  "(OO(    +704-'":     Fj   9?Ïk3  "(OO(  bþAû±Ñ%4'&5676767676767676'45&'&##"'&'&'&'&'&'&7676767676767676336767676'&'&'4'&'&'4'&76376367676764'&'&'&'&'&á "6U    $"E77 ! ¥  €.75:  ) $  $<48/× ÓÉ :  C?d&K‡5B!ˆdÊ 'Ns91 '%H>>Wnunu y=&KM'   32C"'$)6*# ¡   !##%_cß’! 'N35( $54I!”-]Y$$#"þ„ 9  .*}{uW!,lÿð¶§Ç%76767676767656'&'&'&'&'&'&'&'&#"'&'&'&&'4767674767676767656'&'&'&16#'&767676767676'&/&'&76767676767x¶x\ 6*I!#        "    A   —T* p 4  % S9B”`†dY †ŠA %%'!SSAL! 8;<>:.4)        ’':     „AR‚}  O ! IMZ\BEÒwM1  ÿ“ÿïg E•767676767676'&'&!767676767656'&'&'&'&376'&'&'&'&'&'&76767676767476'&##'&1 ::M  € ˆ 99O + þá )G´"   *  q   M88   !&ƒ  N::   &0>- þ}3?C!& %II%> =",(¸$   *+[Z‰0%% Nÿó8¥ E®767676767676'&'&!767676767654'&'&'&'&7676767676'4'&'&'&'&'&'&'&'&'&'&7676765476'&'&'&#&ý ;:O } Ò :9M + ý÷4 $    t¸ .(-&›,þ3ºF 2$##*0rl 3>  N<:   #,€  M87   '2?, þ¢$&2+ $(&*$H! /),"|  ƒðPOE?@7CýÕ(@  L^=A3B@.8&\ `Í9'& %bÿòy³+Lx676767676767676'&'&767676&'&'&'&'&63'&'&'&'5&767676776767H "# |&     'D:@1ž˜€ËEF>::4Ã`rÜ'f V   `Õ. LB¸è ""p !-3X,& O (‚ÞÙ‚m  !|¨yŽS .‰!#.'&þä*v$ 'LNÿó8³+”676767676767676'&'&7676767676'4'&'&'&'&'&'&'&'&'&'&7676765476'&'&'&#&Ï ."# |&    þ÷4 $    t¸ .(-&›,þ3ºF 2$##*0rl 3> è-""p !-3X,( *$&2+ $(&*$H! /),"|  ƒðPOE?@7CýÕ(@  L^=A3B@.8&\ `Í9'& %lÿð¶µ/÷767676767676767676'&'&'&76767676767656'&'&'&'&'&'&'&'&#"'&'&'&&'4767674767676767656'&'&'&16#'&767676767676'&/&'&76767676767Ä   '!%" Y#   Lx¶x\ 6*I!#        "    A   —T* p 4  % S9B”`†dY ÿ  & %" &, M./ ü‡ŠA %%'!SSAL! 8;<>:.4)        ’':     „AR‚}  O ! IMZ\BEÒwM1  OÉõ A‹3276767654'&'&'&'&!76767654'&'&'&'&3#!7#6##323###3323'!'>>  FF  É xJA  ü_ÞÞ7'a"2 +&.Lwká¶D; ~) aa )~ ;D²WA!³R $a+ûô /PQ/  .WV. #*‚  -[S. þ‰aûEaIé »P HI %M?M% I X Bq'œST ˜p‡7775"'&'&&'&776767676776743676;!#%5+'&'5&'&'&''&''&'&'&'&'&'&'&#"6##!7?T]µì(*    q† RÂ7þ&/)Sq6""  ()('AKAN 3UÊ     þ)0k5 aaa =.   DÆaa As eɈ)QR)   Q0a\/£µž¹/,0, Ç/ &KK&55&u€-O};Z3#!2#676767674'&'&'&'&7#336233'!27676767636#"#!OÞÞ™,þ„$>0/,9r 9@c1P&´K<'ÇT (a+û é( %+.DdB) "   uB‘ þË}aûEaR"_seU4*':    X Ev'œSúäP%6;¨I(O~;Nb3#!2#6767676767676'4'&'&'&'&'�'&'&'&'!!!236##!! %#"#!OÞÞ³Ñx%! WLm'  {B  S +'0q½±þ·ýCé3‰5, €HŸþýHYþèR/G'"E™ þÆ}aûEa@ ! aB: &G17wY",ýƒ,)4ªM+ýaU!I@U ´M)O%}3#7%5!3233'!OÞÞ’!bþë²N 'a)ûh}aûEaa»V J«§Hÿúþr;}7O3+367676763!2#3'#35!!67676767676767676765!¢Ý$)?%%+  #z*abK‹ n¶‚”O`a*ôÞú¼Dü’  ."#}añÌŠt„k400+  þ¯§;¸F58D´?§Q²aaûN   (.+0\mbpÂÝ89OÉ}I3#!7#6##323###3323'!OÞÞ7'a"2 +&.Lwká¶D; ~) aa )~ ;D²WA!³R $a+û}aûEaIé »P HI %M?M% I X Bq'œSb Œ}2'##775#"'&'&'&7767676767676767676767#7%5#54'&76?6767##%5#"''&'&'&'&'&'&'&'&'&'&'&''&74?67677676767767635%2235%3&'&''/&5476367767635''ƒ'$%  G"D[-}&-={F# & 0#rå;I% 1b6 !  g&Þ’5Þ&g  ! 6b1 %I;år#0 & "F|=-&}-[D"G  %$'L¡þð "‹¿¿$Þ’þéþËÞ$~þ‹" þð¡L}a;9K&h 2:Q¡\- 2&aa"%A€F" +   U  XþÔaa,X  U   + "F€A%"aa&2 -\¡Q:2 h&K9;aatŸŸj aaýq i?taÿ™ÿè<—å56767676767676'&'&'&'&'&'&'&'&'&'"'&7"#&'&'&'&'&'&'&33276745676767676767236"##'"3"3276'&'&'&'&'&'4545&'# %"7676767676767676545&'&'&'&'&'š1S8B (71<6?4Crb    2     eÇ U>%0CW¼n #K_P:%3 -$N/-   Z¹)6‚O%  Šþâ !5U‰HN((VBPDH8?) UHl6Ý /7I'    <þï%   (#%sG^pJ`"FDV %+ a?*)0 G{U+S"a<ÿèæ}T3#'&'527676'4'&'&"32767676767645!#%5#35!—é! /S</-7 @+*<14†R6#'Þ5’ÞÞú±}ap~k‚K?Å–€,R40`;,*W;j‰¿6Fî,.ûEaa»aRi}§36#775"'&'&&'&74=332367676767676767676767676767673#7%5#35!#"#"#&'&'&'&'&'&'&'&'&'&'&'&'&#"##!RÞ*D$,5nÏë5,$D*  "")Qu=!& 35 "EE"  Þ‹ (ÞÞþ”\#,UU++UU,#[þ”}aüä; aa :ß_%LK%Zµþú‚2:0<<@-n9;s(L˜˜L"DC" ûDaa»a ;"ED"^¾½^>=    >=^½¾^"DE"; Oæ}$3#%5#!#%5#35%3!35%OÞÞ5’Þ—Þ5’ÞÞ’þéþËÞýiÞ’þéþË}aûEaaIý·aa»aaýïaƒÿåe–0u#"7676764'&'&'&'&'&'&'&"6#&'&'&'&'&'&'&'&'&5&54767767676767T fY^Gc62 μ,YZl^eOé!$CLtm„!%!&9 F>@/! 04 ! !`$ Ž&/"6”+.D_ˆ~“ þûª &(@¿WxhrYfB>S !3#'Oo"),$#K6þöv   _­9r 1' u  Oæ}3#%5#!#%5#35!OÞÞ5’Þ—Þ5’ÞÞùi}aûEaa»ûEaa»aPÆ}!=3#%5#!236767676'&'&'&'&%2#!32##PÞÞ5’Þþ‰$ C?! &ŽþégýAõü.h> . >h/ú}aûEaa O [rmZ#QýB]& 9™ $<'&‚ÿè$–˜##"76767676765454'&##'"'&'&'&'&'&'&7676%6763732767676'&55454'&#"#1"''&'&'&'&'&'&'&" 17n`gPìºÇm''•vkIQ   %#3ˆÈNNE;?/z=o# /",%eRQ/          [l9” *-CÇþ®þÜÂÐ94MUi."  =53(m!/{î!&H6µv× DB_ , ?K       , U},36767676767633!%5!323/!  a=C…4qþÇ€`´þÇq4…C=a  úœ}ƒóy&,z7<ûEaa»<7z,&yóƒAÿèÁ}“;6#&'6767654'&#76767676767676767767676767763235'2'''35''A‡%%!åm3T   .;7?+# )-GC-5 ;)/*1RKK;? "aa(L)þ‘' &Kp9 $76 -4GjÐþñBF    3+     $G ©þÁþ€}aB…b0    00$•T   aa    +VL&'    !J™Qaa +4hœM!"  '.$FG$ aa   "D92b %aOþr;}%3#!723'#35%3!35%OÞÞqT6n@ha*ôÞ’þéþËÞýiÞ’þéþË}aûNj )D¿:§Q²aaûN²aOæ}O373676767#%5#35%36#"'&'&'&74535%OÞ/Œ DQDX«2Þ5’ÞÞ’þéþËÞDI BKAO#")Þ’þéþË}aþ b,fH '  ýÀaa»aaþrl   = _aP V}"3#!5#35%3!35%3!35%PÞÞ ÞÞ’þéþËÞýŽÞ’þéþËÞýŽÞ’þéþË}aûNjj²aaûN²aaûN²aPþr «}13#!!2#3'#35%3!35%3!35%PÞÞ?Æ•*xJaa*ôÞ’þéþËÞýŽÞ’þéþËÞýŽÞ’þéþË}aûNj C´@§Q²aaûN²aaûN²aUŠ}9X36767676767633#!2#676767674'&'&'&'&7#35!27676767636#"#!  a;Dˆ1Þ™,þ„$>0/,9r 9@d0P&oüW:( %+.DdB) "   uB‘ þË}ƒóy&/v6>ûEaR"_seU4*':   aúäP%6;¨I(O },=\3#!2#676767674'&'&'&'&7#35%!3#7%5#35%'27676767636#"#!OÞÞ™,þ„$>0/,9r 9@c1P&ÞþòþÔtÝÝ‘5ÞÞþËþé‘üu( %+.DdB) "   uB‘ þË}aûEaR"_seU4*':   aaûEaa»aúäP%6;¨I(O},K3#!2#676767674'&'&'&'&7#35%27676767636#"#!OÞÞ™,þ„$>0/,9r 9@c1P&ÞþòþÔé( %+.DdB) "   uB‘ þË}aûEaR"_seU4*':   aúäP%6;¨I(ÿé#—Ê'&'&'&'&'&'&'454'&'&'&#767$67676'%&%&7''&'&'&'&'&'&'&373276767676767676'&'&'&'&767672763276767ä %)>àQM,(+%6'+  W!%'.4,7š·þò¼þøCBEAC=5        (&2‰¼9;I?D1<%!  0010,J2cdEA  !''8Q-27gƒ1#u:\MT<‡  +.7 ÊC ),305_flÇ‹    CõH  '61."^  !#2>UM].!"  #  , 1 Pÿæ ¬•GŒ!35%'3#7%5#!3727676764'&'&'&'&'&'&#&6#&'&'&'&'&'&'&'&'&5&54767767676767Ëþ…ÞþÊþé‘ÞÞ‘6ÞI  :pn~…ynYKR?ß.2F2=:Dk '(þj»g ÜF>@/! 04 ! !`$ Ž&/"6æ6aaûEaa$  2.0,ˆa_+$$(8ÆTebcVZB/$#)þßŸË [ !3#'Oo"),$#K6þöv   _­9r 1' u  bæ}fƒ"#775"''"#&'&7167767676767676767676;#%5#35!"'&'&'&'&'&'&74767676763; 5W,C ,KLvîC,!  ' $GK&  #€Þ1ÞÞý`Z+þÜ©B$ /3ë…b>‰N 2@NAd‰œGGQ G7  %K @Q>1 & +       9ý j1|(+I@' -,;) þ˜¡ ? &)6',  @ÿô]Žc›6767676767676763676767676767676545&'&##""7676767676'&'&'&"#%63#"'"#&'&'&'&'&'&54545476767¯# dÅ. %"?'4  ,( =%u þñbA /x-''.)-(4-/'Œ°}¸!"‰h%#"Œ!  A*0+5'   9!4(>û[An*    *’_“ˆÅ 9fSÑ #Òò€[4"Z =³$%%$ ™>) '!,A„ÀG(JKŽRm‹232#2#"#! #27676767676745654'&'&'&'&'6767676767676'5&'&'&# !!554547673672''3722#'"#&'&7455J;;$Ϫ]   / T( £V“qþ2þ0w +8]*)(&A *@W­+$t  3€1/! ŽJ wþ[mJ-   kB!2 }6þˆØ6)(?>(% C–1* >GD»ŽH232#2#"#775"'&#"'&'&765554'&76723623/!D;;gÈú'8  !/ N0Ma ü¢ŽJ wþ[mJJ n§x,#,S³` þ´Ž\”232#6#3676745676763!23'#"'&&'&765554'&767"763235!347"332#26##!"'&'&'&77676767676765- ;b==)=q a!?‚)Æ m9 a %09&;üVí! #à   '1þÄ*  IŽJ   U*ß‚J þÝs J4;9/ &2Cs#x¥mJ^  wþ‡   #$&£ÞMU@ÿñöŸKY!33232767654'&'&'&'&'&'&767676767676'&'"#"'&'&5%!4767676GPó8 16X,3/5! Ä~œKyAA!! <03 +   JY¬M*ìþ &@„h@9¿   gMT) hƒß‘s¹ $(3%  &{Dp,C) c>gG?u*0(‚Ž622#775"#&'&#&'&7676767676767676632&2#"#75"#"'&3&'&74=45&7677676767676632&""#75"3&'&''&'&'&'&'&'&'&'&''&5477676767676767676767635'2545&76776335'32&'&'&'&'&'&'&'&'&7635'\5) 9 +5"  7263  &.S¡à     !B/   '  ;ؽe;     /B!     à¡S.&  3627  "5+ 9 )5°Á-  7989 ":"*e½Ø*"7! v8 *Á°ŽJ *&  ?8=9 JJ  %K5    #EJJF{"   5K%  JJ 9=8?  &* JJ   ')') (@JJ?ý& U&   J1ÿôÈ ¸67676767676767676'&'&'&'&''&/&##"32767676767676#"'"232723'&'&'&'&'&'&'&'&'&#"#'"276767676767676767654'&'&'&'&'  C&   ,'@=O5[*"A4  +    @m(-$"'3~:  2$ X0T-œ!3;% 4Y 8G(4H'=0 _0  Ÿ'  ÷# @<4    $ Ÿ. 4  *:/%D5n,'c  # ($$,  4  y@D׎ž232#2#"#775"'"'"'&'&?67676776767676732#"#775"#"'&3&'&765554'&767"763235''222#54'&767"763235''D;;gÁÝ'    ;s- ;gÁÝ;;á½g'    ;s- ;á½gŽJ wþ[mJJ #&Q¡> & þIpJJm¥w JJ #&Q ? & ·pJD׎8×'&'&'6767676'&7676767676'&'&232#2#"#775"'"'"'&'&?67676776767676732#"#775"#"'&3&'&765554'&767"763235''222#54'&767"763235''01A%2 1" J88, (#*HIc 4(6m$  ý;;gÁÝ'    ;s- ;gÁÝ;;á½g'    ;s- ;á½gh  …32K3,) 5*0M/$c  ÚJ wþ[mJJ #&Q¡> & þIpJJm¥w JJ #&Q ? & ·pJDôެ232#2#"#775#"''&'&54=45&76767767673'""#75#&'&'&'&'&'&'&''&'&'&'567676767676767235'2545&76776335''D;;e½Ø*"B   +?    à¡S+&  #EE#(;V) (=T°Á-  :::: 6"*ܹeŽJ wþ[mJJ +—)  /    1F$   JJ ## 'NN'. , >  !JJ   ))*) %@J&ÿð׎ˆ232##676'&'"#"23276767676767676547454'&76716;762#"#775"#"'&3&'&765554'&767"763235!&6.% T  O0h %#K#  Ÿ$;gÁÝ;;üOŽJ % [-5ÊdM !-[b4(B)w@W$Y<-)--  ) µþˆ_JJm¥w JUÌŽÂ232#"#775"#&'&'&'&76553236767676767676767676732#"#775"#"'&3&'&765554'&767"763235!#"#"#&'&'&'&'&'&'&'&'&'&'&#"##!U; 1 O© 1   !`.   >&7,   ;a³Ï;;ÿ>! <*    *< !BþóŽJ wþrj  JJ   ƒñ++!HÏl-   6&‡Txc/.ýߎ$ JJm¥w J $ /C†]/$$$$/]†C/ $ D׎|232#2#"#775#"''&'&7455!##775"#"'&3&'&765554'&767"763235''32!5545&76776335''D;;gÁÝ*"¥"*gÁÝ;;á½g*"þ["*á½gŽJ wþ[mJJFþäFJJm¥w JJ 5ØØ5 J=ÿò\¡$\7276767676'&'&'&'&'&63#"'"#&'&'&'&'&'&545454767671 *E=@3‹‡ÜBD‰_+""8^=aXj'  !  A*0+5'   9!4(>Ÿ *€âÓ~z  A%&-g€¦yN.+ J =³$%%$ ™>) '!,A„ÀG(D׎x232#2#"#775"#"'&3&'&765554'&7673633276#2#"#775"#"'&3&'&765554'&767"763235!D;;gÁÝ;  {Z9;gÁÝ;;ûmŽJ wþ[mJJn§w  )œþ~bJJm¥w JJþrÏ›8u23223#775#37676767676'&'&'&5"#62'&'&'&'&'&'&74=45&7676767672767J) ŽgÁÝŽ"5:;6"'&I2&5 `òËu $&/!  BS% )"'šF;ŽZ36767676767636723"#"#775"'&#"#&'&765554'&76736323/!T a  %H $<ï <$ H%  a üOŽ`³S*) /* wþXn JJ n¨w */ )*S³`-þf¤Ž—ž3223'"'6767676'&'&767676767676767676767676767635'2&'&'&'&'&'&'&5&''&76776315''&'&'6!   "FE""   g„  QT &–VNG4$  $KJ$! 1·¥  ,,   D. 8á«Z€! ŽJ/('J’’J%J    ;”( \Gz 4/N#O32NœœN"DD"CJJ   /\\/-F ’^"# JûBMþrÙŽM}±2&'&76767#775#76767676'&'&'&'&"#636'&'&'&'&'&'&7676767!6'&'&&'&74=45&76776767–'  Ah"# êwqÀ6B=F"Q;Že½ØŽ;Q"F=B6Àqwê #"hA=yy=7 T;   "&aE ›N  G63 ›4.-"  %#,}a Hþ¿8 ƒ}µû€$ þ˜aah $€ûµ}ƒ 8: ýÉD   %…üL  E'%*FAçG  2.F /+á>) Iò(   ÈŽÝ23"23#775"'&'&'&7676767676767676736#75"#2'"#&'&'&'&'&'&'&'&'&'&'&''&5477676767676767676767635'2#&'&'&'&'&'&''&767767635''8] *&)&    !C3(A(JŠ»   &&    7  اX]  994 )&<)JŠ»     *   اXŽJ  1,1-! %K: JJ    **   B JJ  "CC" ; 0 JJ    "  !2JDþ´Ž…232#2#"#!2'3'#"'&&'&765554'&767"763235'232####"'&3&'&54=545&767"763235'D;;ÚÔdDa %09&;gÁÝ;  {Z9;gÁÝŽJmþ[w J=53K$s#x¥mJJnþYw  )œ‚bJD׎ƒ327676767##775"#"'&3&'&765554'&767"763235''32'&'&'&'&=45&767"763235''D*")3l IQdd$"*gÁÝ;;á½g*" VX"" ;á½gŽJFˆ6A þîDJJm¥w JJ +¯0 $_GJDC޶232#2#"#!5"#"'&3&'&765554'&767"763235''232#2'&#"#"'"#&'&765554'&767"763235''232#"##"#"'&3&'&54=545&767"763235''D;;ÿ;;á½g;7Uu   ;á½g;   uU7;á½gŽJ wþ[mJJm¥w JJbþ~œ)  w§nJJnþYw  )œ‚bJDþ´~ŽÀ232#2#"#!!233'#"'&&'&765554'&767"763235'232#2'&#"#"'"#&'&765554'&767"763235'232#"##"#"'&3&'&54=545&767"763235'D;;q.]6[a %09&;gÁÝ;7Uu   ;gÁÝ;   uU7;gÁÝŽJmþ[w J2@s#x¥mJJbþ~œ)  w§nJJnþYw  )œ‚bJ;6ŽTo367676767676367232#"#!236767676'&'&'&'&'&'&'"##55454767232375!33223##'&7455T a  %F ; T ª`A  f¶Ê 'ýlM‡/E(422m$^Ž`³S*) /* mþ\x J4J^" 9Ù5JþE )5PN66GD`ŽGˆ£232#2#"#!236767676'&'&'&'&'&'&'"##5545&76776335''!223"##775"'"'"'&'&765554'&7676363635''33223##'&7455D;; T ª`A  f¶Ê"*á½g&  &gÂÜ&  &ÜÂgý`‡/E(422m$^ŽJ wþ[mJ4J^" 9Ø5 JJmþ\x JJn£w JþE )5PN66GDPŽGb232#2#"#!236767676'&'&'&'&'&'&'"##5545&76776335''33223##'&7455D;; T ª`A  f¶Ê"*á½gw‡/E(422m$^ŽJ wþ[mJ4J^" 9Ø5 JþE )5PN66G?ÿõÉ¡¡'&'&'&'&'&'&'&'&##"32727$765&'&'&'&'&/&'&#"#"73323676767676766'&'&'&"776767Â$M®71$ 64AI\vCu$3/6Y_QI 3    DL”K"')#".185    ,2PŒ%Ä) gC!   9*'Æpо(     =u / $ i1M      $ ADÿô¥ g™#5545&76776335'232#2#"#775#"''&'&745537676767656'&'&#&6"#"'&'&'&'&5545476767•Ú"*gÁÝ;;gÁÝ*"Ó"F(308%*&*&%׃<#"±w² &&þþ€ ò N(4rg5!5)?Ø5 JJ wþ[mJJFhT^A%  v6OKTö…Y ¨1,? EÚ 3—>Q 5©'@B»E*'‘Žvœ"#775"3"'&#&'4767#?3##775"#"'&3&'&765554'&767"763235!"&%"'&'&'&'&7676767676763232323Û*Q1    &: U¥å   Eu4="*e½Ø;;þ&V ¯oB(1 D”ÃJ]G.,A!'! ->! /Á-`9   JJT@þøAJJm¥w J(&/=   ;%0: !I#$#  ;ì@ÿñö~ A›3276767654'&'&'&'&!3276767654'&'&'&'&!33232767654'&'&'&'&'&'&767676767676'&'"#"'&'&5%!4767676)@B   FE  É  … FB  þUPó8 16X,3/5! Ä~œKyAA!! <03 +   JY¬M*ìþ &@„h@9} 0QS/  .VW. $‹  .XT.üB   gMT) hƒß‘s¹ $(3%  &{Dp,C) c>gG?u*0EF¸€=#1767767676767676767676'&'&'&ÿ"A+??      2k 17#<•M1F ˜K&$$!  †E ?  R(  :n#+&™ã/+Ï: ;!$29»c ()_#J !   #G/1ýõ  (#& %Q<  E// #%>s¤òu('7+62< &F/:.#+#.  0  "$,'vU€\1"&  BwW@   pNT*;“!; /V*+"$C `K %!,& %;]- `ÿ皦C#&'&'&'&'&'&'&'&'45&'&#"#"3"767676767456'&'&'&'&'&'&'&'&76'&'&'&'76765&'&#&'&'&7277676764533767676767676776'4'&'&'&'"'&###&'"'&'&'&'&5&'&'&'&'45&'6767676767676'&'&'&'&'&'&'&'&'&'&#""##!456'&'&'&'&'4'&76763676767676727761Ã>R^‹U tF !  :+"  !- `% 8 *‡   5'(     )L +($!41.$~Þ  %+679   # ) T$   9< ME:žn ³Er!9þÉ *9+?   -(  -)1 [$.atG80 M$.   #/ "†0@3 '" ›3p')þK!C+l3 !"3       ,  *•ˆ)D‡W, ;2,.!'      2m(OP(    W  . 0`f3  5  þE( ¦Q    !!L/D8 -ÿþ‘76767676767674'&'&'&'&'&/&'&7676767676767677676765454'&'&'&'&'&'&'&'&'&#"2&'&'&'&''&'&'&'&'&'&'&'&""#&3"332767674'&'&'&'&76547676767ÏE $JI$"CD" 2  7    J! *       ? *TT* m4- u     *H #   riX7)SC þ; <<87''$*  2*C1! -   ?> )  $( 4M*) &  #*W+ ;;&5 "ED#Y*"(%+  $ %;D'Yd  G7I@K}     ( 8L=(C ].ƒ¯ÿW34'&'&'&'&'&'&'&'!!2367656545&'#!!6767676767676765#P .KK^D--D^KK. {$$./ L= B @þÂúµ /.$${ÿ  aOO3%  %3OOa  C>>7. )' .7>>C AþqXŽ^27"767676767677767676'455'#35&'&'&'&'&'&'&'&'&'&'L  7TRc @;<4004<;@ ]NP8  Ž  ZFD* { !"+0û{Æ 1 , Ã0+"! { '?AR ƒ¯ÿW!!"3"23!!367676767676767675&'&'&'&'&'&'&'&'#g$$./ úµþÂ@ B =L /.$${ .KK^D--D^KK. {ÿ C>>7. ') .7>>C  aOO3%  %3OOa  AþrX_&&'&'&'&'&'&3&#3676767676767676767675"265476'&'&04<;@ cRT7    7TRc @;<40S0+"! { *DFZ   ZFD* { !"+0„Ç 1 , Äû}ƒ¯ÿˆ34'&'&'&'&'&'&'&'!367676767676767675&'&'&'&'&'&'&'&'#!6767676767676765#P .KK^D--D^KK. {$$./   /.$${ .KK^D--D^KK. {$$./ ú` /.$${ÿ  aOO3%  %3OOa  C>>7.  .7>>C  aOO3%  %3OOa  C>>7.  .7>>C AýéX—27"767676767677&&'&'&'&'&'&3&#3676767676767676767675"26'#35&'&'&'&'&'&'&'&'&'&'L  7TRc @;<4004<;@ cRT7    7TRc @;<4004<;@ ]NP8    ZFD* { !"+0úH0+"! { *DFZ   ZFD* { !"+0¸0+"! { '?AR ƒþeÁäƒ'7677676767674'&'7676767676''&'&'&&'&'&'&'&'276767676767&'&''&#"6'&'&'ƒ! 1   UI   %I)3ee3üÙ÷ÞMXJ\3%E; RÂþ{öz2dc2%>##£”  #"%fnJG1A Ž >‡**,,+* I> EKGM' ">!,WW+Ø»ÓÀCK@N//72ŠH«OÔj+VV, 3R     # qþd¯ä…3776767$7676767677776767676''&'&'&'&'&'&76767'&'&'&'&'&'&&#"¦Zabd  %3ef3çÿàþúVOVP?&8/_z=•4ih4)C   IU   1 ! A1EHoh%"$ “  /   +XW,ÅÜÀâJDIE4-5)Rj5ÝÉ‚-ZZ.!8 4KEJB >I *+,,**‡>  #    qþ¯œ‚"327767676767676&'&'&7676767676776'&'&'&''&&&'&'&'&'&'&'&'&'&'&Ž##£”  $"%hoHE1A ! 1   VJ   %I)3ee3üÙ÷ÞMXJ\3%E ;°[Â…öz2cd2%>åR     #  >‡**,,+* J? EKGM' ">!,WW+Ø»ÓÀCK@N//83—P«þ±Ôj+VV, 3ƒþ»¢€6765&'&'&'&''&'&667676'32776767&''&'&'&'�7676776'&'&'&'&'&O  JV   1 ! A1EHoh%"$ Zabd*\ HŒ9£FG£7mn7<(>C‡T*ŸþÁþß4hi4%=‹ 4KEJB ?J *+,,**‡>  #      /"Q >x1ŒŒ/^_/0*8;uH$ŠþìþíŠ-ZZ. 2‚Á±ÿ;!!2767456'&'&##!6767676767676767#P *89D  Bu"=&5íú£ /.&% {ÿ$9PEG9 ,$  .5=;B  ‚±>;3&'&'&'&'&'&'&'&'!327676'45&'&#!!ƒ  D98* { %&./ ]í5&="þ‹ù¾=, 9GEP9$  B;=5.  $Á°ÿ;!#"'&37!!5456'&''&''&'&'&'&'&'&'#g %&./ ú£í5&="uB  D98* {ÿ  B;=5.  $, 9GEP9$°>;36767676767677677676'455!!'"7633!| /.&% { *89D  ù¾þ‹"=&5í] .5=;B  $9PEG9 ,$ …ÿÅí;FªÀ!27676736776'+!56776767676767676767&##'&63727676767676767676676333!5!67656776767676767676;56376767676776'&##!…„')0#1"   :ûûÖ \ˆ))YcUg+*3 ' 6c`d`"%º@S) /LS   -),(2 GåÝüI9&ƒPFNG   > Mk 5LFLG~wy#$#$üF×5%!!=! gþM1‹  0 %'   %$$#   þÐ=v'*)55/3  ! ,{ P5 $  Š$ $!¨{  aþp=–67676677676'&55545&7677676767676767376'&55&5476'&''&'&'&'&'&'&'&'&'&'&'1&'Î  8GHU+*.- :=6::/ 1  1 /::6=: $"SJI=   ^PRC!Y"'& ü˜(. LN½8       8½ýþ²L .(˜å &'"Y5EDP(,+-ƒÿƯ;pÙ!7'&#63767676767676767675&'&'&76767676767&##'&#'##!5!#'"#2323233!632767676767677676776767675!'&53";!ƒþ   " "?HA?bacb5B"CT /$59B;E 4  5-3,   7¸ý–,þ©l 6#!# ‰Aþì ?n#5x>dQ: R  3cdqav ]0  úð<* :P(   :û*!{    M >2Z# 11ûr11 #Z2>>GE//EG>>2Z# 11Ž11 #Z2>>GE/Ê4C!=Ðý8òG!C44C!=ÐÈòG!C4ÿûÿæ'”]€767676767676767676767476'&#1+!+"'&''&'&'&'&'&'&#&'&'&'&'&'&'&'&'!6 " 3gŸM "" !@@ 3*1*)  ((  uþwj  */*++      ++*OŽ#&Lråþ¢±"BC"4&M8HHo^ma.Z8A !-YY-   ·   AA   Ê Bß   AA  ‰   !2,9¿7J71*&À} $ !1   (D;N{Å*$5/W>PB5.2' !N  ûZ  /^>~ q9¬O© "CD"_¿¿_;: #ÎB‡Nœ ­c T8ç;  !AA!_¿¿_==  pÿä6~;V3276767767677677676765&'&+)#'"''''!ˆ P'fÉ{>( &  B")Míw)S IþÏü‘þçZ µ %9@"" &JþøZ-ÿ} *ŒD¯þŸÖl#F54 8 s;Hˆ ËF“   ÷ @ dßq;;5C€ΜOÃÿN_°j!37676'&'&'&#!477676767676323!37676745&'&'##"#&3327676'4'&'#!#"'&'&'&'&''&5C(   üÚ *   CQvõ f/寲-  9„¤T”Ü1$AþÖ~>…mn< Â"xSQ ,™œß216543œsq,$ QSx"ÂÿO^±j!#'&773!#"#!#&&332376767676'&'&'&'&'&'&##"'&3"3!32ÞüØ   & þÖ   CQvõ f/寲-  9„¤T”Ü1$A*~>…mn< ="xSQ ,™œß216543œsq,$ QSx"Oã}3#!5#35%3!35%OÞÞ”ÞÞ’þéþËÞýlÞ’þéþË}aûEaa»aaûE»aÄÁd?32;!327676'&#!##'"ù3( >ØÜê$)-'§ý!ïM =6+1 þ)¥OV!##";!767676'455!3327676'&'&'&+!!27674'&#!##&7633!VýÕN    L..L    NýÕ¼bG-8'(áüžù8;'7ö,Òý§ýÑL    N,Y;  =•7ÉÈ&'&'&'&'&'&'&&'&3"76776767676767677676'&'&'&'&'&''76'&'&#&'&'&'&'&'&'67676767676727676'&667676767676'&%/ 0   a  4343  a   0 /  J8 / 0   a  3443  a   0 /  J8 B & $  o'        'o  $ & $H4?)8 V+ & $  o'        'o  $ & $H4?)8 V+€6Ë,T76767676'&'&'&'&'&'&'&'"6"3'&'&'&7676767676773 ):36)%ƒw¼//E>@1ƒ +=:F  PQ&71=&'‚QY *(.CÊ '#-,2V^Î{o -zÎKH.)+$6$#{ c!;=ŒU( MU•KD   €6Ë,76767676'&'&'&'&'&'&'&'"3 ):36)%ƒw¼//E>@1ƒ +=:F Ê '#-,2V^Î{o -zÎKH.)+$6$#‚ÿô¤¸|§72367767654="#"#&'&'&'&'&'&'&''&74767676767676365&'$&'&'&'&'&'&#"767676767677676'"'&&76767 J_ad*&  !!“   BQX\  þýÔ * )329Z^ ZL “Ñ7@;;76,)'# ýÍ!%‰‹    ESZc-&Þ– % **%E*+c" $  K/3 ^$Ô  >",##'  ˆÝþî‚ "%#*ë .¿    R27  E É` *ýýp&M7676765455456'&'&!727676'455476'&'&`"$É" $Bþàû&þ­  E"Üó 7Bþàû&þ®  FNÙÒ 0ÿè Ëk376'&'&'&'&'&'&'&'&'&'&'&7276767676767676767676767676767  $J( &%G ; 95:6"/*4  +# 58rs7 ; &&,9 ).  0 #D‘F7$H$Iƒ  9)(+(,pcnd!D[-Le>=/b2l×Öl,(+()8   #GF#)Sj6@L6U  ÿå Çk%&'&'&'&'&'&'&'&'&''&'&'&'&'&#&76767676767676767676'&"  $J( &%G ; 95:6"/*4  +#''8rs7 ;  &%,9 ).  ª0 #D‘F7$H$Iƒ  8)(+(,pcnd!D[-Le>>%II%l×Öl,(+()8   #FG#)Sj6@L6U  ÿè¢È`"#3323676'&55547676767676727676'&5554'&'&'&'&'&#&##&ì  %!/-þÌD. ,1ˆ 8K˜»QQ'$.C) /1ˆ 6bsA--10  ! ,]Vmi7 .fJN (CEº1'\/.iIL )$Uc'‚ÿT«\37676'&'&'&'&'"#&'&'&'&'&'&'&7676767676'&'&'&'&'&Ë" ,"  )Zy -    _ !J*'- ª   ?N3714&M¨`!!¶B   %-.g±-A8B>-/‚Nÿù§ Tr7676767676763276767676767676'&'&'&'&'&'&'&'&'&&32;!!27656'&#!!#'"öK&X><  KHVZ`I]7óŸUGD)    JGX>E:?7fxC0,2/C+ þÃ4( Eí#(+0-¼üãþüT  $LI^/$* *$P85 &@ '¬77O!&!'**O40 #HV!üq6+3 ~ÿ·«G8%67676767676767676'&'&'&'&'&'&'&"767676767676'&'&''&'&'&'&'&'&'&#"¸: " $0:••ˆ… :*,..0…‹•ptfj+¼  mmfb 6, *+,-†‡”uykm )1 to}{2 B ;Ê >9_  : % $ N!$2+H%ý,40E 7 % " O#& 2-J" 4 M06@¦8W«#7676767676767676727676767676'&'&'&"#'&'&'&'&'&'""#7676767676767676727676767676'&'&'&%&'&'&'&'&ôSW>A ?™VcDg #œ lMP ?™n6gD-+.- RW>A @™‰Ù #œ mLP 6‹–þ´9)2-30 2 9}j—$N0  ÿ 0DPk6?}j—$N0   0DPk6?}j—$N0  ýH3( >ØÜê$)-'§ý!ïM ã 0DPk6?}j—$N0  ýƒ3( >ØÜê$)-'§ý!ïM ä 0DPk6?/89?z‰þçÈZ88 ")+nq–)+*+$$#"'%$"/   !9ÄÿPd°V733!232''!#'"32;23276767676767676'45&'&'&'&'&#"#!+&ù4 {rÁGÆ…ˆ  $F`]h4Peþ²x 4$ ?ìþu;e^_M !98`O`aiB… þÿØF ¯ 6#,Ÿ£È1/0-/,)'K0. 5'+*B"/346`h‚|zZI00 ¾þkd•Zx3233!32327674'&##!"#'&'&'&'&767676767676767676323!327656'&+"'&32;!327676'&#!+&v[[TTE4**8ÀVqp|1d Î'F"%‹þš ªS˜pt#  :DEI?~ä+&7)9þÑ1"ýÁ3' 9ξß!)+%žýBåJ “ ,+>/89?z‰þçÈZ88 ")+nq–)+*+$$#"'%$"/   !9ùT6*.Äþkd”Vt733!232''!#'"32;!23276767676767676'45&'&'&'&'&#"#!+&32;!327656'&#!+&ù4 {rÁGÆ…ˆ  $F`]h4Peþ²x 4$ ?ì t9e]^M !98`O`aiB… þþØF 3( ;λß,*%žý@åJ “ 6#,Ÿ£È1/0-/,)'K0. 5'**A"/346`h‚|zZI00 ùT6+.~ÿå ÊS˜7676767$765455456'&'"#""'&'&'&'&7455476'&'&#"'&36337676'&55322767676'&'&##5476'&'&¸:>8K˜»QQ'$.C) /1ˆ )*"*F°©þñ++IAH>)*"*.™¶536PÓþºxtl\bGà %'=ÔŽ99qdkTfD@ ú.šýû·5)#)(?GBJ..¨¡ F)#)(?GBJ..þ㨡 .š·5÷Ñþí¥0]†#"76767$6'&'&'&'&'&'&'&&63"2'$'&'&'&7767676776767676767676'&'&'&'&r rahKÅ16LÑGJJi^dO $'@Nqlƒ&*&+9 5A5tagF. ¬MoeyIJþï«7(((¯C\Weô¼ § ! £$%  *Y36PÓþºxtl\bGà %'=ÔŽ99qdkTfD@ a 68W8EBJkoþß´Q1,£4DBKŠ&·F.,þ©`þ  ­4  6Ep@ €ÿü1!3767676'&'&##!476'&#"76'4=þ(„   üÖ:$ : ŠŒ+X,73Ïýá< 9HÞ ‚ÿû0!#'"773!7676'4555476'&#" üÖ€   „( ; #;þöÜ 3; 9 âûÎ28,X+þuƒÿÿ¨0767676'&55!3276'&'&##!#'&763!V,ö7'; 8ùüžá)&:-Gb»ü§) & ¥å=  <ƒÿþ¨0%!"'&773!337676'&##!5476'&'&'&VþEbG-:&)ábù8 ;'7öþÔ{<  =å¥ & )§üÿÍ2(<176?776'&'&/&'&/?E JþÊL&+Ѿ(!J8I'+п)!¢þÎMMþÎ"CÐJM2. JþÊL&+Ѿ+J8I'+п+ýÒþÎMM2#CÐJMþÎ1ÿòi®7436776767676767676632&'2'&'&'&'&'&'&'676767676767656'&2'&'45&'&5&'&'4'&#"''&'&'&'&'&'&'&3&¢!  # 6   F#      #F   6 *  1 !CC!  (P?   ""   ?P(  !CC! 1˜ G(F$  7  C#      #C  7  +T0 7 ##   %%J_0BC0_J%%   ## aÿ¯ï^¾676776767767676767676765&'"#&7723674'&'&''&'&'&'&''&''&'&'&'&'!676776767767676767676765&'"#&7723674'&'&''&'&'&'&'&'&''&'&'&'&'@#A& ºr_¦9'NS*   6E+2)5“þÙ»_8j4j[=5:=9=… Øl2J%E6  < @Z-l¾zÃ&   Ï#A& ºr_¦9'NS*   6E+2)5“þÙ»_8j4j[=5:=9=… Øl2J%E6  <"CV+NRLSi°'&   ÿ# eA6Z+. 9'P£h4 ;80!*# ! "J’w<('9 "$28l Dj  #dA6Z+. 9'P£h4 ;80!*# ! "J’w<('9 "%0).*/;`  ƒÿÐï^¾23767676%67676766'&''&'&'&%&'&'&'&"#!23767676%67676766'&''&'&'&%&'&'&'&"###A& ºr_§8'NS*   6E+2)5“&¼_8j4j[=5:=9=…þöÙl2J%E6  < @Z-l¾zÃ&   Ï#A& ºr_§8'NS*   6E+2)5“&¼_8j4iZ=5:=9=…þöÙl2J%E6  <"CV+NRLSi°'&   #dA6[+. 9'P£h4 ;80!*# ! "J’w<('9 "$28l Dj  #dA6[+. 9'P£h4 ;80!*# ! "J’w<('9 "%0).*/;`  ÿçýüö0!276'&'&#! %"7676'&55"@.=?5þ›ýéõ9"…? "#  lþ±ûûþŸ G $‘î ýøŒ.7127676'455456'&'&'&#!'"763! 7 $;þ›4?=.@"…ýüt’$6I a Ol  "" ?ÿçýýö05476'&'&3$!!27676'&#!"9þ e5?=.@þßþz펑$ G þŸûûþ±l  #" ? ýýŒ.!"'&37!2767676'455456'&'&þß@.=?4e;$ 7 þz? ""  mO ` I6$’ütýýÿf2727676767676'&'&'&'&''&'&'&'&'4'&54767676767676767676767676'&Ê&$H 6H$   55'&'&$)%$$%-["EE# I U® A¬W"A " +@@^[_[\<VYVYoÙ?%& %%%%S¦¥S(+(,#výþ_7674767676767676767654'&'&'&'&'&'&'&'&'&¸B   "#D1  !DC" ("0"6H$  76(8(0 @8 =S*R¥v;G%  5'Q¢¡Q+.+/ &U:tQ(A¬W"A " ((BƒƒB1aˆCbbÿ9ÿ4!5456'&'&773!3276'4555456'&'&ü“   ’¢  ­ Z  !wþNf l™\  yýõÿþ¤«3R77)3376'&'&'&'&''&''&'&'&5&!676767676767676767676767 "++’þàY'8'5)1‘X 2  #@I”Ül5!#' ¹'­5úI ZKXN77  ¥;!CB!éþ@‰?X, <# 4 "6dsåV®)R56°þÞþ2þñS($*)**Žv‰z+WW+ ?ÿ«ZU8D736767676767676767676'&''&''$'&'&'&'&557w A+<X°±X650  a-BþÄ·%H  $FPþ£_R  uý- ! & "4de4 8&³m)¨.Sþ×þë^7]¯2þW¯3@767676767667676776'&#)#'"#''!ÃB  \¸¹\I%(' *)gÉ–L(6+2/þÉü‹þß^ /5­þÙ¹¹þÙ­5· @"4/þßþÞq;@5!BA!>ív @U*B%{(Sþñþ2þÞ"ÎS(?ÿªZU:C767676'4555476'&'&''577#)%(%¤b‘v[52 -9`À¿`.1 $6_£þá£_R _8TC 4   !7oo7   vÓ€ ! ¨ü«7^^7þZ±§,Y##7676767'%&#&'&'&&6"'$'&%676767672727o :3™‚Œjþñ#‹À©Ï..GG”€ŠoP¼èþG *<4* ‚Ç¢…,=;FXgbjqlþƒèýXpiv ¥ <@cýþgþTÿz?7  04UÐIñ*3{0ÿÐþáþÿÇC87)4 ËÞqßD-*wæ»3Q#&7767767676%67676767676'&'&'&'&'&'&'&''&–  -$+&¡‘—{933-% 3@>GüM{«”¢~*'%$&%.44:š¥:; 2?Ab.349/( :30'ˆ 48_'$+2/:54.eB@vü³:767676767676'&'&'$'&'&'4#&«, 9FCM,|yx¼©²Œ1(-" +! 7DBJûþ¸šþØÎ)#&/!0@97.´ BGq'',, , & 7.,!p)Ž #6‚þö¨²%337323676''&'&'&'&53327676767676765676'&'&'&'&'&'&'&'&'&5&'&766767676745ðf   B? f*q9-&"* A÷)A %+!#'+2zþÕ  9¨%|6t*he# &) >  )%1TpjR±Ë3!+-//A@ B6<17a úî!#98ä,  > ÿÛ¥­OŸ&'&'&'&767676767676767676767676'&'&'&'&'&'&&'&'&'&'&'&'&'&'&'&'&76763232727676767676767676”r±m…66fN} 7"+ !"(<"[=L,1   k¡f]&"#  :@,9.P0< ž+2G;@& !FL‚ID +`Ý,0æ#MhÙƒqrpTg*"'%+7C2,-$/ QGYYa[ *%)%1+/&[*û¹ - 3'1.PK\\:=Ö3 !#8   ;   NI€ "DF?>‰°"qY}þЩ¶U7676767676767676766'&''&'&'&'&'&'&'&'&'&'&#&''&'&'&'&'56767676767676767567‹^nl}" $6$9RNKIEþöé±w&'&'&"76767676765337323676''&'&'&'&5376'&'&'&'&#&'67676'&'&'&•2>HK?+##<}‚Ï! pf   B? fp !Ï‚}<##+?KH>2 % Q7wð n_b6.Q % õW  !! *_s³uyP he# &) >2./+$’þ2Î*O?67677676'4555476'5545&767767676767ô K½£_"  K½£_ª -.[r9 -.[r9Î OþÖúì PE(þ[G Ë PE({m  ý—þ%~! '2Û~! '2‚þ4ÌŒ667676767?=?6777676'4=4'&76?676'4=54'&76?676'4=55'55?½E9Ø €¯  .  . F9Ø €¯  .  . `8‘H8‘HÌ 6Ä4 WX1FB¨ & 5º þM 5º ç $‚# Wæ2G +s   5º ³ 5º ôFýzþ#} :Ý} :Á <37674'&'"'&'&'&'&'&'&'&76767232767676'&#&¸K%P47DAg  '%   !@ #7%   !AESgRM,   ><7  )€À43#76767676'&'&'&¸7& : *:&)U69GBf! 858:  < AEWfSN ÂÞɰ1367676767676767676'&'&#!K#O8% Þ  ".5kk5 "%:! ."0 1cb1."  ÿŽþd*™I232''56767676'&#"37676767676'&5"#«%'  " 5q  Z6$% :Q pV <?~~?ˆa 1ÏýÝe=&N%&:+# !' QÁ"[ @ø›n’#3#775#!#775#35#545&76767676767636363276'&'&'&'&'&#"''&'&'&'&'&"!5454767632ؘ˜Že½ØŽ°ŽeÃö²íø#  $:( 8 $()$(#  2P žq9(- ™   þE3¶&(-Žaý4aaÌý4aaÌa‰‡;   3"'$K%       9',6"F ¥¬ !,   ‘¨ M%|@`š‚­#3#775#!#775#!336#775#!54547676'367654'&'&'&'&7#"''&'&'&'&'&"#!545476767632ؘ˜Že½ØŽ°Že½ØŽ/N Že½ØŽþ”þÓ=«12ÍÁ ;4L# 02?2G?7>7 3@ $(•k4$+§&   þE7¤  Žaý4aaÌý4aaÌ !|ýíaa@ ¨]+p WR J 5+, 9!, 5.,     6 %.-\¤œ$6#   rªV(p@`›Z~¢#3#775#!#775#!#775#"6'"''&'&'&'"''&'&'&'&'&""#!5454767632%!545&7676ؘ˜Že½ØŽ°Že½ØŽ°Že½ØŽ= 5:;@,)*( # '!) 3µ€1$(™  þE3¶&(-z  þE /Ä.1! Žaý4aaÌý4aaÌý4aa-   @!%,-\¤¬ ".   ‘¨ M%|  #  $¢§ D!ˆ~€(dd,,,40Xt 8 䘄xàÀ\x蘈ð¼t 8"”$€%T&l'Œ(8)X*à-Ü/t0¤2d3<44Ä6”7 7L889ô:hVX`X[ÛbXa_=b78šN^aa^b"lMÿ“šNÛbšN"l OõT‹O‹OˆO6ÿú O ïbŸÿ™6O6O6O6<¼R6Oéƒ6OJP¥‚gUõAª‚õF6O6O §P §PU O‹O¥ 0P6by@š@šJ÷D 7@«(1DDD&"UDš=DJLZ;Û-'MÛDDˆDˆD€;¥DšD?æDÜ'7@ÇEš@¥q6ÿÓ9ÿªŸ@¥`Ÿ 3ƒšA 3ƒšA 3ƒšA 3ƒ 3q 3q 3ƒ 3‚ 3‚ 3 3 3…Ÿa 3ƒŸaŸaÿû€š\«p"Ã"Â3O(Ä(š•š€š€(‚š*""""~({Ž‚((~((ƒ(¹(À(¹(À(¾(Ä(¾(Ä"~(Ä(}""(€(€(€(€(÷ÑŸ€Ÿ‚(ƒ(ƒšš1 3a 3ƒÿç ÿç ””všb.š?.š? 3 3w 3v(‚((}(>”ƒ”’”‚ŽŽ€ŽÂÐÿŽ^@«@@yý‰ ï÷Ñú «}Æ””— ›§ ¯ºÁ (Á é ï ÷   5 ÁConverted from fonts of Computer Modern family (C) 1979-1985 Donald E. Knuth and others. Metatype software (C) 2001 Serge Vakulenko .TeXBoldMetatype:TeXTeX BoldVersion 0.1TeXBoldConverted from fonts of Computer Modern family (C) 1979-1985 Donald E. Knuth and others. Metatype software (C) 2001 Serge Vakulenko <vak@cronyx.ru>.TeXBoldMetatype:TeXTeX BoldVersion 0.1TeXBoldÿ!d~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a£…†©¤“ˆÃª¢‘‰ ¸¡×°±›²³´µ‚˜¥’œ”•ÀÁ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûü.nullmultiply gravecomb acutecombuni0302 tildecombuni0305uni0306uni0307uni0308uni030Auni030Buni030Cuni030Duni0311uni0327uni0332uni0337uni0338iotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9 IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii10023 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071minuteuni20D7uni2110 afii61289 afii61352 weierstrassRfrakturaleph arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni21BCuni21BDuni21C0uni21C1 arrowdblleft arrowdblup arrowdblright arrowdbldownuni21D5 universal existentialemptysetgradientelementsuchthatuni2210minusuni2213 asteriskmathuni2218uni2219 proportionaluni2225 logicaland logicalor intersectionunionsimilaruni2240uni2242uni2243 congruentuni224Duni227Auni227Buni227Cuni227D propersubsetpropersuperset reflexsubsetreflexsupersetuni228Euni2291uni2292uni2293uni2294 circleplusuni2296circlemultiplyuni2298uni2299uni22A2uni22A3uni22A4 perpendicularuni22C4uni22C6uni22D8uni22D9uni2308uni2309uni230Auni230B angleleft anglerightuni2422uni25B3uni25B9uni25BDuni25C3circleuni25E0uni25E1spadeuni2661uni2662clubuni266Duni266Euni266F bracerighttp bracerightmid bracerightbtuniF8FFffffifflPK!®ò(ƒƒfonts/index.htmlnu„[µü¤ 403 Forbidden

Directory access is forbidden.

PK!èZ„ûw%w%helpers/captcha_helper.phpnu„[µü¤ '', 'img_path' => '', 'img_url' => '', 'img_width' => '150', 'img_height' => '30', 'font_path' => '', 'expiration' => 7200, 'word_length' => 8, 'font_size' => 16, 'img_id' => '', 'pool' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 'colors' => array( 'background' => array(255,255,255), 'border' => array(153,102,102), 'text' => array(204,153,153), 'grid' => array(255,182,182) ) ); foreach ($defaults as $key => $val) { if ( ! is_array($data) && empty($$key)) { $$key = $val; } else { $$key = isset($data[$key]) ? $data[$key] : $val; } } if ($img_path === '' OR $img_url === '' OR ! is_dir($img_path) OR ! is_really_writable($img_path) OR ! extension_loaded('gd')) { return FALSE; } // ----------------------------------- // Remove old images // ----------------------------------- $now = microtime(TRUE); $current_dir = @opendir($img_path); while ($filename = @readdir($current_dir)) { if (in_array(substr($filename, -4), array('.jpg', '.png')) && (str_replace(array('.jpg', '.png'), '', $filename) + $expiration) < $now) { @unlink($img_path.$filename); } } @closedir($current_dir); // ----------------------------------- // Do we have a "word" yet? // ----------------------------------- if (empty($word)) { $word = ''; $pool_length = strlen($pool); $rand_max = $pool_length - 1; // PHP7 or a suitable polyfill if (function_exists('random_int')) { try { for ($i = 0; $i < $word_length; $i++) { $word .= $pool[random_int(0, $rand_max)]; } } catch (Exception $e) { // This means fallback to the next possible // alternative to random_int() $word = ''; } } } if (empty($word)) { // Nobody will have a larger character pool than // 256 characters, but let's handle it just in case ... // // No, I do not care that the fallback to mt_rand() can // handle it; if you trigger this, you're very obviously // trying to break it. -- Narf if ($pool_length > 256) { return FALSE; } // We'll try using the operating system's PRNG first, // which we can access through CI_Security::get_random_bytes() $security = get_instance()->security; // To avoid numerous get_random_bytes() calls, we'll // just try fetching as much bytes as we need at once. if (($bytes = $security->get_random_bytes($pool_length)) !== FALSE) { $byte_index = $word_index = 0; while ($word_index < $word_length) { // Do we have more random data to use? // It could be exhausted by previous iterations // ignoring bytes higher than $rand_max. if ($byte_index === $pool_length) { // No failures should be possible if the // first get_random_bytes() call didn't // return FALSE, but still ... for ($i = 0; $i < 5; $i++) { if (($bytes = $security->get_random_bytes($pool_length)) === FALSE) { continue; } $byte_index = 0; break; } if ($bytes === FALSE) { // Sadly, this means fallback to mt_rand() $word = ''; break; } } list(, $rand_index) = unpack('C', $bytes[$byte_index++]); if ($rand_index > $rand_max) { continue; } $word .= $pool[$rand_index]; $word_index++; } } } if (empty($word)) { for ($i = 0; $i < $word_length; $i++) { $word .= $pool[mt_rand(0, $rand_max)]; } } elseif ( ! is_string($word)) { $word = (string) $word; } // ----------------------------------- // Determine angle and position // ----------------------------------- $length = strlen($word); $angle = ($length >= 6) ? mt_rand(-($length-6), ($length-6)) : 0; $x_axis = mt_rand(6, (360/$length)-16); $y_axis = ($angle >= 0) ? mt_rand($img_height, $img_width) : mt_rand(6, $img_height); // Create image // PHP.net recommends imagecreatetruecolor(), but it isn't always available $im = function_exists('imagecreatetruecolor') ? imagecreatetruecolor($img_width, $img_height) : imagecreate($img_width, $img_height); // ----------------------------------- // Assign colors // ---------------------------------- is_array($colors) OR $colors = $defaults['colors']; foreach (array_keys($defaults['colors']) as $key) { // Check for a possible missing value is_array($colors[$key]) OR $colors[$key] = $defaults['colors'][$key]; $colors[$key] = imagecolorallocate($im, $colors[$key][0], $colors[$key][1], $colors[$key][2]); } // Create the rectangle ImageFilledRectangle($im, 0, 0, $img_width, $img_height, $colors['background']); // ----------------------------------- // Create the spiral pattern // ----------------------------------- $theta = 1; $thetac = 7; $radius = 16; $circles = 20; $points = 32; for ($i = 0, $cp = ($circles * $points) - 1; $i < $cp; $i++) { $theta += $thetac; $rad = $radius * ($i / $points); $x = ($rad * cos($theta)) + $x_axis; $y = ($rad * sin($theta)) + $y_axis; $theta += $thetac; $rad1 = $radius * (($i + 1) / $points); $x1 = ($rad1 * cos($theta)) + $x_axis; $y1 = ($rad1 * sin($theta)) + $y_axis; imageline($im, $x, $y, $x1, $y1, $colors['grid']); $theta -= $thetac; } // ----------------------------------- // Write the text // ----------------------------------- $use_font = ($font_path !== '' && file_exists($font_path) && function_exists('imagettftext')); if ($use_font === FALSE) { ($font_size > 5) && $font_size = 5; $x = mt_rand(0, $img_width / ($length / 3)); $y = 0; } else { ($font_size > 30) && $font_size = 30; $x = mt_rand(0, $img_width / ($length / 1.5)); $y = $font_size + 2; } for ($i = 0; $i < $length; $i++) { if ($use_font === FALSE) { $y = mt_rand(0 , $img_height / 2); imagestring($im, $font_size, $x, $y, $word[$i], $colors['text']); $x += ($font_size * 2); } else { $y = mt_rand($img_height / 2, $img_height - 3); imagettftext($im, $font_size, $angle, $x, $y, $colors['text'], $font_path, $word[$i]); $x += $font_size; } } // Create the border imagerectangle($im, 0, 0, $img_width - 1, $img_height - 1, $colors['border']); // ----------------------------------- // Generate the image // ----------------------------------- $img_url = rtrim($img_url, '/').'/'; if (function_exists('imagejpeg')) { $img_filename = $now.'.jpg'; imagejpeg($im, $img_path.$img_filename); } elseif (function_exists('imagepng')) { $img_filename = $now.'.png'; imagepng($im, $img_path.$img_filename); } else { return FALSE; } $img = ' '; ImageDestroy($im); return array('word' => $word, 'time' => $now, 'image' => $img, 'filename' => $img_filename); } } PK!êŠ"£‡%‡%helpers/html_helper.phpnu„[µü¤'.$data.''; } } // ------------------------------------------------------------------------ if ( ! function_exists('ul')) { /** * Unordered List * * Generates an HTML unordered list from an single or multi-dimensional array. * * @param array * @param mixed * @return string */ function ul($list, $attributes = '') { return _list('ul', $list, $attributes); } } // ------------------------------------------------------------------------ if ( ! function_exists('ol')) { /** * Ordered List * * Generates an HTML ordered list from an single or multi-dimensional array. * * @param array * @param mixed * @return string */ function ol($list, $attributes = '') { return _list('ol', $list, $attributes); } } // ------------------------------------------------------------------------ if ( ! function_exists('_list')) { /** * Generates the list * * Generates an HTML ordered list from an single or multi-dimensional array. * * @param string * @param mixed * @param mixed * @param int * @return string */ function _list($type = 'ul', $list = array(), $attributes = '', $depth = 0) { // If an array wasn't submitted there's nothing to do... if ( ! is_array($list)) { return $list; } // Set the indentation based on the depth $out = str_repeat(' ', $depth) // Write the opening list tag .'<'.$type._stringify_attributes($attributes).">\n"; // Cycle through the list elements. If an array is // encountered we will recursively call _list() static $_last_list_item = ''; foreach ($list as $key => $val) { $_last_list_item = $key; $out .= str_repeat(' ', $depth + 2).'
  • '; if ( ! is_array($val)) { $out .= $val; } else { $out .= $_last_list_item."\n"._list($type, $val, '', $depth + 4).str_repeat(' ', $depth + 2); } $out .= "
  • \n"; } // Set the indentation for the closing tag and apply it return $out.str_repeat(' ', $depth).'\n"; } } // ------------------------------------------------------------------------ if ( ! function_exists('img')) { /** * Image * * Generates an element * * @param mixed * @param bool * @param mixed * @return string */ function img($src = '', $index_page = FALSE, $attributes = '') { if ( ! is_array($src) ) { $src = array('src' => $src); } // If there is no alt attribute defined, set it to an empty string if ( ! isset($src['alt'])) { $src['alt'] = ''; } $img = ' $v) { if ($k === 'src' && ! preg_match('#^(data:[a-z,;])|(([a-z]+:)?(?config->site_url($v).'"'; } else { $img .= ' src="'.get_instance()->config->base_url($v).'"'; } } else { $img .= ' '.$k.'="'.$v.'"'; } } return $img._stringify_attributes($attributes).' />'; } } // ------------------------------------------------------------------------ if ( ! function_exists('doctype')) { /** * Doctype * * Generates a page document type declaration * * Examples of valid options: html5, xhtml-11, xhtml-strict, xhtml-trans, * xhtml-frame, html4-strict, html4-trans, and html4-frame. * All values are saved in the doctypes config file. * * @param string type The doctype to be generated * @return string */ function doctype($type = 'xhtml1-strict') { static $doctypes; if ( ! is_array($doctypes)) { if (file_exists(APPPATH.'config/doctypes.php')) { include(APPPATH.'config/doctypes.php'); } if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/doctypes.php')) { include(APPPATH.'config/'.ENVIRONMENT.'/doctypes.php'); } if (empty($_doctypes) OR ! is_array($_doctypes)) { $doctypes = array(); return FALSE; } $doctypes = $_doctypes; } return isset($doctypes[$type]) ? $doctypes[$type] : FALSE; } } // ------------------------------------------------------------------------ if ( ! function_exists('link_tag')) { /** * Link * * Generates link to a CSS file * * @param mixed stylesheet hrefs or an array * @param string rel * @param string type * @param string title * @param string media * @param bool should index_page be added to the css path * @return string */ function link_tag($href = '', $rel = 'stylesheet', $type = 'text/css', $title = '', $media = '', $index_page = FALSE) { $CI =& get_instance(); $link = ' $v) { if ($k === 'href' && ! preg_match('#^([a-z]+:)?//#i', $v)) { if ($index_page === TRUE) { $link .= 'href="'.$CI->config->site_url($v).'" '; } else { $link .= 'href="'.$CI->config->base_url($v).'" '; } } else { $link .= $k.'="'.$v.'" '; } } } else { if (preg_match('#^([a-z]+:)?//#i', $href)) { $link .= 'href="'.$href.'" '; } elseif ($index_page === TRUE) { $link .= 'href="'.$CI->config->site_url($href).'" '; } else { $link .= 'href="'.$CI->config->base_url($href).'" '; } $link .= 'rel="'.$rel.'" type="'.$type.'" '; if ($media !== '') { $link .= 'media="'.$media.'" '; } if ($title !== '') { $link .= 'title="'.$title.'" '; } } return $link."/>\n"; } } // ------------------------------------------------------------------------ if ( ! function_exists('meta')) { /** * Generates meta tags from an array of key/values * * @param array * @param string * @param string * @param string * @return string */ function meta($name = '', $content = '', $type = 'name', $newline = "\n") { // Since we allow the data to be passes as a string, a simple array // or a multidimensional one, we need to do a little prepping. if ( ! is_array($name)) { $name = array(array('name' => $name, 'content' => $content, 'type' => $type, 'newline' => $newline)); } elseif (isset($name['name'])) { // Turn single array into multidimensional $name = array($name); } $str = ''; foreach ($name as $meta) { $type = (isset($meta['type']) && $meta['type'] !== 'name') ? 'http-equiv' : 'name'; $name = isset($meta['name']) ? $meta['name'] : ''; $content = isset($meta['content']) ? $meta['content'] : ''; $newline = isset($meta['newline']) ? $meta['newline'] : "\n"; $str .= ''.$newline; } return $str; } } // ------------------------------------------------------------------------ if ( ! function_exists('br')) { /** * Generates HTML BR tags based on number supplied * * @deprecated 3.0.0 Use str_repeat() instead * @param int $count Number of times to repeat the tag * @return string */ function br($count = 1) { return str_repeat('
    ', $count); } } // ------------------------------------------------------------------------ if ( ! function_exists('nbs')) { /** * Generates non-breaking space entities based on number supplied * * @deprecated 3.0.0 Use str_repeat() instead * @param int * @return string */ function nbs($num = 1) { return str_repeat(' ', $num); } } PK!j_¤ªG G helpers/path_helper.phpnu„[µü¤input->set_cookie($name, $value, $expire, $domain, $path, $prefix, $secure, $httponly); } } // -------------------------------------------------------------------- if ( ! function_exists('get_cookie')) { /** * Fetch an item from the COOKIE array * * @param string * @param bool * @return mixed */ function get_cookie($index, $xss_clean = NULL) { is_bool($xss_clean) OR $xss_clean = (config_item('global_xss_filtering') === TRUE); $prefix = isset($_COOKIE[$index]) ? '' : config_item('cookie_prefix'); return get_instance()->input->cookie($prefix.$index, $xss_clean); } } // -------------------------------------------------------------------- if ( ! function_exists('delete_cookie')) { /** * Delete a COOKIE * * @param mixed * @param string the cookie domain. Usually: .yourdomain.com * @param string the cookie path * @param string the cookie prefix * @return void */ function delete_cookie($name, $domain = '', $path = '/', $prefix = '') { set_cookie($name, '', '', $domain, $path, $prefix); } } PK!7Úp£8£8helpers/text_helper.phpnu„[µü¤= $n) { $out = trim($out); return (mb_strlen($out) === mb_strlen($str)) ? $out : $out.$end_char; } } } } // ------------------------------------------------------------------------ if ( ! function_exists('ascii_to_entities')) { /** * High ASCII to Entities * * Converts high ASCII text and MS Word special characters to character entities * * @param string $str * @return string */ function ascii_to_entities($str) { $out = ''; $length = defined('MB_OVERLOAD_STRING') ? mb_strlen($str, '8bit') - 1 : strlen($str) - 1; for ($i = 0, $count = 1, $temp = array(); $i <= $length; $i++) { $ordinal = ord($str[$i]); if ($ordinal < 128) { /* If the $temp array has a value but we have moved on, then it seems only fair that we output that entity and restart $temp before continuing. -Paul */ if (count($temp) === 1) { $out .= '&#'.array_shift($temp).';'; $count = 1; } $out .= $str[$i]; } else { if (count($temp) === 0) { $count = ($ordinal < 224) ? 2 : 3; } $temp[] = $ordinal; if (count($temp) === $count) { $number = ($count === 3) ? (($temp[0] % 16) * 4096) + (($temp[1] % 64) * 64) + ($temp[2] % 64) : (($temp[0] % 32) * 64) + ($temp[1] % 64); $out .= '&#'.$number.';'; $count = 1; $temp = array(); } // If this is the last iteration, just output whatever we have elseif ($i === $length) { $out .= '&#'.implode(';', $temp).';'; } } } return $out; } } // ------------------------------------------------------------------------ if ( ! function_exists('entities_to_ascii')) { /** * Entities to ASCII * * Converts character entities back to ASCII * * @param string * @param bool * @return string */ function entities_to_ascii($str, $all = TRUE) { if (preg_match_all('/\&#(\d+)\;/', $str, $matches)) { for ($i = 0, $s = count($matches[0]); $i < $s; $i++) { $digits = $matches[1][$i]; $out = ''; if ($digits < 128) { $out .= chr($digits); } elseif ($digits < 2048) { $out .= chr(192 + (($digits - ($digits % 64)) / 64)).chr(128 + ($digits % 64)); } else { $out .= chr(224 + (($digits - ($digits % 4096)) / 4096)) .chr(128 + ((($digits % 4096) - ($digits % 64)) / 64)) .chr(128 + ($digits % 64)); } $str = str_replace($matches[0][$i], $out, $str); } } if ($all) { return str_replace( array('&', '<', '>', '"', ''', '-'), array('&', '<', '>', '"', "'", '-'), $str ); } return $str; } } // ------------------------------------------------------------------------ if ( ! function_exists('word_censor')) { /** * Word Censoring Function * * Supply a string and an array of disallowed words and any * matched words will be converted to #### or to the replacement * word you've submitted. * * @param string the text string * @param string the array of censored words * @param string the optional replacement value * @return string */ function word_censor($str, $censored, $replacement = '') { if ( ! is_array($censored)) { return $str; } $str = ' '.$str.' '; // \w, \b and a few others do not match on a unicode character // set for performance reasons. As a result words like über // will not match on a word boundary. Instead, we'll assume that // a bad word will be bookeneded by any of these characters. $delim = '[-_\'\"`(){}<>\[\]|!?@#%&,.:;^~*+=\/ 0-9\n\r\t]'; foreach ($censored as $badword) { $badword = str_replace('\*', '\w*?', preg_quote($badword, '/')); if ($replacement !== '') { $str = preg_replace( "/({$delim})(".$badword.")({$delim})/i", "\\1{$replacement}\\3", $str ); } elseif (preg_match_all("/{$delim}(".$badword."){$delim}/i", $str, $matches, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE)) { $matches = $matches[1]; for ($i = count($matches) - 1; $i >= 0; $i--) { $length = strlen($matches[$i][0]); $str = substr_replace( $str, str_repeat('#', $length), $matches[$i][1], $length ); } } } return trim($str); } } // ------------------------------------------------------------------------ if ( ! function_exists('highlight_code')) { /** * Code Highlighter * * Colorizes code strings * * @param string the text string * @return string */ function highlight_code($str) { /* The highlight string function encodes and highlights * brackets so we need them to start raw. * * Also replace any existing PHP tags to temporary markers * so they don't accidentally break the string out of PHP, * and thus, thwart the highlighting. */ $str = str_replace( array('<', '>', '', '<%', '%>', '\\', ''), array('<', '>', 'phptagopen', 'phptagclose', 'asptagopen', 'asptagclose', 'backslashtmp', 'scriptclose'), $str ); // The highlight_string function requires that the text be surrounded // by PHP tags, which we will remove later $str = highlight_string('', TRUE); // Remove our artificially added PHP, and the syntax highlighting that came with it $str = preg_replace( array( '/<\?php( | )/i', '/(.*?)\?><\/span>\n<\/span>\n<\/code>/is', '/<\/span>/i' ), array( '', "$1\n\n", '' ), $str ); // Replace our markers back to PHP tags. return str_replace( array('phptagopen', 'phptagclose', 'asptagopen', 'asptagclose', 'backslashtmp', 'scriptclose'), array('<?', '?>', '<%', '%>', '\\', '</script>'), $str ); } } // ------------------------------------------------------------------------ if ( ! function_exists('highlight_phrase')) { /** * Phrase Highlighter * * Highlights a phrase within a text string * * @param string $str the text string * @param string $phrase the phrase you'd like to highlight * @param string $tag_open the openging tag to precede the phrase with * @param string $tag_close the closing tag to end the phrase with * @return string */ function highlight_phrase($str, $phrase, $tag_open = '', $tag_close = '') { return ($str !== '' && $phrase !== '') ? preg_replace('/('.preg_quote($phrase, '/').')/i'.(UTF8_ENABLED ? 'u' : ''), $tag_open.'\\1'.$tag_close, $str) : $str; } } // ------------------------------------------------------------------------ if ( ! function_exists('convert_accented_characters')) { /** * Convert Accented Foreign Characters to ASCII * * @param string $str Input string * @return string */ function convert_accented_characters($str) { static $array_from, $array_to; if ( ! is_array($array_from)) { if (file_exists(APPPATH.'config/foreign_chars.php')) { include(APPPATH.'config/foreign_chars.php'); } if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/foreign_chars.php')) { include(APPPATH.'config/'.ENVIRONMENT.'/foreign_chars.php'); } if (empty($foreign_characters) OR ! is_array($foreign_characters)) { $array_from = array(); $array_to = array(); return $str; } $array_from = array_keys($foreign_characters); $array_to = array_values($foreign_characters); } return preg_replace($array_from, $array_to, $str); } } // ------------------------------------------------------------------------ if ( ! function_exists('word_wrap')) { /** * Word Wrap * * Wraps text at the specified character. Maintains the integrity of words. * Anything placed between {unwrap}{/unwrap} will not be word wrapped, nor * will URLs. * * @param string $str the text string * @param int $charlim = 76 the number of characters to wrap at * @return string */ function word_wrap($str, $charlim = 76) { // Set the character limit is_numeric($charlim) OR $charlim = 76; // Reduce multiple spaces $str = preg_replace('| +|', ' ', $str); // Standardize newlines if (strpos($str, "\r") !== FALSE) { $str = str_replace(array("\r\n", "\r"), "\n", $str); } // If the current word is surrounded by {unwrap} tags we'll // strip the entire chunk and replace it with a marker. $unwrap = array(); if (preg_match_all('|\{unwrap\}(.+?)\{/unwrap\}|s', $str, $matches)) { for ($i = 0, $c = count($matches[0]); $i < $c; $i++) { $unwrap[] = $matches[1][$i]; $str = str_replace($matches[0][$i], '{{unwrapped'.$i.'}}', $str); } } // Use PHP's native function to do the initial wordwrap. // We set the cut flag to FALSE so that any individual words that are // too long get left alone. In the next step we'll deal with them. $str = wordwrap($str, $charlim, "\n", FALSE); // Split the string into individual lines of text and cycle through them $output = ''; foreach (explode("\n", $str) as $line) { // Is the line within the allowed character count? // If so we'll join it to the output and continue if (mb_strlen($line) <= $charlim) { $output .= $line."\n"; continue; } $temp = ''; while (mb_strlen($line) > $charlim) { // If the over-length word is a URL we won't wrap it if (preg_match('!\[url.+\]|://|www\.!', $line)) { break; } // Trim the word down $temp .= mb_substr($line, 0, $charlim - 1); $line = mb_substr($line, $charlim - 1); } // If $temp contains data it means we had to split up an over-length // word into smaller chunks so we'll add it back to our current line if ($temp !== '') { $output .= $temp."\n".$line."\n"; } else { $output .= $line."\n"; } } // Put our markers back if (count($unwrap) > 0) { foreach ($unwrap as $key => $val) { $output = str_replace('{{unwrapped'.$key.'}}', $val, $output); } } return $output; } } // ------------------------------------------------------------------------ if ( ! function_exists('ellipsize')) { /** * Ellipsize String * * This function will strip tags from a string, split it at its max_length and ellipsize * * @param string string to ellipsize * @param int max length of string * @param mixed int (1|0) or float, .5, .2, etc for position to split * @param string ellipsis ; Default '...' * @return string ellipsized string */ function ellipsize($str, $max_length, $position = 1, $ellipsis = '…') { // Strip tags $str = trim(strip_tags($str)); // Is the string long enough to ellipsize? if (mb_strlen($str) <= $max_length) { return $str; } $beg = mb_substr($str, 0, floor($max_length * $position)); $position = ($position > 1) ? 1 : $position; if ($position === 1) { $end = mb_substr($str, 0, -($max_length - mb_strlen($beg))); } else { $end = mb_substr($str, -($max_length - mb_strlen($beg))); } return $beg.$ellipsis.$end; } } PK!&‹  helpers/directory_helper.phpnu„[µü¤ 0) && is_dir($source_dir.$file)) { $filedata[$file] = directory_map($source_dir.$file, $new_depth, $hidden); } else { $filedata[] = $file; } } closedir($fp); return $filedata; } return FALSE; } } PK!4oR–6–6helpers/url_helper.phpnu„[µü¤config->site_url($uri, $protocol); } } // ------------------------------------------------------------------------ if ( ! function_exists('base_url')) { /** * Base URL * * Create a local URL based on your basepath. * Segments can be passed in as a string or an array, same as site_url * or a URL to a file can be passed in, e.g. to an image file. * * @param string $uri * @param string $protocol * @return string */ function base_url($uri = '', $protocol = NULL) { return get_instance()->config->base_url($uri, $protocol); } } // ------------------------------------------------------------------------ if ( ! function_exists('current_url')) { /** * Current URL * * Returns the full URL (including segments) of the page where this * function is placed * * @return string */ function current_url() { $CI =& get_instance(); return $CI->config->site_url($CI->uri->uri_string()); } } // ------------------------------------------------------------------------ if ( ! function_exists('uri_string')) { /** * URL String * * Returns the URI segments. * * @return string */ function uri_string() { return get_instance()->uri->uri_string(); } } // ------------------------------------------------------------------------ if ( ! function_exists('index_page')) { /** * Index page * * Returns the "index_page" from your config file * * @return string */ function index_page() { return get_instance()->config->item('index_page'); } } // ------------------------------------------------------------------------ if ( ! function_exists('anchor')) { /** * Anchor Link * * Creates an anchor based on the local URL. * * @param string the URL * @param string the link title * @param mixed any attributes * @return string */ function anchor($uri = '', $title = '', $attributes = '') { $title = (string) $title; $site_url = is_array($uri) ? site_url($uri) : (preg_match('#^(\w+:)?//#i', $uri) ? $uri : site_url($uri)); if ($title === '') { $title = $site_url; } if ($attributes !== '') { $attributes = _stringify_attributes($attributes); } return '
    '.$title.''; } } // ------------------------------------------------------------------------ if ( ! function_exists('anchor_popup')) { /** * Anchor Link - Pop-up version * * Creates an anchor based on the local URL. The link * opens a new window based on the attributes specified. * * @param string the URL * @param string the link title * @param mixed any attributes * @return string */ function anchor_popup($uri = '', $title = '', $attributes = FALSE) { $title = (string) $title; $site_url = preg_match('#^(\w+:)?//#i', $uri) ? $uri : site_url($uri); if ($title === '') { $title = $site_url; } if ($attributes === FALSE) { return '".$title.''; } if ( ! is_array($attributes)) { $attributes = array($attributes); // Ref: http://www.w3schools.com/jsref/met_win_open.asp $window_name = '_blank'; } elseif ( ! empty($attributes['window_name'])) { $window_name = $attributes['window_name']; unset($attributes['window_name']); } else { $window_name = '_blank'; } foreach (array('width' => '800', 'height' => '600', 'scrollbars' => 'yes', 'menubar' => 'no', 'status' => 'yes', 'resizable' => 'yes', 'screenx' => '0', 'screeny' => '0') as $key => $val) { $atts[$key] = isset($attributes[$key]) ? $attributes[$key] : $val; unset($attributes[$key]); } $attributes = _stringify_attributes($attributes); return ''.$title.''; } } // ------------------------------------------------------------------------ if ( ! function_exists('mailto')) { /** * Mailto Link * * @param string the email address * @param string the link title * @param mixed any attributes * @return string */ function mailto($email, $title = '', $attributes = '') { $title = (string) $title; if ($title === '') { $title = $email; } return ''.$title.''; } } // ------------------------------------------------------------------------ if ( ! function_exists('safe_mailto')) { /** * Encoded Mailto Link * * Create a spam-protected mailto link written in Javascript * * @param string the email address * @param string the link title * @param mixed any attributes * @return string */ function safe_mailto($email, $title = '', $attributes = '') { $title = (string) $title; if ($title === '') { $title = $email; } $x = str_split(' $val) { $x[] = ' '.$key.'="'; for ($i = 0, $l = strlen($val); $i < $l; $i++) { $x[] = '|'.ord($val[$i]); } $x[] = '"'; } } else { for ($i = 0, $l = strlen($attributes); $i < $l; $i++) { $x[] = $attributes[$i]; } } } $x[] = '>'; $temp = array(); for ($i = 0, $l = strlen($title); $i < $l; $i++) { $ordinal = ord($title[$i]); if ($ordinal < 128) { $x[] = '|'.$ordinal; } else { if (count($temp) === 0) { $count = ($ordinal < 224) ? 2 : 3; } $temp[] = $ordinal; if (count($temp) === $count) { $number = ($count === 3) ? (($temp[0] % 16) * 4096) + (($temp[1] % 64) * 64) + ($temp[2] % 64) : (($temp[0] % 32) * 64) + ($temp[1] % 64); $x[] = '|'.$number; $count = 1; $temp = array(); } } } $x[] = '<'; $x[] = '/'; $x[] = 'a'; $x[] = '>'; $x = array_reverse($x); $output = "'; return $output; } } // ------------------------------------------------------------------------ if ( ! function_exists('auto_link')) { /** * Auto-linker * * Automatically links URL and Email addresses. * Note: There's a bit of extra code here to deal with * URLs or emails that end in a period. We'll strip these * off and add them after the link. * * @param string the string * @param string the type: email, url, or both * @param bool whether to create pop-up links * @return string */ function auto_link($str, $type = 'both', $popup = FALSE) { // Find and replace any URLs. if ($type !== 'email' && preg_match_all('#(\w*://|www\.)[a-z0-9]+(-+[a-z0-9]+)*(\.[a-z0-9]+(-+[a-z0-9]+)*)+(/([^\s()<>;]+\w)?/?)?#i', $str, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) { // Set our target HTML if using popup links. $target = ($popup) ? ' target="_blank" rel="noopener"' : ''; // We process the links in reverse order (last -> first) so that // the returned string offsets from preg_match_all() are not // moved as we add more HTML. foreach (array_reverse($matches) as $match) { // $match[0] is the matched string/link // $match[1] is either a protocol prefix or 'www.' // // With PREG_OFFSET_CAPTURE, both of the above is an array, // where the actual value is held in [0] and its offset at the [1] index. $a = ''.$match[0][0].''; $str = substr_replace($str, $a, $match[0][1], strlen($match[0][0])); } } // Find and replace any emails. if ($type !== 'url' && preg_match_all('#([\w\.\-\+]+@[a-z0-9\-]+\.[a-z0-9\-\.]+[^[:punct:]\s])#i', $str, $matches, PREG_OFFSET_CAPTURE)) { foreach (array_reverse($matches[0]) as $match) { if (filter_var($match[0], FILTER_VALIDATE_EMAIL) !== FALSE) { $str = substr_replace($str, safe_mailto($match[0]), $match[1], strlen($match[0])); } } } return $str; } } // ------------------------------------------------------------------------ if ( ! function_exists('prep_url')) { /** * Prep URL * * Simply adds the http:// part if no scheme is included * * @param string the URL * @return string */ function prep_url($str = '') { if ($str === 'http://' OR $str === '') { return ''; } $url = parse_url($str); if ( ! $url OR ! isset($url['scheme'])) { return 'http://'.$str; } return $str; } } // ------------------------------------------------------------------------ if ( ! function_exists('url_title')) { /** * Create URL Title * * Takes a "title" string as input and creates a * human-friendly URL string with a "separator" string * as the word separator. * * @todo Remove old 'dash' and 'underscore' usage in 3.1+. * @param string $str Input string * @param string $separator Word separator * (usually '-' or '_') * @param bool $lowercase Whether to transform the output string to lowercase * @return string */ function url_title($str, $separator = '-', $lowercase = FALSE) { if ($separator === 'dash') { $separator = '-'; } elseif ($separator === 'underscore') { $separator = '_'; } $q_separator = preg_quote($separator, '#'); $trans = array( '&.+?;' => '', '[^\w\d _-]' => '', '\s+' => $separator, '('.$q_separator.')+' => $separator ); $str = strip_tags($str); foreach ($trans as $key => $val) { $str = preg_replace('#'.$key.'#i'.(UTF8_ENABLED ? 'u' : ''), $val, $str); } if ($lowercase === TRUE) { $str = strtolower($str); } return trim(trim($str, $separator)); } } // ------------------------------------------------------------------------ if ( ! function_exists('redirect')) { /** * Header Redirect * * Header redirect in two flavors * For very fine grained control over headers, you could use the Output * Library's set_header() function. * * @param string $uri URL * @param string $method Redirect method * 'auto', 'location' or 'refresh' * @param int $code HTTP Response status code * @return void */ function redirect($uri = '', $method = 'auto', $code = NULL) { if ( ! preg_match('#^(\w+:)?//#i', $uri)) { $uri = site_url($uri); } // IIS environment likely? Use 'refresh' for better compatibility if ($method === 'auto' && isset($_SERVER['SERVER_SOFTWARE']) && strpos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS') !== FALSE) { $method = 'refresh'; } elseif ($method !== 'refresh' && (empty($code) OR ! is_numeric($code))) { if (isset($_SERVER['SERVER_PROTOCOL'], $_SERVER['REQUEST_METHOD']) && $_SERVER['SERVER_PROTOCOL'] === 'HTTP/1.1') { $code = ($_SERVER['REQUEST_METHOD'] !== 'GET') ? 303 // reference: http://en.wikipedia.org/wiki/Post/Redirect/Get : 307; } else { $code = 302; } } switch ($method) { case 'refresh': header('Refresh:0;url='.$uri); break; default: header('Location: '.$uri, TRUE, $code); break; } exit; } } PK!æEñé © helpers/array_helper.phpnu„[µü¤field_id pairs * @param string field_id if alias name was passed in * @param bool * @return array */ function smiley_js($alias = '', $field_id = '', $inline = TRUE) { static $do_setup = TRUE; $r = ''; if ($alias !== '' && ! is_array($alias)) { $alias = array($alias => $field_id); } if ($do_setup === TRUE) { $do_setup = FALSE; $m = array(); if (is_array($alias)) { foreach ($alias as $name => $id) { $m[] = '"'.$name.'" : "'.$id.'"'; } } $m = '{'.implode(',', $m).'}'; $r .= << $id) { $r .= 'smiley_map["'.$name.'"] = "'.$id."\";\n"; } } return ($inline) ? '' : $r; } } // ------------------------------------------------------------------------ if ( ! function_exists('get_clickable_smileys')) { /** * Get Clickable Smileys * * Returns an array of image tag links that can be clicked to be inserted * into a form field. * * @param string the URL to the folder containing the smiley images * @param array * @return array */ function get_clickable_smileys($image_url, $alias = '') { // For backward compatibility with js_insert_smiley if (is_array($alias)) { $smileys = $alias; } elseif (FALSE === ($smileys = _get_smiley_array())) { return FALSE; } // Add a trailing slash to the file path if needed $image_url = rtrim($image_url, '/').'/'; $used = array(); foreach ($smileys as $key => $val) { // Keep duplicates from being used, which can happen if the // mapping array contains multiple identical replacements. For example: // :-) and :) might be replaced with the same image so both smileys // will be in the array. if (isset($used[$smileys[$key][0]])) { continue; } $link[] = ''.$smileys[$key][3].''; $used[$smileys[$key][0]] = TRUE; } return $link; } } // ------------------------------------------------------------------------ if ( ! function_exists('parse_smileys')) { /** * Parse Smileys * * Takes a string as input and swaps any contained smileys for the actual image * * @param string the text to be parsed * @param string the URL to the folder containing the smiley images * @param array * @return string */ function parse_smileys($str = '', $image_url = '', $smileys = NULL) { if ($image_url === '' OR ( ! is_array($smileys) && FALSE === ($smileys = _get_smiley_array()))) { return $str; } // Add a trailing slash to the file path if needed $image_url = rtrim($image_url, '/').'/'; foreach ($smileys as $key => $val) { $str = str_replace($key, ''.$smileys[$key][3].'', $str); } return $str; } } // ------------------------------------------------------------------------ if ( ! function_exists('_get_smiley_array')) { /** * Get Smiley Array * * Fetches the config/smiley.php file * * @return mixed */ function _get_smiley_array() { static $_smileys; if ( ! is_array($_smileys)) { if (file_exists(APPPATH.'config/smileys.php')) { include(APPPATH.'config/smileys.php'); } if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/smileys.php')) { include(APPPATH.'config/'.ENVIRONMENT.'/smileys.php'); } if (empty($smileys) OR ! is_array($smileys)) { $_smileys = array(); return FALSE; } $_smileys = $smileys; } return $_smileys; } } PK!}‘0•½ ½ helpers/typography_helper.phpnu„[µü¤load->library('typography'); return $CI->typography->nl2br_except_pre($str); } } // ------------------------------------------------------------------------ if ( ! function_exists('auto_typography')) { /** * Auto Typography Wrapper Function * * @param string $str * @param bool $reduce_linebreaks = FALSE whether to reduce multiple instances of double newlines to two * @return string */ function auto_typography($str, $reduce_linebreaks = FALSE) { $CI =& get_instance(); $CI->load->library('typography'); return $CI->typography->auto_typography($str, $reduce_linebreaks); } } // -------------------------------------------------------------------- if ( ! function_exists('entity_decode')) { /** * HTML Entities Decode * * This function is a replacement for html_entity_decode() * * @param string * @param string * @return string */ function entity_decode($str, $charset = NULL) { return get_instance()->security->entity_decode($str, $charset); } } PK!AÆ @zzhelpers/security_helper.phpnu„[µü¤security->xss_clean($str, $is_image); } } // ------------------------------------------------------------------------ if ( ! function_exists('sanitize_filename')) { /** * Sanitize Filename * * @param string * @return string */ function sanitize_filename($filename) { return get_instance()->security->sanitize_filename($filename); } } // -------------------------------------------------------------------- if ( ! function_exists('do_hash')) { /** * Hash encode a string * * @todo Remove in version 3.1+. * @deprecated 3.0.0 Use PHP's native hash() instead. * @param string $str * @param string $type = 'sha1' * @return string */ function do_hash($str, $type = 'sha1') { if ( ! in_array(strtolower($type), hash_algos())) { $type = 'md5'; } return hash($type, $str); } } // ------------------------------------------------------------------------ if ( ! function_exists('strip_image_tags')) { /** * Strip Image Tags * * @param string * @return string */ function strip_image_tags($str) { return get_instance()->security->strip_image_tags($str); } } // ------------------------------------------------------------------------ if ( ! function_exists('encode_php_tags')) { /** * Convert PHP tags to entities * * @param string * @return string */ function encode_php_tags($str) { return str_replace(array(''), array('<?', '?>'), $str); } } PK! X$Í^^helpers/form_helper.phpnu„[µü¤config->site_url($CI->uri->uri_string()); } // If an action is not a full URL then turn it into one elseif (strpos($action, '://') === FALSE) { $action = $CI->config->site_url($action); } $attributes = _attributes_to_string($attributes); if (stripos($attributes, 'method=') === FALSE) { $attributes .= ' method="post"'; } if (stripos($attributes, 'accept-charset=') === FALSE) { $attributes .= ' accept-charset="'.strtolower(config_item('charset')).'"'; } $form = '
    \n"; if (is_array($hidden)) { foreach ($hidden as $name => $value) { $form .= ''."\n"; } } // Add CSRF field if enabled, but leave it out for GET requests and requests to external websites if ($CI->config->item('csrf_protection') === TRUE && strpos($action, $CI->config->base_url()) !== FALSE && ! stripos($form, 'method="get"')) { // Prepend/append random-length "white noise" around the CSRF // token input, as a form of protection against BREACH attacks if (FALSE !== ($noise = $CI->security->get_random_bytes(1))) { list(, $noise) = unpack('c', $noise); } else { $noise = mt_rand(-128, 127); } // Prepend if $noise has a negative value, append if positive, do nothing for zero $prepend = $append = ''; if ($noise < 0) { $prepend = str_repeat(" ", abs($noise)); } elseif ($noise > 0) { $append = str_repeat(" ", $noise); } $form .= sprintf( '%s%s%s', $prepend, $CI->security->get_csrf_token_name(), $CI->security->get_csrf_hash(), $append, "\n" ); } return $form; } } // ------------------------------------------------------------------------ if ( ! function_exists('form_open_multipart')) { /** * Form Declaration - Multipart type * * Creates the opening portion of the form, but with "multipart/form-data". * * @param string the URI segments of the form destination * @param array a key/value pair of attributes * @param array a key/value pair hidden data * @return string */ function form_open_multipart($action = '', $attributes = array(), $hidden = array()) { if (is_string($attributes)) { $attributes .= ' enctype="multipart/form-data"'; } else { $attributes['enctype'] = 'multipart/form-data'; } return form_open($action, $attributes, $hidden); } } // ------------------------------------------------------------------------ if ( ! function_exists('form_hidden')) { /** * Hidden Input Field * * Generates hidden fields. You can pass a simple key/value string or * an associative array with multiple values. * * @param mixed $name Field name * @param string $value Field value * @param bool $recursing * @return string */ function form_hidden($name, $value = '', $recursing = FALSE) { static $form; if ($recursing === FALSE) { $form = "\n"; } if (is_array($name)) { foreach ($name as $key => $val) { form_hidden($key, $val, TRUE); } return $form; } if ( ! is_array($value)) { $form .= '\n"; } else { foreach ($value as $k => $v) { $k = is_int($k) ? '' : $k; form_hidden($name.'['.$k.']', $v, TRUE); } } return $form; } } // ------------------------------------------------------------------------ if ( ! function_exists('form_input')) { /** * Text Input Field * * @param mixed * @param string * @param mixed * @return string */ function form_input($data = '', $value = '', $extra = '') { $defaults = array( 'type' => 'text', 'name' => is_array($data) ? '' : $data, 'value' => $value ); return '\n"; } } // ------------------------------------------------------------------------ if ( ! function_exists('form_password')) { /** * Password Field * * Identical to the input function but adds the "password" type * * @param mixed * @param string * @param mixed * @return string */ function form_password($data = '', $value = '', $extra = '') { is_array($data) OR $data = array('name' => $data); $data['type'] = 'password'; return form_input($data, $value, $extra); } } // ------------------------------------------------------------------------ if ( ! function_exists('form_upload')) { /** * Upload Field * * Identical to the input function but adds the "file" type * * @param mixed * @param string * @param mixed * @return string */ function form_upload($data = '', $value = '', $extra = '') { $defaults = array('type' => 'file', 'name' => ''); is_array($data) OR $data = array('name' => $data); $data['type'] = 'file'; return '\n"; } } // ------------------------------------------------------------------------ if ( ! function_exists('form_textarea')) { /** * Textarea field * * @param mixed $data * @param string $value * @param mixed $extra * @return string */ function form_textarea($data = '', $value = '', $extra = '') { $defaults = array( 'name' => is_array($data) ? '' : $data, 'cols' => '40', 'rows' => '10' ); if ( ! is_array($data) OR ! isset($data['value'])) { $val = $value; } else { $val = $data['value']; unset($data['value']); // textareas don't use the value attribute } return '\n"; } } // ------------------------------------------------------------------------ if ( ! function_exists('form_multiselect')) { /** * Multi-select menu * * @param string * @param array * @param mixed * @param mixed * @return string */ function form_multiselect($name = '', $options = array(), $selected = array(), $extra = '') { $extra = _attributes_to_string($extra); if (stripos($extra, 'multiple') === FALSE) { $extra .= ' multiple="multiple"'; } return form_dropdown($name, $options, $selected, $extra); } } // -------------------------------------------------------------------- if ( ! function_exists('form_dropdown')) { /** * Drop-down Menu * * @param mixed $data * @param mixed $options * @param mixed $selected * @param mixed $extra * @return string */ function form_dropdown($data = '', $options = array(), $selected = array(), $extra = '') { $defaults = array(); if (is_array($data)) { if (isset($data['selected'])) { $selected = $data['selected']; unset($data['selected']); // select tags don't have a selected attribute } if (isset($data['options'])) { $options = $data['options']; unset($data['options']); // select tags don't use an options attribute } } else { $defaults = array('name' => $data); } is_array($selected) OR $selected = array($selected); is_array($options) OR $options = array($options); // If no selected state was submitted we will attempt to set it automatically if (empty($selected)) { if (is_array($data)) { if (isset($data['name'], $_POST[$data['name']])) { $selected = array($_POST[$data['name']]); } } elseif (isset($_POST[$data])) { $selected = array($_POST[$data]); } } $extra = _attributes_to_string($extra); $multiple = (count($selected) > 1 && stripos($extra, 'multiple') === FALSE) ? ' multiple="multiple"' : ''; $form = '\n"; } } // ------------------------------------------------------------------------ if ( ! function_exists('form_checkbox')) { /** * Checkbox Field * * @param mixed * @param string * @param bool * @param mixed * @return string */ function form_checkbox($data = '', $value = '', $checked = FALSE, $extra = '') { $defaults = array('type' => 'checkbox', 'name' => ( ! is_array($data) ? $data : ''), 'value' => $value); if (is_array($data) && array_key_exists('checked', $data)) { $checked = $data['checked']; if ($checked == FALSE) { unset($data['checked']); } else { $data['checked'] = 'checked'; } } if ($checked == TRUE) { $defaults['checked'] = 'checked'; } else { unset($defaults['checked']); } return '\n"; } } // ------------------------------------------------------------------------ if ( ! function_exists('form_radio')) { /** * Radio Button * * @param mixed * @param string * @param bool * @param mixed * @return string */ function form_radio($data = '', $value = '', $checked = FALSE, $extra = '') { is_array($data) OR $data = array('name' => $data); $data['type'] = 'radio'; return form_checkbox($data, $value, $checked, $extra); } } // ------------------------------------------------------------------------ if ( ! function_exists('form_submit')) { /** * Submit Button * * @param mixed * @param string * @param mixed * @return string */ function form_submit($data = '', $value = '', $extra = '') { $defaults = array( 'type' => 'submit', 'name' => is_array($data) ? '' : $data, 'value' => $value ); return '\n"; } } // ------------------------------------------------------------------------ if ( ! function_exists('form_reset')) { /** * Reset Button * * @param mixed * @param string * @param mixed * @return string */ function form_reset($data = '', $value = '', $extra = '') { $defaults = array( 'type' => 'reset', 'name' => is_array($data) ? '' : $data, 'value' => $value ); return '\n"; } } // ------------------------------------------------------------------------ if ( ! function_exists('form_button')) { /** * Form Button * * @param mixed * @param string * @param mixed * @return string */ function form_button($data = '', $content = '', $extra = '') { $defaults = array( 'name' => is_array($data) ? '' : $data, 'type' => 'button' ); if (is_array($data) && isset($data['content'])) { $content = $data['content']; unset($data['content']); // content is not an attribute } return '\n"; } } // ------------------------------------------------------------------------ if ( ! function_exists('form_label')) { /** * Form Label Tag * * @param string The text to appear onscreen * @param string The id the label applies to * @param mixed Additional attributes * @return string */ function form_label($label_text = '', $id = '', $attributes = array()) { $label = ''.$label_text.''; } } // ------------------------------------------------------------------------ if ( ! function_exists('form_fieldset')) { /** * Fieldset Tag * * Used to produce
    text. To close fieldset * use form_fieldset_close() * * @param string The legend text * @param array Additional attributes * @return string */ function form_fieldset($legend_text = '', $attributes = array()) { $fieldset = '\n"; if ($legend_text !== '') { return $fieldset.''.$legend_text."\n"; } return $fieldset; } } // ------------------------------------------------------------------------ if ( ! function_exists('form_fieldset_close')) { /** * Fieldset Close Tag * * @param string * @return string */ function form_fieldset_close($extra = '') { return '
    '.$extra; } } // ------------------------------------------------------------------------ if ( ! function_exists('form_close')) { /** * Form Close Tag * * @param string * @return string */ function form_close($extra = '') { return ''.$extra; } } // ------------------------------------------------------------------------ if ( ! function_exists('form_prep')) { /** * Form Prep * * Formats text so that it can be safely placed in a form field in the event it has HTML tags. * * @deprecated 3.0.0 An alias for html_escape() * @param string|string[] $str Value to escape * @return string|string[] Escaped values */ function form_prep($str) { return html_escape($str, TRUE); } } // ------------------------------------------------------------------------ if ( ! function_exists('set_value')) { /** * Form Value * * Grabs a value from the POST array for the specified field so you can * re-populate an input field or textarea. If Form Validation * is active it retrieves the info from the validation class * * @param string $field Field name * @param string $default Default value * @param bool $html_escape Whether to escape HTML special characters or not * @return string */ function set_value($field, $default = '', $html_escape = TRUE) { $CI =& get_instance(); $value = (isset($CI->form_validation) && is_object($CI->form_validation) && $CI->form_validation->has_rule($field)) ? $CI->form_validation->set_value($field, $default) : $CI->input->post($field, FALSE); isset($value) OR $value = $default; return ($html_escape) ? html_escape($value) : $value; } } // ------------------------------------------------------------------------ if ( ! function_exists('set_select')) { /** * Set Select * * Let's you set the selected value of a \n"; foreach (timezones() as $key => $val) { $selected = ($default === $key) ? ' selected="selected"' : ''; $menu .= '\n"; } return $menu.''; } } // ------------------------------------------------------------------------ if ( ! function_exists('timezones')) { /** * Timezones * * Returns an array of timezones. This is a helper function * for various other ones in this library * * @param string timezone * @return string */ function timezones($tz = '') { // Note: Don't change the order of these even though // some items appear to be in the wrong order $zones = array( 'UM12' => -12, 'UM11' => -11, 'UM10' => -10, 'UM95' => -9.5, 'UM9' => -9, 'UM8' => -8, 'UM7' => -7, 'UM6' => -6, 'UM5' => -5, 'UM45' => -4.5, 'UM4' => -4, 'UM35' => -3.5, 'UM3' => -3, 'UM2' => -2, 'UM1' => -1, 'UTC' => 0, 'UP1' => +1, 'UP2' => +2, 'UP3' => +3, 'UP35' => +3.5, 'UP4' => +4, 'UP45' => +4.5, 'UP5' => +5, 'UP55' => +5.5, 'UP575' => +5.75, 'UP6' => +6, 'UP65' => +6.5, 'UP7' => +7, 'UP8' => +8, 'UP875' => +8.75, 'UP9' => +9, 'UP95' => +9.5, 'UP10' => +10, 'UP105' => +10.5, 'UP11' => +11, 'UP115' => +11.5, 'UP12' => +12, 'UP1275' => +12.75, 'UP13' => +13, 'UP14' => +14 ); if ($tz === '') { return $zones; } return isset($zones[$tz]) ? $zones[$tz] : 0; } } // ------------------------------------------------------------------------ if ( ! function_exists('date_range')) { /** * Date range * * Returns a list of dates within a specified period. * * @param int unix_start UNIX timestamp of period start date * @param int unix_end|days UNIX timestamp of period end date * or interval in days. * @param mixed is_unix Specifies whether the second parameter * is a UNIX timestamp or a day interval * - TRUE or 'unix' for a timestamp * - FALSE or 'days' for an interval * @param string date_format Output date format, same as in date() * @return array */ function date_range($unix_start = '', $mixed = '', $is_unix = TRUE, $format = 'Y-m-d') { if ($unix_start == '' OR $mixed == '' OR $format == '') { return FALSE; } $is_unix = ! ( ! $is_unix OR $is_unix === 'days'); // Validate input and try strtotime() on invalid timestamps/intervals, just in case if ( ( ! ctype_digit((string) $unix_start) && ($unix_start = @strtotime($unix_start)) === FALSE) OR ( ! ctype_digit((string) $mixed) && ($is_unix === FALSE OR ($mixed = @strtotime($mixed)) === FALSE)) OR ($is_unix === TRUE && $mixed < $unix_start)) { return FALSE; } if ($is_unix && ($unix_start == $mixed OR date($format, $unix_start) === date($format, $mixed))) { return array(date($format, $unix_start)); } $range = array(); $from = new DateTime(); $from->setTimestamp($unix_start); if ($is_unix) { $arg = new DateTime(); $arg->setTimestamp($mixed); } else { $arg = (int) $mixed; } $period = new DatePeriod($from, new DateInterval('P1D'), $arg); foreach ($period as $date) { $range[] = $date->format($format); } /* If a period end date was passed to the DatePeriod constructor, it might not * be in our results. Not sure if this is a bug or it's just possible because * the end date might actually be less than 24 hours away from the previously * generated DateTime object, but either way - we have to append it manually. */ if ( ! is_int($arg) && $range[count($range) - 1] !== $arg->format($format)) { $range[] = $arg->format($format); } return $range; } } PK!®ò(ƒƒlanguage/index.htmlnu„[µü¤ 403 Forbidden

    Directory access is forbidden.

    PK!+£¶ä\\ language/english/number_lang.phpnu„[µü¤ 403 Forbidden

    Directory access is forbidden.

    PK!^?$¾1 1 language/english/ftp_lang.phpnu„[µü¤db =& $db; log_message('info', 'Database Utility Class Initialized'); } // -------------------------------------------------------------------- /** * List databases * * @return array */ public function list_databases() { // Is there a cached result? if (isset($this->db->data_cache['db_names'])) { return $this->db->data_cache['db_names']; } elseif ($this->_list_databases === FALSE) { return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; } $this->db->data_cache['db_names'] = array(); $query = $this->db->query($this->_list_databases); if ($query === FALSE) { return $this->db->data_cache['db_names']; } for ($i = 0, $query = $query->result_array(), $c = count($query); $i < $c; $i++) { $this->db->data_cache['db_names'][] = current($query[$i]); } return $this->db->data_cache['db_names']; } // -------------------------------------------------------------------- /** * Determine if a particular database exists * * @param string $database_name * @return bool */ public function database_exists($database_name) { return in_array($database_name, $this->list_databases()); } // -------------------------------------------------------------------- /** * Optimize Table * * @param string $table_name * @return mixed */ public function optimize_table($table_name) { if ($this->_optimize_table === FALSE) { return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; } $query = $this->db->query(sprintf($this->_optimize_table, $this->db->escape_identifiers($table_name))); if ($query !== FALSE) { $query = $query->result_array(); return current($query); } return FALSE; } // -------------------------------------------------------------------- /** * Optimize Database * * @return mixed */ public function optimize_database() { if ($this->_optimize_table === FALSE) { return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; } $result = array(); foreach ($this->db->list_tables() as $table_name) { $res = $this->db->query(sprintf($this->_optimize_table, $this->db->escape_identifiers($table_name))); if (is_bool($res)) { return $res; } // Build the result array... $res = $res->result_array(); $res = current($res); $key = str_replace($this->db->database.'.', '', current($res)); $keys = array_keys($res); unset($res[$keys[0]]); $result[$key] = $res; } return $result; } // -------------------------------------------------------------------- /** * Repair Table * * @param string $table_name * @return mixed */ public function repair_table($table_name) { if ($this->_repair_table === FALSE) { return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; } $query = $this->db->query(sprintf($this->_repair_table, $this->db->escape_identifiers($table_name))); if (is_bool($query)) { return $query; } $query = $query->result_array(); return current($query); } // -------------------------------------------------------------------- /** * Generate CSV from a query result object * * @param object $query Query result object * @param string $delim Delimiter (default: ,) * @param string $newline Newline character (default: \n) * @param string $enclosure Enclosure (default: ") * @return string */ public function csv_from_result($query, $delim = ',', $newline = "\n", $enclosure = '"') { if ( ! is_object($query) OR ! method_exists($query, 'list_fields')) { show_error('You must submit a valid result object'); } $out = ''; // First generate the headings from the table column names foreach ($query->list_fields() as $name) { $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim; } $out = substr($out, 0, -strlen($delim)).$newline; // Next blast through the result array and build out the rows while ($row = $query->unbuffered_row('array')) { $line = array(); foreach ($row as $item) { $line[] = $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure; } $out .= implode($delim, $line).$newline; } return $out; } // -------------------------------------------------------------------- /** * Generate XML data from a query result object * * @param object $query Query result object * @param array $params Any preferences * @return string */ public function xml_from_result($query, $params = array()) { if ( ! is_object($query) OR ! method_exists($query, 'list_fields')) { show_error('You must submit a valid result object'); } // Set our default values foreach (array('root' => 'root', 'element' => 'element', 'newline' => "\n", 'tab' => "\t") as $key => $val) { if ( ! isset($params[$key])) { $params[$key] = $val; } } // Create variables for convenience extract($params); // Load the xml helper get_instance()->load->helper('xml'); // Generate the result $xml = '<'.$root.'>'.$newline; while ($row = $query->unbuffered_row()) { $xml .= $tab.'<'.$element.'>'.$newline; foreach ($row as $key => $val) { $xml .= $tab.$tab.'<'.$key.'>'.xml_convert($val).''.$newline; } $xml .= $tab.''.$newline; } return $xml.''.$newline; } // -------------------------------------------------------------------- /** * Database Backup * * @param array $params * @return string */ public function backup($params = array()) { // If the parameters have not been submitted as an // array then we know that it is simply the table // name, which is a valid short cut. if (is_string($params)) { $params = array('tables' => $params); } // Set up our default preferences $prefs = array( 'tables' => array(), 'ignore' => array(), 'filename' => '', 'format' => 'gzip', // gzip, zip, txt 'add_drop' => TRUE, 'add_insert' => TRUE, 'newline' => "\n", 'foreign_key_checks' => TRUE ); // Did the user submit any preferences? If so set them.... if (count($params) > 0) { foreach ($prefs as $key => $val) { if (isset($params[$key])) { $prefs[$key] = $params[$key]; } } } // Are we backing up a complete database or individual tables? // If no table names were submitted we'll fetch the entire table list if (count($prefs['tables']) === 0) { $prefs['tables'] = $this->db->list_tables(); } // Validate the format if ( ! in_array($prefs['format'], array('gzip', 'zip', 'txt'), TRUE)) { $prefs['format'] = 'txt'; } // Is the encoder supported? If not, we'll either issue an // error or use plain text depending on the debug settings if (($prefs['format'] === 'gzip' && ! function_exists('gzencode')) OR ($prefs['format'] === 'zip' && ! function_exists('gzcompress'))) { if ($this->db->db_debug) { return $this->db->display_error('db_unsupported_compression'); } $prefs['format'] = 'txt'; } // Was a Zip file requested? if ($prefs['format'] === 'zip') { // Set the filename if not provided (only needed with Zip files) if ($prefs['filename'] === '') { $prefs['filename'] = (count($prefs['tables']) === 1 ? $prefs['tables'] : $this->db->database) .date('Y-m-d_H-i', time()).'.sql'; } else { // If they included the .zip file extension we'll remove it if (preg_match('|.+?\.zip$|', $prefs['filename'])) { $prefs['filename'] = str_replace('.zip', '', $prefs['filename']); } // Tack on the ".sql" file extension if needed if ( ! preg_match('|.+?\.sql$|', $prefs['filename'])) { $prefs['filename'] .= '.sql'; } } // Load the Zip class and output it $CI =& get_instance(); $CI->load->library('zip'); $CI->zip->add_data($prefs['filename'], $this->_backup($prefs)); return $CI->zip->get_zip(); } elseif ($prefs['format'] === 'txt') // Was a text file requested? { return $this->_backup($prefs); } elseif ($prefs['format'] === 'gzip') // Was a Gzip file requested? { return gzencode($this->_backup($prefs)); } return; } } PK!Áï¥édatabase/DB.phpnu„[µü¤load->get_package_paths() as $path) { if ($path !== APPPATH) { if (file_exists($file_path = $path.'config/'.ENVIRONMENT.'/database.php')) { include($file_path); } elseif (file_exists($file_path = $path.'config/database.php')) { include($file_path); } } } } if ( ! isset($db) OR count($db) === 0) { show_error('No database connection settings were found in the database config file.'); } if ($params !== '') { $active_group = $params; } if ( ! isset($active_group)) { show_error('You have not specified a database connection group via $active_group in your config/database.php file.'); } elseif ( ! isset($db[$active_group])) { show_error('You have specified an invalid database connection group ('.$active_group.') in your config/database.php file.'); } $params = $db[$active_group]; } elseif (is_string($params)) { /** * Parse the URL from the DSN string * Database settings can be passed as discreet * parameters or as a data source name in the first * parameter. DSNs must have this prototype: * $dsn = 'driver://username:password@hostname/database'; */ if (($dsn = @parse_url($params)) === FALSE) { show_error('Invalid DB Connection String'); } $params = array( 'dbdriver' => $dsn['scheme'], 'hostname' => isset($dsn['host']) ? rawurldecode($dsn['host']) : '', 'port' => isset($dsn['port']) ? rawurldecode($dsn['port']) : '', 'username' => isset($dsn['user']) ? rawurldecode($dsn['user']) : '', 'password' => isset($dsn['pass']) ? rawurldecode($dsn['pass']) : '', 'database' => isset($dsn['path']) ? rawurldecode(substr($dsn['path'], 1)) : '' ); // Were additional config items set? if (isset($dsn['query'])) { parse_str($dsn['query'], $extra); foreach ($extra as $key => $val) { if (is_string($val) && in_array(strtoupper($val), array('TRUE', 'FALSE', 'NULL'))) { $val = var_export($val, TRUE); } $params[$key] = $val; } } } // No DB specified yet? Beat them senseless... if (empty($params['dbdriver'])) { show_error('You have not selected a database type to connect to.'); } // Load the DB classes. Note: Since the query builder class is optional // we need to dynamically create a class that extends proper parent class // based on whether we're using the query builder class or not. if ($query_builder_override !== NULL) { $query_builder = $query_builder_override; } // Backwards compatibility work-around for keeping the // $active_record config variable working. Should be // removed in v3.1 elseif ( ! isset($query_builder) && isset($active_record)) { $query_builder = $active_record; } require_once(BASEPATH.'database/DB_driver.php'); if ( ! isset($query_builder) OR $query_builder === TRUE) { require_once(BASEPATH.'database/DB_query_builder.php'); if ( ! class_exists('CI_DB', FALSE)) { /** * CI_DB * * Acts as an alias for both CI_DB_driver and CI_DB_query_builder. * * @see CI_DB_query_builder * @see CI_DB_driver */ class CI_DB extends CI_DB_query_builder { } } } elseif ( ! class_exists('CI_DB', FALSE)) { /** * @ignore */ class CI_DB extends CI_DB_driver { } } // Load the DB driver $driver_file = BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver.php'; file_exists($driver_file) OR show_error('Invalid DB driver'); require_once($driver_file); // Instantiate the DB adapter $driver = 'CI_DB_'.$params['dbdriver'].'_driver'; $DB = new $driver($params); // Check for a subdriver if ( ! empty($DB->subdriver)) { $driver_file = BASEPATH.'database/drivers/'.$DB->dbdriver.'/subdrivers/'.$DB->dbdriver.'_'.$DB->subdriver.'_driver.php'; if (file_exists($driver_file)) { require_once($driver_file); $driver = 'CI_DB_'.$DB->dbdriver.'_'.$DB->subdriver.'_driver'; $DB = new $driver($params); } } $DB->initialize(); return $DB; } PK!˜<Ó²R^R^database/DB_forge.phpnu„[µü¤db =& $db; log_message('info', 'Database Forge Class Initialized'); } // -------------------------------------------------------------------- /** * Create database * * @param string $db_name * @return bool */ public function create_database($db_name) { if ($this->_create_database === FALSE) { return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; } elseif ( ! $this->db->query(sprintf($this->_create_database, $this->db->escape_identifiers($db_name), $this->db->char_set, $this->db->dbcollat))) { return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; } if ( ! empty($this->db->data_cache['db_names'])) { $this->db->data_cache['db_names'][] = $db_name; } return TRUE; } // -------------------------------------------------------------------- /** * Drop database * * @param string $db_name * @return bool */ public function drop_database($db_name) { if ($this->_drop_database === FALSE) { return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; } elseif ( ! $this->db->query(sprintf($this->_drop_database, $this->db->escape_identifiers($db_name)))) { return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; } if ( ! empty($this->db->data_cache['db_names'])) { $key = array_search(strtolower($db_name), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); if ($key !== FALSE) { unset($this->db->data_cache['db_names'][$key]); } } return TRUE; } // -------------------------------------------------------------------- /** * Add Key * * @param string $key * @param bool $primary * @return CI_DB_forge */ public function add_key($key, $primary = FALSE) { // DO NOT change this! This condition is only applicable // for PRIMARY keys because you can only have one such, // and therefore all fields you add to it will be included // in the same, composite PRIMARY KEY. // // It's not the same for regular indexes. if ($primary === TRUE && is_array($key)) { foreach ($key as $one) { $this->add_key($one, $primary); } return $this; } if ($primary === TRUE) { $this->primary_keys[] = $key; } else { $this->keys[] = $key; } return $this; } // -------------------------------------------------------------------- /** * Add Field * * @param array $field * @return CI_DB_forge */ public function add_field($field) { if (is_string($field)) { if ($field === 'id') { $this->add_field(array( 'id' => array( 'type' => 'INT', 'constraint' => 9, 'auto_increment' => TRUE ) )); $this->add_key('id', TRUE); } else { if (strpos($field, ' ') === FALSE) { show_error('Field information is required for that operation.'); } $this->fields[] = $field; } } if (is_array($field)) { $this->fields = array_merge($this->fields, $field); } return $this; } // -------------------------------------------------------------------- /** * Create Table * * @param string $table Table name * @param bool $if_not_exists Whether to add IF NOT EXISTS condition * @param array $attributes Associative array of table attributes * @return bool */ public function create_table($table, $if_not_exists = FALSE, array $attributes = array()) { if ($table === '') { show_error('A table name is required for that operation.'); } else { $table = $this->db->dbprefix.$table; } if (count($this->fields) === 0) { show_error('Field information is required.'); } $sql = $this->_create_table($table, $if_not_exists, $attributes); if (is_bool($sql)) { $this->_reset(); if ($sql === FALSE) { return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; } } if (($result = $this->db->query($sql)) !== FALSE) { if (isset($this->db->data_cache['table_names'])) { $this->db->data_cache['table_names'][] = $table; } // Most databases don't support creating indexes from within the CREATE TABLE statement if ( ! empty($this->keys)) { for ($i = 0, $sqls = $this->_process_indexes($table), $c = count($sqls); $i < $c; $i++) { $this->db->query($sqls[$i]); } } } $this->_reset(); return $result; } // -------------------------------------------------------------------- /** * Create Table * * @param string $table Table name * @param bool $if_not_exists Whether to add 'IF NOT EXISTS' condition * @param array $attributes Associative array of table attributes * @return mixed */ protected function _create_table($table, $if_not_exists, $attributes) { if ($if_not_exists === TRUE && $this->_create_table_if === FALSE) { if ($this->db->table_exists($table)) { return TRUE; } $if_not_exists = FALSE; } $sql = ($if_not_exists) ? sprintf($this->_create_table_if, $this->db->escape_identifiers($table)) : 'CREATE TABLE'; $columns = $this->_process_fields(TRUE); for ($i = 0, $c = count($columns); $i < $c; $i++) { $columns[$i] = ($columns[$i]['_literal'] !== FALSE) ? "\n\t".$columns[$i]['_literal'] : "\n\t".$this->_process_column($columns[$i]); } $columns = implode(',', $columns) .$this->_process_primary_keys($table); // Are indexes created from within the CREATE TABLE statement? (e.g. in MySQL) if ($this->_create_table_keys === TRUE) { $columns .= $this->_process_indexes($table); } // _create_table will usually have the following format: "%s %s (%s\n)" $sql = sprintf($this->_create_table.'%s', $sql, $this->db->escape_identifiers($table), $columns, $this->_create_table_attr($attributes) ); return $sql; } // -------------------------------------------------------------------- /** * CREATE TABLE attributes * * @param array $attributes Associative array of table attributes * @return string */ protected function _create_table_attr($attributes) { $sql = ''; foreach (array_keys($attributes) as $key) { if (is_string($key)) { $sql .= ' '.strtoupper($key).' '.$attributes[$key]; } } return $sql; } // -------------------------------------------------------------------- /** * Drop Table * * @param string $table_name Table name * @param bool $if_exists Whether to add an IF EXISTS condition * @return bool */ public function drop_table($table_name, $if_exists = FALSE) { if ($table_name === '') { return ($this->db->db_debug) ? $this->db->display_error('db_table_name_required') : FALSE; } if (($query = $this->_drop_table($this->db->dbprefix.$table_name, $if_exists)) === TRUE) { return TRUE; } $query = $this->db->query($query); // Update table list cache if ($query && ! empty($this->db->data_cache['table_names'])) { $key = array_search(strtolower($this->db->dbprefix.$table_name), array_map('strtolower', $this->db->data_cache['table_names']), TRUE); if ($key !== FALSE) { unset($this->db->data_cache['table_names'][$key]); } } return $query; } // -------------------------------------------------------------------- /** * Drop Table * * Generates a platform-specific DROP TABLE string * * @param string $table Table name * @param bool $if_exists Whether to add an IF EXISTS condition * @return mixed (Returns a platform-specific DROP table string, or TRUE to indicate there's nothing to do) */ protected function _drop_table($table, $if_exists) { $sql = 'DROP TABLE'; if ($if_exists) { if ($this->_drop_table_if === FALSE) { if ( ! $this->db->table_exists($table)) { return TRUE; } } else { $sql = sprintf($this->_drop_table_if, $this->db->escape_identifiers($table)); } } return $sql.' '.$this->db->escape_identifiers($table); } // -------------------------------------------------------------------- /** * Rename Table * * @param string $table_name Old table name * @param string $new_table_name New table name * @return bool */ public function rename_table($table_name, $new_table_name) { if ($table_name === '' OR $new_table_name === '') { show_error('A table name is required for that operation.'); return FALSE; } elseif ($this->_rename_table === FALSE) { return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; } $result = $this->db->query(sprintf($this->_rename_table, $this->db->escape_identifiers($this->db->dbprefix.$table_name), $this->db->escape_identifiers($this->db->dbprefix.$new_table_name)) ); if ($result && ! empty($this->db->data_cache['table_names'])) { $key = array_search(strtolower($this->db->dbprefix.$table_name), array_map('strtolower', $this->db->data_cache['table_names']), TRUE); if ($key !== FALSE) { $this->db->data_cache['table_names'][$key] = $this->db->dbprefix.$new_table_name; } } return $result; } // -------------------------------------------------------------------- /** * Column Add * * @todo Remove deprecated $_after option in 3.1+ * @param string $table Table name * @param array $field Column definition * @param string $_after Column for AFTER clause (deprecated) * @return bool */ public function add_column($table, $field, $_after = NULL) { // Work-around for literal column definitions is_array($field) OR $field = array($field); foreach (array_keys($field) as $k) { // Backwards-compatibility work-around for MySQL/CUBRID AFTER clause (remove in 3.1+) if ($_after !== NULL && is_array($field[$k]) && ! isset($field[$k]['after'])) { $field[$k]['after'] = $_after; } $this->add_field(array($k => $field[$k])); } $sqls = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->_process_fields()); $this->_reset(); if ($sqls === FALSE) { return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; } for ($i = 0, $c = count($sqls); $i < $c; $i++) { if ($this->db->query($sqls[$i]) === FALSE) { return FALSE; } } return TRUE; } // -------------------------------------------------------------------- /** * Column Drop * * @param string $table Table name * @param string $column_name Column name * @return bool */ public function drop_column($table, $column_name) { $sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name); if ($sql === FALSE) { return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; } return $this->db->query($sql); } // -------------------------------------------------------------------- /** * Column Modify * * @param string $table Table name * @param string $field Column definition * @return bool */ public function modify_column($table, $field) { // Work-around for literal column definitions is_array($field) OR $field = array($field); foreach (array_keys($field) as $k) { $this->add_field(array($k => $field[$k])); } if (count($this->fields) === 0) { show_error('Field information is required.'); } $sqls = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->_process_fields()); $this->_reset(); if ($sqls === FALSE) { return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; } for ($i = 0, $c = count($sqls); $i < $c; $i++) { if ($this->db->query($sqls[$i]) === FALSE) { return FALSE; } } return TRUE; } // -------------------------------------------------------------------- /** * ALTER TABLE * * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' '; // DROP has everything it needs now. if ($alter_type === 'DROP') { return $sql.'DROP COLUMN '.$this->db->escape_identifiers($field); } $sql .= ($alter_type === 'ADD') ? 'ADD ' : $alter_type.' COLUMN '; $sqls = array(); for ($i = 0, $c = count($field); $i < $c; $i++) { $sqls[] = $sql .($field[$i]['_literal'] !== FALSE ? $field[$i]['_literal'] : $this->_process_column($field[$i])); } return $sqls; } // -------------------------------------------------------------------- /** * Process fields * * @param bool $create_table * @return array */ protected function _process_fields($create_table = FALSE) { $fields = array(); foreach ($this->fields as $key => $attributes) { if (is_int($key) && ! is_array($attributes)) { $fields[] = array('_literal' => $attributes); continue; } $attributes = array_change_key_case($attributes, CASE_UPPER); if ($create_table === TRUE && empty($attributes['TYPE'])) { continue; } isset($attributes['TYPE']) && $this->_attr_type($attributes); $field = array( 'name' => $key, 'new_name' => isset($attributes['NAME']) ? $attributes['NAME'] : NULL, 'type' => isset($attributes['TYPE']) ? $attributes['TYPE'] : NULL, 'length' => '', 'unsigned' => '', 'null' => NULL, 'unique' => '', 'default' => '', 'auto_increment' => '', '_literal' => FALSE ); isset($attributes['TYPE']) && $this->_attr_unsigned($attributes, $field); if ($create_table === FALSE) { if (isset($attributes['AFTER'])) { $field['after'] = $attributes['AFTER']; } elseif (isset($attributes['FIRST'])) { $field['first'] = (bool) $attributes['FIRST']; } } $this->_attr_default($attributes, $field); if (isset($attributes['NULL'])) { if ($attributes['NULL'] === TRUE) { $field['null'] = empty($this->_null) ? '' : ' '.$this->_null; } else { $field['null'] = ' NOT NULL'; } } elseif ($create_table === TRUE) { $field['null'] = ' NOT NULL'; } $this->_attr_auto_increment($attributes, $field); $this->_attr_unique($attributes, $field); if (isset($attributes['COMMENT'])) { $field['comment'] = $this->db->escape($attributes['COMMENT']); } if (isset($attributes['TYPE']) && ! empty($attributes['CONSTRAINT'])) { switch (strtoupper($attributes['TYPE'])) { case 'ENUM': case 'SET': $attributes['CONSTRAINT'] = $this->db->escape($attributes['CONSTRAINT']); default: $field['length'] = is_array($attributes['CONSTRAINT']) ? '('.implode(',', $attributes['CONSTRAINT']).')' : '('.$attributes['CONSTRAINT'].')'; break; } } $fields[] = $field; } return $fields; } // -------------------------------------------------------------------- /** * Process column * * @param array $field * @return string */ protected function _process_column($field) { return $this->db->escape_identifiers($field['name']) .' '.$field['type'].$field['length'] .$field['unsigned'] .$field['default'] .$field['null'] .$field['auto_increment'] .$field['unique']; } // -------------------------------------------------------------------- /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { // Usually overridden by drivers } // -------------------------------------------------------------------- /** * Field attribute UNSIGNED * * Depending on the _unsigned property value: * * - TRUE will always set $field['unsigned'] to 'UNSIGNED' * - FALSE will always set $field['unsigned'] to '' * - array(TYPE) will set $field['unsigned'] to 'UNSIGNED', * if $attributes['TYPE'] is found in the array * - array(TYPE => UTYPE) will change $field['type'], * from TYPE to UTYPE in case of a match * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_unsigned(&$attributes, &$field) { if (empty($attributes['UNSIGNED']) OR $attributes['UNSIGNED'] !== TRUE) { return; } // Reset the attribute in order to avoid issues if we do type conversion $attributes['UNSIGNED'] = FALSE; if (is_array($this->_unsigned)) { foreach (array_keys($this->_unsigned) as $key) { if (is_int($key) && strcasecmp($attributes['TYPE'], $this->_unsigned[$key]) === 0) { $field['unsigned'] = ' UNSIGNED'; return; } elseif (is_string($key) && strcasecmp($attributes['TYPE'], $key) === 0) { $field['type'] = $key; return; } } return; } $field['unsigned'] = ($this->_unsigned === TRUE) ? ' UNSIGNED' : ''; } // -------------------------------------------------------------------- /** * Field attribute DEFAULT * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_default(&$attributes, &$field) { if ($this->_default === FALSE) { return; } if (array_key_exists('DEFAULT', $attributes)) { if ($attributes['DEFAULT'] === NULL) { $field['default'] = empty($this->_null) ? '' : $this->_default.$this->_null; // Override the NULL attribute if that's our default $attributes['NULL'] = TRUE; $field['null'] = empty($this->_null) ? '' : ' '.$this->_null; } else { $field['default'] = $this->_default.$this->db->escape($attributes['DEFAULT']); } } } // -------------------------------------------------------------------- /** * Field attribute UNIQUE * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_unique(&$attributes, &$field) { if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) { $field['unique'] = ' UNIQUE'; } } // -------------------------------------------------------------------- /** * Field attribute AUTO_INCREMENT * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_auto_increment(&$attributes, &$field) { if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) { $field['auto_increment'] = ' AUTO_INCREMENT'; } } // -------------------------------------------------------------------- /** * Process primary keys * * @param string $table Table name * @return string */ protected function _process_primary_keys($table) { $sql = ''; for ($i = 0, $c = count($this->primary_keys); $i < $c; $i++) { if ( ! isset($this->fields[$this->primary_keys[$i]])) { unset($this->primary_keys[$i]); } } if (count($this->primary_keys) > 0) { $sql .= ",\n\tCONSTRAINT ".$this->db->escape_identifiers('pk_'.$table) .' PRIMARY KEY('.implode(', ', $this->db->escape_identifiers($this->primary_keys)).')'; } return $sql; } // -------------------------------------------------------------------- /** * Process indexes * * @param string $table Table name * @return string[] list of SQL statements */ protected function _process_indexes($table) { $sqls = array(); for ($i = 0, $c = count($this->keys); $i < $c; $i++) { if (is_array($this->keys[$i])) { for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) { if ( ! isset($this->fields[$this->keys[$i][$i2]])) { unset($this->keys[$i][$i2]); continue; } } } elseif ( ! isset($this->fields[$this->keys[$i]])) { unset($this->keys[$i]); continue; } is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); $sqls[] = 'CREATE INDEX '.$this->db->escape_identifiers($table.'_'.implode('_', $this->keys[$i])) .' ON '.$this->db->escape_identifiers($table) .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).');'; } return $sqls; } // -------------------------------------------------------------------- /** * Reset * * Resets table creation vars * * @return void */ protected function _reset() { $this->fields = $this->keys = $this->primary_keys = array(); } } PK!&Ò$‘  database/DB_cache.phpnu„[µü¤CI and load the file helper since we use it a lot $this->CI =& get_instance(); $this->db =& $db; $this->CI->load->helper('file'); $this->check_path(); } // -------------------------------------------------------------------- /** * Set Cache Directory Path * * @param string $path Path to the cache directory * @return bool */ public function check_path($path = '') { if ($path === '') { if ($this->db->cachedir === '') { return $this->db->cache_off(); } $path = $this->db->cachedir; } // Add a trailing slash to the path if needed $path = realpath($path) ? rtrim(realpath($path), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR : rtrim($path, '/').'/'; if ( ! is_dir($path)) { log_message('debug', 'DB cache path error: '.$path); // If the path is wrong we'll turn off caching return $this->db->cache_off(); } if ( ! is_really_writable($path)) { log_message('debug', 'DB cache dir not writable: '.$path); // If the path is not really writable we'll turn off caching return $this->db->cache_off(); } $this->db->cachedir = $path; return TRUE; } // -------------------------------------------------------------------- /** * Retrieve a cached query * * The URI being requested will become the name of the cache sub-folder. * An MD5 hash of the SQL statement will become the cache file name. * * @param string $sql * @return string */ public function read($sql) { $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); $filepath = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'.md5($sql); if ( ! is_file($filepath) OR FALSE === ($cachedata = file_get_contents($filepath))) { return FALSE; } return unserialize($cachedata); } // -------------------------------------------------------------------- /** * Write a query to a cache file * * @param string $sql * @param object $object * @return bool */ public function write($sql, $object) { $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'; $filename = md5($sql); if ( ! is_dir($dir_path) && ! @mkdir($dir_path, 0750)) { return FALSE; } if (write_file($dir_path.$filename, serialize($object)) === FALSE) { return FALSE; } chmod($dir_path.$filename, 0640); return TRUE; } // -------------------------------------------------------------------- /** * Delete cache files within a particular directory * * @param string $segment_one * @param string $segment_two * @return void */ public function delete($segment_one = '', $segment_two = '') { if ($segment_one === '') { $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); } if ($segment_two === '') { $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); } $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'; delete_files($dir_path, TRUE); } // -------------------------------------------------------------------- /** * Delete all existing cache files * * @return void */ public function delete_all() { delete_files($this->db->cachedir, TRUE, TRUE); } } PK!ΦnÖ +database/drivers/sqlite3/sqlite3_driver.phpnu„[µü¤password) ? new SQLite3($this->database) : new SQLite3($this->database, SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, $this->password); } catch (Exception $e) { return FALSE; } } // -------------------------------------------------------------------- /** * Database version number * * @return string */ public function version() { if (isset($this->data_cache['version'])) { return $this->data_cache['version']; } $version = SQLite3::version(); return $this->data_cache['version'] = $version['versionString']; } // -------------------------------------------------------------------- /** * Execute the query * * @todo Implement use of SQLite3::querySingle(), if needed * @param string $sql * @return mixed SQLite3Result object or bool */ protected function _execute($sql) { return $this->is_write_type($sql) ? $this->conn_id->exec($sql) : $this->conn_id->query($sql); } // -------------------------------------------------------------------- /** * Begin Transaction * * @return bool */ protected function _trans_begin() { return $this->conn_id->exec('BEGIN TRANSACTION'); } // -------------------------------------------------------------------- /** * Commit Transaction * * @return bool */ protected function _trans_commit() { return $this->conn_id->exec('END TRANSACTION'); } // -------------------------------------------------------------------- /** * Rollback Transaction * * @return bool */ protected function _trans_rollback() { return $this->conn_id->exec('ROLLBACK'); } // -------------------------------------------------------------------- /** * Platform-dependent string escape * * @param string * @return string */ protected function _escape_str($str) { return $this->conn_id->escapeString($str); } // -------------------------------------------------------------------- /** * Affected Rows * * @return int */ public function affected_rows() { return $this->conn_id->changes(); } // -------------------------------------------------------------------- /** * Insert ID * * @return int */ public function insert_id() { return $this->conn_id->lastInsertRowID(); } // -------------------------------------------------------------------- /** * Show table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { return 'SELECT "NAME" FROM "SQLITE_MASTER" WHERE "TYPE" = \'table\'' .(($prefix_limit !== FALSE && $this->dbprefix != '') ? ' AND "NAME" LIKE \''.$this->escape_like_str($this->dbprefix).'%\' '.sprintf($this->_like_escape_str, $this->_like_escape_chr) : ''); } // -------------------------------------------------------------------- /** * Fetch Field Names * * @param string $table Table name * @return array */ public function list_fields($table) { if (($result = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) { return FALSE; } $fields = array(); foreach ($result->result_array() as $row) { $fields[] = $row['name']; } return $fields; } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { if (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) { return FALSE; } $query = $query->result_array(); if (empty($query)) { return FALSE; } $retval = array(); for ($i = 0, $c = count($query); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = $query[$i]['name']; $retval[$i]->type = $query[$i]['type']; $retval[$i]->max_length = NULL; $retval[$i]->default = $query[$i]['dflt_value']; $retval[$i]->primary_key = isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0; } return $retval; } // -------------------------------------------------------------------- /** * Error * * Returns an array containing code and message of the last * database error that has occurred. * * @return array */ public function error() { return array('code' => $this->conn_id->lastErrorCode(), 'message' => $this->conn_id->lastErrorMsg()); } // -------------------------------------------------------------------- /** * Replace statement * * Generates a platform-specific replace string from the supplied data * * @param string $table Table name * @param array $keys INSERT keys * @param array $values INSERT values * @return string */ protected function _replace($table, $keys, $values) { return 'INSERT OR '.parent::_replace($table, $keys, $values); } // -------------------------------------------------------------------- /** * Truncate statement * * Generates a platform-specific truncate string from the supplied data * * If the database does not support the TRUNCATE statement, * then this method maps to 'DELETE FROM table' * * @param string $table * @return string */ protected function _truncate($table) { return 'DELETE FROM '.$table; } // -------------------------------------------------------------------- /** * Close DB Connection * * @return void */ protected function _close() { $this->conn_id->close(); } } PK!‹ì I--+database/drivers/sqlite3/sqlite3_result.phpnu„[µü¤result_id->numColumns(); } // -------------------------------------------------------------------- /** * Fetch Field Names * * Generates an array of column names * * @return array */ public function list_fields() { $field_names = array(); for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) { $field_names[] = $this->result_id->columnName($i); } return $field_names; } // -------------------------------------------------------------------- /** * Field data * * Generates an array of objects containing field meta-data * * @return array */ public function field_data() { static $data_types = array( SQLITE3_INTEGER => 'integer', SQLITE3_FLOAT => 'float', SQLITE3_TEXT => 'text', SQLITE3_BLOB => 'blob', SQLITE3_NULL => 'null' ); $retval = array(); for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = $this->result_id->columnName($i); $type = $this->result_id->columnType($i); $retval[$i]->type = isset($data_types[$type]) ? $data_types[$type] : $type; $retval[$i]->max_length = NULL; } return $retval; } // -------------------------------------------------------------------- /** * Free the result * * @return void */ public function free_result() { if (is_object($this->result_id)) { $this->result_id->finalize(); $this->result_id = NULL; } } // -------------------------------------------------------------------- /** * Result - associative array * * Returns the result set as an array * * @return array */ protected function _fetch_assoc() { return $this->result_id->fetchArray(SQLITE3_ASSOC); } // -------------------------------------------------------------------- /** * Result - object * * Returns the result set as an object * * @param string $class_name * @return object */ protected function _fetch_object($class_name = 'stdClass') { // No native support for fetching rows as objects if (($row = $this->result_id->fetchArray(SQLITE3_ASSOC)) === FALSE) { return FALSE; } elseif ($class_name === 'stdClass') { return (object) $row; } $class_name = new $class_name(); foreach (array_keys($row) as $key) { $class_name->$key = $row[$key]; } return $class_name; } // -------------------------------------------------------------------- /** * Data Seek * * Moves the internal pointer to the desired offset. We call * this internally before fetching results to make sure the * result set starts at zero. * * @param int $n (ignored) * @return array */ public function data_seek($n = 0) { // Only resetting to the start of the result set is supported return ($n > 0) ? FALSE : $this->result_id->reset(); } } PK!üG®T]],database/drivers/sqlite3/sqlite3_utility.phpnu„[µü¤db->display_error('db_unsupported_feature'); } } PK!®ò(ƒƒ#database/drivers/sqlite3/index.htmlnu„[µü¤ 403 Forbidden

    Directory access is forbidden.

    PK!éPíkMM*database/drivers/sqlite3/sqlite3_forge.phpnu„[µü¤db->version(), '3.3', '<')) { $this->_create_table_if = FALSE; $this->_drop_table_if = FALSE; } } // -------------------------------------------------------------------- /** * Create database * * @param string $db_name * @return bool */ public function create_database($db_name) { // In SQLite, a database is created when you connect to the database. // We'll return TRUE so that an error isn't generated return TRUE; } // -------------------------------------------------------------------- /** * Drop database * * @param string $db_name (ignored) * @return bool */ public function drop_database($db_name) { // In SQLite, a database is dropped when we delete a file if (file_exists($this->db->database)) { // We need to close the pseudo-connection first $this->db->close(); if ( ! @unlink($this->db->database)) { return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; } elseif ( ! empty($this->db->data_cache['db_names'])) { $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); if ($key !== FALSE) { unset($this->db->data_cache['db_names'][$key]); } } return TRUE; } return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; } // -------------------------------------------------------------------- /** * ALTER TABLE * * @todo implement drop_column(), modify_column() * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if ($alter_type === 'DROP' OR $alter_type === 'CHANGE') { // drop_column(): // BEGIN TRANSACTION; // CREATE TEMPORARY TABLE t1_backup(a,b); // INSERT INTO t1_backup SELECT a,b FROM t1; // DROP TABLE t1; // CREATE TABLE t1(a,b); // INSERT INTO t1 SELECT a,b FROM t1_backup; // DROP TABLE t1_backup; // COMMIT; return FALSE; } return parent::_alter_table($alter_type, $table, $field); } // -------------------------------------------------------------------- /** * Process column * * @param array $field * @return string */ protected function _process_column($field) { return $this->db->escape_identifiers($field['name']) .' '.$field['type'] .$field['auto_increment'] .$field['null'] .$field['unique'] .$field['default']; } // -------------------------------------------------------------------- /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { switch (strtoupper($attributes['TYPE'])) { case 'ENUM': case 'SET': $attributes['TYPE'] = 'TEXT'; return; default: return; } } // -------------------------------------------------------------------- /** * Field attribute AUTO_INCREMENT * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_auto_increment(&$attributes, &$field) { if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) { $field['type'] = 'INTEGER PRIMARY KEY'; $field['default'] = ''; $field['null'] = ''; $field['unique'] = ''; $field['auto_increment'] = ' AUTOINCREMENT'; $this->primary_keys = array(); } } } PK!ì×wff*database/drivers/sqlite/sqlite_utility.phpnu„[µü¤db->display_error('db_unsupported_feature'); } } PK!p,©g;;)database/drivers/sqlite/sqlite_driver.phpnu„[µü¤database, 0666, $error) : sqlite_open($this->database, 0666, $error); isset($error) && log_message('error', $error); return $conn_id; } // -------------------------------------------------------------------- /** * Database version number * * @return string */ public function version() { return isset($this->data_cache['version']) ? $this->data_cache['version'] : $this->data_cache['version'] = sqlite_libversion(); } // -------------------------------------------------------------------- /** * Execute the query * * @param string $sql an SQL query * @return resource */ protected function _execute($sql) { return $this->is_write_type($sql) ? sqlite_exec($this->conn_id, $sql) : sqlite_query($this->conn_id, $sql); } // -------------------------------------------------------------------- /** * Begin Transaction * * @return bool */ protected function _trans_begin() { return $this->simple_query('BEGIN TRANSACTION'); } // -------------------------------------------------------------------- /** * Commit Transaction * * @return bool */ protected function _trans_commit() { return $this->simple_query('COMMIT'); } // -------------------------------------------------------------------- /** * Rollback Transaction * * @return bool */ protected function _trans_rollback() { return $this->simple_query('ROLLBACK'); } // -------------------------------------------------------------------- /** * Platform-dependant string escape * * @param string * @return string */ protected function _escape_str($str) { return sqlite_escape_string($str); } // -------------------------------------------------------------------- /** * Affected Rows * * @return int */ public function affected_rows() { return sqlite_changes($this->conn_id); } // -------------------------------------------------------------------- /** * Insert ID * * @return int */ public function insert_id() { return sqlite_last_insert_rowid($this->conn_id); } // -------------------------------------------------------------------- /** * List table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = "SELECT name FROM sqlite_master WHERE type='table'"; if ($prefix_limit !== FALSE && $this->dbprefix != '') { return $sql." AND 'name' LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); } return $sql; } // -------------------------------------------------------------------- /** * Show column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return bool */ protected function _list_columns($table = '') { // Not supported return FALSE; } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { if (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) { return FALSE; } $query = $query->result_array(); if (empty($query)) { return FALSE; } $retval = array(); for ($i = 0, $c = count($query); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = $query[$i]['name']; $retval[$i]->type = $query[$i]['type']; $retval[$i]->max_length = NULL; $retval[$i]->default = $query[$i]['dflt_value']; $retval[$i]->primary_key = isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0; } return $retval; } // -------------------------------------------------------------------- /** * Error * * Returns an array containing code and message of the last * database error that has occured. * * @return array */ public function error() { $error = array('code' => sqlite_last_error($this->conn_id)); $error['message'] = sqlite_error_string($error['code']); return $error; } // -------------------------------------------------------------------- /** * Replace statement * * Generates a platform-specific replace string from the supplied data * * @param string $table Table name * @param array $keys INSERT keys * @param array $values INSERT values * @return string */ protected function _replace($table, $keys, $values) { return 'INSERT OR '.parent::_replace($table, $keys, $values); } // -------------------------------------------------------------------- /** * Truncate statement * * Generates a platform-specific truncate string from the supplied data * * If the database does not support the TRUNCATE statement, * then this function maps to 'DELETE FROM table' * * @param string $table * @return string */ protected function _truncate($table) { return 'DELETE FROM '.$table; } // -------------------------------------------------------------------- /** * Close DB Connection * * @return void */ protected function _close() { sqlite_close($this->conn_id); } } PK!ùµ!SS(database/drivers/sqlite/sqlite_forge.phpnu„[µü¤db->database) OR ! @unlink($this->db->database)) { return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; } elseif ( ! empty($this->db->data_cache['db_names'])) { $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); if ($key !== FALSE) { unset($this->db->data_cache['db_names'][$key]); } } return TRUE; } // -------------------------------------------------------------------- /** * ALTER TABLE * * @todo implement drop_column(), modify_column() * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if ($alter_type === 'DROP' OR $alter_type === 'CHANGE') { // drop_column(): // BEGIN TRANSACTION; // CREATE TEMPORARY TABLE t1_backup(a,b); // INSERT INTO t1_backup SELECT a,b FROM t1; // DROP TABLE t1; // CREATE TABLE t1(a,b); // INSERT INTO t1 SELECT a,b FROM t1_backup; // DROP TABLE t1_backup; // COMMIT; return FALSE; } return parent::_alter_table($alter_type, $table, $field); } // -------------------------------------------------------------------- /** * Process column * * @param array $field * @return string */ protected function _process_column($field) { return $this->db->escape_identifiers($field['name']) .' '.$field['type'] .$field['auto_increment'] .$field['null'] .$field['unique'] .$field['default']; } // -------------------------------------------------------------------- /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { switch (strtoupper($attributes['TYPE'])) { case 'ENUM': case 'SET': $attributes['TYPE'] = 'TEXT'; return; default: return; } } // -------------------------------------------------------------------- /** * Field attribute AUTO_INCREMENT * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_auto_increment(&$attributes, &$field) { if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) { $field['type'] = 'INTEGER PRIMARY KEY'; $field['default'] = ''; $field['null'] = ''; $field['unique'] = ''; $field['auto_increment'] = ' AUTOINCREMENT'; $this->primary_keys = array(); } } } PK!]šêñÀÀ)database/drivers/sqlite/sqlite_result.phpnu„[µü¤num_rows) ? $this->num_rows : $this->num_rows = @sqlite_num_rows($this->result_id); } // -------------------------------------------------------------------- /** * Number of fields in the result set * * @return int */ public function num_fields() { return @sqlite_num_fields($this->result_id); } // -------------------------------------------------------------------- /** * Fetch Field Names * * Generates an array of column names * * @return array */ public function list_fields() { $field_names = array(); for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) { $field_names[$i] = sqlite_field_name($this->result_id, $i); } return $field_names; } // -------------------------------------------------------------------- /** * Field data * * Generates an array of objects containing field meta-data * * @return array */ public function field_data() { $retval = array(); for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = sqlite_field_name($this->result_id, $i); $retval[$i]->type = NULL; $retval[$i]->max_length = NULL; } return $retval; } // -------------------------------------------------------------------- /** * Data Seek * * Moves the internal pointer to the desired offset. We call * this internally before fetching results to make sure the * result set starts at zero. * * @param int $n * @return bool */ public function data_seek($n = 0) { return sqlite_seek($this->result_id, $n); } // -------------------------------------------------------------------- /** * Result - associative array * * Returns the result set as an array * * @return array */ protected function _fetch_assoc() { return sqlite_fetch_array($this->result_id); } // -------------------------------------------------------------------- /** * Result - object * * Returns the result set as an object * * @param string $class_name * @return object */ protected function _fetch_object($class_name = 'stdClass') { return sqlite_fetch_object($this->result_id, $class_name); } } PK!®ò(ƒƒ"database/drivers/sqlite/index.htmlnu„[µü¤ 403 Forbidden

    Directory access is forbidden.

    PK!ÏxíI‡‡$database/drivers/pdo/pdo_utility.phpnu„[µü¤db->display_error('db_unsupported_feature'); } } PK!Ëóbb#database/drivers/pdo/pdo_driver.phpnu„[µü¤dsn, $match) && count($match) === 2) { // If there is a minimum valid dsn string pattern found, we're done // This is for general PDO users, who tend to have a full DSN string. $this->subdriver = $match[1]; return; } // Legacy support for DSN specified in the hostname field elseif (preg_match('/([^:]+):/', $this->hostname, $match) && count($match) === 2) { $this->dsn = $this->hostname; $this->hostname = NULL; $this->subdriver = $match[1]; return; } elseif (in_array($this->subdriver, array('mssql', 'sybase'), TRUE)) { $this->subdriver = 'dblib'; } elseif ($this->subdriver === '4D') { $this->subdriver = '4d'; } elseif ( ! in_array($this->subdriver, array('4d', 'cubrid', 'dblib', 'firebird', 'ibm', 'informix', 'mysql', 'oci', 'odbc', 'pgsql', 'sqlite', 'sqlsrv'), TRUE)) { log_message('error', 'PDO: Invalid or non-existent subdriver'); if ($this->db_debug) { show_error('Invalid or non-existent PDO subdriver'); } } $this->dsn = NULL; } // -------------------------------------------------------------------- /** * Database connection * * @param bool $persistent * @return object */ public function db_connect($persistent = FALSE) { if ($persistent === TRUE) { $this->options[PDO::ATTR_PERSISTENT] = TRUE; } try { return new PDO($this->dsn, $this->username, $this->password, $this->options); } catch (PDOException $e) { if ($this->db_debug && empty($this->failover)) { $this->display_error($e->getMessage(), '', TRUE); } return FALSE; } } // -------------------------------------------------------------------- /** * Database version number * * @return string */ public function version() { if (isset($this->data_cache['version'])) { return $this->data_cache['version']; } // Not all subdrivers support the getAttribute() method try { return $this->data_cache['version'] = $this->conn_id->getAttribute(PDO::ATTR_SERVER_VERSION); } catch (PDOException $e) { return parent::version(); } } // -------------------------------------------------------------------- /** * Execute the query * * @param string $sql SQL query * @return mixed */ protected function _execute($sql) { return $this->conn_id->query($sql); } // -------------------------------------------------------------------- /** * Begin Transaction * * @return bool */ protected function _trans_begin() { return $this->conn_id->beginTransaction(); } // -------------------------------------------------------------------- /** * Commit Transaction * * @return bool */ protected function _trans_commit() { return $this->conn_id->commit(); } // -------------------------------------------------------------------- /** * Rollback Transaction * * @return bool */ protected function _trans_rollback() { return $this->conn_id->rollBack(); } // -------------------------------------------------------------------- /** * Platform-dependent string escape * * @param string * @return string */ protected function _escape_str($str) { // Escape the string $str = $this->conn_id->quote($str); // If there are duplicated quotes, trim them away return ($str[0] === "'") ? substr($str, 1, -1) : $str; } // -------------------------------------------------------------------- /** * Affected Rows * * @return int */ public function affected_rows() { return is_object($this->result_id) ? $this->result_id->rowCount() : 0; } // -------------------------------------------------------------------- /** * Insert ID * * @param string $name * @return int */ public function insert_id($name = NULL) { return $this->conn_id->lastInsertId($name); } // -------------------------------------------------------------------- /** * Field data query * * Generates a platform-specific query so that the column data can be retrieved * * @param string $table * @return string */ protected function _field_data($table) { return 'SELECT TOP 1 * FROM '.$this->protect_identifiers($table); } // -------------------------------------------------------------------- /** * Error * * Returns an array containing code and message of the last * database error that has occurred. * * @return array */ public function error() { $error = array('code' => '00000', 'message' => ''); $pdo_error = $this->conn_id->errorInfo(); if (empty($pdo_error[0])) { return $error; } $error['code'] = isset($pdo_error[1]) ? $pdo_error[0].'/'.$pdo_error[1] : $pdo_error[0]; if (isset($pdo_error[2])) { $error['message'] = $pdo_error[2]; } return $error; } // -------------------------------------------------------------------- /** * Truncate statement * * Generates a platform-specific truncate string from the supplied data * * If the database does not support the TRUNCATE statement, * then this method maps to 'DELETE FROM table' * * @param string $table * @return string */ protected function _truncate($table) { return 'TRUNCATE TABLE '.$table; } } PK! Í'½½#database/drivers/pdo/pdo_result.phpnu„[µü¤num_rows)) { return $this->num_rows; } elseif (count($this->result_array) > 0) { return $this->num_rows = count($this->result_array); } elseif (count($this->result_object) > 0) { return $this->num_rows = count($this->result_object); } elseif (($num_rows = $this->result_id->rowCount()) > 0) { return $this->num_rows = $num_rows; } return $this->num_rows = count($this->result_array()); } // -------------------------------------------------------------------- /** * Number of fields in the result set * * @return int */ public function num_fields() { return $this->result_id->columnCount(); } // -------------------------------------------------------------------- /** * Fetch Field Names * * Generates an array of column names * * @return bool */ public function list_fields() { $field_names = array(); for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) { // Might trigger an E_WARNING due to not all subdrivers // supporting getColumnMeta() $field_names[$i] = @$this->result_id->getColumnMeta($i); $field_names[$i] = $field_names[$i]['name']; } return $field_names; } // -------------------------------------------------------------------- /** * Field data * * Generates an array of objects containing field meta-data * * @return array */ public function field_data() { try { $retval = array(); for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) { $field = $this->result_id->getColumnMeta($i); $retval[$i] = new stdClass(); $retval[$i]->name = $field['name']; $retval[$i]->type = isset($field['native_type']) ? $field['native_type'] : null; $retval[$i]->max_length = ($field['len'] > 0) ? $field['len'] : NULL; $retval[$i]->primary_key = (int) ( ! empty($field['flags']) && in_array('primary_key', $field['flags'], TRUE)); } return $retval; } catch (Exception $e) { if ($this->db->db_debug) { return $this->db->display_error('db_unsupported_feature'); } return FALSE; } } // -------------------------------------------------------------------- /** * Free the result * * @return void */ public function free_result() { if (is_object($this->result_id)) { $this->result_id = FALSE; } } // -------------------------------------------------------------------- /** * Result - associative array * * Returns the result set as an array * * @return array */ protected function _fetch_assoc() { return $this->result_id->fetch(PDO::FETCH_ASSOC); } // -------------------------------------------------------------------- /** * Result - object * * Returns the result set as an object * * @param string $class_name * @return object */ protected function _fetch_object($class_name = 'stdClass') { return $this->result_id->fetchObject($class_name); } } PK!N­L!ee"database/drivers/pdo/pdo_forge.phpnu„[µü¤dsn)) { $this->dsn = 'oci:dbname='; // Oracle has a slightly different PDO DSN format (Easy Connect), // which also supports pre-defined DSNs. if (empty($this->hostname) && empty($this->port)) { $this->dsn .= $this->database; } else { $this->dsn .= '//'.(empty($this->hostname) ? '127.0.0.1' : $this->hostname) .(empty($this->port) ? '' : ':'.$this->port).'/'; empty($this->database) OR $this->dsn .= $this->database; } empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; } elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 4) === FALSE) { $this->dsn .= ';charset='.$this->char_set; } } // -------------------------------------------------------------------- /** * Database version number * * @return string */ public function version() { if (isset($this->data_cache['version'])) { return $this->data_cache['version']; } $version_string = parent::version(); if (preg_match('#Release\s(?\d+(?:\.\d+)+)#', $version_string, $match)) { return $this->data_cache['version'] = $match[1]; } return FALSE; } // -------------------------------------------------------------------- /** * Show table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SELECT "TABLE_NAME" FROM "ALL_TABLES"'; if ($prefix_limit === TRUE && $this->dbprefix !== '') { return $sql.' WHERE "TABLE_NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " .sprintf($this->_like_escape_str, $this->_like_escape_chr); } return $sql; } // -------------------------------------------------------------------- /** * Show column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return string */ protected function _list_columns($table = '') { if (strpos($table, '.') !== FALSE) { sscanf($table, '%[^.].%s', $owner, $table); } else { $owner = $this->username; } return 'SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { if (strpos($table, '.') !== FALSE) { sscanf($table, '%[^.].%s', $owner, $table); } else { $owner = $this->username; } $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHAR_LENGTH, DATA_PRECISION, DATA_LENGTH, DATA_DEFAULT, NULLABLE FROM ALL_TAB_COLUMNS WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); if (($query = $this->query($sql)) === FALSE) { return FALSE; } $query = $query->result_object(); $retval = array(); for ($i = 0, $c = count($query); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = $query[$i]->COLUMN_NAME; $retval[$i]->type = $query[$i]->DATA_TYPE; $length = ($query[$i]->CHAR_LENGTH > 0) ? $query[$i]->CHAR_LENGTH : $query[$i]->DATA_PRECISION; if ($length === NULL) { $length = $query[$i]->DATA_LENGTH; } $retval[$i]->max_length = $length; $default = $query[$i]->DATA_DEFAULT; if ($default === NULL && $query[$i]->NULLABLE === 'N') { $default = ''; } $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; } return $retval; } // -------------------------------------------------------------------- /** * Insert batch statement * * @param string $table Table name * @param array $keys INSERT keys * @param array $values INSERT values * @return string */ protected function _insert_batch($table, $keys, $values) { $keys = implode(', ', $keys); $sql = "INSERT ALL\n"; for ($i = 0, $c = count($values); $i < $c; $i++) { $sql .= ' INTO '.$table.' ('.$keys.') VALUES '.$values[$i]."\n"; } return $sql.'SELECT * FROM dual'; } // -------------------------------------------------------------------- /** * Delete statement * * Generates a platform-specific delete string from the supplied data * * @param string $table * @return string */ protected function _delete($table) { if ($this->qb_limit) { $this->where('rownum <= ',$this->qb_limit, FALSE); $this->qb_limit = FALSE; } return parent::_delete($table); } // -------------------------------------------------------------------- /** * LIMIT * * Generates a platform-specific LIMIT clause * * @param string $sql SQL Query * @return string */ protected function _limit($sql) { if (version_compare($this->version(), '12.1', '>=')) { // OFFSET-FETCH can be used only with the ORDER BY clause empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; } return 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($this->qb_offset + $this->qb_limit + 1).')' .($this->qb_offset ? ' WHERE rnum >= '.($this->qb_offset + 1): ''); } } PK!/b’Þ¥¥5database/drivers/pdo/subdrivers/pdo_cubrid_driver.phpnu„[µü¤dsn)) { $this->dsn = 'cubrid:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); empty($this->port) OR $this->dsn .= ';port='.$this->port; empty($this->database) OR $this->dsn .= ';dbname='.$this->database; empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; } } // -------------------------------------------------------------------- /** * Show table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SHOW TABLES'; if ($prefix_limit === TRUE && $this->dbprefix !== '') { return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; } return $sql; } // -------------------------------------------------------------------- /** * Show column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return string */ protected function _list_columns($table = '') { return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) { return FALSE; } $query = $query->result_object(); $retval = array(); for ($i = 0, $c = count($query); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = $query[$i]->Field; sscanf($query[$i]->Type, '%[a-z](%d)', $retval[$i]->type, $retval[$i]->max_length ); $retval[$i]->default = $query[$i]->Default; $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); } return $retval; } // -------------------------------------------------------------------- /** * Truncate statement * * Generates a platform-specific truncate string from the supplied data * * If the database does not support the TRUNCATE statement, * then this method maps to 'DELETE FROM table' * * @param string $table * @return string */ protected function _truncate($table) { return 'TRUNCATE '.$table; } // -------------------------------------------------------------------- /** * FROM tables * * Groups tables in FROM clauses if needed, so there is no confusion * about operator precedence. * * @return string */ protected function _from_tables() { if ( ! empty($this->qb_join) && count($this->qb_from) > 1) { return '('.implode(', ', $this->qb_from).')'; } return implode(', ', $this->qb_from); } } PK!TÚÏææ2database/drivers/pdo/subdrivers/pdo_ibm_driver.phpnu„[µü¤dsn)) { $this->dsn = 'ibm:'; // Pre-defined DSN if (empty($this->hostname) && empty($this->HOSTNAME) && empty($this->port) && empty($this->PORT)) { if (isset($this->DSN)) { $this->dsn .= 'DSN='.$this->DSN; } elseif ( ! empty($this->database)) { $this->dsn .= 'DSN='.$this->database; } return; } $this->dsn .= 'DRIVER='.(isset($this->DRIVER) ? '{'.$this->DRIVER.'}' : '{IBM DB2 ODBC DRIVER}').';'; if (isset($this->DATABASE)) { $this->dsn .= 'DATABASE='.$this->DATABASE.';'; } elseif ( ! empty($this->database)) { $this->dsn .= 'DATABASE='.$this->database.';'; } if (isset($this->HOSTNAME)) { $this->dsn .= 'HOSTNAME='.$this->HOSTNAME.';'; } else { $this->dsn .= 'HOSTNAME='.(empty($this->hostname) ? '127.0.0.1;' : $this->hostname.';'); } if (isset($this->PORT)) { $this->dsn .= 'PORT='.$this->port.';'; } elseif ( ! empty($this->port)) { $this->dsn .= ';PORT='.$this->port.';'; } $this->dsn .= 'PROTOCOL='.(isset($this->PROTOCOL) ? $this->PROTOCOL.';' : 'TCPIP;'); } } // -------------------------------------------------------------------- /** * Show table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SELECT "tabname" FROM "syscat"."tables" WHERE "type" = \'T\' AND LOWER("tabschema") = '.$this->escape(strtolower($this->database)); if ($prefix_limit === TRUE && $this->dbprefix !== '') { $sql .= ' AND "tabname" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " .sprintf($this->_like_escape_str, $this->_like_escape_chr); } return $sql; } // -------------------------------------------------------------------- /** * Show column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return array */ protected function _list_columns($table = '') { return 'SELECT "colname" FROM "syscat"."columns" WHERE LOWER("tabschema") = '.$this->escape(strtolower($this->database)).' AND LOWER("tabname") = '.$this->escape(strtolower($table)); } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { $sql = 'SELECT "colname" AS "name", "typename" AS "type", "default" AS "default", "length" AS "max_length", CASE "keyseq" WHEN NULL THEN 0 ELSE 1 END AS "primary_key" FROM "syscat"."columns" WHERE LOWER("tabschema") = '.$this->escape(strtolower($this->database)).' AND LOWER("tabname") = '.$this->escape(strtolower($table)).' ORDER BY "colno"'; return (($query = $this->query($sql)) !== FALSE) ? $query->result_object() : FALSE; } // -------------------------------------------------------------------- /** * Update statement * * Generates a platform-specific update string from the supplied data * * @param string $table * @param array $values * @return string */ protected function _update($table, $values) { $this->qb_limit = FALSE; $this->qb_orderby = array(); return parent::_update($table, $values); } // -------------------------------------------------------------------- /** * Delete statement * * Generates a platform-specific delete string from the supplied data * * @param string $table * @return string */ protected function _delete($table) { $this->qb_limit = FALSE; return parent::_delete($table); } // -------------------------------------------------------------------- /** * LIMIT * * Generates a platform-specific LIMIT clause * * @param string $sql SQL Query * @return string */ protected function _limit($sql) { $sql .= ' FETCH FIRST '.($this->qb_limit + $this->qb_offset).' ROWS ONLY'; return ($this->qb_offset) ? 'SELECT * FROM ('.$sql.') WHERE rownum > '.$this->qb_offset : $sql; } } PK!£Ã¿Á*Á*5database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.phpnu„[µü¤dsn)) { $this->dsn = 'sqlsrv:Server='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); empty($this->port) OR $this->dsn .= ','.$this->port; empty($this->database) OR $this->dsn .= ';Database='.$this->database; // Some custom options if (isset($this->QuotedId)) { $this->dsn .= ';QuotedId='.$this->QuotedId; $this->_quoted_identifier = (bool) $this->QuotedId; } if (isset($this->ConnectionPooling)) { $this->dsn .= ';ConnectionPooling='.$this->ConnectionPooling; } if ($this->encrypt === TRUE) { $this->dsn .= ';Encrypt=1'; } if (isset($this->TraceOn)) { $this->dsn .= ';TraceOn='.$this->TraceOn; } if (isset($this->TrustServerCertificate)) { $this->dsn .= ';TrustServerCertificate='.$this->TrustServerCertificate; } empty($this->APP) OR $this->dsn .= ';APP='.$this->APP; empty($this->Failover_Partner) OR $this->dsn .= ';Failover_Partner='.$this->Failover_Partner; empty($this->LoginTimeout) OR $this->dsn .= ';LoginTimeout='.$this->LoginTimeout; empty($this->MultipleActiveResultSets) OR $this->dsn .= ';MultipleActiveResultSets='.$this->MultipleActiveResultSets; empty($this->TraceFile) OR $this->dsn .= ';TraceFile='.$this->TraceFile; empty($this->WSID) OR $this->dsn .= ';WSID='.$this->WSID; } elseif (preg_match('/QuotedId=(0|1)/', $this->dsn, $match)) { $this->_quoted_identifier = (bool) $match[1]; } } // -------------------------------------------------------------------- /** * Database connection * * @param bool $persistent * @return object */ public function db_connect($persistent = FALSE) { if ( ! empty($this->char_set) && preg_match('/utf[^8]*8/i', $this->char_set)) { $this->options[PDO::SQLSRV_ENCODING_UTF8] = 1; } $this->conn_id = parent::db_connect($persistent); if ( ! is_object($this->conn_id) OR is_bool($this->_quoted_identifier)) { return $this->conn_id; } // Determine how identifiers are escaped $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); $query = $query->row_array(); $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); return $this->conn_id; } // -------------------------------------------------------------------- /** * Show table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SELECT '.$this->escape_identifiers('name') .' FROM '.$this->escape_identifiers('sysobjects') .' WHERE '.$this->escape_identifiers('type')." = 'U'"; if ($prefix_limit === TRUE && $this->dbprefix !== '') { $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " .sprintf($this->_like_escape_str, $this->_like_escape_chr); } return $sql.' ORDER BY '.$this->escape_identifiers('name'); } // -------------------------------------------------------------------- /** * Show column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return string */ protected function _list_columns($table = '') { return 'SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.Columns WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.Columns WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); if (($query = $this->query($sql)) === FALSE) { return FALSE; } $query = $query->result_object(); $retval = array(); for ($i = 0, $c = count($query); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = $query[$i]->COLUMN_NAME; $retval[$i]->type = $query[$i]->DATA_TYPE; $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; } return $retval; } // -------------------------------------------------------------------- /** * Update statement * * Generates a platform-specific update string from the supplied data * * @param string $table * @param array $values * @return string */ protected function _update($table, $values) { $this->qb_limit = FALSE; $this->qb_orderby = array(); return parent::_update($table, $values); } // -------------------------------------------------------------------- /** * Delete statement * * Generates a platform-specific delete string from the supplied data * * @param string $table * @return string */ protected function _delete($table) { if ($this->qb_limit) { return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; } return parent::_delete($table); } // -------------------------------------------------------------------- /** * LIMIT * * Generates a platform-specific LIMIT clause * * @param string $sql SQL Query * @return string */ protected function _limit($sql) { // As of SQL Server 2012 (11.0.*) OFFSET is supported if (version_compare($this->version(), '11', '>=')) { // SQL Server OFFSET-FETCH can be used only with the ORDER BY clause empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; } $limit = $this->qb_offset + $this->qb_limit; // An ORDER BY clause is required for ROW_NUMBER() to work if ($this->qb_offset && ! empty($this->qb_orderby)) { $orderby = $this->_compile_order_by(); // We have to strip the ORDER BY clause $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results if (count($this->qb_select) === 0 OR strpos(implode(',', $this->qb_select), '*') !== FALSE) { $select = '*'; // Inevitable } else { // Use only field names and their aliases, everything else is out of our scope. $select = array(); $field_regexp = ($this->_quoted_identifier) ? '("[^\"]+")' : '(\[[^\]]+\])'; for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) { $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) ? $m[1] : $this->qb_select[$i]; } $select = implode(', ', $select); } return 'SELECT '.$select." FROM (\n\n" .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) ."\n\n) ".$this->escape_identifiers('CI_subquery') ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; } return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); } // -------------------------------------------------------------------- /** * Insert batch statement * * Generates a platform-specific insert string from the supplied data. * * @param string $table Table name * @param array $keys INSERT keys * @param array $values INSERT values * @return string|bool */ protected function _insert_batch($table, $keys, $values) { // Multiple-value inserts are only supported as of SQL Server 2008 if (version_compare($this->version(), '10', '>=')) { return parent::_insert_batch($table, $keys, $values); } return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; } } PK!H¸ææ6database/drivers/pdo/subdrivers/pdo_informix_forge.phpnu„[µü¤ 'INTEGER', 'INT' => 'BIGINT', 'INTEGER' => 'BIGINT', 'REAL' => 'DOUBLE PRECISION', 'SMALLFLOAT' => 'DOUBLE PRECISION' ); /** * DEFAULT value representation in CREATE/ALTER TABLE statements * * @var string */ protected $_default = ', '; // -------------------------------------------------------------------- /** * ALTER TABLE * * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if ($alter_type === 'CHANGE') { $alter_type = 'MODIFY'; } return parent::_alter_table($alter_type, $table, $field); } // -------------------------------------------------------------------- /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { switch (strtoupper($attributes['TYPE'])) { case 'TINYINT': $attributes['TYPE'] = 'SMALLINT'; $attributes['UNSIGNED'] = FALSE; return; case 'MEDIUMINT': $attributes['TYPE'] = 'INTEGER'; $attributes['UNSIGNED'] = FALSE; return; case 'BYTE': case 'TEXT': case 'BLOB': case 'CLOB': $attributes['UNIQUE'] = FALSE; if (isset($attributes['DEFAULT'])) { unset($attributes['DEFAULT']); } return; default: return; } } // -------------------------------------------------------------------- /** * Field attribute UNIQUE * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_unique(&$attributes, &$field) { if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) { $field['unique'] = ' UNIQUE CONSTRAINT '.$this->db->escape_identifiers($field['name']); } } // -------------------------------------------------------------------- /** * Field attribute AUTO_INCREMENT * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_auto_increment(&$attributes, &$field) { // Not supported } } PK!{N’÷3database/drivers/pdo/subdrivers/pdo_odbc_driver.phpnu„[µü¤dsn)) { $this->dsn = 'odbc:'; // Pre-defined DSN if (empty($this->hostname) && empty($this->HOSTNAME) && empty($this->port) && empty($this->PORT)) { if (isset($this->DSN)) { $this->dsn .= 'DSN='.$this->DSN; } elseif ( ! empty($this->database)) { $this->dsn .= 'DSN='.$this->database; } return; } // If the DSN is not pre-configured - try to build an IBM DB2 connection string $this->dsn .= 'DRIVER='.(isset($this->DRIVER) ? '{'.$this->DRIVER.'}' : '{IBM DB2 ODBC DRIVER}').';'; if (isset($this->DATABASE)) { $this->dsn .= 'DATABASE='.$this->DATABASE.';'; } elseif ( ! empty($this->database)) { $this->dsn .= 'DATABASE='.$this->database.';'; } if (isset($this->HOSTNAME)) { $this->dsn .= 'HOSTNAME='.$this->HOSTNAME.';'; } else { $this->dsn .= 'HOSTNAME='.(empty($this->hostname) ? '127.0.0.1;' : $this->hostname.';'); } if (isset($this->PORT)) { $this->dsn .= 'PORT='.$this->port.';'; } elseif ( ! empty($this->port)) { $this->dsn .= ';PORT='.$this->port.';'; } $this->dsn .= 'PROTOCOL='.(isset($this->PROTOCOL) ? $this->PROTOCOL.';' : 'TCPIP;'); } } // -------------------------------------------------------------------- /** * Platform-dependent string escape * * @param string * @return string */ protected function _escape_str($str) { $this->display_error('db_unsupported_feature'); } // -------------------------------------------------------------------- /** * Determines if a query is a "write" type. * * @param string An SQL query string * @return bool */ public function is_write_type($sql) { if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) { return FALSE; } return parent::is_write_type($sql); } // -------------------------------------------------------------------- /** * Show table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = '".$this->schema."'"; if ($prefix_limit !== FALSE && $this->dbprefix !== '') { return $sql." AND table_name LIKE '".$this->escape_like_str($this->dbprefix)."%' " .sprintf($this->_like_escape_str, $this->_like_escape_chr); } return $sql; } // -------------------------------------------------------------------- /** * Show column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return string */ protected function _list_columns($table = '') { return 'SELECT column_name FROM information_schema.columns WHERE table_name = '.$this->escape($table); } } PK!¡€  2database/drivers/pdo/subdrivers/pdo_odbc_forge.phpnu„[µü¤dsn)) { $this->dsn = 'informix:'; // Pre-defined DSN if (empty($this->hostname) && empty($this->host) && empty($this->port) && empty($this->service)) { if (isset($this->DSN)) { $this->dsn .= 'DSN='.$this->DSN; } elseif ( ! empty($this->database)) { $this->dsn .= 'DSN='.$this->database; } return; } if (isset($this->host)) { $this->dsn .= 'host='.$this->host; } else { $this->dsn .= 'host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); } if (isset($this->service)) { $this->dsn .= '; service='.$this->service; } elseif ( ! empty($this->port)) { $this->dsn .= '; service='.$this->port; } empty($this->database) OR $this->dsn .= '; database='.$this->database; empty($this->server) OR $this->dsn .= '; server='.$this->server; $this->dsn .= '; protocol='.(isset($this->protocol) ? $this->protocol : 'onsoctcp') .'; EnableScrollableCursors=1'; } } // -------------------------------------------------------------------- /** * Show table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SELECT "tabname" FROM "systables" WHERE "tabid" > 99 AND "tabtype" = \'T\' AND LOWER("owner") = '.$this->escape(strtolower($this->username)); if ($prefix_limit === TRUE && $this->dbprefix !== '') { $sql .= ' AND "tabname" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " .sprintf($this->_like_escape_str, $this->_like_escape_chr); } return $sql; } // -------------------------------------------------------------------- /** * Show column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return string */ protected function _list_columns($table = '') { if (strpos($table, '.') !== FALSE) { sscanf($table, '%[^.].%s', $owner, $table); } else { $owner = $this->username; } return 'SELECT "colname" FROM "systables", "syscolumns" WHERE "systables"."tabid" = "syscolumns"."tabid" AND "systables"."tabtype" = \'T\' AND LOWER("systables"."owner") = '.$this->escape(strtolower($owner)).' AND LOWER("systables"."tabname") = '.$this->escape(strtolower($table)); } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { $sql = 'SELECT "syscolumns"."colname" AS "name", CASE "syscolumns"."coltype" WHEN 0 THEN \'CHAR\' WHEN 1 THEN \'SMALLINT\' WHEN 2 THEN \'INTEGER\' WHEN 3 THEN \'FLOAT\' WHEN 4 THEN \'SMALLFLOAT\' WHEN 5 THEN \'DECIMAL\' WHEN 6 THEN \'SERIAL\' WHEN 7 THEN \'DATE\' WHEN 8 THEN \'MONEY\' WHEN 9 THEN \'NULL\' WHEN 10 THEN \'DATETIME\' WHEN 11 THEN \'BYTE\' WHEN 12 THEN \'TEXT\' WHEN 13 THEN \'VARCHAR\' WHEN 14 THEN \'INTERVAL\' WHEN 15 THEN \'NCHAR\' WHEN 16 THEN \'NVARCHAR\' WHEN 17 THEN \'INT8\' WHEN 18 THEN \'SERIAL8\' WHEN 19 THEN \'SET\' WHEN 20 THEN \'MULTISET\' WHEN 21 THEN \'LIST\' WHEN 22 THEN \'Unnamed ROW\' WHEN 40 THEN \'LVARCHAR\' WHEN 41 THEN \'BLOB/CLOB/BOOLEAN\' WHEN 4118 THEN \'Named ROW\' ELSE "syscolumns"."coltype" END AS "type", "syscolumns"."collength" as "max_length", CASE "sysdefaults"."type" WHEN \'L\' THEN "sysdefaults"."default" ELSE NULL END AS "default" FROM "syscolumns", "systables", "sysdefaults" WHERE "syscolumns"."tabid" = "systables"."tabid" AND "systables"."tabid" = "sysdefaults"."tabid" AND "syscolumns"."colno" = "sysdefaults"."colno" AND "systables"."tabtype" = \'T\' AND LOWER("systables"."owner") = '.$this->escape(strtolower($this->username)).' AND LOWER("systables"."tabname") = '.$this->escape(strtolower($table)).' ORDER BY "syscolumns"."colno"'; return (($query = $this->query($sql)) !== FALSE) ? $query->result_object() : FALSE; } // -------------------------------------------------------------------- /** * Update statement * * Generates a platform-specific update string from the supplied data * * @param string $table * @param array $values * @return string */ protected function _update($table, $values) { $this->qb_limit = FALSE; $this->qb_orderby = array(); return parent::_update($table, $values); } // -------------------------------------------------------------------- /** * Truncate statement * * Generates a platform-specific truncate string from the supplied data * * If the database does not support the TRUNCATE statement, * then this method maps to 'DELETE FROM table' * * @param string $table * @return string */ protected function _truncate($table) { return 'TRUNCATE TABLE ONLY '.$table; } // -------------------------------------------------------------------- /** * Delete statement * * Generates a platform-specific delete string from the supplied data * * @param string $table * @return string */ protected function _delete($table) { $this->qb_limit = FALSE; return parent::_delete($table); } // -------------------------------------------------------------------- /** * LIMIT * * Generates a platform-specific LIMIT clause * * @param string $sql $SQL Query * @return string */ protected function _limit($sql) { $select = 'SELECT '.($this->qb_offset ? 'SKIP '.$this->qb_offset : '').'FIRST '.$this->qb_limit.' '; return preg_replace('/^(SELECT\s)/i', $select, $sql, 1); } } PK!ž”  5database/drivers/pdo/subdrivers/pdo_sqlite_driver.phpnu„[µü¤dsn)) { $this->dsn = 'sqlite:'; if (empty($this->database) && empty($this->hostname)) { $this->database = ':memory:'; } $this->database = empty($this->database) ? $this->hostname : $this->database; } } // -------------------------------------------------------------------- /** * Show table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SELECT "NAME" FROM "SQLITE_MASTER" WHERE "TYPE" = \'table\''; if ($prefix_limit === TRUE && $this->dbprefix !== '') { return $sql.' AND "NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " .sprintf($this->_like_escape_str, $this->_like_escape_chr); } return $sql; } // -------------------------------------------------------------------- /** * Fetch Field Names * * @param string $table Table name * @return array */ public function list_fields($table) { if (($result = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) { return FALSE; } $fields = array(); foreach ($result->result_array() as $row) { $fields[] = $row['name']; } return $fields; } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { if (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) { return FALSE; } $query = $query->result_array(); if (empty($query)) { return FALSE; } $retval = array(); for ($i = 0, $c = count($query); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = $query[$i]['name']; $retval[$i]->type = $query[$i]['type']; $retval[$i]->max_length = NULL; $retval[$i]->default = $query[$i]['dflt_value']; $retval[$i]->primary_key = isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0; } return $retval; } // -------------------------------------------------------------------- /** * Replace statement * * @param string $table Table name * @param array $keys INSERT keys * @param array $values INSERT values * @return string */ protected function _replace($table, $keys, $values) { return 'INSERT OR '.parent::_replace($table, $keys, $values); } // -------------------------------------------------------------------- /** * Truncate statement * * Generates a platform-specific truncate string from the supplied data * * If the database does not support the TRUNCATE statement, * then this method maps to 'DELETE FROM table' * * @param string $table * @return string */ protected function _truncate($table) { return 'DELETE FROM '.$table; } } PK!›äG4database/drivers/pdo/subdrivers/pdo_sqlite_forge.phpnu„[µü¤db->version(), '3.3', '<')) { $this->_create_table_if = FALSE; $this->_drop_table_if = FALSE; } } // -------------------------------------------------------------------- /** * Create database * * @param string $db_name (ignored) * @return bool */ public function create_database($db_name) { // In SQLite, a database is created when you connect to the database. // We'll return TRUE so that an error isn't generated return TRUE; } // -------------------------------------------------------------------- /** * Drop database * * @param string $db_name (ignored) * @return bool */ public function drop_database($db_name) { // In SQLite, a database is dropped when we delete a file if (file_exists($this->db->database)) { // We need to close the pseudo-connection first $this->db->close(); if ( ! @unlink($this->db->database)) { return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; } elseif ( ! empty($this->db->data_cache['db_names'])) { $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); if ($key !== FALSE) { unset($this->db->data_cache['db_names'][$key]); } } return TRUE; } return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; } // -------------------------------------------------------------------- /** * ALTER TABLE * * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if ($alter_type === 'DROP' OR $alter_type === 'CHANGE') { // drop_column(): // BEGIN TRANSACTION; // CREATE TEMPORARY TABLE t1_backup(a,b); // INSERT INTO t1_backup SELECT a,b FROM t1; // DROP TABLE t1; // CREATE TABLE t1(a,b); // INSERT INTO t1 SELECT a,b FROM t1_backup; // DROP TABLE t1_backup; // COMMIT; return FALSE; } return parent::_alter_table($alter_type, $table, $field); } // -------------------------------------------------------------------- /** * Process column * * @param array $field * @return string */ protected function _process_column($field) { return $this->db->escape_identifiers($field['name']) .' '.$field['type'] .$field['auto_increment'] .$field['null'] .$field['unique'] .$field['default']; } // -------------------------------------------------------------------- /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { switch (strtoupper($attributes['TYPE'])) { case 'ENUM': case 'SET': $attributes['TYPE'] = 'TEXT'; return; default: return; } } // -------------------------------------------------------------------- /** * Field attribute AUTO_INCREMENT * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_auto_increment(&$attributes, &$field) { if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) { $field['type'] = 'INTEGER PRIMARY KEY'; $field['default'] = ''; $field['null'] = ''; $field['unique'] = ''; $field['auto_increment'] = ' AUTOINCREMENT'; $this->primary_keys = array(); } } } PK!’Vb+õ'õ'4database/drivers/pdo/subdrivers/pdo_dblib_driver.phpnu„[µü¤dsn)) { $this->dsn = $params['subdriver'].':host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); if ( ! empty($this->port)) { $this->dsn .= (DIRECTORY_SEPARATOR === '\\' ? ',' : ':').$this->port; } empty($this->database) OR $this->dsn .= ';dbname='.$this->database; empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; empty($this->appname) OR $this->dsn .= ';appname='.$this->appname; } else { if ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE) { $this->dsn .= ';charset='.$this->char_set; } $this->subdriver = 'dblib'; } } // -------------------------------------------------------------------- /** * Database connection * * @param bool $persistent * @return object */ public function db_connect($persistent = FALSE) { if ($persistent === TRUE) { log_message('debug', "dblib driver doesn't support persistent connections"); } $this->conn_id = parent::db_connect(FALSE); if ( ! is_object($this->conn_id)) { return $this->conn_id; } // Determine how identifiers are escaped $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); $query = $query->row_array(); $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); return $this->conn_id; } // -------------------------------------------------------------------- /** * Show table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SELECT '.$this->escape_identifiers('name') .' FROM '.$this->escape_identifiers('sysobjects') .' WHERE '.$this->escape_identifiers('type')." = 'U'"; if ($prefix_limit === TRUE && $this->dbprefix !== '') { $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " .sprintf($this->_like_escape_str, $this->_like_escape_chr); } return $sql.' ORDER BY '.$this->escape_identifiers('name'); } // -------------------------------------------------------------------- /** * Show column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return string */ protected function _list_columns($table = '') { return 'SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.Columns WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.Columns WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); if (($query = $this->query($sql)) === FALSE) { return FALSE; } $query = $query->result_object(); $retval = array(); for ($i = 0, $c = count($query); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = $query[$i]->COLUMN_NAME; $retval[$i]->type = $query[$i]->DATA_TYPE; $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; } return $retval; } // -------------------------------------------------------------------- /** * Update statement * * Generates a platform-specific update string from the supplied data * * @param string $table * @param array $values * @return string */ protected function _update($table, $values) { $this->qb_limit = FALSE; $this->qb_orderby = array(); return parent::_update($table, $values); } // -------------------------------------------------------------------- /** * Delete statement * * Generates a platform-specific delete string from the supplied data * * @param string $table * @return string */ protected function _delete($table) { if ($this->qb_limit) { return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; } return parent::_delete($table); } // -------------------------------------------------------------------- /** * LIMIT * * Generates a platform-specific LIMIT clause * * @param string $sql SQL Query * @return string */ protected function _limit($sql) { $limit = $this->qb_offset + $this->qb_limit; // As of SQL Server 2005 (9.0.*) ROW_NUMBER() is supported, // however an ORDER BY clause is required for it to work if (version_compare($this->version(), '9', '>=') && $this->qb_offset && ! empty($this->qb_orderby)) { $orderby = $this->_compile_order_by(); // We have to strip the ORDER BY clause $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results if (count($this->qb_select) === 0 OR strpos(implode(',', $this->qb_select), '*') !== FALSE) { $select = '*'; // Inevitable } else { // Use only field names and their aliases, everything else is out of our scope. $select = array(); $field_regexp = ($this->_quoted_identifier) ? '("[^\"]+")' : '(\[[^\]]+\])'; for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) { $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) ? $m[1] : $this->qb_select[$i]; } $select = implode(', ', $select); } return 'SELECT '.$select." FROM (\n\n" .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) ."\n\n) ".$this->escape_identifiers('CI_subquery') ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; } return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); } // -------------------------------------------------------------------- /** * Insert batch statement * * Generates a platform-specific insert string from the supplied data. * * @param string $table Table name * @param array $keys INSERT keys * @param array $values INSERT values * @return string|bool */ protected function _insert_batch($table, $keys, $values) { // Multiple-value inserts are only supported as of SQL Server 2008 if (version_compare($this->version(), '10', '>=')) { return parent::_insert_batch($table, $keys, $values); } return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; } // -------------------------------------------------------------------- /** * Database version number * * @return string */ public function version() { if (isset($this->data_cache['version'])) { return $this->data_cache['version']; } return $this->data_cache['version'] = $this->conn_id->query("SELECT SERVERPROPERTY('ProductVersion') AS ver")->fetchColumn(0); } } PK!8PÌêê3database/drivers/pdo/subdrivers/pdo_mysql_forge.phpnu„[µü¤db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET')) { $sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set; } if ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE')) { $sql .= ' COLLATE = '.$this->db->dbcollat; } return $sql; } // -------------------------------------------------------------------- /** * ALTER TABLE * * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if ($alter_type === 'DROP') { return parent::_alter_table($alter_type, $table, $field); } $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); for ($i = 0, $c = count($field); $i < $c; $i++) { if ($field[$i]['_literal'] !== FALSE) { $field[$i] = ($alter_type === 'ADD') ? "\n\tADD ".$field[$i]['_literal'] : "\n\tMODIFY ".$field[$i]['_literal']; } else { if ($alter_type === 'ADD') { $field[$i]['_literal'] = "\n\tADD "; } else { $field[$i]['_literal'] = empty($field[$i]['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE "; } $field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]); } } return array($sql.implode(',', $field)); } // -------------------------------------------------------------------- /** * Process column * * @param array $field * @return string */ protected function _process_column($field) { $extra_clause = isset($field['after']) ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) { $extra_clause = ' FIRST'; } return $this->db->escape_identifiers($field['name']) .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) .' '.$field['type'].$field['length'] .$field['unsigned'] .$field['null'] .$field['default'] .$field['auto_increment'] .$field['unique'] .(empty($field['comment']) ? '' : ' COMMENT '.$field['comment']) .$extra_clause; } // -------------------------------------------------------------------- /** * Process indexes * * @param string $table (ignored) * @return string */ protected function _process_indexes($table) { $sql = ''; for ($i = 0, $c = count($this->keys); $i < $c; $i++) { if (is_array($this->keys[$i])) { for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) { if ( ! isset($this->fields[$this->keys[$i][$i2]])) { unset($this->keys[$i][$i2]); continue; } } } elseif ( ! isset($this->fields[$this->keys[$i]])) { unset($this->keys[$i]); continue; } is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; } $this->keys = array(); return $sql; } } PK!Ýr §§3database/drivers/pdo/subdrivers/pdo_pgsql_forge.phpnu„[µü¤ 'INTEGER', 'SMALLINT' => 'INTEGER', 'INT' => 'BIGINT', 'INT4' => 'BIGINT', 'INTEGER' => 'BIGINT', 'INT8' => 'NUMERIC', 'BIGINT' => 'NUMERIC', 'REAL' => 'DOUBLE PRECISION', 'FLOAT' => 'DOUBLE PRECISION' ); /** * NULL value representation in CREATE/ALTER TABLE statements * * @var string */ protected $_null = 'NULL'; // -------------------------------------------------------------------- /** * Class constructor * * @param object &$db Database object * @return void */ public function __construct(&$db) { parent::__construct($db); if (version_compare($this->db->version(), '9.0', '>')) { $this->create_table_if = 'CREATE TABLE IF NOT EXISTS'; } } // -------------------------------------------------------------------- /** * ALTER TABLE * * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) { return parent::_alter_table($alter_type, $table, $field); } $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); $sqls = array(); for ($i = 0, $c = count($field); $i < $c; $i++) { if ($field[$i]['_literal'] !== FALSE) { return FALSE; } if (version_compare($this->db->version(), '8', '>=') && isset($field[$i]['type'])) { $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) .' TYPE '.$field[$i]['type'].$field[$i]['length']; } if ( ! empty($field[$i]['default'])) { $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) .' SET '.$field[$i]['default']; } if (isset($field[$i]['null'])) { $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) .(trim($field[$i]['null']) === $this->_null ? ' DROP NOT NULL' : ' SET NOT NULL'); } if ( ! empty($field[$i]['new_name'])) { $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); } if ( ! empty($field[$i]['comment'])) { $sqls[] = 'COMMENT ON COLUMN ' .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) .' IS '.$field[$i]['comment']; } } return $sqls; } // -------------------------------------------------------------------- /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { // Reset field lengths for data types that don't support it if (isset($attributes['CONSTRAINT']) && stripos($attributes['TYPE'], 'int') !== FALSE) { $attributes['CONSTRAINT'] = NULL; } switch (strtoupper($attributes['TYPE'])) { case 'TINYINT': $attributes['TYPE'] = 'SMALLINT'; $attributes['UNSIGNED'] = FALSE; return; case 'MEDIUMINT': $attributes['TYPE'] = 'INTEGER'; $attributes['UNSIGNED'] = FALSE; return; default: return; } } // -------------------------------------------------------------------- /** * Field attribute AUTO_INCREMENT * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_auto_increment(&$attributes, &$field) { if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) { $field['type'] = ($field['type'] === 'NUMERIC') ? 'BIGSERIAL' : 'SERIAL'; } } } PK!´×€ÅÅ1database/drivers/pdo/subdrivers/pdo_oci_forge.phpnu„[µü¤db->escape_identifiers($table); $sqls = array(); for ($i = 0, $c = count($field); $i < $c; $i++) { if ($field[$i]['_literal'] !== FALSE) { $field[$i] = "\n\t".$field[$i]['_literal']; } else { $field[$i]['_literal'] = "\n\t".$this->_process_column($field[$i]); if ( ! empty($field[$i]['comment'])) { $sqls[] = 'COMMENT ON COLUMN ' .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) .' IS '.$field[$i]['comment']; } if ($alter_type === 'MODIFY' && ! empty($field[$i]['new_name'])) { $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); } } } $sql .= ' '.$alter_type.' '; $sql .= (count($field) === 1) ? $field[0] : '('.implode(',', $field).')'; // RENAME COLUMN must be executed after MODIFY array_unshift($sqls, $sql); return $sql; } // -------------------------------------------------------------------- /** * Field attribute AUTO_INCREMENT * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_auto_increment(&$attributes, &$field) { // Not supported - sequences and triggers must be used instead } /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { switch (strtoupper($attributes['TYPE'])) { case 'TINYINT': $attributes['TYPE'] = 'NUMBER'; return; case 'MEDIUMINT': $attributes['TYPE'] = 'NUMBER'; return; case 'INT': $attributes['TYPE'] = 'NUMBER'; return; case 'BIGINT': $attributes['TYPE'] = 'NUMBER'; return; default: return; } } } PK!ãI-)¼%¼%4database/drivers/pdo/subdrivers/pdo_pgsql_driver.phpnu„[µü¤dsn)) { $this->dsn = 'pgsql:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); empty($this->port) OR $this->dsn .= ';port='.$this->port; empty($this->database) OR $this->dsn .= ';dbname='.$this->database; if ( ! empty($this->username)) { $this->dsn .= ';user='.$this->username; empty($this->password) OR $this->dsn .= ';password='.$this->password; } } } // -------------------------------------------------------------------- /** * Database connection * * @param bool $persistent * @return object */ public function db_connect($persistent = FALSE) { $this->conn_id = parent::db_connect($persistent); if (is_object($this->conn_id) && ! empty($this->schema)) { $this->simple_query('SET search_path TO '.$this->schema.',public'); } return $this->conn_id; } // -------------------------------------------------------------------- /** * Insert ID * * @param string $name * @return int */ public function insert_id($name = NULL) { if ($name === NULL && version_compare($this->version(), '8.1', '>=')) { $query = $this->query('SELECT LASTVAL() AS ins_id'); $query = $query->row(); return $query->ins_id; } return $this->conn_id->lastInsertId($name); } // -------------------------------------------------------------------- /** * Determines if a query is a "write" type. * * @param string An SQL query string * @return bool */ public function is_write_type($sql) { if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) { return FALSE; } return parent::is_write_type($sql); } // -------------------------------------------------------------------- /** * "Smart" Escape String * * Escapes data based on type * * @param string $str * @return mixed */ public function escape($str) { if (is_bool($str)) { return ($str) ? 'TRUE' : 'FALSE'; } return parent::escape($str); } // -------------------------------------------------------------------- /** * ORDER BY * * @param string $orderby * @param string $direction ASC, DESC or RANDOM * @param bool $escape * @return object */ public function order_by($orderby, $direction = '', $escape = NULL) { $direction = strtoupper(trim($direction)); if ($direction === 'RANDOM') { if ( ! is_float($orderby) && ctype_digit((string) $orderby)) { $orderby = ($orderby > 1) ? (float) '0.'.$orderby : (float) $orderby; } if (is_float($orderby)) { $this->simple_query('SET SEED '.$orderby); } $orderby = $this->_random_keyword[0]; $direction = ''; $escape = FALSE; } return parent::order_by($orderby, $direction, $escape); } // -------------------------------------------------------------------- /** * Show table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SELECT "table_name" FROM "information_schema"."tables" WHERE "table_schema" = \''.$this->schema."'"; if ($prefix_limit === TRUE && $this->dbprefix !== '') { return $sql.' AND "table_name" LIKE \'' .$this->escape_like_str($this->dbprefix)."%' " .sprintf($this->_like_escape_str, $this->_like_escape_chr); } return $sql; } // -------------------------------------------------------------------- /** * List column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return string */ protected function _list_columns($table = '') { return 'SELECT "column_name" FROM "information_schema"."columns" WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { $sql = 'SELECT "column_name", "data_type", "character_maximum_length", "numeric_precision", "column_default" FROM "information_schema"."columns" WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); if (($query = $this->query($sql)) === FALSE) { return FALSE; } $query = $query->result_object(); $retval = array(); for ($i = 0, $c = count($query); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = $query[$i]->column_name; $retval[$i]->type = $query[$i]->data_type; $retval[$i]->max_length = ($query[$i]->character_maximum_length > 0) ? $query[$i]->character_maximum_length : $query[$i]->numeric_precision; $retval[$i]->default = $query[$i]->column_default; } return $retval; } // -------------------------------------------------------------------- /** * Update statement * * Generates a platform-specific update string from the supplied data * * @param string $table * @param array $values * @return string */ protected function _update($table, $values) { $this->qb_limit = FALSE; $this->qb_orderby = array(); return parent::_update($table, $values); } // -------------------------------------------------------------------- /** * Update_Batch statement * * Generates a platform-specific batch update string from the supplied data * * @param string $table Table name * @param array $values Update data * @param string $index WHERE key * @return string */ protected function _update_batch($table, $values, $index) { $ids = array(); foreach ($values as $key => $val) { $ids[] = $val[$index]['value']; foreach (array_keys($val) as $field) { if ($field !== $index) { $final[$val[$field]['field']][] = 'WHEN '.$val[$index]['value'].' THEN '.$val[$field]['value']; } } } $cases = ''; foreach ($final as $k => $v) { $cases .= $k.' = (CASE '.$val[$index]['field']."\n" .implode("\n", $v)."\n" .'ELSE '.$k.' END), '; } $this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE); return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); } // -------------------------------------------------------------------- /** * Delete statement * * Generates a platform-specific delete string from the supplied data * * @param string $table * @return string */ protected function _delete($table) { $this->qb_limit = FALSE; return parent::_delete($table); } // -------------------------------------------------------------------- /** * LIMIT * * Generates a platform-specific LIMIT clause * * @param string $sql SQL Query * @return string */ protected function _limit($sql) { return $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : ''); } } PK!–ÙIãøø0database/drivers/pdo/subdrivers/pdo_4d_forge.phpnu„[µü¤ 'INT', 'SMALLINT' => 'INT', 'INT' => 'INT64', 'INT32' => 'INT64' ); /** * DEFAULT value representation in CREATE/ALTER TABLE statements * * @var string */ protected $_default = FALSE; // -------------------------------------------------------------------- /** * ALTER TABLE * * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) { return parent::_alter_table($alter_type, $table, $field); } // No method of modifying columns is supported return FALSE; } // -------------------------------------------------------------------- /** * Process column * * @param array $field * @return string */ protected function _process_column($field) { return $this->db->escape_identifiers($field['name']) .' '.$field['type'].$field['length'] .$field['null'] .$field['unique'] .$field['auto_increment']; } // -------------------------------------------------------------------- /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { switch (strtoupper($attributes['TYPE'])) { case 'TINYINT': $attributes['TYPE'] = 'SMALLINT'; $attributes['UNSIGNED'] = FALSE; return; case 'MEDIUMINT': $attributes['TYPE'] = 'INTEGER'; $attributes['UNSIGNED'] = FALSE; return; case 'INTEGER': $attributes['TYPE'] = 'INT'; return; case 'BIGINT': $attributes['TYPE'] = 'INT64'; return; default: return; } } // -------------------------------------------------------------------- /** * Field attribute UNIQUE * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_unique(&$attributes, &$field) { if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) { $field['unique'] = ' UNIQUE'; // UNIQUE must be used with NOT NULL $field['null'] = ' NOT NULL'; } } // -------------------------------------------------------------------- /** * Field attribute AUTO_INCREMENT * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_auto_increment(&$attributes, &$field) { if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) { if (stripos($field['type'], 'int') !== FALSE) { $field['auto_increment'] = ' AUTO_INCREMENT'; } elseif (strcasecmp($field['type'], 'UUID') === 0) { $field['auto_increment'] = ' AUTO_GENERATE'; } } } } PK!zÓz½6database/drivers/pdo/subdrivers/pdo_firebird_forge.phpnu„[µü¤ 'INTEGER', 'INTEGER' => 'INT64', 'FLOAT' => 'DOUBLE PRECISION' ); /** * NULL value representation in CREATE/ALTER TABLE statements * * @var string */ protected $_null = 'NULL'; // -------------------------------------------------------------------- /** * Create database * * @param string $db_name * @return string */ public function create_database($db_name) { // Firebird databases are flat files, so a path is required // Hostname is needed for remote access empty($this->db->hostname) OR $db_name = $this->hostname.':'.$db_name; return parent::create_database('"'.$db_name.'"'); } // -------------------------------------------------------------------- /** * Drop database * * @param string $db_name (ignored) * @return bool */ public function drop_database($db_name) { if ( ! ibase_drop_db($this->conn_id)) { return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; } elseif ( ! empty($this->db->data_cache['db_names'])) { $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); if ($key !== FALSE) { unset($this->db->data_cache['db_names'][$key]); } } return TRUE; } // -------------------------------------------------------------------- /** * ALTER TABLE * * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) { return parent::_alter_table($alter_type, $table, $field); } $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); $sqls = array(); for ($i = 0, $c = count($field); $i < $c; $i++) { if ($field[$i]['_literal'] !== FALSE) { return FALSE; } if (isset($field[$i]['type'])) { $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) .' TYPE '.$field[$i]['type'].$field[$i]['length']; } if ( ! empty($field[$i]['default'])) { $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) .' SET '.$field[$i]['default']; } if (isset($field[$i]['null'])) { $sqls[] = 'UPDATE "RDB$RELATION_FIELDS" SET "RDB$NULL_FLAG" = ' .($field[$i]['null'] === TRUE ? 'NULL' : '1') .' WHERE "RDB$FIELD_NAME" = '.$this->db->escape($field[$i]['name']) .' AND "RDB$RELATION_NAME" = '.$this->db->escape($table); } if ( ! empty($field[$i]['new_name'])) { $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); } } return $sqls; } // -------------------------------------------------------------------- /** * Process column * * @param array $field * @return string */ protected function _process_column($field) { return $this->db->escape_identifiers($field['name']) .' '.$field['type'].$field['length'] .$field['null'] .$field['unique'] .$field['default']; } // -------------------------------------------------------------------- /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { switch (strtoupper($attributes['TYPE'])) { case 'TINYINT': $attributes['TYPE'] = 'SMALLINT'; $attributes['UNSIGNED'] = FALSE; return; case 'MEDIUMINT': $attributes['TYPE'] = 'INTEGER'; $attributes['UNSIGNED'] = FALSE; return; case 'INT': $attributes['TYPE'] = 'INTEGER'; return; case 'BIGINT': $attributes['TYPE'] = 'INT64'; return; default: return; } } // -------------------------------------------------------------------- /** * Field attribute AUTO_INCREMENT * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_auto_increment(&$attributes, &$field) { // Not supported } } PK!Œ­kMìì3database/drivers/pdo/subdrivers/pdo_dblib_forge.phpnu„[µü¤ 'SMALLINT', 'SMALLINT' => 'INT', 'INT' => 'BIGINT', 'REAL' => 'FLOAT' ); // -------------------------------------------------------------------- /** * ALTER TABLE * * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) { return parent::_alter_table($alter_type, $table, $field); } $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; $sqls = array(); for ($i = 0, $c = count($field); $i < $c; $i++) { $sqls[] = $sql.$this->_process_column($field[$i]); } return $sqls; } // -------------------------------------------------------------------- /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) { unset($attributes['CONSTRAINT']); } switch (strtoupper($attributes['TYPE'])) { case 'MEDIUMINT': $attributes['TYPE'] = 'INTEGER'; $attributes['UNSIGNED'] = FALSE; return; case 'INTEGER': $attributes['TYPE'] = 'INT'; return; default: return; } } // -------------------------------------------------------------------- /** * Field attribute AUTO_INCREMENT * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_auto_increment(&$attributes, &$field) { if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) { $field['auto_increment'] = ' IDENTITY(1,1)'; } } } PK!ãyîî4database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.phpnu„[µü¤ 'SMALLINT', 'SMALLINT' => 'INT', 'INT' => 'BIGINT', 'REAL' => 'FLOAT' ); // -------------------------------------------------------------------- /** * ALTER TABLE * * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) { return parent::_alter_table($alter_type, $table, $field); } $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; $sqls = array(); for ($i = 0, $c = count($field); $i < $c; $i++) { $sqls[] = $sql.$this->_process_column($field[$i]); } return $sqls; } // -------------------------------------------------------------------- /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) { unset($attributes['CONSTRAINT']); } switch (strtoupper($attributes['TYPE'])) { case 'MEDIUMINT': $attributes['TYPE'] = 'INTEGER'; $attributes['UNSIGNED'] = FALSE; return; case 'INTEGER': $attributes['TYPE'] = 'INT'; return; default: return; } } // -------------------------------------------------------------------- /** * Field attribute AUTO_INCREMENT * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_auto_increment(&$attributes, &$field) { if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) { $field['auto_increment'] = ' IDENTITY(1,1)'; } } } PK!ïˆObØØ4database/drivers/pdo/subdrivers/pdo_cubrid_forge.phpnu„[µü¤ 'INTEGER', 'SMALLINT' => 'INTEGER', 'INT' => 'BIGINT', 'INTEGER' => 'BIGINT', 'BIGINT' => 'NUMERIC', 'FLOAT' => 'DOUBLE', 'REAL' => 'DOUBLE' ); // -------------------------------------------------------------------- /** * ALTER TABLE * * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) { return parent::_alter_table($alter_type, $table, $field); } $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); $sqls = array(); for ($i = 0, $c = count($field); $i < $c; $i++) { if ($field[$i]['_literal'] !== FALSE) { $sqls[] = $sql.' CHANGE '.$field[$i]['_literal']; } else { $alter_type = empty($field[$i]['new_name']) ? ' MODIFY ' : ' CHANGE '; $sqls[] = $sql.$alter_type.$this->_process_column($field[$i]); } } return $sqls; } // -------------------------------------------------------------------- /** * Process column * * @param array $field * @return string */ protected function _process_column($field) { $extra_clause = isset($field['after']) ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) { $extra_clause = ' FIRST'; } return $this->db->escape_identifiers($field['name']) .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) .' '.$field['type'].$field['length'] .$field['unsigned'] .$field['null'] .$field['default'] .$field['auto_increment'] .$field['unique'] .$extra_clause; } // -------------------------------------------------------------------- /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { switch (strtoupper($attributes['TYPE'])) { case 'TINYINT': $attributes['TYPE'] = 'SMALLINT'; $attributes['UNSIGNED'] = FALSE; return; case 'MEDIUMINT': $attributes['TYPE'] = 'INTEGER'; $attributes['UNSIGNED'] = FALSE; return; case 'LONGTEXT': $attributes['TYPE'] = 'STRING'; return; default: return; } } // -------------------------------------------------------------------- /** * Process indexes * * @param string $table (ignored) * @return string */ protected function _process_indexes($table) { $sql = ''; for ($i = 0, $c = count($this->keys); $i < $c; $i++) { if (is_array($this->keys[$i])) { for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) { if ( ! isset($this->fields[$this->keys[$i][$i2]])) { unset($this->keys[$i][$i2]); continue; } } } elseif ( ! isset($this->fields[$this->keys[$i]])) { unset($this->keys[$i]); continue; } is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; } $this->keys = array(); return $sql; } } PK!.uÅ0441database/drivers/pdo/subdrivers/pdo_4d_driver.phpnu„[µü¤dsn)) { $this->dsn = '4D:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); empty($this->port) OR $this->dsn .= ';port='.$this->port; empty($this->database) OR $this->dsn .= ';dbname='.$this->database; empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; } elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 3) === FALSE) { $this->dsn .= ';charset='.$this->char_set; } } // -------------------------------------------------------------------- /** * Show table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SELECT '.$this->escape_identifiers('TABLE_NAME').' FROM '.$this->escape_identifiers('_USER_TABLES'); if ($prefix_limit === TRUE && $this->dbprefix !== '') { $sql .= ' WHERE '.$this->escape_identifiers('TABLE_NAME')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " .sprintf($this->_like_escape_str, $this->_like_escape_chr); } return $sql; } // -------------------------------------------------------------------- /** * Show column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return string */ protected function _list_columns($table = '') { return 'SELECT '.$this->escape_identifiers('COLUMN_NAME').' FROM '.$this->escape_identifiers('_USER_COLUMNS') .' WHERE '.$this->escape_identifiers('TABLE_NAME').' = '.$this->escape($table); } // -------------------------------------------------------------------- /** * Field data query * * Generates a platform-specific query so that the column data can be retrieved * * @param string $table * @return string */ protected function _field_data($table) { return 'SELECT * FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE).' LIMIT 1'; } // -------------------------------------------------------------------- /** * Update statement * * Generates a platform-specific update string from the supplied data * * @param string $table * @param array $values * @return string */ protected function _update($table, $values) { $this->qb_limit = FALSE; $this->qb_orderby = array(); return parent::_update($table, $values); } // -------------------------------------------------------------------- /** * Delete statement * * Generates a platform-specific delete string from the supplied data * * @param string $table * @return string */ protected function _delete($table) { $this->qb_limit = FALSE; return parent::_delete($table); } // -------------------------------------------------------------------- /** * LIMIT * * Generates a platform-specific LIMIT clause * * @param string $sql SQL Query * @return string */ protected function _limit($sql) { return $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : ''); } } PK!®ò(ƒƒ*database/drivers/pdo/subdrivers/index.htmlnu„[µü¤ 403 Forbidden

    Directory access is forbidden.

    PK!^œ!$PP7database/drivers/pdo/subdrivers/pdo_firebird_driver.phpnu„[µü¤dsn)) { $this->dsn = 'firebird:'; if ( ! empty($this->database)) { $this->dsn .= 'dbname='.$this->database; } elseif ( ! empty($this->hostname)) { $this->dsn .= 'dbname='.$this->hostname; } empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; empty($this->role) OR $this->dsn .= ';role='.$this->role; } elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 9) === FALSE) { $this->dsn .= ';charset='.$this->char_set; } } // -------------------------------------------------------------------- /** * Show table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SELECT "RDB$RELATION_NAME" FROM "RDB$RELATIONS" WHERE "RDB$RELATION_NAME" NOT LIKE \'RDB$%\' AND "RDB$RELATION_NAME" NOT LIKE \'MON$%\''; if ($prefix_limit === TRUE && $this->dbprefix !== '') { return $sql.' AND "RDB$RELATION_NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " .sprintf($this->_like_escape_str, $this->_like_escape_chr); } return $sql; } // -------------------------------------------------------------------- /** * Show column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return string */ protected function _list_columns($table = '') { return 'SELECT "RDB$FIELD_NAME" FROM "RDB$RELATION_FIELDS" WHERE "RDB$RELATION_NAME" = '.$this->escape($table); } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { $sql = 'SELECT "rfields"."RDB$FIELD_NAME" AS "name", CASE "fields"."RDB$FIELD_TYPE" WHEN 7 THEN \'SMALLINT\' WHEN 8 THEN \'INTEGER\' WHEN 9 THEN \'QUAD\' WHEN 10 THEN \'FLOAT\' WHEN 11 THEN \'DFLOAT\' WHEN 12 THEN \'DATE\' WHEN 13 THEN \'TIME\' WHEN 14 THEN \'CHAR\' WHEN 16 THEN \'INT64\' WHEN 27 THEN \'DOUBLE\' WHEN 35 THEN \'TIMESTAMP\' WHEN 37 THEN \'VARCHAR\' WHEN 40 THEN \'CSTRING\' WHEN 261 THEN \'BLOB\' ELSE NULL END AS "type", "fields"."RDB$FIELD_LENGTH" AS "max_length", "rfields"."RDB$DEFAULT_VALUE" AS "default" FROM "RDB$RELATION_FIELDS" "rfields" JOIN "RDB$FIELDS" "fields" ON "rfields"."RDB$FIELD_SOURCE" = "fields"."RDB$FIELD_NAME" WHERE "rfields"."RDB$RELATION_NAME" = '.$this->escape($table).' ORDER BY "rfields"."RDB$FIELD_POSITION"'; return (($query = $this->query($sql)) !== FALSE) ? $query->result_object() : FALSE; } // -------------------------------------------------------------------- /** * Update statement * * Generates a platform-specific update string from the supplied data * * @param string $table * @param array $values * @return string */ protected function _update($table, $values) { $this->qb_limit = FALSE; return parent::_update($table, $values); } // -------------------------------------------------------------------- /** * Truncate statement * * Generates a platform-specific truncate string from the supplied data * * If the database does not support the TRUNCATE statement, * then this method maps to 'DELETE FROM table' * * @param string $table * @return string */ protected function _truncate($table) { return 'DELETE FROM '.$table; } // -------------------------------------------------------------------- /** * Delete statement * * Generates a platform-specific delete string from the supplied data * * @param string $table * @return string */ protected function _delete($table) { $this->qb_limit = FALSE; return parent::_delete($table); } // -------------------------------------------------------------------- /** * LIMIT * * Generates a platform-specific LIMIT clause * * @param string $sql SQL Query * @return string */ protected function _limit($sql) { // Limit clause depends on if Interbase or Firebird if (stripos($this->version(), 'firebird') !== FALSE) { $select = 'FIRST '.$this->qb_limit .($this->qb_offset > 0 ? ' SKIP '.$this->qb_offset : ''); } else { $select = 'ROWS ' .($this->qb_offset > 0 ? $this->qb_offset.' TO '.($this->qb_limit + $this->qb_offset) : $this->qb_limit); } return preg_replace('`SELECT`i', 'SELECT '.$select, $sql); } // -------------------------------------------------------------------- /** * Insert batch statement * * Generates a platform-specific insert string from the supplied data. * * @param string $table Table name * @param array $keys INSERT keys * @param array $values INSERT values * @return string|bool */ protected function _insert_batch($table, $keys, $values) { return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; } } PK!LlI›@'@'4database/drivers/pdo/subdrivers/pdo_mysql_driver.phpnu„[µü¤dsn)) { $this->dsn = 'mysql:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); empty($this->port) OR $this->dsn .= ';port='.$this->port; empty($this->database) OR $this->dsn .= ';dbname='.$this->database; empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; } elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE) { $this->dsn .= ';charset='.$this->char_set; } } // -------------------------------------------------------------------- /** * Database connection * * @param bool $persistent * @return object */ public function db_connect($persistent = FALSE) { if (isset($this->stricton)) { if ($this->stricton) { $sql = 'CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'; } else { $sql = 'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( @@sql_mode, "STRICT_ALL_TABLES,", ""), ",STRICT_ALL_TABLES", ""), "STRICT_ALL_TABLES", ""), "STRICT_TRANS_TABLES,", ""), ",STRICT_TRANS_TABLES", ""), "STRICT_TRANS_TABLES", "")'; } if ( ! empty($sql)) { if (empty($this->options[PDO::MYSQL_ATTR_INIT_COMMAND])) { $this->options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET SESSION sql_mode = '.$sql; } else { $this->options[PDO::MYSQL_ATTR_INIT_COMMAND] .= ', @@session.sql_mode = '.$sql; } } } if ($this->compress === TRUE) { $this->options[PDO::MYSQL_ATTR_COMPRESS] = TRUE; } if (is_array($this->encrypt)) { $ssl = array(); empty($this->encrypt['ssl_key']) OR $ssl[PDO::MYSQL_ATTR_SSL_KEY] = $this->encrypt['ssl_key']; empty($this->encrypt['ssl_cert']) OR $ssl[PDO::MYSQL_ATTR_SSL_CERT] = $this->encrypt['ssl_cert']; empty($this->encrypt['ssl_ca']) OR $ssl[PDO::MYSQL_ATTR_SSL_CA] = $this->encrypt['ssl_ca']; empty($this->encrypt['ssl_capath']) OR $ssl[PDO::MYSQL_ATTR_SSL_CAPATH] = $this->encrypt['ssl_capath']; empty($this->encrypt['ssl_cipher']) OR $ssl[PDO::MYSQL_ATTR_SSL_CIPHER] = $this->encrypt['ssl_cipher']; if (defined('PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT') && isset($this->encrypt['ssl_verify'])) { $ssl[PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT] = $this->encrypt['ssl_verify']; } // DO NOT use array_merge() here! // It re-indexes numeric keys and the PDO_MYSQL_ATTR_SSL_* constants are integers. empty($ssl) OR $this->options += $ssl; } // Prior to version 5.7.3, MySQL silently downgrades to an unencrypted connection if SSL setup fails if ( ($pdo = parent::db_connect($persistent)) !== FALSE && ! empty($ssl) && version_compare($pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), '5.7.3', '<=') && empty($pdo->query("SHOW STATUS LIKE 'ssl_cipher'")->fetchObject()->Value) ) { $message = 'PDO_MYSQL was configured for an SSL connection, but got an unencrypted connection instead!'; log_message('error', $message); return ($this->db_debug) ? $this->display_error($message, '', TRUE) : FALSE; } return $pdo; } // -------------------------------------------------------------------- /** * Select the database * * @param string $database * @return bool */ public function db_select($database = '') { if ($database === '') { $database = $this->database; } if (FALSE !== $this->simple_query('USE '.$this->escape_identifiers($database))) { $this->database = $database; $this->data_cache = array(); return TRUE; } return FALSE; } // -------------------------------------------------------------------- /** * Begin Transaction * * @return bool */ protected function _trans_begin() { $this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE); return $this->conn_id->beginTransaction(); } // -------------------------------------------------------------------- /** * Commit Transaction * * @return bool */ protected function _trans_commit() { if ($this->conn_id->commit()) { $this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, TRUE); return TRUE; } return FALSE; } // -------------------------------------------------------------------- /** * Rollback Transaction * * @return bool */ protected function _trans_rollback() { if ($this->conn_id->rollBack()) { $this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, TRUE); return TRUE; } return FALSE; } // -------------------------------------------------------------------- /** * Show table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SHOW TABLES FROM '.$this->_escape_char.$this->database.$this->_escape_char; if ($prefix_limit === TRUE && $this->dbprefix !== '') { return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; } return $sql; } // -------------------------------------------------------------------- /** * Show column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return string */ protected function _list_columns($table = '') { return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) { return FALSE; } $query = $query->result_object(); $retval = array(); for ($i = 0, $c = count($query); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = $query[$i]->Field; sscanf($query[$i]->Type, '%[a-z](%d)', $retval[$i]->type, $retval[$i]->max_length ); $retval[$i]->default = $query[$i]->Default; $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); } return $retval; } // -------------------------------------------------------------------- /** * Truncate statement * * Generates a platform-specific truncate string from the supplied data * * If the database does not support the TRUNCATE statement, * then this method maps to 'DELETE FROM table' * * @param string $table * @return string */ protected function _truncate($table) { return 'TRUNCATE '.$table; } // -------------------------------------------------------------------- /** * FROM tables * * Groups tables in FROM clauses if needed, so there is no confusion * about operator precedence. * * @return string */ protected function _from_tables() { if ( ! empty($this->qb_join) && count($this->qb_from) > 1) { return '('.implode(', ', $this->qb_from).')'; } return implode(', ', $this->qb_from); } } PK!®0“ïçç1database/drivers/pdo/subdrivers/pdo_ibm_forge.phpnu„[µü¤ 'INTEGER', 'INT' => 'BIGINT', 'INTEGER' => 'BIGINT' ); /** * DEFAULT value representation in CREATE/ALTER TABLE statements * * @var string */ protected $_default = FALSE; // -------------------------------------------------------------------- /** * ALTER TABLE * * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if ($alter_type === 'CHANGE') { $alter_type = 'MODIFY'; } return parent::_alter_table($alter_type, $table, $field); } // -------------------------------------------------------------------- /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { switch (strtoupper($attributes['TYPE'])) { case 'TINYINT': $attributes['TYPE'] = 'SMALLINT'; $attributes['UNSIGNED'] = FALSE; return; case 'MEDIUMINT': $attributes['TYPE'] = 'INTEGER'; $attributes['UNSIGNED'] = FALSE; return; default: return; } } // -------------------------------------------------------------------- /** * Field attribute UNIQUE * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_unique(&$attributes, &$field) { if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) { $field['unique'] = ' UNIQUE'; // UNIQUE must be used with NOT NULL $field['null'] = ' NOT NULL'; } } // -------------------------------------------------------------------- /** * Field attribute AUTO_INCREMENT * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_auto_increment(&$attributes, &$field) { // Not supported } } PK!®ò(ƒƒdatabase/drivers/pdo/index.htmlnu„[µü¤ 403 Forbidden

    Directory access is forbidden.

    PK!ÆlcD D *database/drivers/cubrid/cubrid_utility.phpnu„[µü¤db->data_cache['db_names'])) { return $this->db->data_cache['db_names']; } return $this->db->data_cache['db_names'] = cubrid_list_dbs($this->db->conn_id); } // -------------------------------------------------------------------- /** * CUBRID Export * * @param array Preferences * @return mixed */ protected function _backup($params = array()) { // No SQL based support in CUBRID as of version 8.4.0. Database or // table backup can be performed using CUBRID Manager // database administration tool. return $this->db->display_error('db_unsupported_feature'); } } PK!BˆL%L%)database/drivers/cubrid/cubrid_driver.phpnu„[µü¤dsn, $matches)) { if (stripos($matches[2], 'autocommit=off') !== FALSE) { $this->auto_commit = FALSE; } } else { // If no port is defined by the user, use the default value empty($this->port) OR $this->port = 33000; } } // -------------------------------------------------------------------- /** * Non-persistent database connection * * @param bool $persistent * @return resource */ public function db_connect($persistent = FALSE) { if (preg_match('/^CUBRID:[^:]+(:[0-9][1-9]{0,4})?:[^:]+:([^:]*):([^:]*):(\?.+)?$/', $this->dsn, $matches)) { $func = ($persistent !== TRUE) ? 'cubrid_connect_with_url' : 'cubrid_pconnect_with_url'; return ($matches[2] === '' && $matches[3] === '' && $this->username !== '' && $this->password !== '') ? $func($this->dsn, $this->username, $this->password) : $func($this->dsn); } $func = ($persistent !== TRUE) ? 'cubrid_connect' : 'cubrid_pconnect'; return ($this->username !== '') ? $func($this->hostname, $this->port, $this->database, $this->username, $this->password) : $func($this->hostname, $this->port, $this->database); } // -------------------------------------------------------------------- /** * Reconnect * * Keep / reestablish the db connection if no queries have been * sent for a length of time exceeding the server's idle timeout * * @return void */ public function reconnect() { if (cubrid_ping($this->conn_id) === FALSE) { $this->conn_id = FALSE; } } // -------------------------------------------------------------------- /** * Database version number * * @return string */ public function version() { if (isset($this->data_cache['version'])) { return $this->data_cache['version']; } return ( ! $this->conn_id OR ($version = cubrid_get_server_info($this->conn_id)) === FALSE) ? FALSE : $this->data_cache['version'] = $version; } // -------------------------------------------------------------------- /** * Execute the query * * @param string $sql an SQL query * @return resource */ protected function _execute($sql) { return cubrid_query($sql, $this->conn_id); } // -------------------------------------------------------------------- /** * Begin Transaction * * @return bool */ protected function _trans_begin() { if (($autocommit = cubrid_get_autocommit($this->conn_id)) === NULL) { return FALSE; } elseif ($autocommit === TRUE) { return cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_FALSE); } return TRUE; } // -------------------------------------------------------------------- /** * Commit Transaction * * @return bool */ protected function _trans_commit() { if ( ! cubrid_commit($this->conn_id)) { return FALSE; } if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id)) { return cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE); } return TRUE; } // -------------------------------------------------------------------- /** * Rollback Transaction * * @return bool */ protected function _trans_rollback() { if ( ! cubrid_rollback($this->conn_id)) { return FALSE; } if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id)) { cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE); } return TRUE; } // -------------------------------------------------------------------- /** * Platform-dependent string escape * * @param string * @return string */ protected function _escape_str($str) { return cubrid_real_escape_string($str, $this->conn_id); } // -------------------------------------------------------------------- /** * Affected Rows * * @return int */ public function affected_rows() { return cubrid_affected_rows(); } // -------------------------------------------------------------------- /** * Insert ID * * @return int */ public function insert_id() { return cubrid_insert_id($this->conn_id); } // -------------------------------------------------------------------- /** * List table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SHOW TABLES'; if ($prefix_limit !== FALSE && $this->dbprefix !== '') { return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; } return $sql; } // -------------------------------------------------------------------- /** * Show column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return string */ protected function _list_columns($table = '') { return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) { return FALSE; } $query = $query->result_object(); $retval = array(); for ($i = 0, $c = count($query); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = $query[$i]->Field; sscanf($query[$i]->Type, '%[a-z](%d)', $retval[$i]->type, $retval[$i]->max_length ); $retval[$i]->default = $query[$i]->Default; $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); } return $retval; } // -------------------------------------------------------------------- /** * Error * * Returns an array containing code and message of the last * database error that has occurred. * * @return array */ public function error() { return array('code' => cubrid_errno($this->conn_id), 'message' => cubrid_error($this->conn_id)); } // -------------------------------------------------------------------- /** * FROM tables * * Groups tables in FROM clauses if needed, so there is no confusion * about operator precedence. * * @return string */ protected function _from_tables() { if ( ! empty($this->qb_join) && count($this->qb_from) > 1) { return '('.implode(', ', $this->qb_from).')'; } return implode(', ', $this->qb_from); } // -------------------------------------------------------------------- /** * Close DB Connection * * @return void */ protected function _close() { cubrid_close($this->conn_id); } } PK!¿ýÇÀºº(database/drivers/cubrid/cubrid_forge.phpnu„[µü¤ 'INTEGER', 'SMALLINT' => 'INTEGER', 'INT' => 'BIGINT', 'INTEGER' => 'BIGINT', 'BIGINT' => 'NUMERIC', 'FLOAT' => 'DOUBLE', 'REAL' => 'DOUBLE' ); // -------------------------------------------------------------------- /** * ALTER TABLE * * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) { return parent::_alter_table($alter_type, $table, $field); } $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); $sqls = array(); for ($i = 0, $c = count($field); $i < $c; $i++) { if ($field[$i]['_literal'] !== FALSE) { $sqls[] = $sql.' CHANGE '.$field[$i]['_literal']; } else { $alter_type = empty($field[$i]['new_name']) ? ' MODIFY ' : ' CHANGE '; $sqls[] = $sql.$alter_type.$this->_process_column($field[$i]); } } return $sqls; } // -------------------------------------------------------------------- /** * Process column * * @param array $field * @return string */ protected function _process_column($field) { $extra_clause = isset($field['after']) ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) { $extra_clause = ' FIRST'; } return $this->db->escape_identifiers($field['name']) .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) .' '.$field['type'].$field['length'] .$field['unsigned'] .$field['null'] .$field['default'] .$field['auto_increment'] .$field['unique'] .$extra_clause; } // -------------------------------------------------------------------- /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { switch (strtoupper($attributes['TYPE'])) { case 'TINYINT': $attributes['TYPE'] = 'SMALLINT'; $attributes['UNSIGNED'] = FALSE; return; case 'MEDIUMINT': $attributes['TYPE'] = 'INTEGER'; $attributes['UNSIGNED'] = FALSE; return; case 'LONGTEXT': $attributes['TYPE'] = 'STRING'; return; default: return; } } // -------------------------------------------------------------------- /** * Process indexes * * @param string $table (ignored) * @return string */ protected function _process_indexes($table) { $sql = ''; for ($i = 0, $c = count($this->keys); $i < $c; $i++) { if (is_array($this->keys[$i])) { for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) { if ( ! isset($this->fields[$this->keys[$i][$i2]])) { unset($this->keys[$i][$i2]); continue; } } } elseif ( ! isset($this->fields[$this->keys[$i]])) { unset($this->keys[$i]); continue; } is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; } $this->keys = array(); return $sql; } } PK! )Úƒƒ)database/drivers/cubrid/cubrid_result.phpnu„[µü¤num_rows) ? $this->num_rows : $this->num_rows = cubrid_num_rows($this->result_id); } // -------------------------------------------------------------------- /** * Number of fields in the result set * * @return int */ public function num_fields() { return cubrid_num_fields($this->result_id); } // -------------------------------------------------------------------- /** * Fetch Field Names * * Generates an array of column names * * @return array */ public function list_fields() { return cubrid_column_names($this->result_id); } // -------------------------------------------------------------------- /** * Field data * * Generates an array of objects containing field meta-data * * @return array */ public function field_data() { $retval = array(); for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = cubrid_field_name($this->result_id, $i); $retval[$i]->type = cubrid_field_type($this->result_id, $i); $retval[$i]->max_length = cubrid_field_len($this->result_id, $i); $retval[$i]->primary_key = (int) (strpos(cubrid_field_flags($this->result_id, $i), 'primary_key') !== FALSE); } return $retval; } // -------------------------------------------------------------------- /** * Free the result * * @return void */ public function free_result() { if (is_resource($this->result_id) OR (get_resource_type($this->result_id) === 'Unknown' && preg_match('/Resource id #/', strval($this->result_id)))) { cubrid_close_request($this->result_id); $this->result_id = FALSE; } } // -------------------------------------------------------------------- /** * Data Seek * * Moves the internal pointer to the desired offset. We call * this internally before fetching results to make sure the * result set starts at zero. * * @param int $n * @return bool */ public function data_seek($n = 0) { return cubrid_data_seek($this->result_id, $n); } // -------------------------------------------------------------------- /** * Result - associative array * * Returns the result set as an array * * @return array */ protected function _fetch_assoc() { return cubrid_fetch_assoc($this->result_id); } // -------------------------------------------------------------------- /** * Result - object * * Returns the result set as an object * * @param string $class_name * @return object */ protected function _fetch_object($class_name = 'stdClass') { return cubrid_fetch_object($this->result_id, $class_name); } } PK!®ò(ƒƒ"database/drivers/cubrid/index.htmlnu„[µü¤ 403 Forbidden

    Directory access is forbidden.

    PK!+ûà &database/drivers/mssql/mssql_forge.phpnu„[µü¤ 'SMALLINT', 'SMALLINT' => 'INT', 'INT' => 'BIGINT', 'REAL' => 'FLOAT' ); // -------------------------------------------------------------------- /** * ALTER TABLE * * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) { return parent::_alter_table($alter_type, $table, $field); } $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; $sqls = array(); for ($i = 0, $c = count($field); $i < $c; $i++) { $sqls[] = $sql.$this->_process_column($field[$i]); } return $sqls; } // -------------------------------------------------------------------- /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) { unset($attributes['CONSTRAINT']); } switch (strtoupper($attributes['TYPE'])) { case 'MEDIUMINT': $attributes['TYPE'] = 'INTEGER'; $attributes['UNSIGNED'] = FALSE; return; case 'INTEGER': $attributes['TYPE'] = 'INT'; return; default: return; } } // -------------------------------------------------------------------- /** * Field attribute AUTO_INCREMENT * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_auto_increment(&$attributes, &$field) { if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) { $field['auto_increment'] = ' IDENTITY(1,1)'; } } } PK!\Z¢ ¢ (database/drivers/mssql/mssql_utility.phpnu„[µü¤db->display_error('db_unsupported_feature'); } } PK!a€†bøø'database/drivers/mssql/mssql_result.phpnu„[µü¤num_rows) ? $this->num_rows : $this->num_rows = mssql_num_rows($this->result_id); } // -------------------------------------------------------------------- /** * Number of fields in the result set * * @return int */ public function num_fields() { return mssql_num_fields($this->result_id); } // -------------------------------------------------------------------- /** * Fetch Field Names * * Generates an array of column names * * @return array */ public function list_fields() { $field_names = array(); mssql_field_seek($this->result_id, 0); while ($field = mssql_fetch_field($this->result_id)) { $field_names[] = $field->name; } return $field_names; } // -------------------------------------------------------------------- /** * Field data * * Generates an array of objects containing field meta-data * * @return array */ public function field_data() { $retval = array(); for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) { $field = mssql_fetch_field($this->result_id, $i); $retval[$i] = new stdClass(); $retval[$i]->name = $field->name; $retval[$i]->type = $field->type; $retval[$i]->max_length = $field->max_length; } return $retval; } // -------------------------------------------------------------------- /** * Free the result * * @return void */ public function free_result() { if (is_resource($this->result_id)) { mssql_free_result($this->result_id); $this->result_id = FALSE; } } // -------------------------------------------------------------------- /** * Data Seek * * Moves the internal pointer to the desired offset. We call * this internally before fetching results to make sure the * result set starts at zero. * * @param int $n * @return bool */ public function data_seek($n = 0) { return mssql_data_seek($this->result_id, $n); } // -------------------------------------------------------------------- /** * Result - associative array * * Returns the result set as an array * * @return array */ protected function _fetch_assoc() { return mssql_fetch_assoc($this->result_id); } // -------------------------------------------------------------------- /** * Result - object * * Returns the result set as an object * * @param string $class_name * @return object */ protected function _fetch_object($class_name = 'stdClass') { $row = mssql_fetch_object($this->result_id); if ($class_name === 'stdClass' OR ! $row) { return $row; } $class_name = new $class_name(); foreach ($row as $key => $value) { $class_name->$key = $value; } return $class_name; } } PK!` ,l5l5'database/drivers/mssql/mssql_driver.phpnu„[µü¤port)) { $this->hostname .= (DIRECTORY_SEPARATOR === '\\' ? ',' : ':').$this->port; } } // -------------------------------------------------------------------- /** * Non-persistent database connection * * @param bool $persistent * @return resource */ public function db_connect($persistent = FALSE) { $this->conn_id = ($persistent) ? mssql_pconnect($this->hostname, $this->username, $this->password) : mssql_connect($this->hostname, $this->username, $this->password); if ( ! $this->conn_id) { return FALSE; } // ---------------------------------------------------------------- // Select the DB... assuming a database name is specified in the config file if ($this->database !== '' && ! $this->db_select()) { log_message('error', 'Unable to select database: '.$this->database); return ($this->db_debug === TRUE) ? $this->display_error('db_unable_to_select', $this->database) : FALSE; } // Determine how identifiers are escaped $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); $query = $query->row_array(); $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); return $this->conn_id; } // -------------------------------------------------------------------- /** * Select the database * * @param string $database * @return bool */ public function db_select($database = '') { if ($database === '') { $database = $this->database; } // Note: Escaping is required in the event that the DB name // contains reserved characters. if (mssql_select_db('['.$database.']', $this->conn_id)) { $this->database = $database; $this->data_cache = array(); return TRUE; } return FALSE; } // -------------------------------------------------------------------- /** * Execute the query * * @param string $sql an SQL query * @return mixed resource if rows are returned, bool otherwise */ protected function _execute($sql) { return mssql_query($sql, $this->conn_id); } // -------------------------------------------------------------------- /** * Begin Transaction * * @return bool */ protected function _trans_begin() { return $this->simple_query('BEGIN TRAN'); } // -------------------------------------------------------------------- /** * Commit Transaction * * @return bool */ protected function _trans_commit() { return $this->simple_query('COMMIT TRAN'); } // -------------------------------------------------------------------- /** * Rollback Transaction * * @return bool */ protected function _trans_rollback() { return $this->simple_query('ROLLBACK TRAN'); } // -------------------------------------------------------------------- /** * Affected Rows * * @return int */ public function affected_rows() { return mssql_rows_affected($this->conn_id); } // -------------------------------------------------------------------- /** * Insert ID * * Returns the last id created in the Identity column. * * @return string */ public function insert_id() { $query = version_compare($this->version(), '8', '>=') ? 'SELECT SCOPE_IDENTITY() AS last_id' : 'SELECT @@IDENTITY AS last_id'; $query = $this->query($query); $query = $query->row(); return $query->last_id; } // -------------------------------------------------------------------- /** * Set client character set * * @param string $charset * @return bool */ protected function _db_set_charset($charset) { return (ini_set('mssql.charset', $charset) !== FALSE); } // -------------------------------------------------------------------- /** * Version number query string * * @return string */ protected function _version() { return "SELECT SERVERPROPERTY('ProductVersion') AS ver"; } // -------------------------------------------------------------------- /** * List table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SELECT '.$this->escape_identifiers('name') .' FROM '.$this->escape_identifiers('sysobjects') .' WHERE '.$this->escape_identifiers('type')." = 'U'"; if ($prefix_limit !== FALSE && $this->dbprefix !== '') { $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " .sprintf($this->_like_escape_str, $this->_like_escape_chr); } return $sql.' ORDER BY '.$this->escape_identifiers('name'); } // -------------------------------------------------------------------- /** * List column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return string */ protected function _list_columns($table = '') { return 'SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.Columns WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.Columns WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); if (($query = $this->query($sql)) === FALSE) { return FALSE; } $query = $query->result_object(); $retval = array(); for ($i = 0, $c = count($query); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = $query[$i]->COLUMN_NAME; $retval[$i]->type = $query[$i]->DATA_TYPE; $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; } return $retval; } // -------------------------------------------------------------------- /** * Error * * Returns an array containing code and message of the last * database error that has occurred. * * @return array */ public function error() { // We need this because the error info is discarded by the // server the first time you request it, and query() already // calls error() once for logging purposes when a query fails. static $error = array('code' => 0, 'message' => NULL); $message = mssql_get_last_message(); if ( ! empty($message)) { $error['code'] = $this->query('SELECT @@ERROR AS code')->row()->code; $error['message'] = $message; } return $error; } // -------------------------------------------------------------------- /** * Update statement * * Generates a platform-specific update string from the supplied data * * @param string $table * @param array $values * @return string */ protected function _update($table, $values) { $this->qb_limit = FALSE; $this->qb_orderby = array(); return parent::_update($table, $values); } // -------------------------------------------------------------------- /** * Truncate statement * * Generates a platform-specific truncate string from the supplied data * * If the database does not support the TRUNCATE statement, * then this method maps to 'DELETE FROM table' * * @param string $table * @return string */ protected function _truncate($table) { return 'TRUNCATE TABLE '.$table; } // -------------------------------------------------------------------- /** * Delete statement * * Generates a platform-specific delete string from the supplied data * * @param string $table * @return string */ protected function _delete($table) { if ($this->qb_limit) { return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; } return parent::_delete($table); } // -------------------------------------------------------------------- /** * LIMIT * * Generates a platform-specific LIMIT clause * * @param string $sql SQL Query * @return string */ protected function _limit($sql) { $limit = $this->qb_offset + $this->qb_limit; // As of SQL Server 2005 (9.0.*) ROW_NUMBER() is supported, // however an ORDER BY clause is required for it to work if (version_compare($this->version(), '9', '>=') && $this->qb_offset && ! empty($this->qb_orderby)) { $orderby = $this->_compile_order_by(); // We have to strip the ORDER BY clause $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results if (count($this->qb_select) === 0 OR strpos(implode(',', $this->qb_select), '*') !== FALSE) { $select = '*'; // Inevitable } else { // Use only field names and their aliases, everything else is out of our scope. $select = array(); $field_regexp = ($this->_quoted_identifier) ? '("[^\"]+")' : '(\[[^\]]+\])'; for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) { $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) ? $m[1] : $this->qb_select[$i]; } $select = implode(', ', $select); } return 'SELECT '.$select." FROM (\n\n" .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) ."\n\n) ".$this->escape_identifiers('CI_subquery') ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; } return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); } // -------------------------------------------------------------------- /** * Insert batch statement * * Generates a platform-specific insert string from the supplied data. * * @param string $table Table name * @param array $keys INSERT keys * @param array $values INSERT values * @return string|bool */ protected function _insert_batch($table, $keys, $values) { // Multiple-value inserts are only supported as of SQL Server 2008 if (version_compare($this->version(), '10', '>=')) { return parent::_insert_batch($table, $keys, $values); } return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; } // -------------------------------------------------------------------- /** * Close DB Connection * * @return void */ protected function _close() { mssql_close($this->conn_id); } } PK!®ò(ƒƒ!database/drivers/mssql/index.htmlnu„[µü¤ 403 Forbidden

    Directory access is forbidden.

    PK!;þ á¶¶(database/drivers/mysql/mysql_utility.phpnu„[µü¤db->query('SHOW CREATE TABLE '.$this->db->escape_identifiers($this->db->database.'.'.$table)); // No result means the table name was invalid if ($query === FALSE) { continue; } // Write out the table schema $output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline; if ($add_drop === TRUE) { $output .= 'DROP TABLE IF EXISTS '.$this->db->protect_identifiers($table).';'.$newline.$newline; } $i = 0; $result = $query->result_array(); foreach ($result[0] as $val) { if ($i++ % 2) { $output .= $val.';'.$newline.$newline; } } // If inserts are not needed we're done... if ($add_insert === FALSE) { continue; } // Grab all the data from the current table $query = $this->db->query('SELECT * FROM '.$this->db->protect_identifiers($table)); if ($query->num_rows() === 0) { continue; } // Fetch the field names and determine if the field is an // integer type. We use this info to decide whether to // surround the data with quotes or not $i = 0; $field_str = ''; $is_int = array(); while ($field = mysql_fetch_field($query->result_id)) { // Most versions of MySQL store timestamp as a string $is_int[$i] = in_array(strtolower(mysql_field_type($query->result_id, $i)), array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'), TRUE); // Create a string of field names $field_str .= $this->db->escape_identifiers($field->name).', '; $i++; } // Trim off the end comma $field_str = preg_replace('/, $/' , '', $field_str); // Build the insert string foreach ($query->result_array() as $row) { $val_str = ''; $i = 0; foreach ($row as $v) { // Is the value NULL? if ($v === NULL) { $val_str .= 'NULL'; } else { // Escape the data if it's not an integer $val_str .= ($is_int[$i] === FALSE) ? $this->db->escape($v) : $v; } // Append a comma $val_str .= ', '; $i++; } // Remove the comma at the end of the string $val_str = preg_replace('/, $/' , '', $val_str); // Build the INSERT string $output .= 'INSERT INTO '.$this->db->protect_identifiers($table).' ('.$field_str.') VALUES ('.$val_str.');'.$newline; } $output .= $newline.$newline; } // Do we need to include a statement to re-enable foreign key checks? if ($foreign_key_checks === FALSE) { $output .= 'SET foreign_key_checks = 1;'.$newline; } return $output; } } PK!Kr%ææ'database/drivers/mysql/mysql_result.phpnu„[µü¤num_rows = mysql_num_rows($this->result_id); } // -------------------------------------------------------------------- /** * Number of rows in the result set * * @return int */ public function num_rows() { return $this->num_rows; } // -------------------------------------------------------------------- /** * Number of fields in the result set * * @return int */ public function num_fields() { return mysql_num_fields($this->result_id); } // -------------------------------------------------------------------- /** * Fetch Field Names * * Generates an array of column names * * @return array */ public function list_fields() { $field_names = array(); mysql_field_seek($this->result_id, 0); while ($field = mysql_fetch_field($this->result_id)) { $field_names[] = $field->name; } return $field_names; } // -------------------------------------------------------------------- /** * Field data * * Generates an array of objects containing field meta-data * * @return array */ public function field_data() { $retval = array(); for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = mysql_field_name($this->result_id, $i); $retval[$i]->type = mysql_field_type($this->result_id, $i); $retval[$i]->max_length = mysql_field_len($this->result_id, $i); $retval[$i]->primary_key = (int) (strpos(mysql_field_flags($this->result_id, $i), 'primary_key') !== FALSE); } return $retval; } // -------------------------------------------------------------------- /** * Free the result * * @return void */ public function free_result() { if (is_resource($this->result_id)) { mysql_free_result($this->result_id); $this->result_id = FALSE; } } // -------------------------------------------------------------------- /** * Data Seek * * Moves the internal pointer to the desired offset. We call * this internally before fetching results to make sure the * result set starts at zero. * * @param int $n * @return bool */ public function data_seek($n = 0) { return $this->num_rows ? mysql_data_seek($this->result_id, $n) : FALSE; } // -------------------------------------------------------------------- /** * Result - associative array * * Returns the result set as an array * * @return array */ protected function _fetch_assoc() { return mysql_fetch_assoc($this->result_id); } // -------------------------------------------------------------------- /** * Result - object * * Returns the result set as an object * * @param string $class_name * @return object */ protected function _fetch_object($class_name = 'stdClass') { return mysql_fetch_object($this->result_id, $class_name); } } PK!h+80--'database/drivers/mysql/mysql_driver.phpnu„[µü¤port)) { $this->hostname .= ':'.$this->port; } } // -------------------------------------------------------------------- /** * Non-persistent database connection * * @param bool $persistent * @return resource */ public function db_connect($persistent = FALSE) { $client_flags = ($this->compress === FALSE) ? 0 : MYSQL_CLIENT_COMPRESS; if ($this->encrypt === TRUE) { $client_flags = $client_flags | MYSQL_CLIENT_SSL; } // Error suppression is necessary mostly due to PHP 5.5+ issuing E_DEPRECATED messages $this->conn_id = ($persistent === TRUE) ? mysql_pconnect($this->hostname, $this->username, $this->password, $client_flags) : mysql_connect($this->hostname, $this->username, $this->password, TRUE, $client_flags); // ---------------------------------------------------------------- // Select the DB... assuming a database name is specified in the config file if ($this->database !== '' && ! $this->db_select()) { log_message('error', 'Unable to select database: '.$this->database); return ($this->db_debug === TRUE) ? $this->display_error('db_unable_to_select', $this->database) : FALSE; } if (isset($this->stricton) && is_resource($this->conn_id)) { if ($this->stricton) { $this->simple_query('SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'); } else { $this->simple_query( 'SET SESSION sql_mode = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( @@sql_mode, "STRICT_ALL_TABLES,", ""), ",STRICT_ALL_TABLES", ""), "STRICT_ALL_TABLES", ""), "STRICT_TRANS_TABLES,", ""), ",STRICT_TRANS_TABLES", ""), "STRICT_TRANS_TABLES", "")' ); } } return $this->conn_id; } // -------------------------------------------------------------------- /** * Reconnect * * Keep / reestablish the db connection if no queries have been * sent for a length of time exceeding the server's idle timeout * * @return void */ public function reconnect() { if (mysql_ping($this->conn_id) === FALSE) { $this->conn_id = FALSE; } } // -------------------------------------------------------------------- /** * Select the database * * @param string $database * @return bool */ public function db_select($database = '') { if ($database === '') { $database = $this->database; } if (mysql_select_db($database, $this->conn_id)) { $this->database = $database; $this->data_cache = array(); return TRUE; } return FALSE; } // -------------------------------------------------------------------- /** * Set client character set * * @param string $charset * @return bool */ protected function _db_set_charset($charset) { return mysql_set_charset($charset, $this->conn_id); } // -------------------------------------------------------------------- /** * Database version number * * @return string */ public function version() { if (isset($this->data_cache['version'])) { return $this->data_cache['version']; } if ( ! $this->conn_id OR ($version = mysql_get_server_info($this->conn_id)) === FALSE) { return FALSE; } return $this->data_cache['version'] = $version; } // -------------------------------------------------------------------- /** * Execute the query * * @param string $sql an SQL query * @return mixed */ protected function _execute($sql) { return mysql_query($this->_prep_query($sql), $this->conn_id); } // -------------------------------------------------------------------- /** * Prep the query * * If needed, each database adapter can prep the query string * * @param string $sql an SQL query * @return string */ protected function _prep_query($sql) { // mysql_affected_rows() returns 0 for "DELETE FROM TABLE" queries. This hack // modifies the query so that it a proper number of affected rows is returned. if ($this->delete_hack === TRUE && preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql)) { return trim($sql).' WHERE 1=1'; } return $sql; } // -------------------------------------------------------------------- /** * Begin Transaction * * @return bool */ protected function _trans_begin() { $this->simple_query('SET AUTOCOMMIT=0'); return $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK } // -------------------------------------------------------------------- /** * Commit Transaction * * @return bool */ protected function _trans_commit() { if ($this->simple_query('COMMIT')) { $this->simple_query('SET AUTOCOMMIT=1'); return TRUE; } return FALSE; } // -------------------------------------------------------------------- /** * Rollback Transaction * * @return bool */ protected function _trans_rollback() { if ($this->simple_query('ROLLBACK')) { $this->simple_query('SET AUTOCOMMIT=1'); return TRUE; } return FALSE; } // -------------------------------------------------------------------- /** * Platform-dependent string escape * * @param string * @return string */ protected function _escape_str($str) { return mysql_real_escape_string($str, $this->conn_id); } // -------------------------------------------------------------------- /** * Affected Rows * * @return int */ public function affected_rows() { return mysql_affected_rows($this->conn_id); } // -------------------------------------------------------------------- /** * Insert ID * * @return int */ public function insert_id() { return mysql_insert_id($this->conn_id); } // -------------------------------------------------------------------- /** * List table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SHOW TABLES FROM '.$this->_escape_char.$this->database.$this->_escape_char; if ($prefix_limit !== FALSE && $this->dbprefix !== '') { return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; } return $sql; } // -------------------------------------------------------------------- /** * Show column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return string */ protected function _list_columns($table = '') { return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) { return FALSE; } $query = $query->result_object(); $retval = array(); for ($i = 0, $c = count($query); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = $query[$i]->Field; sscanf($query[$i]->Type, '%[a-z](%d)', $retval[$i]->type, $retval[$i]->max_length ); $retval[$i]->default = $query[$i]->Default; $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); } return $retval; } // -------------------------------------------------------------------- /** * Error * * Returns an array containing code and message of the last * database error that has occurred. * * @return array */ public function error() { return array('code' => mysql_errno($this->conn_id), 'message' => mysql_error($this->conn_id)); } // -------------------------------------------------------------------- /** * FROM tables * * Groups tables in FROM clauses if needed, so there is no confusion * about operator precedence. * * @return string */ protected function _from_tables() { if ( ! empty($this->qb_join) && count($this->qb_from) > 1) { return '('.implode(', ', $this->qb_from).')'; } return implode(', ', $this->qb_from); } // -------------------------------------------------------------------- /** * Close DB Connection * * @return void */ protected function _close() { // Error suppression to avoid annoying E_WARNINGs in cases // where the connection has already been closed for some reason. @mysql_close($this->conn_id); } } PK!ýùžõõ&database/drivers/mysql/mysql_forge.phpnu„[µü¤db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET')) { $sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set; } if ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE')) { $sql .= ' COLLATE = '.$this->db->dbcollat; } return $sql; } // -------------------------------------------------------------------- /** * ALTER TABLE * * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if ($alter_type === 'DROP') { return parent::_alter_table($alter_type, $table, $field); } $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); for ($i = 0, $c = count($field); $i < $c; $i++) { if ($field[$i]['_literal'] !== FALSE) { $field[$i] = ($alter_type === 'ADD') ? "\n\tADD ".$field[$i]['_literal'] : "\n\tMODIFY ".$field[$i]['_literal']; } else { if ($alter_type === 'ADD') { $field[$i]['_literal'] = "\n\tADD "; } else { $field[$i]['_literal'] = empty($field[$i]['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE "; } $field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]); } } return array($sql.implode(',', $field)); } // -------------------------------------------------------------------- /** * Process column * * @param array $field * @return string */ protected function _process_column($field) { $extra_clause = isset($field['after']) ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) { $extra_clause = ' FIRST'; } return $this->db->escape_identifiers($field['name']) .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) .' '.$field['type'].$field['length'] .$field['unsigned'] .$field['null'] .$field['default'] .$field['auto_increment'] .$field['unique'] .(empty($field['comment']) ? '' : ' COMMENT '.$field['comment']) .$extra_clause; } // -------------------------------------------------------------------- /** * Process indexes * * @param string $table (ignored) * @return string */ protected function _process_indexes($table) { $sql = ''; for ($i = 0, $c = count($this->keys); $i < $c; $i++) { if (is_array($this->keys[$i])) { for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) { if ( ! isset($this->fields[$this->keys[$i][$i2]])) { unset($this->keys[$i][$i2]); continue; } } } elseif ( ! isset($this->fields[$this->keys[$i]])) { unset($this->keys[$i]); continue; } is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; } $this->keys = array(); return $sql; } } PK!®ò(ƒƒ!database/drivers/mysql/index.htmlnu„[µü¤ 403 Forbidden

    Directory access is forbidden.

    PK!­Cj%ÙÙ%database/drivers/odbc/odbc_result.phpnu„[µü¤num_rows)) { return $this->num_rows; } elseif (($this->num_rows = odbc_num_rows($this->result_id)) !== -1) { return $this->num_rows; } // Work-around for ODBC subdrivers that don't support num_rows() if (count($this->result_array) > 0) { return $this->num_rows = count($this->result_array); } elseif (count($this->result_object) > 0) { return $this->num_rows = count($this->result_object); } return $this->num_rows = count($this->result_array()); } // -------------------------------------------------------------------- /** * Number of fields in the result set * * @return int */ public function num_fields() { return odbc_num_fields($this->result_id); } // -------------------------------------------------------------------- /** * Fetch Field Names * * Generates an array of column names * * @return array */ public function list_fields() { $field_names = array(); $num_fields = $this->num_fields(); if ($num_fields > 0) { for ($i = 1; $i <= $num_fields; $i++) { $field_names[] = odbc_field_name($this->result_id, $i); } } return $field_names; } // -------------------------------------------------------------------- /** * Field data * * Generates an array of objects containing field meta-data * * @return array */ public function field_data() { $retval = array(); for ($i = 0, $odbc_index = 1, $c = $this->num_fields(); $i < $c; $i++, $odbc_index++) { $retval[$i] = new stdClass(); $retval[$i]->name = odbc_field_name($this->result_id, $odbc_index); $retval[$i]->type = odbc_field_type($this->result_id, $odbc_index); $retval[$i]->max_length = odbc_field_len($this->result_id, $odbc_index); $retval[$i]->primary_key = 0; $retval[$i]->default = ''; } return $retval; } // -------------------------------------------------------------------- /** * Free the result * * @return void */ public function free_result() { if (is_resource($this->result_id)) { odbc_free_result($this->result_id); $this->result_id = FALSE; } } // -------------------------------------------------------------------- /** * Result - associative array * * Returns the result set as an array * * @return array */ protected function _fetch_assoc() { return odbc_fetch_array($this->result_id); } // -------------------------------------------------------------------- /** * Result - object * * Returns the result set as an object * * @param string $class_name * @return object */ protected function _fetch_object($class_name = 'stdClass') { $row = odbc_fetch_object($this->result_id); if ($class_name === 'stdClass' OR ! $row) { return $row; } $class_name = new $class_name(); foreach ($row as $key => $value) { $class_name->$key = $value; } return $class_name; } } // -------------------------------------------------------------------- if ( ! function_exists('odbc_fetch_array')) { /** * ODBC Fetch array * * Emulates the native odbc_fetch_array() function when * it is not available (odbc_fetch_array() requires unixODBC) * * @param resource &$result * @param int $rownumber * @return array */ function odbc_fetch_array(&$result, $rownumber = 1) { $rs = array(); if ( ! odbc_fetch_into($result, $rs, $rownumber)) { return FALSE; } $rs_assoc = array(); foreach ($rs as $k => $v) { $field_name = odbc_field_name($result, $k+1); $rs_assoc[$field_name] = $v; } return $rs_assoc; } } // -------------------------------------------------------------------- if ( ! function_exists('odbc_fetch_object')) { /** * ODBC Fetch object * * Emulates the native odbc_fetch_object() function when * it is not available. * * @param resource &$result * @param int $rownumber * @return object */ function odbc_fetch_object(&$result, $rownumber = 1) { $rs = array(); if ( ! odbc_fetch_into($result, $rs, $rownumber)) { return FALSE; } $rs_object = new stdClass(); foreach ($rs as $k => $v) { $field_name = odbc_field_name($result, $k+1); $rs_object->$field_name = $v; } return $rs_object; } } PK!ý`Q‰‰&database/drivers/odbc/odbc_utility.phpnu„[µü¤db->display_error('db_unsupported_feature'); } } PK!êÖ×0ù ù $database/drivers/odbc/odbc_forge.phpnu„[µü¤dsn)) { $this->dsn = $this->hostname; } } // -------------------------------------------------------------------- /** * Non-persistent database connection * * @param bool $persistent * @return resource */ public function db_connect($persistent = FALSE) { return ($persistent === TRUE) ? odbc_pconnect($this->dsn, $this->username, $this->password) : odbc_connect($this->dsn, $this->username, $this->password); } // -------------------------------------------------------------------- /** * Compile Bindings * * @param string $sql SQL statement * @param array $binds An array of values to bind * @return string */ public function compile_binds($sql, $binds) { if (empty($binds) OR empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE) { return $sql; } elseif ( ! is_array($binds)) { $binds = array($binds); $bind_count = 1; } else { // Make sure we're using numeric keys $binds = array_values($binds); $bind_count = count($binds); } // We'll need the marker length later $ml = strlen($this->bind_marker); // Make sure not to replace a chunk inside a string that happens to match the bind marker if ($c = preg_match_all("/'[^']*'|\"[^\"]*\"/i", $sql, $matches)) { $c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', str_replace($matches[0], str_replace($this->bind_marker, str_repeat(' ', $ml), $matches[0]), $sql, $c), $matches, PREG_OFFSET_CAPTURE); // Bind values' count must match the count of markers in the query if ($bind_count !== $c) { return $sql; } } elseif (($c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', $sql, $matches, PREG_OFFSET_CAPTURE)) !== $bind_count) { return $sql; } if ($this->bind_marker !== '?') { do { $c--; $sql = substr_replace($sql, '?', $matches[0][$c][1], $ml); } while ($c !== 0); } if (FALSE !== ($this->odbc_result = odbc_prepare($this->conn_id, $sql))) { $this->binds = array_values($binds); } return $sql; } // -------------------------------------------------------------------- /** * Execute the query * * @param string $sql an SQL query * @return resource */ protected function _execute($sql) { if ( ! isset($this->odbc_result)) { return odbc_exec($this->conn_id, $sql); } elseif ($this->odbc_result === FALSE) { return FALSE; } if (TRUE === ($success = odbc_execute($this->odbc_result, $this->binds))) { // For queries that return result sets, return the result_id resource on success $this->is_write_type($sql) OR $success = $this->odbc_result; } $this->odbc_result = NULL; $this->binds = array(); return $success; } // -------------------------------------------------------------------- /** * Begin Transaction * * @return bool */ protected function _trans_begin() { return odbc_autocommit($this->conn_id, FALSE); } // -------------------------------------------------------------------- /** * Commit Transaction * * @return bool */ protected function _trans_commit() { if (odbc_commit($this->conn_id)) { odbc_autocommit($this->conn_id, TRUE); return TRUE; } return FALSE; } // -------------------------------------------------------------------- /** * Rollback Transaction * * @return bool */ protected function _trans_rollback() { if (odbc_rollback($this->conn_id)) { odbc_autocommit($this->conn_id, TRUE); return TRUE; } return FALSE; } // -------------------------------------------------------------------- /** * Determines if a query is a "write" type. * * @param string An SQL query string * @return bool */ public function is_write_type($sql) { if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) { return FALSE; } return parent::is_write_type($sql); } // -------------------------------------------------------------------- /** * Platform-dependent string escape * * @param string * @return string */ protected function _escape_str($str) { $this->display_error('db_unsupported_feature'); } // -------------------------------------------------------------------- /** * Affected Rows * * @return int */ public function affected_rows() { return odbc_num_rows($this->result_id); } // -------------------------------------------------------------------- /** * Insert ID * * @return bool */ public function insert_id() { return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; } // -------------------------------------------------------------------- /** * Show table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = '".$this->schema."'"; if ($prefix_limit !== FALSE && $this->dbprefix !== '') { return $sql." AND table_name LIKE '".$this->escape_like_str($this->dbprefix)."%' " .sprintf($this->_like_escape_str, $this->_like_escape_chr); } return $sql; } // -------------------------------------------------------------------- /** * Show column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return string */ protected function _list_columns($table = '') { return 'SHOW COLUMNS FROM '.$table; } // -------------------------------------------------------------------- /** * Field data query * * Generates a platform-specific query so that the column data can be retrieved * * @param string $table * @return string */ protected function _field_data($table) { return 'SELECT TOP 1 FROM '.$table; } // -------------------------------------------------------------------- /** * Error * * Returns an array containing code and message of the last * database error that has occurred. * * @return array */ public function error() { return array('code' => odbc_error($this->conn_id), 'message' => odbc_errormsg($this->conn_id)); } // -------------------------------------------------------------------- /** * Close DB Connection * * @return void */ protected function _close() { odbc_close($this->conn_id); } } PK!®ò(ƒƒ database/drivers/odbc/index.htmlnu„[µü¤ 403 Forbidden

    Directory access is forbidden.

    PK!±†õ //'database/drivers/ibase/ibase_result.phpnu„[µü¤result_id); } // -------------------------------------------------------------------- /** * Fetch Field Names * * Generates an array of column names * * @return array */ public function list_fields() { $field_names = array(); for ($i = 0, $num_fields = $this->num_fields(); $i < $num_fields; $i++) { $info = ibase_field_info($this->result_id, $i); $field_names[] = $info['name']; } return $field_names; } // -------------------------------------------------------------------- /** * Field data * * Generates an array of objects containing field meta-data * * @return array */ public function field_data() { $retval = array(); for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) { $info = ibase_field_info($this->result_id, $i); $retval[$i] = new stdClass(); $retval[$i]->name = $info['name']; $retval[$i]->type = $info['type']; $retval[$i]->max_length = $info['length']; } return $retval; } // -------------------------------------------------------------------- /** * Free the result * * @return void */ public function free_result() { ibase_free_result($this->result_id); } // -------------------------------------------------------------------- /** * Result - associative array * * Returns the result set as an array * * @return array */ protected function _fetch_assoc() { return ibase_fetch_assoc($this->result_id, IBASE_FETCH_BLOBS); } // -------------------------------------------------------------------- /** * Result - object * * Returns the result set as an object * * @param string $class_name * @return object */ protected function _fetch_object($class_name = 'stdClass') { $row = ibase_fetch_object($this->result_id, IBASE_FETCH_BLOBS); if ($class_name === 'stdClass' OR ! $row) { return $row; } $class_name = new $class_name(); foreach ($row as $key => $value) { $class_name->$key = $value; } return $class_name; } } PK!kÐÈ(È('database/drivers/ibase/ibase_driver.phpnu„[µü¤hostname.':'.$this->database, $this->username, $this->password, $this->char_set) : ibase_connect($this->hostname.':'.$this->database, $this->username, $this->password, $this->char_set); } // -------------------------------------------------------------------- /** * Database version number * * @return string */ public function version() { if (isset($this->data_cache['version'])) { return $this->data_cache['version']; } if (($service = ibase_service_attach($this->hostname, $this->username, $this->password))) { $this->data_cache['version'] = ibase_server_info($service, IBASE_SVC_SERVER_VERSION); // Don't keep the service open ibase_service_detach($service); return $this->data_cache['version']; } return FALSE; } // -------------------------------------------------------------------- /** * Execute the query * * @param string $sql an SQL query * @return resource */ protected function _execute($sql) { return ibase_query(isset($this->_ibase_trans) ? $this->_ibase_trans : $this->conn_id, $sql); } // -------------------------------------------------------------------- /** * Begin Transaction * * @return bool */ protected function _trans_begin() { if (($trans_handle = ibase_trans($this->conn_id)) === FALSE) { return FALSE; } $this->_ibase_trans = $trans_handle; return TRUE; } // -------------------------------------------------------------------- /** * Commit Transaction * * @return bool */ protected function _trans_commit() { if (ibase_commit($this->_ibase_trans)) { $this->_ibase_trans = NULL; return TRUE; } return FALSE; } // -------------------------------------------------------------------- /** * Rollback Transaction * * @return bool */ protected function _trans_rollback() { if (ibase_rollback($this->_ibase_trans)) { $this->_ibase_trans = NULL; return TRUE; } return FALSE; } // -------------------------------------------------------------------- /** * Affected Rows * * @return int */ public function affected_rows() { return ibase_affected_rows($this->conn_id); } // -------------------------------------------------------------------- /** * Insert ID * * @param string $generator_name * @param int $inc_by * @return int */ public function insert_id($generator_name, $inc_by = 0) { //If a generator hasn't been used before it will return 0 return ibase_gen_id('"'.$generator_name.'"', $inc_by); } // -------------------------------------------------------------------- /** * List table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SELECT TRIM("RDB$RELATION_NAME") AS TABLE_NAME FROM "RDB$RELATIONS" WHERE "RDB$RELATION_NAME" NOT LIKE \'RDB$%\' AND "RDB$RELATION_NAME" NOT LIKE \'MON$%\''; if ($prefix_limit !== FALSE && $this->dbprefix !== '') { return $sql.' AND TRIM("RDB$RELATION_NAME") AS TABLE_NAME LIKE \''.$this->escape_like_str($this->dbprefix)."%' " .sprintf($this->_like_escape_str, $this->_like_escape_chr); } return $sql; } // -------------------------------------------------------------------- /** * Show column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return string */ protected function _list_columns($table = '') { return 'SELECT TRIM("RDB$FIELD_NAME") AS COLUMN_NAME FROM "RDB$RELATION_FIELDS" WHERE "RDB$RELATION_NAME" = '.$this->escape($table); } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { $sql = 'SELECT "rfields"."RDB$FIELD_NAME" AS "name", CASE "fields"."RDB$FIELD_TYPE" WHEN 7 THEN \'SMALLINT\' WHEN 8 THEN \'INTEGER\' WHEN 9 THEN \'QUAD\' WHEN 10 THEN \'FLOAT\' WHEN 11 THEN \'DFLOAT\' WHEN 12 THEN \'DATE\' WHEN 13 THEN \'TIME\' WHEN 14 THEN \'CHAR\' WHEN 16 THEN \'INT64\' WHEN 27 THEN \'DOUBLE\' WHEN 35 THEN \'TIMESTAMP\' WHEN 37 THEN \'VARCHAR\' WHEN 40 THEN \'CSTRING\' WHEN 261 THEN \'BLOB\' ELSE NULL END AS "type", "fields"."RDB$FIELD_LENGTH" AS "max_length", "rfields"."RDB$DEFAULT_VALUE" AS "default" FROM "RDB$RELATION_FIELDS" "rfields" JOIN "RDB$FIELDS" "fields" ON "rfields"."RDB$FIELD_SOURCE" = "fields"."RDB$FIELD_NAME" WHERE "rfields"."RDB$RELATION_NAME" = '.$this->escape($table).' ORDER BY "rfields"."RDB$FIELD_POSITION"'; return (($query = $this->query($sql)) !== FALSE) ? $query->result_object() : FALSE; } // -------------------------------------------------------------------- /** * Error * * Returns an array containing code and message of the last * database error that has occurred. * * @return array */ public function error() { return array('code' => ibase_errcode(), 'message' => ibase_errmsg()); } // -------------------------------------------------------------------- /** * Update statement * * Generates a platform-specific update string from the supplied data * * @param string $table * @param array $values * @return string */ protected function _update($table, $values) { $this->qb_limit = FALSE; return parent::_update($table, $values); } // -------------------------------------------------------------------- /** * Truncate statement * * Generates a platform-specific truncate string from the supplied data * * If the database does not support the TRUNCATE statement, * then this method maps to 'DELETE FROM table' * * @param string $table * @return string */ protected function _truncate($table) { return 'DELETE FROM '.$table; } // -------------------------------------------------------------------- /** * Delete statement * * Generates a platform-specific delete string from the supplied data * * @param string $table * @return string */ protected function _delete($table) { $this->qb_limit = FALSE; return parent::_delete($table); } // -------------------------------------------------------------------- /** * LIMIT * * Generates a platform-specific LIMIT clause * * @param string $sql SQL Query * @return string */ protected function _limit($sql) { // Limit clause depends on if Interbase or Firebird if (stripos($this->version(), 'firebird') !== FALSE) { $select = 'FIRST '.$this->qb_limit .($this->qb_offset ? ' SKIP '.$this->qb_offset : ''); } else { $select = 'ROWS ' .($this->qb_offset ? $this->qb_offset.' TO '.($this->qb_limit + $this->qb_offset) : $this->qb_limit); } return preg_replace('`SELECT`i', 'SELECT '.$select, $sql, 1); } // -------------------------------------------------------------------- /** * Insert batch statement * * Generates a platform-specific insert string from the supplied data. * * @param string $table Table name * @param array $keys INSERT keys * @param array $values INSERT values * @return string|bool */ protected function _insert_batch($table, $keys, $values) { return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; } // -------------------------------------------------------------------- /** * Close DB Connection * * @return void */ protected function _close() { ibase_close($this->conn_id); } } PK!Só¿@) ) (database/drivers/ibase/ibase_utility.phpnu„[µü¤db->hostname, $this->db->username, $this->db->password)) { $res = ibase_backup($service, $this->db->database, $filename.'.fbk'); // Close the service connection ibase_service_detach($service); return $res; } return FALSE; } } PK!®ò(ƒƒ!database/drivers/ibase/index.htmlnu„[µü¤ 403 Forbidden

    Directory access is forbidden.

    PK!t„1ÖEE&database/drivers/ibase/ibase_forge.phpnu„[µü¤ 'INTEGER', 'INTEGER' => 'INT64', 'FLOAT' => 'DOUBLE PRECISION' ); /** * NULL value representation in CREATE/ALTER TABLE statements * * @var string */ protected $_null = 'NULL'; // -------------------------------------------------------------------- /** * Create database * * @param string $db_name * @return bool */ public function create_database($db_name) { // Firebird databases are flat files, so a path is required // Hostname is needed for remote access empty($this->db->hostname) OR $db_name = $this->hostname.':'.$db_name; return parent::create_database('"'.$db_name.'"'); } // -------------------------------------------------------------------- /** * Drop database * * @param string $db_name (ignored) * @return bool */ public function drop_database($db_name) { if ( ! ibase_drop_db($this->conn_id)) { return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; } elseif ( ! empty($this->db->data_cache['db_names'])) { $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); if ($key !== FALSE) { unset($this->db->data_cache['db_names'][$key]); } } return TRUE; } // -------------------------------------------------------------------- /** * ALTER TABLE * * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) { return parent::_alter_table($alter_type, $table, $field); } $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); $sqls = array(); for ($i = 0, $c = count($field); $i < $c; $i++) { if ($field[$i]['_literal'] !== FALSE) { return FALSE; } if (isset($field[$i]['type'])) { $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identififers($field[$i]['name']) .' TYPE '.$field[$i]['type'].$field[$i]['length']; } if ( ! empty($field[$i]['default'])) { $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) .' SET DEFAULT '.$field[$i]['default']; } if (isset($field[$i]['null'])) { $sqls[] = 'UPDATE "RDB$RELATION_FIELDS" SET "RDB$NULL_FLAG" = ' .($field[$i]['null'] === TRUE ? 'NULL' : '1') .' WHERE "RDB$FIELD_NAME" = '.$this->db->escape($field[$i]['name']) .' AND "RDB$RELATION_NAME" = '.$this->db->escape($table); } if ( ! empty($field[$i]['new_name'])) { $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); } } return $sqls; } // -------------------------------------------------------------------- /** * Process column * * @param array $field * @return string */ protected function _process_column($field) { return $this->db->escape_identifiers($field['name']) .' '.$field['type'].$field['length'] .$field['null'] .$field['unique'] .$field['default']; } // -------------------------------------------------------------------- /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { switch (strtoupper($attributes['TYPE'])) { case 'TINYINT': $attributes['TYPE'] = 'SMALLINT'; $attributes['UNSIGNED'] = FALSE; return; case 'MEDIUMINT': $attributes['TYPE'] = 'INTEGER'; $attributes['UNSIGNED'] = FALSE; return; case 'INT': $attributes['TYPE'] = 'INTEGER'; return; case 'BIGINT': $attributes['TYPE'] = 'INT64'; return; default: return; } } // -------------------------------------------------------------------- /** * Field attribute AUTO_INCREMENT * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_auto_increment(&$attributes, &$field) { // Not supported } } PK!AêpÆZZ*database/drivers/postgre/postgre_forge.phpnu„[µü¤ 'INTEGER', 'SMALLINT' => 'INTEGER', 'INT' => 'BIGINT', 'INT4' => 'BIGINT', 'INTEGER' => 'BIGINT', 'INT8' => 'NUMERIC', 'BIGINT' => 'NUMERIC', 'REAL' => 'DOUBLE PRECISION', 'FLOAT' => 'DOUBLE PRECISION' ); /** * NULL value representation in CREATE/ALTER TABLE statements * * @var string */ protected $_null = 'NULL'; // -------------------------------------------------------------------- /** * Class constructor * * @param object &$db Database object * @return void */ public function __construct(&$db) { parent::__construct($db); if (version_compare($this->db->version(), '9.0', '>')) { $this->create_table_if = 'CREATE TABLE IF NOT EXISTS'; } } // -------------------------------------------------------------------- /** * ALTER TABLE * * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) { return parent::_alter_table($alter_type, $table, $field); } $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); $sqls = array(); for ($i = 0, $c = count($field); $i < $c; $i++) { if ($field[$i]['_literal'] !== FALSE) { return FALSE; } if (version_compare($this->db->version(), '8', '>=') && isset($field[$i]['type'])) { $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) .' TYPE '.$field[$i]['type'].$field[$i]['length']; } if ( ! empty($field[$i]['default'])) { $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) .' SET '.$field[$i]['default']; } if (isset($field[$i]['null'])) { $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) .(trim($field[$i]['null']) === $this->_null ? ' DROP NOT NULL' : ' SET NOT NULL'); } if ( ! empty($field[$i]['new_name'])) { $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); } if ( ! empty($field[$i]['comment'])) { $sqls[] = 'COMMENT ON COLUMN ' .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) .' IS '.$field[$i]['comment']; } } return $sqls; } // -------------------------------------------------------------------- /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { // Reset field lengths for data types that don't support it if (isset($attributes['CONSTRAINT']) && stripos($attributes['TYPE'], 'int') !== FALSE) { $attributes['CONSTRAINT'] = NULL; } switch (strtoupper($attributes['TYPE'])) { case 'TINYINT': $attributes['TYPE'] = 'SMALLINT'; $attributes['UNSIGNED'] = FALSE; return; case 'MEDIUMINT': $attributes['TYPE'] = 'INTEGER'; $attributes['UNSIGNED'] = FALSE; return; default: return; } } // -------------------------------------------------------------------- /** * Field attribute AUTO_INCREMENT * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_auto_increment(&$attributes, &$field) { if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) { $field['type'] = ($field['type'] === 'NUMERIC') ? 'BIGSERIAL' : 'SERIAL'; } } } PK! Äiq~9~9+database/drivers/postgre/postgre_driver.phpnu„[µü¤dsn)) { return; } $this->dsn === '' OR $this->dsn = ''; if (strpos($this->hostname, '/') !== FALSE) { // If UNIX sockets are used, we shouldn't set a port $this->port = ''; } $this->hostname === '' OR $this->dsn = 'host='.$this->hostname.' '; if ( ! empty($this->port) && ctype_digit($this->port)) { $this->dsn .= 'port='.$this->port.' '; } if ($this->username !== '') { $this->dsn .= 'user='.$this->username.' '; /* An empty password is valid! * * $db['password'] = NULL must be done in order to ignore it. */ $this->password === NULL OR $this->dsn .= "password='".$this->password."' "; } $this->database === '' OR $this->dsn .= 'dbname='.$this->database.' '; /* We don't have these options as elements in our standard configuration * array, but they might be set by parse_url() if the configuration was * provided via string. Example: * * postgre://username:password@localhost:5432/database?connect_timeout=5&sslmode=1 */ foreach (array('connect_timeout', 'options', 'sslmode', 'service') as $key) { if (isset($this->$key) && is_string($this->$key) && $this->$key !== '') { $this->dsn .= $key."='".$this->$key."' "; } } $this->dsn = rtrim($this->dsn); } // -------------------------------------------------------------------- /** * Database connection * * @param bool $persistent * @return resource */ public function db_connect($persistent = FALSE) { $this->conn_id = ($persistent === TRUE) ? pg_pconnect($this->dsn) : pg_connect($this->dsn); if ($this->conn_id !== FALSE) { if ($persistent === TRUE && pg_connection_status($this->conn_id) === PGSQL_CONNECTION_BAD && pg_ping($this->conn_id) === FALSE ) { return FALSE; } empty($this->schema) OR $this->simple_query('SET search_path TO '.$this->schema.',public'); } return $this->conn_id; } // -------------------------------------------------------------------- /** * Reconnect * * Keep / reestablish the db connection if no queries have been * sent for a length of time exceeding the server's idle timeout * * @return void */ public function reconnect() { if (pg_ping($this->conn_id) === FALSE) { $this->conn_id = FALSE; } } // -------------------------------------------------------------------- /** * Set client character set * * @param string $charset * @return bool */ protected function _db_set_charset($charset) { return (pg_set_client_encoding($this->conn_id, $charset) === 0); } // -------------------------------------------------------------------- /** * Database version number * * @return string */ public function version() { if (isset($this->data_cache['version'])) { return $this->data_cache['version']; } if ( ! $this->conn_id OR ($pg_version = pg_version($this->conn_id)) === FALSE) { return FALSE; } /* If PHP was compiled with PostgreSQL lib versions earlier * than 7.4, pg_version() won't return the server version * and so we'll have to fall back to running a query in * order to get it. */ return (isset($pg_version['server']) && preg_match('#^(\d+\.\d+)#', $pg_version['server'], $match)) ? $this->data_cache['version'] = $match[1] : parent::version(); } // -------------------------------------------------------------------- /** * Execute the query * * @param string $sql an SQL query * @return resource */ protected function _execute($sql) { return pg_query($this->conn_id, $sql); } // -------------------------------------------------------------------- /** * Begin Transaction * * @return bool */ protected function _trans_begin() { return (bool) pg_query($this->conn_id, 'BEGIN'); } // -------------------------------------------------------------------- /** * Commit Transaction * * @return bool */ protected function _trans_commit() { return (bool) pg_query($this->conn_id, 'COMMIT'); } // -------------------------------------------------------------------- /** * Rollback Transaction * * @return bool */ protected function _trans_rollback() { return (bool) pg_query($this->conn_id, 'ROLLBACK'); } // -------------------------------------------------------------------- /** * Determines if a query is a "write" type. * * @param string An SQL query string * @return bool */ public function is_write_type($sql) { if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) { return FALSE; } return parent::is_write_type($sql); } // -------------------------------------------------------------------- /** * Platform-dependent string escape * * @param string * @return string */ protected function _escape_str($str) { return pg_escape_string($this->conn_id, $str); } // -------------------------------------------------------------------- /** * "Smart" Escape String * * Escapes data based on type * * @param string $str * @return mixed */ public function escape($str) { if (is_php('5.4.4') && (is_string($str) OR (is_object($str) && method_exists($str, '__toString')))) { return pg_escape_literal($this->conn_id, $str); } elseif (is_bool($str)) { return ($str) ? 'TRUE' : 'FALSE'; } return parent::escape($str); } // -------------------------------------------------------------------- /** * Affected Rows * * @return int */ public function affected_rows() { return pg_affected_rows($this->result_id); } // -------------------------------------------------------------------- /** * Insert ID * * @return string */ public function insert_id() { $v = $this->version(); $table = (func_num_args() > 0) ? func_get_arg(0) : NULL; $column = (func_num_args() > 1) ? func_get_arg(1) : NULL; if ($table === NULL && $v >= '8.1') { $sql = 'SELECT LASTVAL() AS ins_id'; } elseif ($table !== NULL) { if ($column !== NULL && $v >= '8.0') { $sql = 'SELECT pg_get_serial_sequence(\''.$table."', '".$column."') AS seq"; $query = $this->query($sql); $query = $query->row(); $seq = $query->seq; } else { // seq_name passed in table parameter $seq = $table; } $sql = 'SELECT CURRVAL(\''.$seq."') AS ins_id"; } else { return pg_last_oid($this->result_id); } $query = $this->query($sql); $query = $query->row(); return (int) $query->ins_id; } // -------------------------------------------------------------------- /** * Show table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SELECT "table_name" FROM "information_schema"."tables" WHERE "table_schema" = \''.$this->schema."'"; if ($prefix_limit !== FALSE && $this->dbprefix !== '') { return $sql.' AND "table_name" LIKE \'' .$this->escape_like_str($this->dbprefix)."%' " .sprintf($this->_like_escape_str, $this->_like_escape_chr); } return $sql; } // -------------------------------------------------------------------- /** * List column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return string */ protected function _list_columns($table = '') { return 'SELECT "column_name" FROM "information_schema"."columns" WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { $sql = 'SELECT "column_name", "data_type", "character_maximum_length", "numeric_precision", "column_default" FROM "information_schema"."columns" WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); if (($query = $this->query($sql)) === FALSE) { return FALSE; } $query = $query->result_object(); $retval = array(); for ($i = 0, $c = count($query); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = $query[$i]->column_name; $retval[$i]->type = $query[$i]->data_type; $retval[$i]->max_length = ($query[$i]->character_maximum_length > 0) ? $query[$i]->character_maximum_length : $query[$i]->numeric_precision; $retval[$i]->default = $query[$i]->column_default; } return $retval; } // -------------------------------------------------------------------- /** * Error * * Returns an array containing code and message of the last * database error that has occurred. * * @return array */ public function error() { return array('code' => '', 'message' => pg_last_error($this->conn_id)); } // -------------------------------------------------------------------- /** * ORDER BY * * @param string $orderby * @param string $direction ASC, DESC or RANDOM * @param bool $escape * @return object */ public function order_by($orderby, $direction = '', $escape = NULL) { $direction = strtoupper(trim($direction)); if ($direction === 'RANDOM') { if ( ! is_float($orderby) && ctype_digit((string) $orderby)) { $orderby = ($orderby > 1) ? (float) '0.'.$orderby : (float) $orderby; } if (is_float($orderby)) { $this->simple_query('SET SEED '.$orderby); } $orderby = $this->_random_keyword[0]; $direction = ''; $escape = FALSE; } return parent::order_by($orderby, $direction, $escape); } // -------------------------------------------------------------------- /** * Update statement * * Generates a platform-specific update string from the supplied data * * @param string $table * @param array $values * @return string */ protected function _update($table, $values) { $this->qb_limit = FALSE; $this->qb_orderby = array(); return parent::_update($table, $values); } // -------------------------------------------------------------------- /** * Update_Batch statement * * Generates a platform-specific batch update string from the supplied data * * @param string $table Table name * @param array $values Update data * @param string $index WHERE key * @return string */ protected function _update_batch($table, $values, $index) { $ids = array(); foreach ($values as $key => $val) { $ids[] = $val[$index]['value']; foreach (array_keys($val) as $field) { if ($field !== $index) { $final[$val[$field]['field']][] = 'WHEN '.$val[$index]['value'].' THEN '.$val[$field]['value']; } } } $cases = ''; foreach ($final as $k => $v) { $cases .= $k.' = (CASE '.$val[$index]['field']."\n" .implode("\n", $v)."\n" .'ELSE '.$k.' END), '; } $this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE); return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); } // -------------------------------------------------------------------- /** * Delete statement * * Generates a platform-specific delete string from the supplied data * * @param string $table * @return string */ protected function _delete($table) { $this->qb_limit = FALSE; return parent::_delete($table); } // -------------------------------------------------------------------- /** * LIMIT * * Generates a platform-specific LIMIT clause * * @param string $sql SQL Query * @return string */ protected function _limit($sql) { return $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : ''); } // -------------------------------------------------------------------- /** * Close DB Connection * * @return void */ protected function _close() { pg_close($this->conn_id); } } PK!•Ê22+database/drivers/postgre/postgre_result.phpnu„[µü¤num_rows) ? $this->num_rows : $this->num_rows = pg_num_rows($this->result_id); } // -------------------------------------------------------------------- /** * Number of fields in the result set * * @return int */ public function num_fields() { return pg_num_fields($this->result_id); } // -------------------------------------------------------------------- /** * Fetch Field Names * * Generates an array of column names * * @return array */ public function list_fields() { $field_names = array(); for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) { $field_names[] = pg_field_name($this->result_id, $i); } return $field_names; } // -------------------------------------------------------------------- /** * Field data * * Generates an array of objects containing field meta-data * * @return array */ public function field_data() { $retval = array(); for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = pg_field_name($this->result_id, $i); $retval[$i]->type = pg_field_type($this->result_id, $i); $retval[$i]->max_length = pg_field_size($this->result_id, $i); } return $retval; } // -------------------------------------------------------------------- /** * Free the result * * @return void */ public function free_result() { if (is_resource($this->result_id)) { pg_free_result($this->result_id); $this->result_id = FALSE; } } // -------------------------------------------------------------------- /** * Data Seek * * Moves the internal pointer to the desired offset. We call * this internally before fetching results to make sure the * result set starts at zero. * * @param int $n * @return bool */ public function data_seek($n = 0) { return pg_result_seek($this->result_id, $n); } // -------------------------------------------------------------------- /** * Result - associative array * * Returns the result set as an array * * @return array */ protected function _fetch_assoc() { return pg_fetch_assoc($this->result_id); } // -------------------------------------------------------------------- /** * Result - object * * Returns the result set as an object * * @param string $class_name * @return object */ protected function _fetch_object($class_name = 'stdClass') { return pg_fetch_object($this->result_id, NULL, $class_name); } } PK!®ò(ƒƒ#database/drivers/postgre/index.htmlnu„[µü¤ 403 Forbidden

    Directory access is forbidden.

    PK!Þ܂ΠΠ,database/drivers/postgre/postgre_utility.phpnu„[µü¤db->display_error('db_unsupported_feature'); } } PK!CÑ£C  &database/drivers/oci8/oci8_utility.phpnu„[µü¤db->display_error('db_unsupported_feature'); } } PK!¼}21••$database/drivers/oci8/oci8_forge.phpnu„[µü¤db->escape_identifiers($table); $sqls = array(); for ($i = 0, $c = count($field); $i < $c; $i++) { if ($field[$i]['_literal'] !== FALSE) { $field[$i] = "\n\t".$field[$i]['_literal']; } else { $field[$i]['_literal'] = "\n\t".$this->_process_column($field[$i]); if ( ! empty($field[$i]['comment'])) { $sqls[] = 'COMMENT ON COLUMN ' .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) .' IS '.$field[$i]['comment']; } if ($alter_type === 'MODIFY' && ! empty($field[$i]['new_name'])) { $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); } $field[$i] = "\n\t".$field[$i]['_literal']; } } $sql .= ' '.$alter_type.' '; $sql .= (count($field) === 1) ? $field[0] : '('.implode(',', $field).')'; // RENAME COLUMN must be executed after MODIFY array_unshift($sqls, $sql); return $sqls; } // -------------------------------------------------------------------- /** * Field attribute AUTO_INCREMENT * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_auto_increment(&$attributes, &$field) { // Not supported - sequences and triggers must be used instead } // -------------------------------------------------------------------- /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { switch (strtoupper($attributes['TYPE'])) { case 'TINYINT': $attributes['TYPE'] = 'NUMBER'; return; case 'MEDIUMINT': $attributes['TYPE'] = 'NUMBER'; return; case 'INT': $attributes['TYPE'] = 'NUMBER'; return; case 'BIGINT': $attributes['TYPE'] = 'NUMBER'; return; default: return; } } } PK!ZÖCC%database/drivers/oci8/oci8_driver.phpnu„[µü¤ '/^\(DESCRIPTION=(\(.+\)){2,}\)$/', // TNS // Easy Connect string (Oracle 10g+) 'ec' => '/^(\/\/)?[a-z0-9.:_-]+(:[1-9][0-9]{0,4})?(\/[a-z0-9$_]+)?(:[^\/])?(\/[a-z0-9$_]+)?$/i', 'in' => '/^[a-z0-9$_]+$/i' // Instance name (defined in tnsnames.ora) ); /* Space characters don't have any effect when actually * connecting, but can be a hassle while validating the DSN. */ $this->dsn = str_replace(array("\n", "\r", "\t", ' '), '', $this->dsn); if ($this->dsn !== '') { foreach ($valid_dsns as $regexp) { if (preg_match($regexp, $this->dsn)) { return; } } } // Legacy support for TNS in the hostname configuration field $this->hostname = str_replace(array("\n", "\r", "\t", ' '), '', $this->hostname); if (preg_match($valid_dsns['tns'], $this->hostname)) { $this->dsn = $this->hostname; return; } elseif ($this->hostname !== '' && strpos($this->hostname, '/') === FALSE && strpos($this->hostname, ':') === FALSE && (( ! empty($this->port) && ctype_digit($this->port)) OR $this->database !== '')) { /* If the hostname field isn't empty, doesn't contain * ':' and/or '/' and if port and/or database aren't * empty, then the hostname field is most likely indeed * just a hostname. Therefore we'll try and build an * Easy Connect string from these 3 settings, assuming * that the database field is a service name. */ $this->dsn = $this->hostname .(( ! empty($this->port) && ctype_digit($this->port)) ? ':'.$this->port : '') .($this->database !== '' ? '/'.ltrim($this->database, '/') : ''); if (preg_match($valid_dsns['ec'], $this->dsn)) { return; } } /* At this point, we can only try and validate the hostname and * database fields separately as DSNs. */ if (preg_match($valid_dsns['ec'], $this->hostname) OR preg_match($valid_dsns['in'], $this->hostname)) { $this->dsn = $this->hostname; return; } $this->database = str_replace(array("\n", "\r", "\t", ' '), '', $this->database); foreach ($valid_dsns as $regexp) { if (preg_match($regexp, $this->database)) { return; } } /* Well - OK, an empty string should work as well. * PHP will try to use environment variables to * determine which Oracle instance to connect to. */ $this->dsn = ''; } // -------------------------------------------------------------------- /** * Non-persistent database connection * * @param bool $persistent * @return resource */ public function db_connect($persistent = FALSE) { $func = ($persistent === TRUE) ? 'oci_pconnect' : 'oci_connect'; return empty($this->char_set) ? $func($this->username, $this->password, $this->dsn) : $func($this->username, $this->password, $this->dsn, $this->char_set); } // -------------------------------------------------------------------- /** * Database version number * * @return string */ public function version() { if (isset($this->data_cache['version'])) { return $this->data_cache['version']; } if ( ! $this->conn_id OR ($version_string = oci_server_version($this->conn_id)) === FALSE) { return FALSE; } elseif (preg_match('#Release\s(\d+(?:\.\d+)+)#', $version_string, $match)) { return $this->data_cache['version'] = $match[1]; } return FALSE; } // -------------------------------------------------------------------- /** * Execute the query * * @param string $sql an SQL query * @return resource */ protected function _execute($sql) { /* Oracle must parse the query before it is run. All of the actions with * the query are based on the statement id returned by oci_parse(). */ if ($this->_reset_stmt_id === TRUE) { $this->stmt_id = oci_parse($this->conn_id, $sql); } oci_set_prefetch($this->stmt_id, 1000); return oci_execute($this->stmt_id, $this->commit_mode); } // -------------------------------------------------------------------- /** * Get cursor. Returns a cursor from the database * * @return resource */ public function get_cursor() { return $this->curs_id = oci_new_cursor($this->conn_id); } // -------------------------------------------------------------------- /** * Stored Procedure. Executes a stored procedure * * @param string package name in which the stored procedure is in * @param string stored procedure name to execute * @param array parameters * @return mixed * * params array keys * * KEY OPTIONAL NOTES * name no the name of the parameter should be in : format * value no the value of the parameter. If this is an OUT or IN OUT parameter, * this should be a reference to a variable * type yes the type of the parameter * length yes the max size of the parameter */ public function stored_procedure($package, $procedure, array $params) { if ($package === '' OR $procedure === '') { log_message('error', 'Invalid query: '.$package.'.'.$procedure); return ($this->db_debug) ? $this->display_error('db_invalid_query') : FALSE; } // Build the query string $sql = 'BEGIN '.$package.'.'.$procedure.'('; $have_cursor = FALSE; foreach ($params as $param) { $sql .= $param['name'].','; if (isset($param['type']) && $param['type'] === OCI_B_CURSOR) { $have_cursor = TRUE; } } $sql = trim($sql, ',').'); END;'; $this->_reset_stmt_id = FALSE; $this->stmt_id = oci_parse($this->conn_id, $sql); $this->_bind_params($params); $result = $this->query($sql, FALSE, $have_cursor); $this->_reset_stmt_id = TRUE; return $result; } // -------------------------------------------------------------------- /** * Bind parameters * * @param array $params * @return void */ protected function _bind_params($params) { if ( ! is_array($params) OR ! is_resource($this->stmt_id)) { return; } foreach ($params as $param) { foreach (array('name', 'value', 'type', 'length') as $val) { if ( ! isset($param[$val])) { $param[$val] = ''; } } oci_bind_by_name($this->stmt_id, $param['name'], $param['value'], $param['length'], $param['type']); } } // -------------------------------------------------------------------- /** * Begin Transaction * * @return bool */ protected function _trans_begin() { $this->commit_mode = OCI_NO_AUTO_COMMIT; return TRUE; } // -------------------------------------------------------------------- /** * Commit Transaction * * @return bool */ protected function _trans_commit() { $this->commit_mode = OCI_COMMIT_ON_SUCCESS; return oci_commit($this->conn_id); } // -------------------------------------------------------------------- /** * Rollback Transaction * * @return bool */ protected function _trans_rollback() { $this->commit_mode = OCI_COMMIT_ON_SUCCESS; return oci_rollback($this->conn_id); } // -------------------------------------------------------------------- /** * Affected Rows * * @return int */ public function affected_rows() { return oci_num_rows($this->stmt_id); } // -------------------------------------------------------------------- /** * Insert ID * * @return int */ public function insert_id() { // not supported in oracle return $this->display_error('db_unsupported_function'); } // -------------------------------------------------------------------- /** * Show table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SELECT "TABLE_NAME" FROM "ALL_TABLES"'; if ($prefix_limit !== FALSE && $this->dbprefix !== '') { return $sql.' WHERE "TABLE_NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " .sprintf($this->_like_escape_str, $this->_like_escape_chr); } return $sql; } // -------------------------------------------------------------------- /** * Show column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return string */ protected function _list_columns($table = '') { if (strpos($table, '.') !== FALSE) { sscanf($table, '%[^.].%s', $owner, $table); } else { $owner = $this->username; } return 'SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { if (strpos($table, '.') !== FALSE) { sscanf($table, '%[^.].%s', $owner, $table); } else { $owner = $this->username; } $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHAR_LENGTH, DATA_PRECISION, DATA_LENGTH, DATA_DEFAULT, NULLABLE FROM ALL_TAB_COLUMNS WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); if (($query = $this->query($sql)) === FALSE) { return FALSE; } $query = $query->result_object(); $retval = array(); for ($i = 0, $c = count($query); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = $query[$i]->COLUMN_NAME; $retval[$i]->type = $query[$i]->DATA_TYPE; $length = ($query[$i]->CHAR_LENGTH > 0) ? $query[$i]->CHAR_LENGTH : $query[$i]->DATA_PRECISION; if ($length === NULL) { $length = $query[$i]->DATA_LENGTH; } $retval[$i]->max_length = $length; $default = $query[$i]->DATA_DEFAULT; if ($default === NULL && $query[$i]->NULLABLE === 'N') { $default = ''; } $retval[$i]->default = $default; } return $retval; } // -------------------------------------------------------------------- /** * Error * * Returns an array containing code and message of the last * database error that has occurred. * * @return array */ public function error() { // oci_error() returns an array that already contains // 'code' and 'message' keys, but it can return false // if there was no error .... if (is_resource($this->curs_id)) { $error = oci_error($this->curs_id); } elseif (is_resource($this->stmt_id)) { $error = oci_error($this->stmt_id); } elseif (is_resource($this->conn_id)) { $error = oci_error($this->conn_id); } else { $error = oci_error(); } return is_array($error) ? $error : array('code' => '', 'message' => ''); } // -------------------------------------------------------------------- /** * Insert batch statement * * Generates a platform-specific insert string from the supplied data * * @param string $table Table name * @param array $keys INSERT keys * @param array $values INSERT values * @return string */ protected function _insert_batch($table, $keys, $values) { $keys = implode(', ', $keys); $sql = "INSERT ALL\n"; for ($i = 0, $c = count($values); $i < $c; $i++) { $sql .= ' INTO '.$table.' ('.$keys.') VALUES '.$values[$i]."\n"; } return $sql.'SELECT * FROM dual'; } // -------------------------------------------------------------------- /** * Truncate statement * * Generates a platform-specific truncate string from the supplied data * * If the database does not support the TRUNCATE statement, * then this method maps to 'DELETE FROM table' * * @param string $table * @return string */ protected function _truncate($table) { return 'TRUNCATE TABLE '.$table; } // -------------------------------------------------------------------- /** * Delete statement * * Generates a platform-specific delete string from the supplied data * * @param string $table * @return string */ protected function _delete($table) { if ($this->qb_limit) { $this->where('rownum <= ',$this->qb_limit, FALSE); $this->qb_limit = FALSE; } return parent::_delete($table); } // -------------------------------------------------------------------- /** * LIMIT * * Generates a platform-specific LIMIT clause * * @param string $sql SQL Query * @return string */ protected function _limit($sql) { if (version_compare($this->version(), '12.1', '>=')) { // OFFSET-FETCH can be used only with the ORDER BY clause empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; } $this->limit_used = TRUE; return 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($this->qb_offset + $this->qb_limit + 1).')' .($this->qb_offset ? ' WHERE rnum >= '.($this->qb_offset + 1) : ''); } // -------------------------------------------------------------------- /** * Close DB Connection * * @return void */ protected function _close() { oci_close($this->conn_id); } // -------------------------------------------------------------------- /** * We need to reset our $limit_used hack flag, so it doesn't propagate * to subsequent queries. * * @return void */ protected function _reset_select() { $this->limit_used = FALSE; parent::_reset_select(); } } PK!®ò(ƒƒ database/drivers/oci8/index.htmlnu„[µü¤ 403 Forbidden

    Directory access is forbidden.

    PK!µý°Ããã%database/drivers/oci8/oci8_result.phpnu„[µü¤stmt_id = $driver_object->stmt_id; $this->curs_id = $driver_object->curs_id; $this->limit_used = $driver_object->limit_used; $this->commit_mode =& $driver_object->commit_mode; $driver_object->stmt_id = FALSE; } // -------------------------------------------------------------------- /** * Number of fields in the result set * * @return int */ public function num_fields() { $count = oci_num_fields($this->stmt_id); // if we used a limit we subtract it return ($this->limit_used) ? $count - 1 : $count; } // -------------------------------------------------------------------- /** * Fetch Field Names * * Generates an array of column names * * @return array */ public function list_fields() { $field_names = array(); for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++) { $field_names[] = oci_field_name($this->stmt_id, $c); } return $field_names; } // -------------------------------------------------------------------- /** * Field data * * Generates an array of objects containing field meta-data * * @return array */ public function field_data() { $retval = array(); for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++) { $F = new stdClass(); $F->name = oci_field_name($this->stmt_id, $c); $F->type = oci_field_type($this->stmt_id, $c); $F->max_length = oci_field_size($this->stmt_id, $c); $retval[] = $F; } return $retval; } // -------------------------------------------------------------------- /** * Free the result * * @return void */ public function free_result() { if (is_resource($this->result_id)) { oci_free_statement($this->result_id); $this->result_id = FALSE; } if (is_resource($this->stmt_id)) { oci_free_statement($this->stmt_id); } if (is_resource($this->curs_id)) { oci_cancel($this->curs_id); $this->curs_id = NULL; } } // -------------------------------------------------------------------- /** * Result - associative array * * Returns the result set as an array * * @return array */ protected function _fetch_assoc() { $id = ($this->curs_id) ? $this->curs_id : $this->stmt_id; return oci_fetch_assoc($id); } // -------------------------------------------------------------------- /** * Result - object * * Returns the result set as an object * * @param string $class_name * @return object */ protected function _fetch_object($class_name = 'stdClass') { $row = ($this->curs_id) ? oci_fetch_object($this->curs_id) : oci_fetch_object($this->stmt_id); if ($class_name === 'stdClass' OR ! $row) { return $row; } $class_name = new $class_name(); foreach ($row as $key => $value) { $class_name->$key = $value; } return $class_name; } } PK!®ò(ƒƒdatabase/drivers/index.htmlnu„[µü¤ 403 Forbidden

    Directory access is forbidden.

    PK!uê0M²²*database/drivers/mysqli/mysqli_utility.phpnu„[µü¤db->query('SHOW CREATE TABLE '.$this->db->escape_identifiers($this->db->database.'.'.$table)); // No result means the table name was invalid if ($query === FALSE) { continue; } // Write out the table schema $output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline; if ($add_drop === TRUE) { $output .= 'DROP TABLE IF EXISTS '.$this->db->protect_identifiers($table).';'.$newline.$newline; } $i = 0; $result = $query->result_array(); foreach ($result[0] as $val) { if ($i++ % 2) { $output .= $val.';'.$newline.$newline; } } // If inserts are not needed we're done... if ($add_insert === FALSE) { continue; } // Grab all the data from the current table $query = $this->db->query('SELECT * FROM '.$this->db->protect_identifiers($table)); if ($query->num_rows() === 0) { continue; } // Fetch the field names and determine if the field is an // integer type. We use this info to decide whether to // surround the data with quotes or not $i = 0; $field_str = ''; $is_int = array(); while ($field = $query->result_id->fetch_field()) { // Most versions of MySQL store timestamp as a string $is_int[$i] = in_array($field->type, array(MYSQLI_TYPE_TINY, MYSQLI_TYPE_SHORT, MYSQLI_TYPE_INT24, MYSQLI_TYPE_LONG), TRUE); // Create a string of field names $field_str .= $this->db->escape_identifiers($field->name).', '; $i++; } // Trim off the end comma $field_str = preg_replace('/, $/' , '', $field_str); // Build the insert string foreach ($query->result_array() as $row) { $val_str = ''; $i = 0; foreach ($row as $v) { // Is the value NULL? if ($v === NULL) { $val_str .= 'NULL'; } else { // Escape the data if it's not an integer $val_str .= ($is_int[$i] === FALSE) ? $this->db->escape($v) : $v; } // Append a comma $val_str .= ', '; $i++; } // Remove the comma at the end of the string $val_str = preg_replace('/, $/' , '', $val_str); // Build the INSERT string $output .= 'INSERT INTO '.$this->db->protect_identifiers($table).' ('.$field_str.') VALUES ('.$val_str.');'.$newline; } $output .= $newline.$newline; } // Do we need to include a statement to re-enable foreign key checks? if ($foreign_key_checks === FALSE) { $output .= 'SET foreign_key_checks = 1;'.$newline; } return $output; } } PK!σ¢Ûè3è3)database/drivers/mysqli/mysqli_driver.phpnu„[µü¤hostname[0] === '/') { $hostname = NULL; $port = NULL; $socket = $this->hostname; } else { $hostname = ($persistent === TRUE) ? 'p:'.$this->hostname : $this->hostname; $port = empty($this->port) ? NULL : $this->port; $socket = NULL; } $client_flags = ($this->compress === TRUE) ? MYSQLI_CLIENT_COMPRESS : 0; $this->_mysqli = mysqli_init(); $this->_mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10); if (isset($this->stricton)) { if ($this->stricton) { $this->_mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'); } else { $this->_mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( @@sql_mode, "STRICT_ALL_TABLES,", ""), ",STRICT_ALL_TABLES", ""), "STRICT_ALL_TABLES", ""), "STRICT_TRANS_TABLES,", ""), ",STRICT_TRANS_TABLES", ""), "STRICT_TRANS_TABLES", "")' ); } } if (is_array($this->encrypt)) { $ssl = array(); empty($this->encrypt['ssl_key']) OR $ssl['key'] = $this->encrypt['ssl_key']; empty($this->encrypt['ssl_cert']) OR $ssl['cert'] = $this->encrypt['ssl_cert']; empty($this->encrypt['ssl_ca']) OR $ssl['ca'] = $this->encrypt['ssl_ca']; empty($this->encrypt['ssl_capath']) OR $ssl['capath'] = $this->encrypt['ssl_capath']; empty($this->encrypt['ssl_cipher']) OR $ssl['cipher'] = $this->encrypt['ssl_cipher']; if (isset($this->encrypt['ssl_verify'])) { $client_flags |= MYSQLI_CLIENT_SSL; if ($this->encrypt['ssl_verify']) { defined('MYSQLI_OPT_SSL_VERIFY_SERVER_CERT') && $this->_mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, TRUE); } // Apparently (when it exists), setting MYSQLI_OPT_SSL_VERIFY_SERVER_CERT // to FALSE didn't do anything, so PHP 5.6.16 introduced yet another // constant ... // // https://secure.php.net/ChangeLog-5.php#5.6.16 // https://bugs.php.net/bug.php?id=68344 elseif (defined('MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT')) { $client_flags |= MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT; } } if ( ! empty($ssl)) { $client_flags |= MYSQLI_CLIENT_SSL; $this->_mysqli->ssl_set( isset($ssl['key']) ? $ssl['key'] : NULL, isset($ssl['cert']) ? $ssl['cert'] : NULL, isset($ssl['ca']) ? $ssl['ca'] : NULL, isset($ssl['capath']) ? $ssl['capath'] : NULL, isset($ssl['cipher']) ? $ssl['cipher'] : NULL ); } } if ($this->_mysqli->real_connect($hostname, $this->username, $this->password, $this->database, $port, $socket, $client_flags)) { // Prior to version 5.7.3, MySQL silently downgrades to an unencrypted connection if SSL setup fails if ( ($client_flags & MYSQLI_CLIENT_SSL) && version_compare($this->_mysqli->client_info, '5.7.3', '<=') && empty($this->_mysqli->query("SHOW STATUS LIKE 'ssl_cipher'")->fetch_object()->Value) ) { $this->_mysqli->close(); $message = 'MySQLi was configured for an SSL connection, but got an unencrypted connection instead!'; log_message('error', $message); return ($this->db_debug) ? $this->display_error($message, '', TRUE) : FALSE; } return $this->_mysqli; } return FALSE; } // -------------------------------------------------------------------- /** * Reconnect * * Keep / reestablish the db connection if no queries have been * sent for a length of time exceeding the server's idle timeout * * @return void */ public function reconnect() { if ($this->conn_id !== FALSE && $this->conn_id->ping() === FALSE) { $this->conn_id = FALSE; } } // -------------------------------------------------------------------- /** * Select the database * * @param string $database * @return bool */ public function db_select($database = '') { if ($database === '') { $database = $this->database; } if ($this->conn_id->select_db($database)) { $this->database = $database; $this->data_cache = array(); return TRUE; } return FALSE; } // -------------------------------------------------------------------- /** * Set client character set * * @param string $charset * @return bool */ protected function _db_set_charset($charset) { return $this->conn_id->set_charset($charset); } // -------------------------------------------------------------------- /** * Database version number * * @return string */ public function version() { if (isset($this->data_cache['version'])) { return $this->data_cache['version']; } return $this->data_cache['version'] = $this->conn_id->server_info; } // -------------------------------------------------------------------- /** * Execute the query * * @param string $sql an SQL query * @return mixed */ protected function _execute($sql) { return $this->conn_id->query($this->_prep_query($sql)); } // -------------------------------------------------------------------- /** * Prep the query * * If needed, each database adapter can prep the query string * * @param string $sql an SQL query * @return string */ protected function _prep_query($sql) { // mysqli_affected_rows() returns 0 for "DELETE FROM TABLE" queries. This hack // modifies the query so that it a proper number of affected rows is returned. if ($this->delete_hack === TRUE && preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql)) { return trim($sql).' WHERE 1=1'; } return $sql; } // -------------------------------------------------------------------- /** * Begin Transaction * * @return bool */ protected function _trans_begin() { $this->conn_id->autocommit(FALSE); return is_php('5.5') ? $this->conn_id->begin_transaction() : $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK } // -------------------------------------------------------------------- /** * Commit Transaction * * @return bool */ protected function _trans_commit() { if ($this->conn_id->commit()) { $this->conn_id->autocommit(TRUE); return TRUE; } return FALSE; } // -------------------------------------------------------------------- /** * Rollback Transaction * * @return bool */ protected function _trans_rollback() { if ($this->conn_id->rollback()) { $this->conn_id->autocommit(TRUE); return TRUE; } return FALSE; } // -------------------------------------------------------------------- /** * Platform-dependent string escape * * @param string * @return string */ protected function _escape_str($str) { return $this->conn_id->real_escape_string($str); } // -------------------------------------------------------------------- /** * Affected Rows * * @return int */ public function affected_rows() { return $this->conn_id->affected_rows; } // -------------------------------------------------------------------- /** * Insert ID * * @return int */ public function insert_id() { return $this->conn_id->insert_id; } // -------------------------------------------------------------------- /** * List table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool $prefix_limit * @return string */ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SHOW TABLES FROM '.$this->_escape_char.$this->database.$this->_escape_char; if ($prefix_limit !== FALSE && $this->dbprefix !== '') { return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; } return $sql; } // -------------------------------------------------------------------- /** * Show column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return string */ protected function _list_columns($table = '') { return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) { return FALSE; } $query = $query->result_object(); $retval = array(); for ($i = 0, $c = count($query); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = $query[$i]->Field; sscanf($query[$i]->Type, '%[a-z](%d)', $retval[$i]->type, $retval[$i]->max_length ); $retval[$i]->default = $query[$i]->Default; $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); } return $retval; } // -------------------------------------------------------------------- /** * Error * * Returns an array containing code and message of the last * database error that has occurred. * * @return array */ public function error() { if ( ! empty($this->_mysqli->connect_errno)) { return array( 'code' => $this->_mysqli->connect_errno, 'message' => $this->_mysqli->connect_error ); } return array('code' => $this->conn_id->errno, 'message' => $this->conn_id->error); } // -------------------------------------------------------------------- /** * FROM tables * * Groups tables in FROM clauses if needed, so there is no confusion * about operator precedence. * * @return string */ protected function _from_tables() { if ( ! empty($this->qb_join) && count($this->qb_from) > 1) { return '('.implode(', ', $this->qb_from).')'; } return implode(', ', $this->qb_from); } // -------------------------------------------------------------------- /** * Close DB Connection * * @return void */ protected function _close() { $this->conn_id->close(); } } PK!:5ã&&(database/drivers/mysqli/mysqli_forge.phpnu„[µü¤db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET')) { $sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set; } if ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE')) { $sql .= ' COLLATE = '.$this->db->dbcollat; } return $sql; } // -------------------------------------------------------------------- /** * ALTER TABLE * * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if ($alter_type === 'DROP') { return parent::_alter_table($alter_type, $table, $field); } $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); for ($i = 0, $c = count($field); $i < $c; $i++) { if ($field[$i]['_literal'] !== FALSE) { $field[$i] = ($alter_type === 'ADD') ? "\n\tADD ".$field[$i]['_literal'] : "\n\tMODIFY ".$field[$i]['_literal']; } else { if ($alter_type === 'ADD') { $field[$i]['_literal'] = "\n\tADD "; } else { $field[$i]['_literal'] = empty($field[$i]['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE "; } $field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]); } } return array($sql.implode(',', $field)); } // -------------------------------------------------------------------- /** * Process column * * @param array $field * @return string */ protected function _process_column($field) { $extra_clause = isset($field['after']) ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) { $extra_clause = ' FIRST'; } return $this->db->escape_identifiers($field['name']) .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) .' '.$field['type'].$field['length'] .$field['unsigned'] .$field['null'] .$field['default'] .$field['auto_increment'] .$field['unique'] .(empty($field['comment']) ? '' : ' COMMENT '.$field['comment']) .$extra_clause; } // -------------------------------------------------------------------- /** * Process indexes * * @param string $table (ignored) * @return string */ protected function _process_indexes($table) { $sql = ''; for ($i = 0, $c = count($this->keys); $i < $c; $i++) { if (is_array($this->keys[$i])) { for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) { if ( ! isset($this->fields[$this->keys[$i][$i2]])) { unset($this->keys[$i][$i2]); continue; } } } elseif ( ! isset($this->fields[$this->keys[$i]])) { unset($this->keys[$i]); continue; } is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; } $this->keys = array(); return $sql; } } PK!Ëêšmll)database/drivers/mysqli/mysqli_result.phpnu„[µü¤num_rows) ? $this->num_rows : $this->num_rows = $this->result_id->num_rows; } // -------------------------------------------------------------------- /** * Number of fields in the result set * * @return int */ public function num_fields() { return $this->result_id->field_count; } // -------------------------------------------------------------------- /** * Fetch Field Names * * Generates an array of column names * * @return array */ public function list_fields() { $field_names = array(); $this->result_id->field_seek(0); while ($field = $this->result_id->fetch_field()) { $field_names[] = $field->name; } return $field_names; } // -------------------------------------------------------------------- /** * Field data * * Generates an array of objects containing field meta-data * * @return array */ public function field_data() { $retval = array(); $field_data = $this->result_id->fetch_fields(); for ($i = 0, $c = count($field_data); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = $field_data[$i]->name; $retval[$i]->type = static::_get_field_type($field_data[$i]->type); $retval[$i]->max_length = $field_data[$i]->max_length; $retval[$i]->primary_key = (int) ($field_data[$i]->flags & MYSQLI_PRI_KEY_FLAG); $retval[$i]->default = $field_data[$i]->def; } return $retval; } // -------------------------------------------------------------------- /** * Get field type * * Extracts field type info from the bitflags returned by * mysqli_result::fetch_fields() * * @used-by CI_DB_mysqli_result::field_data() * @param int $type * @return string */ private static function _get_field_type($type) { static $map; isset($map) OR $map = array( MYSQLI_TYPE_DECIMAL => 'decimal', MYSQLI_TYPE_BIT => 'bit', MYSQLI_TYPE_TINY => 'tinyint', MYSQLI_TYPE_SHORT => 'smallint', MYSQLI_TYPE_INT24 => 'mediumint', MYSQLI_TYPE_LONG => 'int', MYSQLI_TYPE_LONGLONG => 'bigint', MYSQLI_TYPE_FLOAT => 'float', MYSQLI_TYPE_DOUBLE => 'double', MYSQLI_TYPE_TIMESTAMP => 'timestamp', MYSQLI_TYPE_DATE => 'date', MYSQLI_TYPE_TIME => 'time', MYSQLI_TYPE_DATETIME => 'datetime', MYSQLI_TYPE_YEAR => 'year', MYSQLI_TYPE_NEWDATE => 'date', MYSQLI_TYPE_INTERVAL => 'interval', MYSQLI_TYPE_ENUM => 'enum', MYSQLI_TYPE_SET => 'set', MYSQLI_TYPE_TINY_BLOB => 'tinyblob', MYSQLI_TYPE_MEDIUM_BLOB => 'mediumblob', MYSQLI_TYPE_BLOB => 'blob', MYSQLI_TYPE_LONG_BLOB => 'longblob', MYSQLI_TYPE_STRING => 'char', MYSQLI_TYPE_VAR_STRING => 'varchar', MYSQLI_TYPE_GEOMETRY => 'geometry' ); return isset($map[$type]) ? $map[$type] : $type; } // -------------------------------------------------------------------- /** * Free the result * * @return void */ public function free_result() { if (is_object($this->result_id)) { $this->result_id->free(); $this->result_id = FALSE; } } // -------------------------------------------------------------------- /** * Data Seek * * Moves the internal pointer to the desired offset. We call * this internally before fetching results to make sure the * result set starts at zero. * * @param int $n * @return bool */ public function data_seek($n = 0) { return $this->result_id->data_seek($n); } // -------------------------------------------------------------------- /** * Result - associative array * * Returns the result set as an array * * @return array */ protected function _fetch_assoc() { return $this->result_id->fetch_assoc(); } // -------------------------------------------------------------------- /** * Result - object * * Returns the result set as an object * * @param string $class_name * @return object */ protected function _fetch_object($class_name = 'stdClass') { return $this->result_id->fetch_object($class_name); } } PK!®ò(ƒƒ"database/drivers/mysqli/index.htmlnu„[µü¤ 403 Forbidden

    Directory access is forbidden.

    PK!8¥Úââ(database/drivers/sqlsrv/sqlsrv_forge.phpnu„[µü¤ 'SMALLINT', 'SMALLINT' => 'INT', 'INT' => 'BIGINT', 'REAL' => 'FLOAT' ); // -------------------------------------------------------------------- /** * ALTER TABLE * * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) { return parent::_alter_table($alter_type, $table, $field); } $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; $sqls = array(); for ($i = 0, $c = count($field); $i < $c; $i++) { $sqls[] = $sql.$this->_process_column($field[$i]); } return $sqls; } // -------------------------------------------------------------------- /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) { unset($attributes['CONSTRAINT']); } switch (strtoupper($attributes['TYPE'])) { case 'MEDIUMINT': $attributes['TYPE'] = 'INTEGER'; $attributes['UNSIGNED'] = FALSE; return; case 'INTEGER': $attributes['TYPE'] = 'INT'; return; default: return; } } // -------------------------------------------------------------------- /** * Field attribute AUTO_INCREMENT * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_auto_increment(&$attributes, &$field) { if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) { $field['auto_increment'] = ' IDENTITY(1,1)'; } } } PK!77uÛ½ ½ *database/drivers/sqlsrv/sqlsrv_utility.phpnu„[µü¤db->display_error('db_unsupported_feature'); } } PK!–X‰Qð7ð7)database/drivers/sqlsrv/sqlsrv_driver.phpnu„[µü¤scrollable === NULL) { $this->scrollable = defined('SQLSRV_CURSOR_CLIENT_BUFFERED') ? SQLSRV_CURSOR_CLIENT_BUFFERED : FALSE; } } // -------------------------------------------------------------------- /** * Database connection * * @param bool $pooling * @return resource */ public function db_connect($pooling = FALSE) { $charset = in_array(strtolower($this->char_set), array('utf-8', 'utf8'), TRUE) ? 'UTF-8' : SQLSRV_ENC_CHAR; $connection = array( 'UID' => empty($this->username) ? '' : $this->username, 'PWD' => empty($this->password) ? '' : $this->password, 'Database' => $this->database, 'ConnectionPooling' => ($pooling === TRUE) ? 1 : 0, 'CharacterSet' => $charset, 'Encrypt' => ($this->encrypt === TRUE) ? 1 : 0, 'ReturnDatesAsStrings' => 1 ); // If the username and password are both empty, assume this is a // 'Windows Authentication Mode' connection. if (empty($connection['UID']) && empty($connection['PWD'])) { unset($connection['UID'], $connection['PWD']); } if (FALSE !== ($this->conn_id = sqlsrv_connect($this->hostname, $connection))) { // Determine how identifiers are escaped $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); $query = $query->row_array(); $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); } return $this->conn_id; } // -------------------------------------------------------------------- /** * Select the database * * @param string $database * @return bool */ public function db_select($database = '') { if ($database === '') { $database = $this->database; } if ($this->_execute('USE '.$this->escape_identifiers($database))) { $this->database = $database; $this->data_cache = array(); return TRUE; } return FALSE; } // -------------------------------------------------------------------- /** * Execute the query * * @param string $sql an SQL query * @return resource */ protected function _execute($sql) { return ($this->scrollable === FALSE OR $this->is_write_type($sql)) ? sqlsrv_query($this->conn_id, $sql) : sqlsrv_query($this->conn_id, $sql, NULL, array('Scrollable' => $this->scrollable)); } // -------------------------------------------------------------------- /** * Begin Transaction * * @return bool */ protected function _trans_begin() { return sqlsrv_begin_transaction($this->conn_id); } // -------------------------------------------------------------------- /** * Commit Transaction * * @return bool */ protected function _trans_commit() { return sqlsrv_commit($this->conn_id); } // -------------------------------------------------------------------- /** * Rollback Transaction * * @return bool */ protected function _trans_rollback() { return sqlsrv_rollback($this->conn_id); } // -------------------------------------------------------------------- /** * Affected Rows * * @return int */ public function affected_rows() { return sqlsrv_rows_affected($this->result_id); } // -------------------------------------------------------------------- /** * Insert ID * * Returns the last id created in the Identity column. * * @return string */ public function insert_id() { return $this->query('SELECT SCOPE_IDENTITY() AS insert_id')->row()->insert_id; } // -------------------------------------------------------------------- /** * Database version number * * @return string */ public function version() { if (isset($this->data_cache['version'])) { return $this->data_cache['version']; } if ( ! $this->conn_id OR ($info = sqlsrv_server_info($this->conn_id)) === FALSE) { return FALSE; } return $this->data_cache['version'] = $info['SQLServerVersion']; } // -------------------------------------------------------------------- /** * List table query * * Generates a platform-specific query string so that the table names can be fetched * * @param bool * @return string $prefix_limit */ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SELECT '.$this->escape_identifiers('name') .' FROM '.$this->escape_identifiers('sysobjects') .' WHERE '.$this->escape_identifiers('type')." = 'U'"; if ($prefix_limit === TRUE && $this->dbprefix !== '') { $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " .sprintf($this->_escape_like_str, $this->_escape_like_chr); } return $sql.' ORDER BY '.$this->escape_identifiers('name'); } // -------------------------------------------------------------------- /** * List column query * * Generates a platform-specific query string so that the column names can be fetched * * @param string $table * @return string */ protected function _list_columns($table = '') { return 'SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.Columns WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table * @return array */ public function field_data($table) { $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.Columns WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); if (($query = $this->query($sql)) === FALSE) { return FALSE; } $query = $query->result_object(); $retval = array(); for ($i = 0, $c = count($query); $i < $c; $i++) { $retval[$i] = new stdClass(); $retval[$i]->name = $query[$i]->COLUMN_NAME; $retval[$i]->type = $query[$i]->DATA_TYPE; $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; } return $retval; } // -------------------------------------------------------------------- /** * Error * * Returns an array containing code and message of the last * database error that has occurred. * * @return array */ public function error() { $error = array('code' => '00000', 'message' => ''); $sqlsrv_errors = sqlsrv_errors(SQLSRV_ERR_ERRORS); if ( ! is_array($sqlsrv_errors)) { return $error; } $sqlsrv_error = array_shift($sqlsrv_errors); if (isset($sqlsrv_error['SQLSTATE'])) { $error['code'] = isset($sqlsrv_error['code']) ? $sqlsrv_error['SQLSTATE'].'/'.$sqlsrv_error['code'] : $sqlsrv_error['SQLSTATE']; } elseif (isset($sqlsrv_error['code'])) { $error['code'] = $sqlsrv_error['code']; } if (isset($sqlsrv_error['message'])) { $error['message'] = $sqlsrv_error['message']; } return $error; } // -------------------------------------------------------------------- /** * Update statement * * Generates a platform-specific update string from the supplied data * * @param string $table * @param array $values * @return string */ protected function _update($table, $values) { $this->qb_limit = FALSE; $this->qb_orderby = array(); return parent::_update($table, $values); } // -------------------------------------------------------------------- /** * Truncate statement * * Generates a platform-specific truncate string from the supplied data * * If the database does not support the TRUNCATE statement, * then this method maps to 'DELETE FROM table' * * @param string $table * @return string */ protected function _truncate($table) { return 'TRUNCATE TABLE '.$table; } // -------------------------------------------------------------------- /** * Delete statement * * Generates a platform-specific delete string from the supplied data * * @param string $table * @return string */ protected function _delete($table) { if ($this->qb_limit) { return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; } return parent::_delete($table); } // -------------------------------------------------------------------- /** * LIMIT * * Generates a platform-specific LIMIT clause * * @param string $sql SQL Query * @return string */ protected function _limit($sql) { // As of SQL Server 2012 (11.0.*) OFFSET is supported if (version_compare($this->version(), '11', '>=')) { // SQL Server OFFSET-FETCH can be used only with the ORDER BY clause empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; } $limit = $this->qb_offset + $this->qb_limit; // An ORDER BY clause is required for ROW_NUMBER() to work if ($this->qb_offset && ! empty($this->qb_orderby)) { $orderby = $this->_compile_order_by(); // We have to strip the ORDER BY clause $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results if (count($this->qb_select) === 0 OR strpos(implode(',', $this->qb_select), '*') !== FALSE) { $select = '*'; // Inevitable } else { // Use only field names and their aliases, everything else is out of our scope. $select = array(); $field_regexp = ($this->_quoted_identifier) ? '("[^\"]+")' : '(\[[^\]]+\])'; for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) { $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) ? $m[1] : $this->qb_select[$i]; } $select = implode(', ', $select); } return 'SELECT '.$select." FROM (\n\n" .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) ."\n\n) ".$this->escape_identifiers('CI_subquery') ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; } return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); } // -------------------------------------------------------------------- /** * Insert batch statement * * Generates a platform-specific insert string from the supplied data. * * @param string $table Table name * @param array $keys INSERT keys * @param array $values INSERT values * @return string|bool */ protected function _insert_batch($table, $keys, $values) { // Multiple-value inserts are only supported as of SQL Server 2008 if (version_compare($this->version(), '10', '>=')) { return parent::_insert_batch($table, $keys, $values); } return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; } // -------------------------------------------------------------------- /** * Close DB Connection * * @return void */ protected function _close() { sqlsrv_close($this->conn_id); } } PK!®ò(ƒƒ"database/drivers/sqlsrv/index.htmlnu„[µü¤ 403 Forbidden

    Directory access is forbidden.

    PK!5Ú0)database/drivers/sqlsrv/sqlsrv_result.phpnu„[µü¤scrollable = $driver_object->scrollable; } // -------------------------------------------------------------------- /** * Number of rows in the result set * * @return int */ public function num_rows() { // sqlsrv_num_rows() doesn't work with the FORWARD and DYNAMIC cursors (FALSE is the same as FORWARD) if ( ! in_array($this->scrollable, array(FALSE, SQLSRV_CURSOR_FORWARD, SQLSRV_CURSOR_DYNAMIC), TRUE)) { return parent::num_rows(); } return is_int($this->num_rows) ? $this->num_rows : $this->num_rows = sqlsrv_num_rows($this->result_id); } // -------------------------------------------------------------------- /** * Number of fields in the result set * * @return int */ public function num_fields() { return @sqlsrv_num_fields($this->result_id); } // -------------------------------------------------------------------- /** * Fetch Field Names * * Generates an array of column names * * @return array */ public function list_fields() { $field_names = array(); foreach (sqlsrv_field_metadata($this->result_id) as $offset => $field) { $field_names[] = $field['Name']; } return $field_names; } // -------------------------------------------------------------------- /** * Field data * * Generates an array of objects containing field meta-data * * @return array */ public function field_data() { $retval = array(); foreach (sqlsrv_field_metadata($this->result_id) as $i => $field) { $retval[$i] = new stdClass(); $retval[$i]->name = $field['Name']; $retval[$i]->type = $field['Type']; $retval[$i]->max_length = $field['Size']; } return $retval; } // -------------------------------------------------------------------- /** * Free the result * * @return void */ public function free_result() { if (is_resource($this->result_id)) { sqlsrv_free_stmt($this->result_id); $this->result_id = FALSE; } } // -------------------------------------------------------------------- /** * Result - associative array * * Returns the result set as an array * * @return array */ protected function _fetch_assoc() { return sqlsrv_fetch_array($this->result_id, SQLSRV_FETCH_ASSOC); } // -------------------------------------------------------------------- /** * Result - object * * Returns the result set as an object * * @param string $class_name * @return object */ protected function _fetch_object($class_name = 'stdClass') { return sqlsrv_fetch_object($this->result_id, $class_name); } } PK!­È×3èøèødatabase/DB_query_builder.phpnu„[µü¤_protect_identifiers; foreach ($select as $val) { $val = trim($val); if ($val !== '') { $this->qb_select[] = $val; $this->qb_no_escape[] = $escape; if ($this->qb_caching === TRUE) { $this->qb_cache_select[] = $val; $this->qb_cache_exists[] = 'select'; $this->qb_cache_no_escape[] = $escape; } } } return $this; } // -------------------------------------------------------------------- /** * Select Max * * Generates a SELECT MAX(field) portion of a query * * @param string the field * @param string an alias * @return CI_DB_query_builder */ public function select_max($select = '', $alias = '') { return $this->_max_min_avg_sum($select, $alias, 'MAX'); } // -------------------------------------------------------------------- /** * Select Min * * Generates a SELECT MIN(field) portion of a query * * @param string the field * @param string an alias * @return CI_DB_query_builder */ public function select_min($select = '', $alias = '') { return $this->_max_min_avg_sum($select, $alias, 'MIN'); } // -------------------------------------------------------------------- /** * Select Average * * Generates a SELECT AVG(field) portion of a query * * @param string the field * @param string an alias * @return CI_DB_query_builder */ public function select_avg($select = '', $alias = '') { return $this->_max_min_avg_sum($select, $alias, 'AVG'); } // -------------------------------------------------------------------- /** * Select Sum * * Generates a SELECT SUM(field) portion of a query * * @param string the field * @param string an alias * @return CI_DB_query_builder */ public function select_sum($select = '', $alias = '') { return $this->_max_min_avg_sum($select, $alias, 'SUM'); } // -------------------------------------------------------------------- /** * SELECT [MAX|MIN|AVG|SUM]() * * @used-by select_max() * @used-by select_min() * @used-by select_avg() * @used-by select_sum() * * @param string $select Field name * @param string $alias * @param string $type * @return CI_DB_query_builder */ protected function _max_min_avg_sum($select = '', $alias = '', $type = 'MAX') { if ( ! is_string($select) OR $select === '') { $this->display_error('db_invalid_query'); } $type = strtoupper($type); if ( ! in_array($type, array('MAX', 'MIN', 'AVG', 'SUM'))) { show_error('Invalid function type: '.$type); } if ($alias === '') { $alias = $this->_create_alias_from_table(trim($select)); } $sql = $type.'('.$this->protect_identifiers(trim($select)).') AS '.$this->escape_identifiers(trim($alias)); $this->qb_select[] = $sql; $this->qb_no_escape[] = NULL; if ($this->qb_caching === TRUE) { $this->qb_cache_select[] = $sql; $this->qb_cache_exists[] = 'select'; } return $this; } // -------------------------------------------------------------------- /** * Determines the alias name based on the table * * @param string $item * @return string */ protected function _create_alias_from_table($item) { if (strpos($item, '.') !== FALSE) { $item = explode('.', $item); return end($item); } return $item; } // -------------------------------------------------------------------- /** * DISTINCT * * Sets a flag which tells the query string compiler to add DISTINCT * * @param bool $val * @return CI_DB_query_builder */ public function distinct($val = TRUE) { $this->qb_distinct = is_bool($val) ? $val : TRUE; return $this; } // -------------------------------------------------------------------- /** * From * * Generates the FROM portion of the query * * @param mixed $from can be a string or array * @return CI_DB_query_builder */ public function from($from) { foreach ((array) $from as $val) { if (strpos($val, ',') !== FALSE) { foreach (explode(',', $val) as $v) { $v = trim($v); $this->_track_aliases($v); $this->qb_from[] = $v = $this->protect_identifiers($v, TRUE, NULL, FALSE); if ($this->qb_caching === TRUE) { $this->qb_cache_from[] = $v; $this->qb_cache_exists[] = 'from'; } } } else { $val = trim($val); // Extract any aliases that might exist. We use this information // in the protect_identifiers to know whether to add a table prefix $this->_track_aliases($val); $this->qb_from[] = $val = $this->protect_identifiers($val, TRUE, NULL, FALSE); if ($this->qb_caching === TRUE) { $this->qb_cache_from[] = $val; $this->qb_cache_exists[] = 'from'; } } } return $this; } // -------------------------------------------------------------------- /** * JOIN * * Generates the JOIN portion of the query * * @param string * @param string the join condition * @param string the type of join * @param string whether not to try to escape identifiers * @return CI_DB_query_builder */ public function join($table, $cond, $type = '', $escape = NULL) { if ($type !== '') { $type = strtoupper(trim($type)); if ( ! in_array($type, array('LEFT', 'RIGHT', 'OUTER', 'INNER', 'LEFT OUTER', 'RIGHT OUTER'), TRUE)) { $type = ''; } else { $type .= ' '; } } // Extract any aliases that might exist. We use this information // in the protect_identifiers to know whether to add a table prefix $this->_track_aliases($table); is_bool($escape) OR $escape = $this->_protect_identifiers; if ( ! $this->_has_operator($cond)) { $cond = ' USING ('.($escape ? $this->escape_identifiers($cond) : $cond).')'; } elseif ($escape === FALSE) { $cond = ' ON '.$cond; } else { // Split multiple conditions if (preg_match_all('/\sAND\s|\sOR\s/i', $cond, $joints, PREG_OFFSET_CAPTURE)) { $conditions = array(); $joints = $joints[0]; array_unshift($joints, array('', 0)); for ($i = count($joints) - 1, $pos = strlen($cond); $i >= 0; $i--) { $joints[$i][1] += strlen($joints[$i][0]); // offset $conditions[$i] = substr($cond, $joints[$i][1], $pos - $joints[$i][1]); $pos = $joints[$i][1] - strlen($joints[$i][0]); $joints[$i] = $joints[$i][0]; } } else { $conditions = array($cond); $joints = array(''); } $cond = ' ON '; for ($i = 0, $c = count($conditions); $i < $c; $i++) { $operator = $this->_get_operator($conditions[$i]); $cond .= $joints[$i]; $cond .= preg_match("/(\(*)?([\[\]\w\.'-]+)".preg_quote($operator)."(.*)/i", $conditions[$i], $match) ? $match[1].$this->protect_identifiers($match[2]).$operator.$this->protect_identifiers($match[3]) : $conditions[$i]; } } // Do we want to escape the table name? if ($escape === TRUE) { $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); } // Assemble the JOIN statement $this->qb_join[] = $join = $type.'JOIN '.$table.$cond; if ($this->qb_caching === TRUE) { $this->qb_cache_join[] = $join; $this->qb_cache_exists[] = 'join'; } return $this; } // -------------------------------------------------------------------- /** * WHERE * * Generates the WHERE portion of the query. * Separates multiple calls with 'AND'. * * @param mixed * @param mixed * @param bool * @return CI_DB_query_builder */ public function where($key, $value = NULL, $escape = NULL) { return $this->_wh('qb_where', $key, $value, 'AND ', $escape); } // -------------------------------------------------------------------- /** * OR WHERE * * Generates the WHERE portion of the query. * Separates multiple calls with 'OR'. * * @param mixed * @param mixed * @param bool * @return CI_DB_query_builder */ public function or_where($key, $value = NULL, $escape = NULL) { return $this->_wh('qb_where', $key, $value, 'OR ', $escape); } // -------------------------------------------------------------------- /** * WHERE, HAVING * * @used-by where() * @used-by or_where() * @used-by having() * @used-by or_having() * * @param string $qb_key 'qb_where' or 'qb_having' * @param mixed $key * @param mixed $value * @param string $type * @param bool $escape * @return CI_DB_query_builder */ protected function _wh($qb_key, $key, $value = NULL, $type = 'AND ', $escape = NULL) { $qb_cache_key = ($qb_key === 'qb_having') ? 'qb_cache_having' : 'qb_cache_where'; if ( ! is_array($key)) { $key = array($key => $value); } // If the escape value was not set will base it on the global setting is_bool($escape) OR $escape = $this->_protect_identifiers; foreach ($key as $k => $v) { $prefix = (count($this->$qb_key) === 0 && count($this->$qb_cache_key) === 0) ? $this->_group_get_type('') : $this->_group_get_type($type); if ($v !== NULL) { if ($escape === TRUE) { $v = $this->escape($v); } if ( ! $this->_has_operator($k)) { $k .= ' = '; } } elseif ( ! $this->_has_operator($k)) { // value appears not to have been set, assign the test to IS NULL $k .= ' IS NULL'; } elseif (preg_match('/\s*(!?=|<>|\sIS(?:\s+NOT)?\s)\s*$/i', $k, $match, PREG_OFFSET_CAPTURE)) { $k = substr($k, 0, $match[0][1]).($match[1][0] === '=' ? ' IS NULL' : ' IS NOT NULL'); } ${$qb_key} = array('condition' => $prefix.$k, 'value' => $v, 'escape' => $escape); $this->{$qb_key}[] = ${$qb_key}; if ($this->qb_caching === TRUE) { $this->{$qb_cache_key}[] = ${$qb_key}; $this->qb_cache_exists[] = substr($qb_key, 3); } } return $this; } // -------------------------------------------------------------------- /** * WHERE IN * * Generates a WHERE field IN('item', 'item') SQL query, * joined with 'AND' if appropriate. * * @param string $key The field to search * @param array $values The values searched on * @param bool $escape * @return CI_DB_query_builder */ public function where_in($key = NULL, $values = NULL, $escape = NULL) { return $this->_where_in($key, $values, FALSE, 'AND ', $escape); } // -------------------------------------------------------------------- /** * OR WHERE IN * * Generates a WHERE field IN('item', 'item') SQL query, * joined with 'OR' if appropriate. * * @param string $key The field to search * @param array $values The values searched on * @param bool $escape * @return CI_DB_query_builder */ public function or_where_in($key = NULL, $values = NULL, $escape = NULL) { return $this->_where_in($key, $values, FALSE, 'OR ', $escape); } // -------------------------------------------------------------------- /** * WHERE NOT IN * * Generates a WHERE field NOT IN('item', 'item') SQL query, * joined with 'AND' if appropriate. * * @param string $key The field to search * @param array $values The values searched on * @param bool $escape * @return CI_DB_query_builder */ public function where_not_in($key = NULL, $values = NULL, $escape = NULL) { return $this->_where_in($key, $values, TRUE, 'AND ', $escape); } // -------------------------------------------------------------------- /** * OR WHERE NOT IN * * Generates a WHERE field NOT IN('item', 'item') SQL query, * joined with 'OR' if appropriate. * * @param string $key The field to search * @param array $values The values searched on * @param bool $escape * @return CI_DB_query_builder */ public function or_where_not_in($key = NULL, $values = NULL, $escape = NULL) { return $this->_where_in($key, $values, TRUE, 'OR ', $escape); } // -------------------------------------------------------------------- /** * Internal WHERE IN * * @used-by where_in() * @used-by or_where_in() * @used-by where_not_in() * @used-by or_where_not_in() * * @param string $key The field to search * @param array $values The values searched on * @param bool $not If the statement would be IN or NOT IN * @param string $type * @param bool $escape * @return CI_DB_query_builder */ protected function _where_in($key = NULL, $values = NULL, $not = FALSE, $type = 'AND ', $escape = NULL) { if ($key === NULL OR $values === NULL) { return $this; } if ( ! is_array($values)) { $values = array($values); } is_bool($escape) OR $escape = $this->_protect_identifiers; $not = ($not) ? ' NOT' : ''; if ($escape === TRUE) { $where_in = array(); foreach ($values as $value) { $where_in[] = $this->escape($value); } } else { $where_in = array_values($values); } $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) ? $this->_group_get_type('') : $this->_group_get_type($type); $where_in = array( 'condition' => $prefix.$key.$not.' IN('.implode(', ', $where_in).')', 'value' => NULL, 'escape' => $escape ); $this->qb_where[] = $where_in; if ($this->qb_caching === TRUE) { $this->qb_cache_where[] = $where_in; $this->qb_cache_exists[] = 'where'; } return $this; } // -------------------------------------------------------------------- /** * LIKE * * Generates a %LIKE% portion of the query. * Separates multiple calls with 'AND'. * * @param mixed $field * @param string $match * @param string $side * @param bool $escape * @return CI_DB_query_builder */ public function like($field, $match = '', $side = 'both', $escape = NULL) { return $this->_like($field, $match, 'AND ', $side, '', $escape); } // -------------------------------------------------------------------- /** * NOT LIKE * * Generates a NOT LIKE portion of the query. * Separates multiple calls with 'AND'. * * @param mixed $field * @param string $match * @param string $side * @param bool $escape * @return CI_DB_query_builder */ public function not_like($field, $match = '', $side = 'both', $escape = NULL) { return $this->_like($field, $match, 'AND ', $side, 'NOT', $escape); } // -------------------------------------------------------------------- /** * OR LIKE * * Generates a %LIKE% portion of the query. * Separates multiple calls with 'OR'. * * @param mixed $field * @param string $match * @param string $side * @param bool $escape * @return CI_DB_query_builder */ public function or_like($field, $match = '', $side = 'both', $escape = NULL) { return $this->_like($field, $match, 'OR ', $side, '', $escape); } // -------------------------------------------------------------------- /** * OR NOT LIKE * * Generates a NOT LIKE portion of the query. * Separates multiple calls with 'OR'. * * @param mixed $field * @param string $match * @param string $side * @param bool $escape * @return CI_DB_query_builder */ public function or_not_like($field, $match = '', $side = 'both', $escape = NULL) { return $this->_like($field, $match, 'OR ', $side, 'NOT', $escape); } // -------------------------------------------------------------------- /** * Internal LIKE * * @used-by like() * @used-by or_like() * @used-by not_like() * @used-by or_not_like() * * @param mixed $field * @param string $match * @param string $type * @param string $side * @param string $not * @param bool $escape * @return CI_DB_query_builder */ protected function _like($field, $match = '', $type = 'AND ', $side = 'both', $not = '', $escape = NULL) { if ( ! is_array($field)) { $field = array($field => $match); } is_bool($escape) OR $escape = $this->_protect_identifiers; // lowercase $side in case somebody writes e.g. 'BEFORE' instead of 'before' (doh) $side = strtolower($side); foreach ($field as $k => $v) { $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) ? $this->_group_get_type('') : $this->_group_get_type($type); if ($escape === TRUE) { $v = $this->escape_like_str($v); } switch ($side) { case 'none': $v = "'{$v}'"; break; case 'before': $v = "'%{$v}'"; break; case 'after': $v = "'{$v}%'"; break; case 'both': default: $v = "'%{$v}%'"; break; } // some platforms require an escape sequence definition for LIKE wildcards if ($escape === TRUE && $this->_like_escape_str !== '') { $v .= sprintf($this->_like_escape_str, $this->_like_escape_chr); } $qb_where = array('condition' => "{$prefix} {$k} {$not} LIKE {$v}", 'value' => NULL, 'escape' => $escape); $this->qb_where[] = $qb_where; if ($this->qb_caching === TRUE) { $this->qb_cache_where[] = $qb_where; $this->qb_cache_exists[] = 'where'; } } return $this; } // -------------------------------------------------------------------- /** * Starts a query group. * * @param string $not (Internal use only) * @param string $type (Internal use only) * @return CI_DB_query_builder */ public function group_start($not = '', $type = 'AND ') { $type = $this->_group_get_type($type); $this->qb_where_group_started = TRUE; $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) ? '' : $type; $where = array( 'condition' => $prefix.$not.str_repeat(' ', ++$this->qb_where_group_count).' (', 'value' => NULL, 'escape' => FALSE ); $this->qb_where[] = $where; if ($this->qb_caching) { $this->qb_cache_where[] = $where; } return $this; } // -------------------------------------------------------------------- /** * Starts a query group, but ORs the group * * @return CI_DB_query_builder */ public function or_group_start() { return $this->group_start('', 'OR '); } // -------------------------------------------------------------------- /** * Starts a query group, but NOTs the group * * @return CI_DB_query_builder */ public function not_group_start() { return $this->group_start('NOT ', 'AND '); } // -------------------------------------------------------------------- /** * Starts a query group, but OR NOTs the group * * @return CI_DB_query_builder */ public function or_not_group_start() { return $this->group_start('NOT ', 'OR '); } // -------------------------------------------------------------------- /** * Ends a query group * * @return CI_DB_query_builder */ public function group_end() { $this->qb_where_group_started = FALSE; $where = array( 'condition' => str_repeat(' ', $this->qb_where_group_count--).')', 'value' => NULL, 'escape' => FALSE ); $this->qb_where[] = $where; if ($this->qb_caching) { $this->qb_cache_where[] = $where; } return $this; } // -------------------------------------------------------------------- /** * Group_get_type * * @used-by group_start() * @used-by _like() * @used-by _wh() * @used-by _where_in() * * @param string $type * @return string */ protected function _group_get_type($type) { if ($this->qb_where_group_started) { $type = ''; $this->qb_where_group_started = FALSE; } return $type; } // -------------------------------------------------------------------- /** * GROUP BY * * @param string $by * @param bool $escape * @return CI_DB_query_builder */ public function group_by($by, $escape = NULL) { is_bool($escape) OR $escape = $this->_protect_identifiers; if (is_string($by)) { $by = ($escape === TRUE) ? explode(',', $by) : array($by); } foreach ($by as $val) { $val = trim($val); if ($val !== '') { $val = array('field' => $val, 'escape' => $escape); $this->qb_groupby[] = $val; if ($this->qb_caching === TRUE) { $this->qb_cache_groupby[] = $val; $this->qb_cache_exists[] = 'groupby'; } } } return $this; } // -------------------------------------------------------------------- /** * HAVING * * Separates multiple calls with 'AND'. * * @param string $key * @param string $value * @param bool $escape * @return CI_DB_query_builder */ public function having($key, $value = NULL, $escape = NULL) { return $this->_wh('qb_having', $key, $value, 'AND ', $escape); } // -------------------------------------------------------------------- /** * OR HAVING * * Separates multiple calls with 'OR'. * * @param string $key * @param string $value * @param bool $escape * @return CI_DB_query_builder */ public function or_having($key, $value = NULL, $escape = NULL) { return $this->_wh('qb_having', $key, $value, 'OR ', $escape); } // -------------------------------------------------------------------- /** * ORDER BY * * @param string $orderby * @param string $direction ASC, DESC or RANDOM * @param bool $escape * @return CI_DB_query_builder */ public function order_by($orderby, $direction = '', $escape = NULL) { $direction = strtoupper(trim($direction)); if ($direction === 'RANDOM') { $direction = ''; // Do we have a seed value? $orderby = ctype_digit((string) $orderby) ? sprintf($this->_random_keyword[1], $orderby) : $this->_random_keyword[0]; } elseif (empty($orderby)) { return $this; } elseif ($direction !== '') { $direction = in_array($direction, array('ASC', 'DESC'), TRUE) ? ' '.$direction : ''; } is_bool($escape) OR $escape = $this->_protect_identifiers; if ($escape === FALSE) { $qb_orderby[] = array('field' => $orderby, 'direction' => $direction, 'escape' => FALSE); } else { $qb_orderby = array(); foreach (explode(',', $orderby) as $field) { $qb_orderby[] = ($direction === '' && preg_match('/\s+(ASC|DESC)$/i', rtrim($field), $match, PREG_OFFSET_CAPTURE)) ? array('field' => ltrim(substr($field, 0, $match[0][1])), 'direction' => ' '.$match[1][0], 'escape' => TRUE) : array('field' => trim($field), 'direction' => $direction, 'escape' => TRUE); } } $this->qb_orderby = array_merge($this->qb_orderby, $qb_orderby); if ($this->qb_caching === TRUE) { $this->qb_cache_orderby = array_merge($this->qb_cache_orderby, $qb_orderby); $this->qb_cache_exists[] = 'orderby'; } return $this; } // -------------------------------------------------------------------- /** * LIMIT * * @param int $value LIMIT value * @param int $offset OFFSET value * @return CI_DB_query_builder */ public function limit($value, $offset = 0) { is_null($value) OR $this->qb_limit = (int) $value; empty($offset) OR $this->qb_offset = (int) $offset; return $this; } // -------------------------------------------------------------------- /** * Sets the OFFSET value * * @param int $offset OFFSET value * @return CI_DB_query_builder */ public function offset($offset) { empty($offset) OR $this->qb_offset = (int) $offset; return $this; } // -------------------------------------------------------------------- /** * LIMIT string * * Generates a platform-specific LIMIT clause. * * @param string $sql SQL Query * @return string */ protected function _limit($sql) { return $sql.' LIMIT '.($this->qb_offset ? $this->qb_offset.', ' : '').(int) $this->qb_limit; } // -------------------------------------------------------------------- /** * The "set" function. * * Allows key/value pairs to be set for inserting or updating * * @param mixed * @param string * @param bool * @return CI_DB_query_builder */ public function set($key, $value = '', $escape = NULL) { $key = $this->_object_to_array($key); if ( ! is_array($key)) { $key = array($key => $value); } is_bool($escape) OR $escape = $this->_protect_identifiers; foreach ($key as $k => $v) { $this->qb_set[$this->protect_identifiers($k, FALSE, $escape)] = ($escape) ? $this->escape($v) : $v; } return $this; } // -------------------------------------------------------------------- /** * Get SELECT query string * * Compiles a SELECT query string and returns the sql. * * @param string the table name to select from (optional) * @param bool TRUE: resets QB values; FALSE: leave QB values alone * @return string */ public function get_compiled_select($table = '', $reset = TRUE) { if ($table !== '') { $this->_track_aliases($table); $this->from($table); } $select = $this->_compile_select(); if ($reset === TRUE) { $this->_reset_select(); } return $select; } // -------------------------------------------------------------------- /** * Get * * Compiles the select statement based on the other functions called * and runs the query * * @param string the table * @param string the limit clause * @param string the offset clause * @return CI_DB_result */ public function get($table = '', $limit = NULL, $offset = NULL) { if ($table !== '') { $this->_track_aliases($table); $this->from($table); } if ( ! empty($limit)) { $this->limit($limit, $offset); } $result = $this->query($this->_compile_select()); $this->_reset_select(); return $result; } // -------------------------------------------------------------------- /** * "Count All Results" query * * Generates a platform-specific query string that counts all records * returned by an Query Builder query. * * @param string * @param bool the reset clause * @return int */ public function count_all_results($table = '', $reset = TRUE) { if ($table !== '') { $this->_track_aliases($table); $this->from($table); } // ORDER BY usage is often problematic here (most notably // on Microsoft SQL Server) and ultimately unnecessary // for selecting COUNT(*) ... $qb_orderby = $this->qb_orderby; $qb_cache_orderby = $this->qb_cache_orderby; $this->qb_orderby = $this->qb_cache_orderby = array(); $result = ($this->qb_distinct === TRUE OR ! empty($this->qb_groupby) OR ! empty($this->qb_cache_groupby) OR $this->qb_limit OR $this->qb_offset) ? $this->query($this->_count_string.$this->protect_identifiers('numrows')."\nFROM (\n".$this->_compile_select()."\n) CI_count_all_results") : $this->query($this->_compile_select($this->_count_string.$this->protect_identifiers('numrows'))); if ($reset === TRUE) { $this->_reset_select(); } else { $this->qb_orderby = $qb_orderby; $this->qb_cache_orderby = $qb_cache_orderby; } if ($result->num_rows() === 0) { return 0; } $row = $result->row(); return (int) $row->numrows; } // -------------------------------------------------------------------- /** * get_where() * * Allows the where clause, limit and offset to be added directly * * @param string $table * @param string $where * @param int $limit * @param int $offset * @return CI_DB_result */ public function get_where($table = '', $where = NULL, $limit = NULL, $offset = NULL) { if ($table !== '') { $this->from($table); } if ($where !== NULL) { $this->where($where); } if ( ! empty($limit)) { $this->limit($limit, $offset); } $result = $this->query($this->_compile_select()); $this->_reset_select(); return $result; } // -------------------------------------------------------------------- /** * Insert_Batch * * Compiles batch insert strings and runs the queries * * @param string $table Table to insert into * @param array $set An associative array of insert values * @param bool $escape Whether to escape values and identifiers * @return int Number of rows inserted or FALSE on failure */ public function insert_batch($table, $set = NULL, $escape = NULL, $batch_size = 100) { if ($set === NULL) { if (empty($this->qb_set)) { return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; } } else { if (empty($set)) { return ($this->db_debug) ? $this->display_error('insert_batch() called with no data') : FALSE; } $this->set_insert_batch($set, '', $escape); } if (strlen($table) === 0) { if ( ! isset($this->qb_from[0])) { return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; } $table = $this->qb_from[0]; } // Batch this baby $affected_rows = 0; for ($i = 0, $total = count($this->qb_set); $i < $total; $i += $batch_size) { if ($this->query($this->_insert_batch($this->protect_identifiers($table, TRUE, $escape, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, $batch_size)))) { $affected_rows += $this->affected_rows(); } } $this->_reset_write(); return $affected_rows; } // -------------------------------------------------------------------- /** * Insert batch statement * * Generates a platform-specific insert string from the supplied data. * * @param string $table Table name * @param array $keys INSERT keys * @param array $values INSERT values * @return string */ protected function _insert_batch($table, $keys, $values) { return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES '.implode(', ', $values); } // -------------------------------------------------------------------- /** * The "set_insert_batch" function. Allows key/value pairs to be set for batch inserts * * @param mixed * @param string * @param bool * @return CI_DB_query_builder */ public function set_insert_batch($key, $value = '', $escape = NULL) { $key = $this->_object_to_array_batch($key); if ( ! is_array($key)) { $key = array($key => $value); } is_bool($escape) OR $escape = $this->_protect_identifiers; $keys = array_keys($this->_object_to_array(reset($key))); sort($keys); foreach ($key as $row) { $row = $this->_object_to_array($row); if (count(array_diff($keys, array_keys($row))) > 0 OR count(array_diff(array_keys($row), $keys)) > 0) { // batch function above returns an error on an empty array $this->qb_set[] = array(); return; } ksort($row); // puts $row in the same order as our keys if ($escape !== FALSE) { $clean = array(); foreach ($row as $value) { $clean[] = $this->escape($value); } $row = $clean; } $this->qb_set[] = '('.implode(',', $row).')'; } foreach ($keys as $k) { $this->qb_keys[] = $this->protect_identifiers($k, FALSE, $escape); } return $this; } // -------------------------------------------------------------------- /** * Get INSERT query string * * Compiles an insert query and returns the sql * * @param string the table to insert into * @param bool TRUE: reset QB values; FALSE: leave QB values alone * @return string */ public function get_compiled_insert($table = '', $reset = TRUE) { if ($this->_validate_insert($table) === FALSE) { return FALSE; } $sql = $this->_insert( $this->protect_identifiers( $this->qb_from[0], TRUE, NULL, FALSE ), array_keys($this->qb_set), array_values($this->qb_set) ); if ($reset === TRUE) { $this->_reset_write(); } return $sql; } // -------------------------------------------------------------------- /** * Insert * * Compiles an insert string and runs the query * * @param string the table to insert data into * @param array an associative array of insert values * @param bool $escape Whether to escape values and identifiers * @return bool TRUE on success, FALSE on failure */ public function insert($table = '', $set = NULL, $escape = NULL) { if ($set !== NULL) { $this->set($set, '', $escape); } if ($this->_validate_insert($table) === FALSE) { return FALSE; } $sql = $this->_insert( $this->protect_identifiers( $this->qb_from[0], TRUE, $escape, FALSE ), array_keys($this->qb_set), array_values($this->qb_set) ); $this->_reset_write(); return $this->query($sql); } // -------------------------------------------------------------------- /** * Validate Insert * * This method is used by both insert() and get_compiled_insert() to * validate that the there data is actually being set and that table * has been chosen to be inserted into. * * @param string the table to insert data into * @return string */ protected function _validate_insert($table = '') { if (count($this->qb_set) === 0) { return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; } if ($table !== '') { $this->qb_from[0] = $table; } elseif ( ! isset($this->qb_from[0])) { return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; } return TRUE; } // -------------------------------------------------------------------- /** * Replace * * Compiles an replace into string and runs the query * * @param string the table to replace data into * @param array an associative array of insert values * @return bool TRUE on success, FALSE on failure */ public function replace($table = '', $set = NULL) { if ($set !== NULL) { $this->set($set); } if (count($this->qb_set) === 0) { return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; } if ($table === '') { if ( ! isset($this->qb_from[0])) { return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; } $table = $this->qb_from[0]; } $sql = $this->_replace($this->protect_identifiers($table, TRUE, NULL, FALSE), array_keys($this->qb_set), array_values($this->qb_set)); $this->_reset_write(); return $this->query($sql); } // -------------------------------------------------------------------- /** * Replace statement * * Generates a platform-specific replace string from the supplied data * * @param string the table name * @param array the insert keys * @param array the insert values * @return string */ protected function _replace($table, $keys, $values) { return 'REPLACE INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')'; } // -------------------------------------------------------------------- /** * FROM tables * * Groups tables in FROM clauses if needed, so there is no confusion * about operator precedence. * * Note: This is only used (and overridden) by MySQL and CUBRID. * * @return string */ protected function _from_tables() { return implode(', ', $this->qb_from); } // -------------------------------------------------------------------- /** * Get UPDATE query string * * Compiles an update query and returns the sql * * @param string the table to update * @param bool TRUE: reset QB values; FALSE: leave QB values alone * @return string */ public function get_compiled_update($table = '', $reset = TRUE) { // Combine any cached components with the current statements $this->_merge_cache(); if ($this->_validate_update($table) === FALSE) { return FALSE; } $sql = $this->_update($this->qb_from[0], $this->qb_set); if ($reset === TRUE) { $this->_reset_write(); } return $sql; } // -------------------------------------------------------------------- /** * UPDATE * * Compiles an update string and runs the query. * * @param string $table * @param array $set An associative array of update values * @param mixed $where * @param int $limit * @return bool TRUE on success, FALSE on failure */ public function update($table = '', $set = NULL, $where = NULL, $limit = NULL) { // Combine any cached components with the current statements $this->_merge_cache(); if ($set !== NULL) { $this->set($set); } if ($this->_validate_update($table) === FALSE) { return FALSE; } if ($where !== NULL) { $this->where($where); } if ( ! empty($limit)) { $this->limit($limit); } $sql = $this->_update($this->qb_from[0], $this->qb_set); $this->_reset_write(); return $this->query($sql); } // -------------------------------------------------------------------- /** * Validate Update * * This method is used by both update() and get_compiled_update() to * validate that data is actually being set and that a table has been * chosen to be update. * * @param string the table to update data on * @return bool */ protected function _validate_update($table) { if (count($this->qb_set) === 0) { return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; } if ($table !== '') { $this->qb_from = array($this->protect_identifiers($table, TRUE, NULL, FALSE)); } elseif ( ! isset($this->qb_from[0])) { return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; } return TRUE; } // -------------------------------------------------------------------- /** * Update_Batch * * Compiles an update string and runs the query * * @param string the table to retrieve the results from * @param array an associative array of update values * @param string the where key * @return int number of rows affected or FALSE on failure */ public function update_batch($table, $set = NULL, $index = NULL, $batch_size = 100) { // Combine any cached components with the current statements $this->_merge_cache(); if ($index === NULL) { return ($this->db_debug) ? $this->display_error('db_must_use_index') : FALSE; } if ($set === NULL) { if (empty($this->qb_set_ub)) { return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; } } else { if (empty($set)) { return ($this->db_debug) ? $this->display_error('update_batch() called with no data') : FALSE; } $this->set_update_batch($set, $index); } if (strlen($table) === 0) { if ( ! isset($this->qb_from[0])) { return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; } $table = $this->qb_from[0]; } // Batch this baby $affected_rows = 0; for ($i = 0, $total = count($this->qb_set_ub); $i < $total; $i += $batch_size) { if ($this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set_ub, $i, $batch_size), $index))) { $affected_rows += $this->affected_rows(); } $this->qb_where = array(); } $this->_reset_write(); return $affected_rows; } // -------------------------------------------------------------------- /** * Update_Batch statement * * Generates a platform-specific batch update string from the supplied data * * @param string $table Table name * @param array $values Update data * @param string $index WHERE key * @return string */ protected function _update_batch($table, $values, $index) { $ids = array(); foreach ($values as $key => $val) { $ids[] = $val[$index]['value']; foreach (array_keys($val) as $field) { if ($field !== $index) { $final[$val[$field]['field']][] = 'WHEN '.$val[$index]['field'].' = '.$val[$index]['value'].' THEN '.$val[$field]['value']; } } } $cases = ''; foreach ($final as $k => $v) { $cases .= $k." = CASE \n" .implode("\n", $v)."\n" .'ELSE '.$k.' END, '; } $this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE); return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); } // -------------------------------------------------------------------- /** * The "set_update_batch" function. Allows key/value pairs to be set for batch updating * * @param array * @param string * @param bool * @return CI_DB_query_builder */ public function set_update_batch($key, $index = '', $escape = NULL) { $key = $this->_object_to_array_batch($key); if ( ! is_array($key)) { // @todo error } is_bool($escape) OR $escape = $this->_protect_identifiers; foreach ($key as $k => $v) { $index_set = FALSE; $clean = array(); foreach ($v as $k2 => $v2) { if ($k2 === $index) { $index_set = TRUE; } $clean[$k2] = array( 'field' => $this->protect_identifiers($k2, FALSE, $escape), 'value' => ($escape === FALSE ? $v2 : $this->escape($v2)) ); } if ($index_set === FALSE) { return $this->display_error('db_batch_missing_index'); } $this->qb_set_ub[] = $clean; } return $this; } // -------------------------------------------------------------------- /** * Empty Table * * Compiles a delete string and runs "DELETE FROM table" * * @param string the table to empty * @return bool TRUE on success, FALSE on failure */ public function empty_table($table = '') { if ($table === '') { if ( ! isset($this->qb_from[0])) { return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; } $table = $this->qb_from[0]; } else { $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); } $sql = $this->_delete($table); $this->_reset_write(); return $this->query($sql); } // -------------------------------------------------------------------- /** * Truncate * * Compiles a truncate string and runs the query * If the database does not support the truncate() command * This function maps to "DELETE FROM table" * * @param string the table to truncate * @return bool TRUE on success, FALSE on failure */ public function truncate($table = '') { if ($table === '') { if ( ! isset($this->qb_from[0])) { return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; } $table = $this->qb_from[0]; } else { $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); } $sql = $this->_truncate($table); $this->_reset_write(); return $this->query($sql); } // -------------------------------------------------------------------- /** * Truncate statement * * Generates a platform-specific truncate string from the supplied data * * If the database does not support the truncate() command, * then this method maps to 'DELETE FROM table' * * @param string the table name * @return string */ protected function _truncate($table) { return 'TRUNCATE '.$table; } // -------------------------------------------------------------------- /** * Get DELETE query string * * Compiles a delete query string and returns the sql * * @param string the table to delete from * @param bool TRUE: reset QB values; FALSE: leave QB values alone * @return string */ public function get_compiled_delete($table = '', $reset = TRUE) { $this->return_delete_sql = TRUE; $sql = $this->delete($table, '', NULL, $reset); $this->return_delete_sql = FALSE; return $sql; } // -------------------------------------------------------------------- /** * Delete * * Compiles a delete string and runs the query * * @param mixed the table(s) to delete from. String or array * @param mixed the where clause * @param mixed the limit clause * @param bool * @return mixed */ public function delete($table = '', $where = '', $limit = NULL, $reset_data = TRUE) { // Combine any cached components with the current statements $this->_merge_cache(); if ($table === '') { if ( ! isset($this->qb_from[0])) { return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; } $table = $this->qb_from[0]; } elseif (is_array($table)) { empty($where) && $reset_data = FALSE; foreach ($table as $single_table) { $this->delete($single_table, $where, $limit, $reset_data); } return; } else { $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); } if ($where !== '') { $this->where($where); } if ( ! empty($limit)) { $this->limit($limit); } if (count($this->qb_where) === 0) { return ($this->db_debug) ? $this->display_error('db_del_must_use_where') : FALSE; } $sql = $this->_delete($table); if ($reset_data) { $this->_reset_write(); } return ($this->return_delete_sql === TRUE) ? $sql : $this->query($sql); } // -------------------------------------------------------------------- /** * Delete statement * * Generates a platform-specific delete string from the supplied data * * @param string the table name * @return string */ protected function _delete($table) { return 'DELETE FROM '.$table.$this->_compile_wh('qb_where') .($this->qb_limit !== FALSE ? ' LIMIT '.$this->qb_limit : ''); } // -------------------------------------------------------------------- /** * DB Prefix * * Prepends a database prefix if one exists in configuration * * @param string the table * @return string */ public function dbprefix($table = '') { if ($table === '') { $this->display_error('db_table_name_required'); } return $this->dbprefix.$table; } // -------------------------------------------------------------------- /** * Set DB Prefix * * Set's the DB Prefix to something new without needing to reconnect * * @param string the prefix * @return string */ public function set_dbprefix($prefix = '') { return $this->dbprefix = $prefix; } // -------------------------------------------------------------------- /** * Track Aliases * * Used to track SQL statements written with aliased tables. * * @param string The table to inspect * @return string */ protected function _track_aliases($table) { if (is_array($table)) { foreach ($table as $t) { $this->_track_aliases($t); } return; } // Does the string contain a comma? If so, we need to separate // the string into discreet statements if (strpos($table, ',') !== FALSE) { return $this->_track_aliases(explode(',', $table)); } // if a table alias is used we can recognize it by a space if (strpos($table, ' ') !== FALSE) { // if the alias is written with the AS keyword, remove it $table = preg_replace('/\s+AS\s+/i', ' ', $table); // Grab the alias $table = trim(strrchr($table, ' ')); // Store the alias, if it doesn't already exist if ( ! in_array($table, $this->qb_aliased_tables, TRUE)) { $this->qb_aliased_tables[] = $table; if ($this->qb_caching === TRUE && ! in_array($table, $this->qb_cache_aliased_tables, TRUE)) { $this->qb_cache_aliased_tables[] = $table; $this->qb_cache_exists[] = 'aliased_tables'; } } } } // -------------------------------------------------------------------- /** * Compile the SELECT statement * * Generates a query string based on which functions were used. * Should not be called directly. * * @param bool $select_override * @return string */ protected function _compile_select($select_override = FALSE) { // Combine any cached components with the current statements $this->_merge_cache(); // Write the "select" portion of the query if ($select_override !== FALSE) { $sql = $select_override; } else { $sql = ( ! $this->qb_distinct) ? 'SELECT ' : 'SELECT DISTINCT '; if (count($this->qb_select) === 0) { $sql .= '*'; } else { // Cycle through the "select" portion of the query and prep each column name. // The reason we protect identifiers here rather than in the select() function // is because until the user calls the from() function we don't know if there are aliases foreach ($this->qb_select as $key => $val) { $no_escape = isset($this->qb_no_escape[$key]) ? $this->qb_no_escape[$key] : NULL; $this->qb_select[$key] = $this->protect_identifiers($val, FALSE, $no_escape); } $sql .= implode(', ', $this->qb_select); } } // Write the "FROM" portion of the query if (count($this->qb_from) > 0) { $sql .= "\nFROM ".$this->_from_tables(); } // Write the "JOIN" portion of the query if (count($this->qb_join) > 0) { $sql .= "\n".implode("\n", $this->qb_join); } $sql .= $this->_compile_wh('qb_where') .$this->_compile_group_by() .$this->_compile_wh('qb_having') .$this->_compile_order_by(); // ORDER BY // LIMIT if ($this->qb_limit !== FALSE OR $this->qb_offset) { return $this->_limit($sql."\n"); } return $sql; } // -------------------------------------------------------------------- /** * Compile WHERE, HAVING statements * * Escapes identifiers in WHERE and HAVING statements at execution time. * * Required so that aliases are tracked properly, regardless of whether * where(), or_where(), having(), or_having are called prior to from(), * join() and dbprefix is added only if needed. * * @param string $qb_key 'qb_where' or 'qb_having' * @return string SQL statement */ protected function _compile_wh($qb_key) { if (count($this->$qb_key) > 0) { for ($i = 0, $c = count($this->$qb_key); $i < $c; $i++) { // Is this condition already compiled? if (is_string($this->{$qb_key}[$i])) { continue; } elseif ($this->{$qb_key}[$i]['escape'] === FALSE) { $this->{$qb_key}[$i] = $this->{$qb_key}[$i]['condition'].(isset($this->{$qb_key}[$i]['value']) ? ' '.$this->{$qb_key}[$i]['value'] : ''); continue; } // Split multiple conditions $conditions = preg_split( '/((?:^|\s+)AND\s+|(?:^|\s+)OR\s+)/i', $this->{$qb_key}[$i]['condition'], -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); for ($ci = 0, $cc = count($conditions); $ci < $cc; $ci++) { if (($op = $this->_get_operator($conditions[$ci])) === FALSE OR ! preg_match('/^(\(?)(.*)('.preg_quote($op, '/').')\s*(.*(? '(test <= foo)', /* the whole thing */ // 1 => '(', /* optional */ // 2 => 'test', /* the field name */ // 3 => ' <= ', /* $op */ // 4 => 'foo', /* optional, if $op is e.g. 'IS NULL' */ // 5 => ')' /* optional */ // ); if ( ! empty($matches[4])) { $this->_is_literal($matches[4]) OR $matches[4] = $this->protect_identifiers(trim($matches[4])); $matches[4] = ' '.$matches[4]; } $conditions[$ci] = $matches[1].$this->protect_identifiers(trim($matches[2])) .' '.trim($matches[3]).$matches[4].$matches[5]; } $this->{$qb_key}[$i] = implode('', $conditions).(isset($this->{$qb_key}[$i]['value']) ? ' '.$this->{$qb_key}[$i]['value'] : ''); } return ($qb_key === 'qb_having' ? "\nHAVING " : "\nWHERE ") .implode("\n", $this->$qb_key); } return ''; } // -------------------------------------------------------------------- /** * Compile GROUP BY * * Escapes identifiers in GROUP BY statements at execution time. * * Required so that aliases are tracked properly, regardless of whether * group_by() is called prior to from(), join() and dbprefix is added * only if needed. * * @return string SQL statement */ protected function _compile_group_by() { if (count($this->qb_groupby) > 0) { for ($i = 0, $c = count($this->qb_groupby); $i < $c; $i++) { // Is it already compiled? if (is_string($this->qb_groupby[$i])) { continue; } $this->qb_groupby[$i] = ($this->qb_groupby[$i]['escape'] === FALSE OR $this->_is_literal($this->qb_groupby[$i]['field'])) ? $this->qb_groupby[$i]['field'] : $this->protect_identifiers($this->qb_groupby[$i]['field']); } return "\nGROUP BY ".implode(', ', $this->qb_groupby); } return ''; } // -------------------------------------------------------------------- /** * Compile ORDER BY * * Escapes identifiers in ORDER BY statements at execution time. * * Required so that aliases are tracked properly, regardless of whether * order_by() is called prior to from(), join() and dbprefix is added * only if needed. * * @return string SQL statement */ protected function _compile_order_by() { if (empty($this->qb_orderby)) { return ''; } for ($i = 0, $c = count($this->qb_orderby); $i < $c; $i++) { if (is_string($this->qb_orderby[$i])) { continue; } if ($this->qb_orderby[$i]['escape'] !== FALSE && ! $this->_is_literal($this->qb_orderby[$i]['field'])) { $this->qb_orderby[$i]['field'] = $this->protect_identifiers($this->qb_orderby[$i]['field']); } $this->qb_orderby[$i] = $this->qb_orderby[$i]['field'].$this->qb_orderby[$i]['direction']; } return "\nORDER BY ".implode(', ', $this->qb_orderby); } // -------------------------------------------------------------------- /** * Object to Array * * Takes an object as input and converts the class variables to array key/vals * * @param object * @return array */ protected function _object_to_array($object) { if ( ! is_object($object)) { return $object; } $array = array(); foreach (get_object_vars($object) as $key => $val) { // There are some built in keys we need to ignore for this conversion if ( ! is_object($val) && ! is_array($val) && $key !== '_parent_name') { $array[$key] = $val; } } return $array; } // -------------------------------------------------------------------- /** * Object to Array * * Takes an object as input and converts the class variables to array key/vals * * @param object * @return array */ protected function _object_to_array_batch($object) { if ( ! is_object($object)) { return $object; } $array = array(); $out = get_object_vars($object); $fields = array_keys($out); foreach ($fields as $val) { // There are some built in keys we need to ignore for this conversion if ($val !== '_parent_name') { $i = 0; foreach ($out[$val] as $data) { $array[$i++][$val] = $data; } } } return $array; } // -------------------------------------------------------------------- /** * Start Cache * * Starts QB caching * * @return CI_DB_query_builder */ public function start_cache() { $this->qb_caching = TRUE; return $this; } // -------------------------------------------------------------------- /** * Stop Cache * * Stops QB caching * * @return CI_DB_query_builder */ public function stop_cache() { $this->qb_caching = FALSE; return $this; } // -------------------------------------------------------------------- /** * Flush Cache * * Empties the QB cache * * @return CI_DB_query_builder */ public function flush_cache() { $this->_reset_run(array( 'qb_cache_select' => array(), 'qb_cache_from' => array(), 'qb_cache_join' => array(), 'qb_cache_where' => array(), 'qb_cache_groupby' => array(), 'qb_cache_having' => array(), 'qb_cache_orderby' => array(), 'qb_cache_set' => array(), 'qb_cache_exists' => array(), 'qb_cache_no_escape' => array(), 'qb_cache_aliased_tables' => array() )); return $this; } // -------------------------------------------------------------------- /** * Merge Cache * * When called, this function merges any cached QB arrays with * locally called ones. * * @return void */ protected function _merge_cache() { if (count($this->qb_cache_exists) === 0) { return; } elseif (in_array('select', $this->qb_cache_exists, TRUE)) { $qb_no_escape = $this->qb_cache_no_escape; } foreach (array_unique($this->qb_cache_exists) as $val) // select, from, etc. { $qb_variable = 'qb_'.$val; $qb_cache_var = 'qb_cache_'.$val; $qb_new = $this->$qb_cache_var; for ($i = 0, $c = count($this->$qb_variable); $i < $c; $i++) { if ( ! in_array($this->{$qb_variable}[$i], $qb_new, TRUE)) { $qb_new[] = $this->{$qb_variable}[$i]; if ($val === 'select') { $qb_no_escape[] = $this->qb_no_escape[$i]; } } } $this->$qb_variable = $qb_new; if ($val === 'select') { $this->qb_no_escape = $qb_no_escape; } } } // -------------------------------------------------------------------- /** * Is literal * * Determines if a string represents a literal value or a field name * * @param string $str * @return bool */ protected function _is_literal($str) { $str = trim($str); if (empty($str) OR ctype_digit($str) OR (string) (float) $str === $str OR in_array(strtoupper($str), array('TRUE', 'FALSE'), TRUE)) { return TRUE; } static $_str; if (empty($_str)) { $_str = ($this->_escape_char !== '"') ? array('"', "'") : array("'"); } return in_array($str[0], $_str, TRUE); } // -------------------------------------------------------------------- /** * Reset Query Builder values. * * Publicly-visible method to reset the QB values. * * @return CI_DB_query_builder */ public function reset_query() { $this->_reset_select(); $this->_reset_write(); return $this; } // -------------------------------------------------------------------- /** * Resets the query builder values. Called by the get() function * * @param array An array of fields to reset * @return void */ protected function _reset_run($qb_reset_items) { foreach ($qb_reset_items as $item => $default_value) { $this->$item = $default_value; } } // -------------------------------------------------------------------- /** * Resets the query builder values. Called by the get() function * * @return void */ protected function _reset_select() { $this->_reset_run(array( 'qb_select' => array(), 'qb_from' => array(), 'qb_join' => array(), 'qb_where' => array(), 'qb_groupby' => array(), 'qb_having' => array(), 'qb_orderby' => array(), 'qb_aliased_tables' => array(), 'qb_no_escape' => array(), 'qb_distinct' => FALSE, 'qb_limit' => FALSE, 'qb_offset' => FALSE )); } // -------------------------------------------------------------------- /** * Resets the query builder "write" values. * * Called by the insert() update() insert_batch() update_batch() and delete() functions * * @return void */ protected function _reset_write() { $this->_reset_run(array( 'qb_set' => array(), 'qb_set_ub' => array(), 'qb_from' => array(), 'qb_join' => array(), 'qb_where' => array(), 'qb_orderby' => array(), 'qb_keys' => array(), 'qb_limit' => FALSE )); } } PK!®ò(ƒƒdatabase/index.htmlnu„[µü¤ 403 Forbidden

    Directory access is forbidden.

    PK!çß0±v³v³database/DB_driver.phpnu„[µü¤ $val) { $this->$key = $val; } } log_message('info', 'Database Driver Class Initialized'); } // -------------------------------------------------------------------- /** * Initialize Database Settings * * @return bool */ public function initialize() { /* If an established connection is available, then there's * no need to connect and select the database. * * Depending on the database driver, conn_id can be either * boolean TRUE, a resource or an object. */ if ($this->conn_id) { return TRUE; } // ---------------------------------------------------------------- // Connect to the database and set the connection ID $this->conn_id = $this->db_connect($this->pconnect); // No connection resource? Check if there is a failover else throw an error if ( ! $this->conn_id) { // Check if there is a failover set if ( ! empty($this->failover) && is_array($this->failover)) { // Go over all the failovers foreach ($this->failover as $failover) { // Replace the current settings with those of the failover foreach ($failover as $key => $val) { $this->$key = $val; } // Try to connect $this->conn_id = $this->db_connect($this->pconnect); // If a connection is made break the foreach loop if ($this->conn_id) { break; } } } // We still don't have a connection? if ( ! $this->conn_id) { log_message('error', 'Unable to connect to the database'); if ($this->db_debug) { $this->display_error('db_unable_to_connect'); } return FALSE; } } // Now we set the character set and that's all return $this->db_set_charset($this->char_set); } // -------------------------------------------------------------------- /** * DB connect * * This is just a dummy method that all drivers will override. * * @return mixed */ public function db_connect() { return TRUE; } // -------------------------------------------------------------------- /** * Persistent database connection * * @return mixed */ public function db_pconnect() { return $this->db_connect(TRUE); } // -------------------------------------------------------------------- /** * Reconnect * * Keep / reestablish the db connection if no queries have been * sent for a length of time exceeding the server's idle timeout. * * This is just a dummy method to allow drivers without such * functionality to not declare it, while others will override it. * * @return void */ public function reconnect() { } // -------------------------------------------------------------------- /** * Select database * * This is just a dummy method to allow drivers without such * functionality to not declare it, while others will override it. * * @return bool */ public function db_select() { return TRUE; } // -------------------------------------------------------------------- /** * Last error * * @return array */ public function error() { return array('code' => NULL, 'message' => NULL); } // -------------------------------------------------------------------- /** * Set client character set * * @param string * @return bool */ public function db_set_charset($charset) { if (method_exists($this, '_db_set_charset') && ! $this->_db_set_charset($charset)) { log_message('error', 'Unable to set database connection charset: '.$charset); if ($this->db_debug) { $this->display_error('db_unable_to_set_charset', $charset); } return FALSE; } return TRUE; } // -------------------------------------------------------------------- /** * The name of the platform in use (mysql, mssql, etc...) * * @return string */ public function platform() { return $this->dbdriver; } // -------------------------------------------------------------------- /** * Database version number * * Returns a string containing the version of the database being used. * Most drivers will override this method. * * @return string */ public function version() { if (isset($this->data_cache['version'])) { return $this->data_cache['version']; } if (FALSE === ($sql = $this->_version())) { return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; } $query = $this->query($sql)->row(); return $this->data_cache['version'] = $query->ver; } // -------------------------------------------------------------------- /** * Version number query string * * @return string */ protected function _version() { return 'SELECT VERSION() AS ver'; } // -------------------------------------------------------------------- /** * Execute the query * * Accepts an SQL string as input and returns a result object upon * successful execution of a "read" type query. Returns boolean TRUE * upon successful execution of a "write" type query. Returns boolean * FALSE upon failure, and if the $db_debug variable is set to TRUE * will raise an error. * * @param string $sql * @param array $binds = FALSE An array of binding data * @param bool $return_object = NULL * @return mixed */ public function query($sql, $binds = FALSE, $return_object = NULL) { if ($sql === '') { log_message('error', 'Invalid query: '.$sql); return ($this->db_debug) ? $this->display_error('db_invalid_query') : FALSE; } elseif ( ! is_bool($return_object)) { $return_object = ! $this->is_write_type($sql); } // Verify table prefix and replace if necessary if ($this->dbprefix !== '' && $this->swap_pre !== '' && $this->dbprefix !== $this->swap_pre) { $sql = preg_replace('/(\W)'.$this->swap_pre.'(\S+?)/', '\\1'.$this->dbprefix.'\\2', $sql); } // Compile binds if needed if ($binds !== FALSE) { $sql = $this->compile_binds($sql, $binds); } // Is query caching enabled? If the query is a "read type" // we will load the caching class and return the previously // cached query if it exists if ($this->cache_on === TRUE && $return_object === TRUE && $this->_cache_init()) { $this->load_rdriver(); if (FALSE !== ($cache = $this->CACHE->read($sql))) { return $cache; } } // Save the query for debugging if ($this->save_queries === TRUE) { $this->queries[] = $sql; } // Start the Query Timer $time_start = microtime(TRUE); // Run the Query if (FALSE === ($this->result_id = $this->simple_query($sql))) { if ($this->save_queries === TRUE) { $this->query_times[] = 0; } // This will trigger a rollback if transactions are being used if ($this->_trans_depth !== 0) { $this->_trans_status = FALSE; } // Grab the error now, as we might run some additional queries before displaying the error $error = $this->error(); // Log errors log_message('error', 'Query error: '.$error['message'].' - Invalid query: '.$sql); if ($this->db_debug) { // We call this function in order to roll-back queries // if transactions are enabled. If we don't call this here // the error message will trigger an exit, causing the // transactions to remain in limbo. while ($this->_trans_depth !== 0) { $trans_depth = $this->_trans_depth; $this->trans_complete(); if ($trans_depth === $this->_trans_depth) { log_message('error', 'Database: Failure during an automated transaction commit/rollback!'); break; } } // Display errors return $this->display_error(array('Error Number: '.$error['code'], $error['message'], $sql)); } return FALSE; } // Stop and aggregate the query time results $time_end = microtime(TRUE); $this->benchmark += $time_end - $time_start; if ($this->save_queries === TRUE) { $this->query_times[] = $time_end - $time_start; } // Increment the query counter $this->query_count++; // Will we have a result object instantiated? If not - we'll simply return TRUE if ($return_object !== TRUE) { // If caching is enabled we'll auto-cleanup any existing files related to this particular URI if ($this->cache_on === TRUE && $this->cache_autodel === TRUE && $this->_cache_init()) { $this->CACHE->delete(); } return TRUE; } // Load and instantiate the result driver $driver = $this->load_rdriver(); $RES = new $driver($this); // Is query caching enabled? If so, we'll serialize the // result object and save it to a cache file. if ($this->cache_on === TRUE && $this->_cache_init()) { // We'll create a new instance of the result object // only without the platform specific driver since // we can't use it with cached data (the query result // resource ID won't be any good once we've cached the // result object, so we'll have to compile the data // and save it) $CR = new CI_DB_result($this); $CR->result_object = $RES->result_object(); $CR->result_array = $RES->result_array(); $CR->num_rows = $RES->num_rows(); // Reset these since cached objects can not utilize resource IDs. $CR->conn_id = NULL; $CR->result_id = NULL; $this->CACHE->write($sql, $CR); } return $RES; } // -------------------------------------------------------------------- /** * Load the result drivers * * @return string the name of the result class */ public function load_rdriver() { $driver = 'CI_DB_'.$this->dbdriver.'_result'; if ( ! class_exists($driver, FALSE)) { require_once(BASEPATH.'database/DB_result.php'); require_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result.php'); } return $driver; } // -------------------------------------------------------------------- /** * Simple Query * This is a simplified version of the query() function. Internally * we only use it when running transaction commands since they do * not require all the features of the main query() function. * * @param string the sql query * @return mixed */ public function simple_query($sql) { if ( ! $this->conn_id) { if ( ! $this->initialize()) { return FALSE; } } return $this->_execute($sql); } // -------------------------------------------------------------------- /** * Disable Transactions * This permits transactions to be disabled at run-time. * * @return void */ public function trans_off() { $this->trans_enabled = FALSE; } // -------------------------------------------------------------------- /** * Enable/disable Transaction Strict Mode * * When strict mode is enabled, if you are running multiple groups of * transactions, if one group fails all subsequent groups will be * rolled back. * * If strict mode is disabled, each group is treated autonomously, * meaning a failure of one group will not affect any others * * @param bool $mode = TRUE * @return void */ public function trans_strict($mode = TRUE) { $this->trans_strict = is_bool($mode) ? $mode : TRUE; } // -------------------------------------------------------------------- /** * Start Transaction * * @param bool $test_mode = FALSE * @return bool */ public function trans_start($test_mode = FALSE) { if ( ! $this->trans_enabled) { return FALSE; } return $this->trans_begin($test_mode); } // -------------------------------------------------------------------- /** * Complete Transaction * * @return bool */ public function trans_complete() { if ( ! $this->trans_enabled) { return FALSE; } // The query() function will set this flag to FALSE in the event that a query failed if ($this->_trans_status === FALSE OR $this->_trans_failure === TRUE) { $this->trans_rollback(); // If we are NOT running in strict mode, we will reset // the _trans_status flag so that subsequent groups of // transactions will be permitted. if ($this->trans_strict === FALSE) { $this->_trans_status = TRUE; } log_message('debug', 'DB Transaction Failure'); return FALSE; } return $this->trans_commit(); } // -------------------------------------------------------------------- /** * Lets you retrieve the transaction flag to determine if it has failed * * @return bool */ public function trans_status() { return $this->_trans_status; } // -------------------------------------------------------------------- /** * Begin Transaction * * @param bool $test_mode * @return bool */ public function trans_begin($test_mode = FALSE) { if ( ! $this->trans_enabled) { return FALSE; } // When transactions are nested we only begin/commit/rollback the outermost ones elseif ($this->_trans_depth > 0) { $this->_trans_depth++; return TRUE; } // Reset the transaction failure flag. // If the $test_mode flag is set to TRUE transactions will be rolled back // even if the queries produce a successful result. $this->_trans_failure = ($test_mode === TRUE); if ($this->_trans_begin()) { $this->_trans_status = TRUE; $this->_trans_depth++; return TRUE; } return FALSE; } // -------------------------------------------------------------------- /** * Commit Transaction * * @return bool */ public function trans_commit() { if ( ! $this->trans_enabled OR $this->_trans_depth === 0) { return FALSE; } // When transactions are nested we only begin/commit/rollback the outermost ones elseif ($this->_trans_depth > 1 OR $this->_trans_commit()) { $this->_trans_depth--; return TRUE; } return FALSE; } // -------------------------------------------------------------------- /** * Rollback Transaction * * @return bool */ public function trans_rollback() { if ( ! $this->trans_enabled OR $this->_trans_depth === 0) { return FALSE; } // When transactions are nested we only begin/commit/rollback the outermost ones elseif ($this->_trans_depth > 1 OR $this->_trans_rollback()) { $this->_trans_depth--; return TRUE; } return FALSE; } // -------------------------------------------------------------------- /** * Compile Bindings * * @param string the sql statement * @param array an array of bind data * @return string */ public function compile_binds($sql, $binds) { if (empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE) { return $sql; } elseif ( ! is_array($binds)) { $binds = array($binds); $bind_count = 1; } else { // Make sure we're using numeric keys $binds = array_values($binds); $bind_count = count($binds); } // We'll need the marker length later $ml = strlen($this->bind_marker); // Make sure not to replace a chunk inside a string that happens to match the bind marker if ($c = preg_match_all("/'[^']*'|\"[^\"]*\"/i", $sql, $matches)) { $c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', str_replace($matches[0], str_replace($this->bind_marker, str_repeat(' ', $ml), $matches[0]), $sql, $c), $matches, PREG_OFFSET_CAPTURE); // Bind values' count must match the count of markers in the query if ($bind_count !== $c) { return $sql; } } elseif (($c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', $sql, $matches, PREG_OFFSET_CAPTURE)) !== $bind_count) { return $sql; } do { $c--; $escaped_value = $this->escape($binds[$c]); if (is_array($escaped_value)) { $escaped_value = '('.implode(',', $escaped_value).')'; } $sql = substr_replace($sql, $escaped_value, $matches[0][$c][1], $ml); } while ($c !== 0); return $sql; } // -------------------------------------------------------------------- /** * Determines if a query is a "write" type. * * @param string An SQL query string * @return bool */ public function is_write_type($sql) { return (bool) preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX|MERGE)\s/i', $sql); } // -------------------------------------------------------------------- /** * Calculate the aggregate query elapsed time * * @param int The number of decimal places * @return string */ public function elapsed_time($decimals = 6) { return number_format($this->benchmark, $decimals); } // -------------------------------------------------------------------- /** * Returns the total number of queries * * @return int */ public function total_queries() { return $this->query_count; } // -------------------------------------------------------------------- /** * Returns the last query that was executed * * @return string */ public function last_query() { return end($this->queries); } // -------------------------------------------------------------------- /** * "Smart" Escape String * * Escapes data based on type * Sets boolean and null types * * @param string * @return mixed */ public function escape($str) { if (is_array($str)) { $str = array_map(array(&$this, 'escape'), $str); return $str; } elseif (is_string($str) OR (is_object($str) && method_exists($str, '__toString'))) { return "'".$this->escape_str($str)."'"; } elseif (is_bool($str)) { return ($str === FALSE) ? 0 : 1; } elseif ($str === NULL) { return 'NULL'; } return $str; } // -------------------------------------------------------------------- /** * Escape String * * @param string|string[] $str Input string * @param bool $like Whether or not the string will be used in a LIKE condition * @return string */ public function escape_str($str, $like = FALSE) { if (is_array($str)) { foreach ($str as $key => $val) { $str[$key] = $this->escape_str($val, $like); } return $str; } $str = $this->_escape_str($str); // escape LIKE condition wildcards if ($like === TRUE) { return str_replace( array($this->_like_escape_chr, '%', '_'), array($this->_like_escape_chr.$this->_like_escape_chr, $this->_like_escape_chr.'%', $this->_like_escape_chr.'_'), $str ); } return $str; } // -------------------------------------------------------------------- /** * Escape LIKE String * * Calls the individual driver for platform * specific escaping for LIKE conditions * * @param string|string[] * @return mixed */ public function escape_like_str($str) { return $this->escape_str($str, TRUE); } // -------------------------------------------------------------------- /** * Platform-dependent string escape * * @param string * @return string */ protected function _escape_str($str) { return str_replace("'", "''", remove_invisible_characters($str, FALSE)); } // -------------------------------------------------------------------- /** * Primary * * Retrieves the primary key. It assumes that the row in the first * position is the primary key * * @param string $table Table name * @return string */ public function primary($table) { $fields = $this->list_fields($table); return is_array($fields) ? current($fields) : FALSE; } // -------------------------------------------------------------------- /** * "Count All" query * * Generates a platform-specific query string that counts all records in * the specified database * * @param string * @return int */ public function count_all($table = '') { if ($table === '') { return 0; } $query = $this->query($this->_count_string.$this->escape_identifiers('numrows').' FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE)); if ($query->num_rows() === 0) { return 0; } $query = $query->row(); $this->_reset_select(); return (int) $query->numrows; } // -------------------------------------------------------------------- /** * Returns an array of table names * * @param string $constrain_by_prefix = FALSE * @return array */ public function list_tables($constrain_by_prefix = FALSE) { // Is there a cached result? if (isset($this->data_cache['table_names'])) { return $this->data_cache['table_names']; } if (FALSE === ($sql = $this->_list_tables($constrain_by_prefix))) { return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; } $this->data_cache['table_names'] = array(); $query = $this->query($sql); foreach ($query->result_array() as $row) { // Do we know from which column to get the table name? if ( ! isset($key)) { if (isset($row['table_name'])) { $key = 'table_name'; } elseif (isset($row['TABLE_NAME'])) { $key = 'TABLE_NAME'; } else { /* We have no other choice but to just get the first element's key. * Due to array_shift() accepting its argument by reference, if * E_STRICT is on, this would trigger a warning. So we'll have to * assign it first. */ $key = array_keys($row); $key = array_shift($key); } } $this->data_cache['table_names'][] = $row[$key]; } return $this->data_cache['table_names']; } // -------------------------------------------------------------------- /** * Determine if a particular table exists * * @param string $table_name * @return bool */ public function table_exists($table_name) { return in_array($this->protect_identifiers($table_name, TRUE, FALSE, FALSE), $this->list_tables()); } // -------------------------------------------------------------------- /** * Fetch Field Names * * @param string $table Table name * @return array */ public function list_fields($table) { if (FALSE === ($sql = $this->_list_columns($table))) { return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; } $query = $this->query($sql); $fields = array(); foreach ($query->result_array() as $row) { // Do we know from where to get the column's name? if ( ! isset($key)) { if (isset($row['column_name'])) { $key = 'column_name'; } elseif (isset($row['COLUMN_NAME'])) { $key = 'COLUMN_NAME'; } else { // We have no other choice but to just get the first element's key. $key = key($row); } } $fields[] = $row[$key]; } return $fields; } // -------------------------------------------------------------------- /** * Determine if a particular field exists * * @param string * @param string * @return bool */ public function field_exists($field_name, $table_name) { return in_array($field_name, $this->list_fields($table_name)); } // -------------------------------------------------------------------- /** * Returns an object with field data * * @param string $table the table name * @return array */ public function field_data($table) { $query = $this->query($this->_field_data($this->protect_identifiers($table, TRUE, NULL, FALSE))); return ($query) ? $query->field_data() : FALSE; } // -------------------------------------------------------------------- /** * Escape the SQL Identifiers * * This function escapes column and table names * * @param mixed * @return mixed */ public function escape_identifiers($item) { if ($this->_escape_char === '' OR empty($item) OR in_array($item, $this->_reserved_identifiers)) { return $item; } elseif (is_array($item)) { foreach ($item as $key => $value) { $item[$key] = $this->escape_identifiers($value); } return $item; } // Avoid breaking functions and literal values inside queries elseif (ctype_digit($item) OR $item[0] === "'" OR ($this->_escape_char !== '"' && $item[0] === '"') OR strpos($item, '(') !== FALSE) { return $item; } static $preg_ec = array(); if (empty($preg_ec)) { if (is_array($this->_escape_char)) { $preg_ec = array( preg_quote($this->_escape_char[0], '/'), preg_quote($this->_escape_char[1], '/'), $this->_escape_char[0], $this->_escape_char[1] ); } else { $preg_ec[0] = $preg_ec[1] = preg_quote($this->_escape_char, '/'); $preg_ec[2] = $preg_ec[3] = $this->_escape_char; } } foreach ($this->_reserved_identifiers as $id) { if (strpos($item, '.'.$id) !== FALSE) { return preg_replace('/'.$preg_ec[0].'?([^'.$preg_ec[1].'\.]+)'.$preg_ec[1].'?\./i', $preg_ec[2].'$1'.$preg_ec[3].'.', $item); } } return preg_replace('/'.$preg_ec[0].'?([^'.$preg_ec[1].'\.]+)'.$preg_ec[1].'?(\.)?/i', $preg_ec[2].'$1'.$preg_ec[3].'$2', $item); } // -------------------------------------------------------------------- /** * Generate an insert string * * @param string the table upon which the query will be performed * @param array an associative array data of key/values * @return string */ public function insert_string($table, $data) { $fields = $values = array(); foreach ($data as $key => $val) { $fields[] = $this->escape_identifiers($key); $values[] = $this->escape($val); } return $this->_insert($this->protect_identifiers($table, TRUE, NULL, FALSE), $fields, $values); } // -------------------------------------------------------------------- /** * Insert statement * * Generates a platform-specific insert string from the supplied data * * @param string the table name * @param array the insert keys * @param array the insert values * @return string */ protected function _insert($table, $keys, $values) { return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')'; } // -------------------------------------------------------------------- /** * Generate an update string * * @param string the table upon which the query will be performed * @param array an associative array data of key/values * @param mixed the "where" statement * @return string */ public function update_string($table, $data, $where) { if (empty($where)) { return FALSE; } $this->where($where); $fields = array(); foreach ($data as $key => $val) { $fields[$this->protect_identifiers($key)] = $this->escape($val); } $sql = $this->_update($this->protect_identifiers($table, TRUE, NULL, FALSE), $fields); $this->_reset_write(); return $sql; } // -------------------------------------------------------------------- /** * Update statement * * Generates a platform-specific update string from the supplied data * * @param string the table name * @param array the update data * @return string */ protected function _update($table, $values) { foreach ($values as $key => $val) { $valstr[] = $key.' = '.$val; } return 'UPDATE '.$table.' SET '.implode(', ', $valstr) .$this->_compile_wh('qb_where') .$this->_compile_order_by() .($this->qb_limit !== FALSE ? ' LIMIT '.$this->qb_limit : ''); } // -------------------------------------------------------------------- /** * Tests whether the string has an SQL operator * * @param string * @return bool */ protected function _has_operator($str) { return (bool) preg_match('/(<|>|!|=|\sIS NULL|\sIS NOT NULL|\sEXISTS|\sBETWEEN|\sLIKE|\sIN\s*\(|\s)/i', trim($str)); } // -------------------------------------------------------------------- /** * Returns the SQL string operator * * @param string * @return string */ protected function _get_operator($str) { static $_operators; if (empty($_operators)) { $_les = ($this->_like_escape_str !== '') ? '\s+'.preg_quote(trim(sprintf($this->_like_escape_str, $this->_like_escape_chr)), '/') : ''; $_operators = array( '\s*(?:<|>|!)?=\s*', // =, <=, >=, != '\s*<>?\s*', // <, <> '\s*>\s*', // > '\s+IS NULL', // IS NULL '\s+IS NOT NULL', // IS NOT NULL '\s+EXISTS\s*\(.*\)', // EXISTS(sql) '\s+NOT EXISTS\s*\(.*\)', // NOT EXISTS(sql) '\s+BETWEEN\s+', // BETWEEN value AND value '\s+IN\s*\(.*\)', // IN(list) '\s+NOT IN\s*\(.*\)', // NOT IN (list) '\s+LIKE\s+\S.*('.$_les.')?', // LIKE 'expr'[ ESCAPE '%s'] '\s+NOT LIKE\s+\S.*('.$_les.')?' // NOT LIKE 'expr'[ ESCAPE '%s'] ); } return preg_match('/'.implode('|', $_operators).'/i', $str, $match) ? $match[0] : FALSE; } // -------------------------------------------------------------------- /** * Enables a native PHP function to be run, using a platform agnostic wrapper. * * @param string $function Function name * @return mixed */ public function call_function($function) { $driver = ($this->dbdriver === 'postgre') ? 'pg_' : $this->dbdriver.'_'; if (FALSE === strpos($driver, $function)) { $function = $driver.$function; } if ( ! function_exists($function)) { return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; } return (func_num_args() > 1) ? call_user_func_array($function, array_slice(func_get_args(), 1)) : call_user_func($function); } // -------------------------------------------------------------------- /** * Set Cache Directory Path * * @param string the path to the cache directory * @return void */ public function cache_set_path($path = '') { $this->cachedir = $path; } // -------------------------------------------------------------------- /** * Enable Query Caching * * @return bool cache_on value */ public function cache_on() { return $this->cache_on = TRUE; } // -------------------------------------------------------------------- /** * Disable Query Caching * * @return bool cache_on value */ public function cache_off() { return $this->cache_on = FALSE; } // -------------------------------------------------------------------- /** * Delete the cache files associated with a particular URI * * @param string $segment_one = '' * @param string $segment_two = '' * @return bool */ public function cache_delete($segment_one = '', $segment_two = '') { return $this->_cache_init() ? $this->CACHE->delete($segment_one, $segment_two) : FALSE; } // -------------------------------------------------------------------- /** * Delete All cache files * * @return bool */ public function cache_delete_all() { return $this->_cache_init() ? $this->CACHE->delete_all() : FALSE; } // -------------------------------------------------------------------- /** * Initialize the Cache Class * * @return bool */ protected function _cache_init() { if ( ! class_exists('CI_DB_Cache', FALSE)) { require_once(BASEPATH.'database/DB_cache.php'); } elseif (is_object($this->CACHE)) { return TRUE; } $this->CACHE = new CI_DB_Cache($this); // pass db object to support multiple db connections and returned db objects return TRUE; } // -------------------------------------------------------------------- /** * Close DB Connection * * @return void */ public function close() { if ($this->conn_id) { $this->_close(); $this->conn_id = FALSE; } } // -------------------------------------------------------------------- /** * Close DB Connection * * This method would be overridden by most of the drivers. * * @return void */ protected function _close() { $this->conn_id = FALSE; } // -------------------------------------------------------------------- /** * Display an error message * * @param string the error message * @param string any "swap" values * @param bool whether to localize the message * @return string sends the application/views/errors/error_db.php template */ public function display_error($error = '', $swap = '', $native = FALSE) { $LANG =& load_class('Lang', 'core'); $LANG->load('db'); $heading = $LANG->line('db_error_heading'); if ($native === TRUE) { $message = (array) $error; } else { $message = is_array($error) ? $error : array(str_replace('%s', $swap, $LANG->line($error))); } // Find the most likely culprit of the error by going through // the backtrace until the source file is no longer in the // database folder. $trace = debug_backtrace(); foreach ($trace as $call) { if (isset($call['file'], $call['class'])) { // We'll need this on Windows, as APPPATH and BASEPATH will always use forward slashes if (DIRECTORY_SEPARATOR !== '/') { $call['file'] = str_replace('\\', '/', $call['file']); } if (strpos($call['file'], BASEPATH.'database') === FALSE && strpos($call['class'], 'Loader') === FALSE) { // Found it - use a relative path for safety $message[] = 'Filename: '.str_replace(array(APPPATH, BASEPATH), '', $call['file']); $message[] = 'Line Number: '.$call['line']; break; } } } $error =& load_class('Exceptions', 'core'); echo $error->show_error($heading, $message, 'error_db'); exit(8); // EXIT_DATABASE } // -------------------------------------------------------------------- /** * Protect Identifiers * * This function is used extensively by the Query Builder class, and by * a couple functions in this class. * It takes a column or table name (optionally with an alias) and inserts * the table prefix onto it. Some logic is necessary in order to deal with * column names that include the path. Consider a query like this: * * SELECT hostname.database.table.column AS c FROM hostname.database.table * * Or a query with aliasing: * * SELECT m.member_id, m.member_name FROM members AS m * * Since the column name can include up to four segments (host, DB, table, column) * or also have an alias prefix, we need to do a bit of work to figure this out and * insert the table prefix (if it exists) in the proper position, and escape only * the correct identifiers. * * @param string * @param bool * @param mixed * @param bool * @return string */ public function protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE) { if ( ! is_bool($protect_identifiers)) { $protect_identifiers = $this->_protect_identifiers; } if (is_array($item)) { $escaped_array = array(); foreach ($item as $k => $v) { $escaped_array[$this->protect_identifiers($k)] = $this->protect_identifiers($v, $prefix_single, $protect_identifiers, $field_exists); } return $escaped_array; } // This is basically a bug fix for queries that use MAX, MIN, etc. // If a parenthesis is found we know that we do not need to // escape the data or add a prefix. There's probably a more graceful // way to deal with this, but I'm not thinking of it -- Rick // // Added exception for single quotes as well, we don't want to alter // literal strings. -- Narf if (strcspn($item, "()'") !== strlen($item)) { return $item; } // Convert tabs or multiple spaces into single spaces $item = preg_replace('/\s+/', ' ', trim($item)); // If the item has an alias declaration we remove it and set it aside. // Note: strripos() is used in order to support spaces in table names if ($offset = strripos($item, ' AS ')) { $alias = ($protect_identifiers) ? substr($item, $offset, 4).$this->escape_identifiers(substr($item, $offset + 4)) : substr($item, $offset); $item = substr($item, 0, $offset); } elseif ($offset = strrpos($item, ' ')) { $alias = ($protect_identifiers) ? ' '.$this->escape_identifiers(substr($item, $offset + 1)) : substr($item, $offset); $item = substr($item, 0, $offset); } else { $alias = ''; } // Break the string apart if it contains periods, then insert the table prefix // in the correct location, assuming the period doesn't indicate that we're dealing // with an alias. While we're at it, we will escape the components if (strpos($item, '.') !== FALSE) { $parts = explode('.', $item); // Does the first segment of the exploded item match // one of the aliases previously identified? If so, // we have nothing more to do other than escape the item // // NOTE: The ! empty() condition prevents this method // from breaking when QB isn't enabled. if ( ! empty($this->qb_aliased_tables) && in_array($parts[0], $this->qb_aliased_tables)) { if ($protect_identifiers === TRUE) { foreach ($parts as $key => $val) { if ( ! in_array($val, $this->_reserved_identifiers)) { $parts[$key] = $this->escape_identifiers($val); } } $item = implode('.', $parts); } return $item.$alias; } // Is there a table prefix defined in the config file? If not, no need to do anything if ($this->dbprefix !== '') { // We now add the table prefix based on some logic. // Do we have 4 segments (hostname.database.table.column)? // If so, we add the table prefix to the column name in the 3rd segment. if (isset($parts[3])) { $i = 2; } // Do we have 3 segments (database.table.column)? // If so, we add the table prefix to the column name in 2nd position elseif (isset($parts[2])) { $i = 1; } // Do we have 2 segments (table.column)? // If so, we add the table prefix to the column name in 1st segment else { $i = 0; } // This flag is set when the supplied $item does not contain a field name. // This can happen when this function is being called from a JOIN. if ($field_exists === FALSE) { $i++; } // dbprefix may've already been applied, with or without the identifier escaped $ec = '(?'.preg_quote(is_array($this->_escape_char) ? $this->_escape_char[0] : $this->_escape_char).')?'; isset($ec[0]) && $ec .= '?'; // Just in case someone has disabled escaping by forcing an empty escape character // Verify table prefix and replace if necessary if ($this->swap_pre !== '' && preg_match('#^'.$ec.preg_quote($this->swap_pre).'#', $parts[$i])) { $parts[$i] = preg_replace('#^'.$ec.preg_quote($this->swap_pre).'(\S+?)#', '\\1'.$this->dbprefix.'\\2', $parts[$i]); } // We only add the table prefix if it does not already exist else { preg_match('#^'.$ec.preg_quote($this->dbprefix).'#', $parts[$i]) OR $parts[$i] = $this->dbprefix.$parts[$i]; } // Put the parts back together $item = implode('.', $parts); } if ($protect_identifiers === TRUE) { $item = $this->escape_identifiers($item); } return $item.$alias; } // Is there a table prefix? If not, no need to insert it if ($this->dbprefix !== '') { // Verify table prefix and replace if necessary if ($this->swap_pre !== '' && strpos($item, $this->swap_pre) === 0) { $item = preg_replace('/^'.$this->swap_pre.'(\S+?)/', $this->dbprefix.'\\1', $item); } // Do we prefix an item with no segments? elseif ($prefix_single === TRUE && strpos($item, $this->dbprefix) !== 0) { $item = $this->dbprefix.$item; } } if ($protect_identifiers === TRUE && ! in_array($item, $this->_reserved_identifiers)) { $item = $this->escape_identifiers($item); } return $item.$alias; } // -------------------------------------------------------------------- /** * Dummy method that allows Query Builder class to be disabled * and keep count_all() working. * * @return void */ protected function _reset_select() { } } PK!Xp¢Ý7Ý7database/DB_result.phpnu„[µü¤conn_id = $driver_object->conn_id; $this->result_id = $driver_object->result_id; } // -------------------------------------------------------------------- /** * Number of rows in the result set * * @return int */ public function num_rows() { if (is_int($this->num_rows)) { return $this->num_rows; } elseif (count($this->result_array) > 0) { return $this->num_rows = count($this->result_array); } elseif (count($this->result_object) > 0) { return $this->num_rows = count($this->result_object); } return $this->num_rows = count($this->result_array()); } // -------------------------------------------------------------------- /** * Query result. Acts as a wrapper function for the following functions. * * @param string $type 'object', 'array' or a custom class name * @return array */ public function result($type = 'object') { if ($type === 'array') { return $this->result_array(); } elseif ($type === 'object') { return $this->result_object(); } return $this->custom_result_object($type); } // -------------------------------------------------------------------- /** * Custom query result. * * @param string $class_name * @return array */ public function custom_result_object($class_name) { if (isset($this->custom_result_object[$class_name])) { return $this->custom_result_object[$class_name]; } elseif ( ! $this->result_id OR $this->num_rows === 0) { return array(); } // Don't fetch the result set again if we already have it $_data = NULL; if (($c = count($this->result_array)) > 0) { $_data = 'result_array'; } elseif (($c = count($this->result_object)) > 0) { $_data = 'result_object'; } if ($_data !== NULL) { for ($i = 0; $i < $c; $i++) { $this->custom_result_object[$class_name][$i] = new $class_name(); foreach ($this->{$_data}[$i] as $key => $value) { $this->custom_result_object[$class_name][$i]->$key = $value; } } return $this->custom_result_object[$class_name]; } is_null($this->row_data) OR $this->data_seek(0); $this->custom_result_object[$class_name] = array(); while ($row = $this->_fetch_object($class_name)) { $this->custom_result_object[$class_name][] = $row; } return $this->custom_result_object[$class_name]; } // -------------------------------------------------------------------- /** * Query result. "object" version. * * @return array */ public function result_object() { if (count($this->result_object) > 0) { return $this->result_object; } // In the event that query caching is on, the result_id variable // will not be a valid resource so we'll simply return an empty // array. if ( ! $this->result_id OR $this->num_rows === 0) { return array(); } if (($c = count($this->result_array)) > 0) { for ($i = 0; $i < $c; $i++) { $this->result_object[$i] = (object) $this->result_array[$i]; } return $this->result_object; } is_null($this->row_data) OR $this->data_seek(0); while ($row = $this->_fetch_object()) { $this->result_object[] = $row; } return $this->result_object; } // -------------------------------------------------------------------- /** * Query result. "array" version. * * @return array */ public function result_array() { if (count($this->result_array) > 0) { return $this->result_array; } // In the event that query caching is on, the result_id variable // will not be a valid resource so we'll simply return an empty // array. if ( ! $this->result_id OR $this->num_rows === 0) { return array(); } if (($c = count($this->result_object)) > 0) { for ($i = 0; $i < $c; $i++) { $this->result_array[$i] = (array) $this->result_object[$i]; } return $this->result_array; } is_null($this->row_data) OR $this->data_seek(0); while ($row = $this->_fetch_assoc()) { $this->result_array[] = $row; } return $this->result_array; } // -------------------------------------------------------------------- /** * Row * * A wrapper method. * * @param mixed $n * @param string $type 'object' or 'array' * @return mixed */ public function row($n = 0, $type = 'object') { if ( ! is_numeric($n)) { // We cache the row data for subsequent uses is_array($this->row_data) OR $this->row_data = $this->row_array(0); // array_key_exists() instead of isset() to allow for NULL values if (empty($this->row_data) OR ! array_key_exists($n, $this->row_data)) { return NULL; } return $this->row_data[$n]; } if ($type === 'object') return $this->row_object($n); elseif ($type === 'array') return $this->row_array($n); return $this->custom_row_object($n, $type); } // -------------------------------------------------------------------- /** * Assigns an item into a particular column slot * * @param mixed $key * @param mixed $value * @return void */ public function set_row($key, $value = NULL) { // We cache the row data for subsequent uses if ( ! is_array($this->row_data)) { $this->row_data = $this->row_array(0); } if (is_array($key)) { foreach ($key as $k => $v) { $this->row_data[$k] = $v; } return; } if ($key !== '' && $value !== NULL) { $this->row_data[$key] = $value; } } // -------------------------------------------------------------------- /** * Returns a single result row - custom object version * * @param int $n * @param string $type * @return object */ public function custom_row_object($n, $type) { isset($this->custom_result_object[$type]) OR $this->custom_result_object[$type] = $this->custom_result_object($type); if (count($this->custom_result_object[$type]) === 0) { return NULL; } if ($n !== $this->current_row && isset($this->custom_result_object[$type][$n])) { $this->current_row = $n; } return $this->custom_result_object[$type][$this->current_row]; } // -------------------------------------------------------------------- /** * Returns a single result row - object version * * @param int $n * @return object */ public function row_object($n = 0) { $result = $this->result_object(); if (count($result) === 0) { return NULL; } if ($n !== $this->current_row && isset($result[$n])) { $this->current_row = $n; } return $result[$this->current_row]; } // -------------------------------------------------------------------- /** * Returns a single result row - array version * * @param int $n * @return array */ public function row_array($n = 0) { $result = $this->result_array(); if (count($result) === 0) { return NULL; } if ($n !== $this->current_row && isset($result[$n])) { $this->current_row = $n; } return $result[$this->current_row]; } // -------------------------------------------------------------------- /** * Returns the "first" row * * @param string $type * @return mixed */ public function first_row($type = 'object') { $result = $this->result($type); return (count($result) === 0) ? NULL : $result[0]; } // -------------------------------------------------------------------- /** * Returns the "last" row * * @param string $type * @return mixed */ public function last_row($type = 'object') { $result = $this->result($type); return (count($result) === 0) ? NULL : $result[count($result) - 1]; } // -------------------------------------------------------------------- /** * Returns the "next" row * * @param string $type * @return mixed */ public function next_row($type = 'object') { $result = $this->result($type); if (count($result) === 0) { return NULL; } return isset($result[$this->current_row + 1]) ? $result[++$this->current_row] : NULL; } // -------------------------------------------------------------------- /** * Returns the "previous" row * * @param string $type * @return mixed */ public function previous_row($type = 'object') { $result = $this->result($type); if (count($result) === 0) { return NULL; } if (isset($result[$this->current_row - 1])) { --$this->current_row; } return $result[$this->current_row]; } // -------------------------------------------------------------------- /** * Returns an unbuffered row and move pointer to next row * * @param string $type 'array', 'object' or a custom class name * @return mixed */ public function unbuffered_row($type = 'object') { if ($type === 'array') { return $this->_fetch_assoc(); } elseif ($type === 'object') { return $this->_fetch_object(); } return $this->_fetch_object($type); } // -------------------------------------------------------------------- /** * The following methods are normally overloaded by the identically named * methods in the platform-specific driver -- except when query caching * is used. When caching is enabled we do not load the other driver. * These functions are primarily here to prevent undefined function errors * when a cached result object is in use. They are not otherwise fully * operational due to the unavailability of the database resource IDs with * cached results. */ // -------------------------------------------------------------------- /** * Number of fields in the result set * * Overridden by driver result classes. * * @return int */ public function num_fields() { return 0; } // -------------------------------------------------------------------- /** * Fetch Field Names * * Generates an array of column names. * * Overridden by driver result classes. * * @return array */ public function list_fields() { return array(); } // -------------------------------------------------------------------- /** * Field data * * Generates an array of objects containing field meta-data. * * Overridden by driver result classes. * * @return array */ public function field_data() { return array(); } // -------------------------------------------------------------------- /** * Free the result * * Overridden by driver result classes. * * @return void */ public function free_result() { $this->result_id = FALSE; } // -------------------------------------------------------------------- /** * Data Seek * * Moves the internal pointer to the desired offset. We call * this internally before fetching results to make sure the * result set starts at zero. * * Overridden by driver result classes. * * @param int $n * @return bool */ public function data_seek($n = 0) { return FALSE; } // -------------------------------------------------------------------- /** * Result - associative array * * Returns the result set as an array. * * Overridden by driver result classes. * * @return array */ protected function _fetch_assoc() { return array(); } // -------------------------------------------------------------------- /** * Result - object * * Returns the result set as an object. * * Overridden by driver result classes. * * @param string $class_name * @return object */ protected function _fetch_object($class_name = 'stdClass') { return new $class_name(); } } PK!®ò(ƒƒ index.htmlnu„[µü¤ 403 Forbidden

    Directory access is forbidden.

    PK!õ"Kuu .htaccessnu„[µü¤ Require all denied Deny from all PK!=ô•å‡M‡Mxref.gonu„[µü¤GOOF----LE-8-2.0oM]ƒ4h¨ ] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gxref¤ ¤ gfilenameS¤ fsystem/xref.scm¤ gimportsS¤ gbase¤ gpmatch¤   ¤ ¤ gcompile¤  ¤ ¤ gvm¤ gprogram¤ ¤ ¤ gsrfi¤ gsrfi-1¤ ¤ ¤ ¤ gexportsS¤ g*xref-ignored-modules*¤ gprocedure-callees¤ gprocedure-callers¤ gsource-closures¤ !gsource-procedures¤ " !¤ #gset-current-module¤ $#¤ %#¤ &gmemq¤ 'gprogram-objects¤ (g vector-length¤ )g make-vector¤ *g decompile¤ +gprogram-objcode¤ ,gtoS¤ -gassembly¤ .g load-program¤ /gfor-each¤ 0g toplevel-set¤ 1g toplevel-ref¤ 2gprogram?¤ 3gfold¤ 4gprogram-callee-rev-vars¤ 5g variable?¤ 6gmodule-variable¤ 7gprogram-module¤ 8gthe-root-module¤ 9gnested-ref-module¤ :gresolve-module¤ ;gmodule-public-interface¤ gmake-hash-table¤ ?g*module-callees-db*¤ @g*tainted-modules*¤ Ag value-history¤ BA¤ CB¤ Dg module-name¤ Egmember¤ Fgon-module-modified¤ Gg hashq-ref¤ Hgassoc¤ Ig hashq-set!¤ Jg add-caller¤ Kg assoc-remove!¤ Lgforget-callers¤ Mg hash-set!¤ Ngappend¤ Oghash-ref¤ Pg add-callees¤ Qgensure-callers-db¤ Rguntaint-modules¤ Sg hash-for-each¤ Tgmodule-observers¤ Ugmodule-observe¤ Vgmodule-for-each¤ Wg procedure?¤ Xgfilter¤ Ygvariable-bound?¤ Zgmodule-submodules¤ [gcurrent-module¤ \gerror¤ ]f/expected a variable, symbol, or (modname . sym)¤ ^gprogram-sources¤ _gprocedure-sources¤ `g*closure-sources-db*¤ ag *sources-db*¤ bg*module-sources-db*¤ cg*tainted-sources*¤ dgon-source-modified¤ eg hashv-set!¤ fg hashv-ref¤ gg add-source¤ hgdelq¤ ig hashv-remove!¤ jg forget-source¤ kfunexpected source format¤ lg add-sources¤ mgand=>¤ ng vector->list¤ og hashq-remove!¤ pgforget-sources¤ qgensure-sources-db¤ rguntaint-sources¤ sgsort!¤ tghash-map->list¤ ugcons¤ vg lines->ranges¤ wgreverse¤ xglookup-source-procedures¤ ygcanonicalizationS¤ zy Œ¤ {z¤ |grelative¤ }g %file-port-name-canonicalization¤ ~gcatch¤ ~¤ €~¤ gopen-input-file¤ ‚g port-filename¤C5h˜A…]4   "54%>"G&h]45$CŒC‡gx  gy  gfilenamefsystem/xref.scmŒ " ŒŒ  # ŒŒ  # ŒŒ  # ŒŒ   gnameg cons-uniqŒC'()*+,-./01hÿ]!"@ˆ$7Ž&#ˆ$Ž(L¤CCCCCˆ$=Ž&'ˆ$Ž(L¤C"ÿÿ„"ÿÿ€"ÿÿ|"ÿÿx÷gx  Žgvx  Dgvy   Dgvx  , @gvy  , @gvx S Šgvy  S Šgvx  l ‚gvy  l ‚ gfilenamefsystem/xref.scmŒ - ŒŒ  . ŒŒ < 0 'ŒŒ F . ŒŒ | / 'ŒŒ ‚ . ŒŒ  Ž C2345&6789:;h@¡]45$)4544554455ˆ$gŽ &Kˆ$@Žˆ$)Ž 4  O >"G """""ƒ‘$C4 £5$—4 4£55"ÿÿÈ£$5£45$#—45$"Œ"ÿÿŠŠ$R445  $ " 5 — $4 5$" Œ""ÿÿ1ˆ$žŽ   ˆ$‹  Ž   ˆ$x  Ž (f445 5$4 $ 45" 5"—$45$"Œ""ÿþ’CCCC—"ÿþ} "ÿþsC™gprog  @g cons-uniq  @gt  @gn  9 >gprogv  9 >gasm  9 >gvx  L ©gvy  L ©gvy  b ›gvy r ”gi  ± 4gout  ± 4gobj  ÷ 'gt 8 Kgv O €gvx  %gvy  %gvx ž #gvy ž #gvx ¯ !gvy  ¯ !gm  Ç gv  î gfilenamefsystem/xref.scmŒ ! ŒŒ  % ŒŒ $ ŒŒ  ' ŒŒ  ( ŒŒ ( $ŒŒ ) ( ŒŒ * ) ŒŒ - ) ŒŒ 7 ) <ŒŒ 9 ) ŒŒ 9 ' ŒŒ B * ŒŒ y , ŒŒ ± 2 ŒŒ ¶ 4 ŒŒ º 3 ŒŒ ¾ 5 ŒŒ Å 5 ŒŒ Ç 5 ŒŒ Ë 3 ŒŒ Î 6 ŒŒ Ï 7 ŒŒ Ö 8 ŒŒ Ý 8 3ŒŒ ß 8 ŒŒ á 7 ŒŒ é 6 ŒŒ î 9 ŒŒ ò 3 ŒŒ ÷ : ŒŒ ÷ : ŒŒ ú ; ŒŒ  ; ŒŒ  < ŒŒ  # ŒŒ  # ŒŒ  # ŒŒ ' < ŒŒ * ? %ŒŒ . > ŒŒ / @ "ŒŒ 2 @ 7ŒŒ 8 @ 3ŒŒ O @ "ŒŒ O @ ŒŒ T C ŒŒ Z C &ŒŒ [ # ŒŒ g # ŒŒ r # ŒŒ € C ŒŒ ƒ > ŒŒ º F #ŒŒ ½ F 6ŒŒ À F FŒŒ à F 6ŒŒ Ç F #ŒŒ Ç F ŒŒ Ï H #ŒŒ Ð I (ŒŒ Ø J )ŒŒ Ù K -ŒŒ é I (ŒŒ î F ŒŒ ó N ŒŒ ù O ŒŒ ú # ŒŒ  # ŒŒ  # ŒŒ  N ŒŒ * P ŒŒ 4 P ŒŒ 4 2 ŒŒ 6 2 ŒŒ > 2 ŒŒ ? Q ŒŒN  @ gnamegprogram-callee-rev-varsŒC4R24hš]45$6C’gproc  gfilenamefsystem/xref.scmŒ S ŒŒ  U ŒŒ T ŒŒ  U ŒŒ  V ŒŒ   gnamegprocedure-callee-rev-varsŒC Z 6ŒŒ F Z ŒŒ  F gnamegprocedure-calleesŒg documentationf1Evaluates to a list of the given program callees.ŒCR=R4>i5?R@RCRDE@hHÑ] 4545$"45$"ˆ$ Œ CCÉgm  Agname Agfilenamefsystem/xref.scmŒ h ŒŒ  i ŒŒ i ŒŒ j ŒŒ  j ŒŒ  k ŒŒ * j ŒŒ 2 l ŒŒ 6 j ŒŒ ; m ŒŒ = m ŒŒ  A gnamegon-module-modifiedŒCFRG=HEIhhE]45$=45$45$CŽŒCŒ66=gcallee  bgcaller  bgmod-name   bg all-callers  bgcallers   Pgfilenamefsystem/xref.scmŒ o ŒŒ  p ŒŒ p ŒŒ  q ŒŒ  s ŒŒ  s ŒŒ $ t ŒŒ % u ŒŒ 1 u ŒŒ : v 1ŒŒ ; v $ŒŒ < v ŒŒ K x ŒŒ N x ŒŒ P w ŒŒ ] r (ŒŒ b r ŒŒ  b gnameg add-callerŒCJRI=KGh ·]44556¯gcallee  gmod-name  gfilenamefsystem/xref.scmŒ z ŒŒ | ŒŒ | ŒŒ  | ;ŒŒ  | ŒŒ  | ŒŒ  { ŒŒ   gnamegforget-callersŒCLRM?NOh º]44556²gcallees  gmod-name  gfilenamefsystem/xref.scmŒ ~ ŒŒ € ŒŒ  € ŒŒ  € DŒŒ  € ŒŒ  € ŒŒ   ŒŒ   gnameg add-calleesŒCPRQ//Lha]L6Ygcallee  gfilenamefsystem/xref.scmŒ „ ŒŒ „ ŒŒ  CO?Qh0]4O45>"G6•gm  )gfilenamefsystem/xref.scmŒ ƒ ŒŒ  „ ŒŒ … ŒŒ  … .ŒŒ  … ŒŒ  „ ŒŒ ) † ŒŒ  ) gnameguntaintŒC@h0‚]4>"G4>"G Czgfilenamefsystem/xref.scmŒ ‚ ŒŒ  ‡ ŒŒ  ˆ ŒŒ ( ‰ ŒŒ * ‰ ŒŒ  , gnameguntaint-modulesŒCRR:SI&FTUDVGWIXY</Jha]LL6Ygcallee  gfilenamefsystem/xref.scmŒ — ŒŒ ˜ ŒŒ  CP h9]$ƒM$ 4M5"$C45$RM$4M>"G"44554LO>"G L6CC1gsym  Žgvar  Žgx  Œgt  " Œgcallees  e Šgfilenamefsystem/xref.scmŒ ¡ ŒŒ  ŒŒ ŒŒ ŒŒ ŒŒ  ’ ŒŒ  ’ ŒŒ " ‘ ŒŒ . “ ŒŒ 8 ‘ ŒŒ > ” ŒŒ ? ” ŒŒ X • ŒŒ ] – %ŒŒ e • ŒŒ e • ŒŒ h — ŒŒ Š š ŒŒ  Ž CG h ü] "vM$4M>"G"4455$"4>"G454LO>"GL6M$4 M5$C"ÿÿq"ÿÿmôgname  ™gsub  ™gname  V vgfilenamefsystem/xref.scmŒ § ŒŒ ŒŒ ŒŒ & ž ŒŒ + ž (ŒŒ 3 ž ŒŒ 7 ž ŒŒ < Ÿ ŒŒ P   ŒŒ V   ŒŒ Y ¡ ŒŒ | « ŒŒ | ¨ ŒŒ ƒ ¨ ŒŒ ¨ ŒŒ  ™ CZh„]LLO456|gmod  gfilenamefsystem/xref.scmŒ ¥ ŒŒ  ¬ ŒŒ  ¦ ŒŒ   gnamegvisit-submodulesŒC=>I&FTUDVGWIXY</Jha]LL6Ygcallee  gfilenamefsystem/xref.scmŒ — ŒŒ ˜ ŒŒ  CP h9]$ƒM$ 4M5"$C45$RM$4M>"G"44554LO>"G L6CC1gsym  Žgvar  Žgx  Œgt  " Œgcallees  e Šgfilenamefsystem/xref.scmŒ ¡ ŒŒ  ŒŒ ŒŒ ŒŒ ŒŒ  ’ ŒŒ  ’ ŒŒ " ‘ ŒŒ . “ ŒŒ 8 ‘ ŒŒ > ” ŒŒ ? ” ŒŒ X • ŒŒ ] – %ŒŒ e • ŒŒ e • ŒŒ h — ŒŒ Š š ŒŒ  Ž C hȼ]!$ 45"HOQ$"€$4 è5 4 è5K456$aJ$4J>"G"4455$"4 >"G4 5  O6C´gmod-name  Ãgmod  Ãgvisited   Ãgvisit-submodules  " Ãgname  ° Ágfilenamefsystem/xref.scmŒ ‹ ŒŒ  Œ ŒŒ Œ ŒŒ  Œ ŒŒ / ® ŒŒ 7 ® ŒŒ ; ® ŒŒ < ¯ ŒŒ E ¯ ŒŒ F ° ŒŒ O ° ŒŒ R ± ŒŒ U ± -ŒŒ X ± ŒŒ Z ± ŒŒ ` ® ŒŒ f ŒŒ g ŒŒ € ž ŒŒ … ž (ŒŒ ž ŒŒ ‘ ž ŒŒ – Ÿ ŒŒ ª   ŒŒ °   ŒŒ Á ¡ ŒŒ  à gnamegensure-callers-dbŒCQR56[:\]RG= hxN]45$"IŠ$4455"2ˆ$"Ž4455" 454>"G 6Fgvar  wgvx 7 Ogvy  7 Ogv \ wgfilenamefsystem/xref.scmŒ ´ ŒŒ  ¹ ŒŒ ¹ ŒŒ  º ŒŒ  ¹ ŒŒ  º ŒŒ  º 1ŒŒ & º ŒŒ - ¼ ŒŒ < ¾ ŒŒ ? ¾ &ŒŒ I ¾ ŒŒ T À ŒŒ X À ŒŒ \ À ŒŒ \ ¹ ŒŒ _ Á ŒŒ u  ŒŒ w  ŒŒ  w gnamegprocedure-callersŒg documentationf÷Returns an association list, keyed by module name, of known callers of the given procedure. The latter can specified directly as a variable, a symbol (which gets resolved in the current module) or a pair of the form (module-name . variable-name), ŒCR2^h—]45$6Cgproc  gfilenamefsystem/xref.scmŒ Í ŒŒ  Ï ŒŒ Î ŒŒ  Ï ŒŒ  Ð ŒŒ   gnamegprocedure-sourcesŒC_R`RaR4>i5bRcRDEchHÜ] 4545$"45$"ˆ$ Œ CCÔgm  Agname Agfilenamefsystem/xref.scmŒ Û ŒŒ  Ü ŒŒ Ü ŒŒ Ý ŒŒ  Ý ŒŒ  Þ ŒŒ * Ý ŒŒ 2 ß ŒŒ 6 Ý ŒŒ ; à ŒŒ = à ŒŒ  A gnamegon-source-modifiedŒCdRO>MefhX=] 45$""454>"G45Œ65gproc  Ugfile  Ugline   Ugdb   Ugt  >gtable   ;g file-table  > Ugfilenamefsystem/xref.scmŒ â ŒŒ  ã ŒŒ ã ŒŒ  ä %ŒŒ  ä ŒŒ ! å ŒŒ > ã ŒŒ I é ŒŒ P é 6ŒŒ R é ŒŒ S é ŒŒ U ç ŒŒ  U gnameg add-sourceŒCgROhfeihHC]45$,4455ˆ$ 66C;gproc  Agfile  Agline   Agdb   Ag file-table  Agprocs  $ ?gfilenamefsystem/xref.scmŒ ë ŒŒ  ì ŒŒ ì ŒŒ  í ŒŒ  î ŒŒ  î ŒŒ î ;ŒŒ " î ŒŒ $ î ŒŒ $ î ŒŒ ) ï ŒŒ - ï ŒŒ 7 𠌌 ? ñ ŒŒ  A gnameg forget-sourceŒCjR_IOb>M/g\khXß]!ˆ$FŽˆ$.Žˆ$ŽLL6666×gsource  Wgvy Ogvx   Ggvy   Ggvx  - ?gfilenamefsystem/xref.scmŒ ÿ ŒŒ   ŒŒ ?  ŒŒ C  %ŒŒ G  ŒŒ K  %ŒŒ O  ŒŒ S  %ŒŒ W  ŒŒ  W CWl`h p]45$ L6Chgobj  gfilenamefsystem/xref.scmŒ  ŒŒ   ŒŒ  ŒŒ   ŒŒ   C2m'nhÀœ]45ˆ$o445$""454>"G>"G4O>"G" O4 5$4 4 5 5"$"6”gproc  ¼gmod-name  ¼gdb   ¼gsources  ¼gt   Qgtable  1 Ngt  ¨ ºgfilenamefsystem/xref.scmŒ ó ŒŒ  ô ŒŒ ô ŒŒ  õ ŒŒ  õ ŒŒ  ø ŒŒ  ø ŒŒ  ø ŒŒ - ù 'ŒŒ 1 ù ŒŒ 4 ú ŒŒ Z ø ŒŒ c ÿ ŒŒ ‹  ŒŒ •  ŒŒ –  ŒŒ ™  ŒŒ £  ŒŒ ¨  ŒŒ ·  ŒŒ ¼  ŒŒ  ¼ gnameg add-sourcesŒClROb/j\khXß]!ˆ$FŽˆ$.Žˆ$ŽLL6666×gsource  Wgvy Ogvx   Ggvy   Ggvx  - ?gfilenamefsystem/xref.scmŒ  ŒŒ   ŒŒ ?  ŒŒ C  %ŒŒ G  ŒŒ K  %ŒŒ O  ŒŒ S  %ŒŒ W  ŒŒ  W CGoWp`h p]45$ L6Chgobj  gfilenamefsystem/xref.scmŒ  ŒŒ   ŒŒ  ŒŒ   ŒŒ   C2m'n hˆ]]45$r4O45>"G4>"GO45$4 4 5 5"$"6CUgproc  ‡gmod-name  ‡gdb   ‡g mod-table  ‡gt  q ƒgfilenamefsystem/xref.scmŒ  ŒŒ   ŒŒ  ŒŒ   ŒŒ   ŒŒ  ŒŒ '  .ŒŒ )  ŒŒ .  ŒŒ 7  ŒŒ T  ŒŒ ^  ŒŒ _  ŒŒ b  ŒŒ l  ŒŒ q  ŒŒ €  ŒŒ …  ŒŒ  ‡ gnamegforget-sourcesŒCpRq//pah_]L6Wgproc  gfilenamefsystem/xref.scmŒ $ ŒŒ $ ŒŒ  CObShk]Ccgproc  gsources  gfilenamefsystem/xref.scmŒ ( $ŒŒ   CqhH´] 4O45$ 45">"G6¬gm  Agt  .gfilenamefsystem/xref.scmŒ # ŒŒ  $ ŒŒ & ŒŒ  % ŒŒ  ( ŒŒ + ) ŒŒ 3 $ ŒŒ A * ŒŒ  A gnameguntaintŒCch0‚]4>"G4>"G Czgfilenamefsystem/xref.scmŒ " ŒŒ  + ŒŒ  , ŒŒ ( - ŒŒ * - ŒŒ  , gnameguntaint-sourcesŒCrR&dTUDVWlah(´] $45$ L6CC¬gsym  'gvar  'gx  %gfilenamefsystem/xref.scmŒ 5 ŒŒ  6 ŒŒ 6 ŒŒ 7 ŒŒ 7 ŒŒ  8 ŒŒ  8 ŒŒ # 9 ŒŒ  ' ChHÇ] 4455$"4>"G45O6¿gmod  Bgname 3 Bgfilenamefsystem/xref.scmŒ 0 ŒŒ  1 ŒŒ  1 &ŒŒ  1 ŒŒ  1 ŒŒ  2 ŒŒ - 3 ŒŒ 3 3 ŒŒ B 4 ŒŒ  B gnameg visit-moduleŒC>SGIh@”]4M5$C4M>"G4L>"GM6Œgname  >gsub  >gfilenamefsystem/xref.scmŒ B ŒŒ  C ŒŒ  C ŒŒ  E ŒŒ ' F ŒŒ > G ŒŒ  > CZh0‚]M$"45NLLLO456zgmod  )gfilenamefsystem/xref.scmŒ > ŒŒ  ? ŒŒ @ ŒŒ  @ ŒŒ ! H ŒŒ ) A ŒŒ  ) Ca`>:hpJ]HHOK$"$"€$4 è5 4 è5 J456$ 456CBgmod-name  kgvisit-submodules  kg visit-module  kgvisited  gfilenamefsystem/xref.scmŒ / ŒŒ = ŒŒ " J ŒŒ 5 J 0ŒŒ 9 J ŒŒ : K $ŒŒ C K ŒŒ D L ŒŒ M L ŒŒ P M ŒŒ S M +ŒŒ V M ŒŒ X M ŒŒ ^ J ŒŒ a N ŒŒ i N ŒŒ  k gnamegensure-sources-dbŒCqR>S/GIhHÐ] 4L5$&L’$ L"LŽ”$LCCLLLŒ6Ègproc  Fgt Fgfilenamefsystem/xref.scmŒ U ŒŒ  W ŒŒ V ŒŒ  Y ŒŒ  Y ŒŒ  Y ŒŒ " Z ŒŒ + [ ŒŒ , [ ŒŒ 0 [ ŒŒ 5 \ ŒŒ D ^ $ŒŒ F ^ ŒŒ  F Chr]LO6jgline  gprocs  gfilenamefsystem/xref.scmŒ S ŒŒ  T ŒŒ   Cstuh}]ŽŽ’Cugx  gy  gfilenamefsystem/xref.scmŒ b ŒŒ  b ŒŒ b %ŒŒ b ŒŒ  Ch8µ] 454O>"G456­g file-table  1granges  1gfilenamefsystem/xref.scmŒ P ŒŒ  Q ŒŒ  Q ŒŒ R ŒŒ % a ŒŒ 1 a ŒŒ  1 gnameg lines->rangesŒCvROwvh€°]45"O(6" Ž"ÿÿ㎓$"ŽŽ“$ŽŒ"ÿÿ¹"ÿÿÅ"ÿÿÁ$ 45""ÿÿ–¨g canon-file  {gline  {gdb   {g file-table  {granges   `gprocs   `gfilenamefsystem/xref.scmŒ d ŒŒ  e ŒŒ e ŒŒ  f ŒŒ  h ŒŒ  i ŒŒ $ m ŒŒ . m ŒŒ . h ŒŒ 1 j ŒŒ 6 j ŒŒ : h ŒŒ ? j ŒŒ B j ŒŒ I k ŒŒ L k ŒŒ P k ŒŒ X k ŒŒ ` f ŒŒ f f ŒŒ g f $ŒŒ r f ?ŒŒ s g ŒŒ { f ŒŒ  { gnameglookup-source-proceduresŒCxR{|q}€hL]L6Dgfilenamefsystem/xref.scmŒ r ŒŒ  r %ŒŒ   ChX-13CPgargs gfilenamefsystem/xref.scmŒ r ŒŒ C‚x` hh+-/03#4>"GY4O5Z$ 45"  6#gfile  egline  egcanonicalization   egport  D egfile  Y egfilenamefsystem/xref.scmŒ o ŒŒ  o <ŒŒ  p ŒŒ 5 r ŒŒ D q ŒŒ L s ŒŒ M s ŒŒ Y q ŒŒ e t ŒŒ  e  gcanonicalizationS Œgnamegsource-closuresŒC R{|q}€hL]L6Dgfilenamefsystem/xref.scmŒ y ŒŒ  y %ŒŒ   ChX-13CPgargs gfilenamefsystem/xref.scmŒ y ŒŒ C‚xa hh--/03#4>"GY4O5Z$ 45"  6%gfile  egline  egcanonicalization   egport  D egfile  Y egfilenamefsystem/xref.scmŒ v ŒŒ  v >ŒŒ  w ŒŒ 5 y ŒŒ D x ŒŒ L z ŒŒ M z ŒŒ Y x ŒŒ e { ŒŒ  e  gcanonicalizationS Œgnamegsource-proceduresŒC!RC}gm  ,gfilenamefsystem/xref.scmŒ   ŒŒ ¬ ! ŒŒ u S ŒŒ , X ŒŒ 0 a ŒŒ 1 c ŒŒ : c ŒŒ ; e ŒŒ > e ŒŒ @ g ŒŒ C g ŒŒ t h ŒŒ @ o ŒŒ 2 z ŒŒ % ~ ŒŒ ] ‚ ŒŒ G ‹ ŒŒ 1 ´ ŒŒ ú Í ŒŒ þ Ó ŒŒ ! Õ ŒŒ ! × ŒŒ ! × ŒŒ ! Ù ŒŒ ! Ù ŒŒ "O Û ŒŒ $ â ŒŒ %¦ ë ŒŒ * ó ŒŒ .  ŒŒ 1 " ŒŒ 6­ / ŒŒ : P ŒŒ þ o ŒŒ A v ŒŒ%  A’ C6PK!¦br>*?*?vm/trap-state.gonu„[µü¤GOOF----LE-8-2.0?]š4hp ] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gvm¤ g trap-state¤ ¤ gfilenameS¤ fsystem/vm/trap-state.scm¤ gimportsS¤ gbase¤ gsyntax¤  ¤ ¤ gsrfi¤ gsrfi-1¤ ¤ gselectS¤ gfold¤ ¤ ¤ ¤ ¤ gtraps¤ ¤ ¤ gtrace¤ ¤ ¤ gframe¤ ! ¤ "!¤ #gprogram¤ $#¤ %$¤ &"%¤ 'gexportsS¤ (g add-trap!¤ )g list-traps¤ *g trap-enabled?¤ +g trap-name¤ ,g enable-trap!¤ -g disable-trap!¤ .g delete-trap!¤ /gwith-default-trap-handler¤ 0ginstall-trap-handler!¤ 1gadd-trap-at-procedure-call!¤ 2gadd-trace-at-procedure-call!¤ 3gadd-trap-at-source-location!¤ 4g#add-ephemeral-trap-at-frame-finish!¤ 5gadd-ephemeral-stepping-trap!¤ 6()*+,-./012345¤ 7gset-current-module¤ 87¤ 97¤ :g make-fluid¤ ;g%default-trap-handler¤ gdefault-trap-handler¤ ?gmake-record-type¤ @f¤ Agindex¤ Bgenabled?¤ Cgtrap¤ Dgname¤ EABCD¤ Fg¤ Ggmake-trap-wrapper¤ Hgrecord-predicate¤ Ig trap-wrapper?¤ Jgmake-procedure-with-setter¤ Kgrecord-accessor¤ Lgrecord-modifier¤ Mgtrap-wrapper-index¤ Ngtrap-wrapper-enabled?¤ Ogtrap-wrapper-trap¤ Pgtrap-wrapper-name¤ Qf ¤ Rghandler¤ Sgnext-idx¤ Tgnext-ephemeral-idx¤ Ugwrappers¤ VRSTU¤ Wg ¤ Xgmake-trap-state¤ Yg trap-state?¤ Zgtrap-state-handler¤ [gtrap-state-next-idx¤ \gtrap-state-next-ephemeral-idx¤ ]gtrap-state-wrappers¤ ^gtrap-wrappertrace-level¤ lf)no wrapper found with index in trap-state¤ mgwrapper-at-index¤ ng next-index!¤ ognext-ephemeral-index!¤ pghandler-for-index¤ qgephemeral-handler-for-index¤ rgmake-weak-key-hash-table¤ sg *trap-states*¤ tg hashq-ref¤ ug hashq-set!¤ vgtrap-state-for-vm¤ wgthe-vm¤ xgthe-trap-state¤ ygset-vm-trace-level!¤ zgmap¤ {gand=>¤ |gtrap-at-procedure-call¤ }gformat¤ ~fBreakpoint at ~a¤ gtrace-calls-to-procedure¤ €gprefixS¤ f Trap ~a: ¤ ‚fTracepoint at ~a¤ ƒgtrap-at-source-location¤ „fBreakpoint at ~a:~a¤ …gtrap-frame-finish¤ †fReturn from ~a¤ ‡f~a:~a:~a¤ ˆg source:file¤ ‰f unknown file¤ Šgsource:line-for-user¤ ‹g source:column¤ Œfunknown source location¤ g source-string¤ Žginto?S¤ Ž Œ¤ g instruction?S¤ ‘ Œ¤ ’‘¤ “gframe-next-source¤ ”gtrap-matching-instructions¤ •g frame-address¤ –fStep to different instruction¤ —f#Step to different instruction in ~a¤ ˜f Step into ~a¤ ™fStep out of ~a¤C5hX0ˆ]4    &'6549>"G4:i5;R;<=h(ì] [$ 66ägframe  #gidx  #g trap-name   #gdefault-handler   #gfilenamefsystem/vm/trap-state.scmŒ 1 ŒŒ  2 ŒŒ 3 ŒŒ  4 ŒŒ  5 ŒŒ # 5 ŒŒ  # gnamegdefault-trap-handlerŒC>R4?i@E5FRFhÞ-13¨CÖgindex genabled? gtrap  gname  gdefrec-3703f9048699c1-8  gfilenamefsystem/vm/trap-state.scmŒ 7 ŒŒ   gnamegmake-trap-wrapperŒCGR4HiFi5IR4Ji4KiFiA54LiFiA55MR4Ji4KiFiB54LiFiB55NR4Ji4KiFiC54LiFiC55OR4Ji4KiFiD54LiFiD55PR4?iQV5WR>Wh9-13HJ("JJŽKJ( "JJŽKJ( ÿ"JJŽKJ("JJŽK¨C1gdefrec-3703f9048699c1-14 g_x  (g_x 6 Bg_x Q ]g_x k wghandler w gnext-idx  w gnext-ephemeral-idx  w gwrappers  w  gfilenamefsystem/vm/trap-state.scmŒ = ŒŒ d A ŒŒ gnamegmake-trap-stateŒCXR4HiWi5YR4Ji4KiWiR54LiWiR55ZR4Ji4KiWiS54LiWiS55[R4Ji4KiWiT54LiWiT55\R4Ji4KiWiU54LiWiU55]RMhž]4545’C–gt1  gt2  gfilenamefsystem/vm/trap-state.scmŒ C ŒŒ  D ŒŒ D ŒŒ  D ŒŒ   gnamegtrap-wrapper"G456âgwrapper  Kgtrap ! Kgfilenamefsystem/vm/trap-state.scmŒ J ŒŒ  K ŒŒ K ŒŒ  L ŒŒ  L $ŒŒ  L ŒŒ  M ŒŒ ! M ŒŒ $ N ŒŒ . N *ŒŒ 7 N ŒŒ K O ŒŒ  K gnamegenable-trap-wrapper!ŒCdRNOc_eMhPë] 45$14544545>"G456456ãgwrapper  Kgtrap  >gfilenamefsystem/vm/trap-state.scmŒ Q ŒŒ  R ŒŒ R ŒŒ  T ŒŒ  T ŒŒ  U ŒŒ ! U *ŒŒ * U ŒŒ > V ŒŒ B S ŒŒ C S %ŒŒ K S ŒŒ  K gnamegdisable-trap-wrapper!ŒCfRc]gMh0Î]4454455>"G6Æg trap-state  0gwrapper  0gfilenamefsystem/vm/trap-state.scmŒ X ŒŒ  Y ŒŒ Z ŒŒ  Z ŒŒ  Z 1ŒŒ  Z ŒŒ " Y ŒŒ 0 [ ŒŒ  0 gnamegadd-trap-wrapper!ŒChRc]ih ¹]4544556±g trap-state  gwrapper  gfilenamefsystem/vm/trap-state.scmŒ ] ŒŒ _ ŒŒ  _ ŒŒ  _ ŒŒ  ^ ŒŒ   gnamegremove-trap-wrapper!ŒCjRNhŒ]45$—CC„gwrapper  glevel  gfilenamefsystem/vm/trap-state.scmŒ b ŒŒ  c ŒŒ c ŒŒ  d ŒŒ   C]h—] 456g trap-state  gfilenamefsystem/vm/trap-state.scmŒ a ŒŒ  g ŒŒ  b ŒŒ   gnamegtrap-state->trace-levelŒCkR<lM]hP'] "8(4>"GC45†$CŽ"ÿÿÈ45"ÿÿ»g trap-state  Kgidx  Kgwrappers   >gfilenamefsystem/vm/trap-state.scmŒ i ŒŒ  j ŒŒ k ŒŒ m ŒŒ  m ŒŒ  m ŒŒ # o ŒŒ ( o ŒŒ * o ŒŒ - o ŒŒ 1 k ŒŒ 4 p ŒŒ 8 r ŒŒ > r ŒŒ > j ŒŒ ? j ŒŒ K j ŒŒ  K gnamegwrapper-at-indexŒCmR[ch(³] 45445—>"GC«g trap-state  (gidx (gfilenamefsystem/vm/trap-state.scmŒ t ŒŒ  u ŒŒ u ŒŒ v ŒŒ  v +ŒŒ  v ŒŒ  ( gnameg next-index!ŒCnR\ch(½] 45445™>"GCµg trap-state  (gidx (gfilenamefsystem/vm/trap-state.scmŒ y ŒŒ  z ŒŒ z ŒŒ { ŒŒ  { 5ŒŒ  { ŒŒ  ( gnamegnext-ephemeral-index!ŒCoRmZMPh8Ç]4LL54L5$45456C¿gframe  2gwrapper  2ghandler   2gfilenamefsystem/vm/trap-state.scmŒ  ŒŒ  € ŒŒ ŒŒ  € ŒŒ  ‚ ŒŒ ! „ ŒŒ ( … ŒŒ 0 ƒ ŒŒ  2 Ch’]OCŠg trap-state  gidx  gfilenamefsystem/vm/trap-state.scmŒ ~ ŒŒ  gnameghandler-for-indexŒCpRmNfjhP¼] 4LL5$;45$4>"G"4L>"GL6C´gframe  Pgwrapper Pgfilenamefsystem/vm/trap-state.scmŒ ˆ ŒŒ  ‰ ŒŒ ‰ ŒŒ  Š ŒŒ  Œ ŒŒ  Œ ŒŒ  ŒŒ 5 Ž ŒŒ N ŒŒ  P Ch²]OCªg trap-state  gidx  ghandler   gfilenamefsystem/vm/trap-state.scmŒ ‡ ŒŒ   gnamegephemeral-handler-for-indexŒCqR4ri5sRtsXuvh@Í] 45$C454>"G6Ågvm  9gt 9gts  9gfilenamefsystem/vm/trap-state.scmŒ ™ ŒŒ  š ŒŒ š ŒŒ  › ŒŒ  › ŒŒ  œ ŒŒ 9 ŒŒ  9 gnamegtrap-state-for-vmŒCvRvwhx]456pgfilenamefsystem/vm/trap-state.scmŒ Ÿ ŒŒ    ŒŒ   ŒŒ  gnamegthe-trap-stateŒCxRx;ywkh p]L$454L56Chgfilenamefsystem/vm/trap-state.scmŒ ¬ ŒŒ  ® ŒŒ ¯ !ŒŒ  ¯ *ŒŒ  ¯ ŒŒ   Cywhg]L$ 45 6C_gfilenamefsystem/vm/trap-state.scmŒ ± ŒŒ  ² ŒŒ ³ !ŒŒ  ³ ŒŒ   Cywkh p]L$454L56Chgfilenamefsystem/vm/trap-state.scmŒ ¬ ŒŒ  ® ŒŒ ¯ !ŒŒ  ¯ *ŒŒ  ¯ ŒŒ   Cywhg]L$ 45 6C_gfilenamefsystem/vm/trap-state.scmŒ ± ŒŒ  ² ŒŒ ³ !ŒŒ  ³ ŒŒ   ChpÅ-.,3#45YOO4O>"GV4> X4O>"G"ZCZF½ghandler ngthunk ng trap-state  ngfilenamefsystem/vm/trap-state.scmŒ ¨ ŒŒ  © ;ŒŒ 0 « ŒŒ n  gnamegwith-default-trap-handlerŒC/RxzM]h(—-.,3#45456g trap-state &gfilenamefsystem/vm/trap-state.scmŒ µ ŒŒ  µ ,ŒŒ  ¶ ŒŒ & ¶ ŒŒ & gnameg list-trapsŒC)Rx{mPh(¦-.,3#45456žgidx (g trap-state (gfilenamefsystem/vm/trap-state.scmŒ ¸ ŒŒ  ¸ /ŒŒ  ¹ ŒŒ ( ¹ ŒŒ ( gnameg trap-nameŒC+Rx{mNh(ª-.,3#45456¢gidx (g trap-state (gfilenamefsystem/vm/trap-state.scmŒ ¼ ŒŒ  ¼ 3ŒŒ  ½ ŒŒ ( ½ ŒŒ ( gnameg trap-enabled?ŒC*Rx{mdh(©-.,3#45456¡gidx (g trap-state (gfilenamefsystem/vm/trap-state.scmŒ À ŒŒ  À 2ŒŒ  Á ŒŒ ( Á ŒŒ ( gnameg enable-trap!ŒC,Rx{mfh(ª-.,3#45456¢gidx (g trap-state (gfilenamefsystem/vm/trap-state.scmŒ Ä ŒŒ  Ä 3ŒŒ  Å ŒŒ ( Å ŒŒ ( gnameg disable-trap!ŒC-Rx{mNfjh0†]45$4>"G"L6~gwrapper  +gfilenamefsystem/vm/trap-state.scmŒ Ê ŒŒ  Ë ŒŒ Ë ŒŒ  Ì ŒŒ + Í ŒŒ  + Ch0©-.,3#4545O6¡gidx -g trap-state -gfilenamefsystem/vm/trap-state.scmŒ È ŒŒ  È 2ŒŒ  É ŒŒ - É ŒŒ - gnameg delete-trap!ŒC.RxcZh(­-.,3#45456¥ghandler &g trap-state &gfilenamefsystem/vm/trap-state.scmŒ Ï ŒŒ  Ï ?ŒŒ & Ð ŒŒ & gnameginstall-trap-handler!ŒC0Rxn|phG}~ hP6-.,3#4545445544556.gproc Ng trap-state Ngidx  Ngtrap  2 Ngfilenamefsystem/vm/trap-state.scmŒ Ò ŒŒ  Ò BŒŒ  Ó ŒŒ Ó ŒŒ # Ô ŒŒ ( Ö ŒŒ 2 Ô ŒŒ 2 Ó ŒŒ 9 Ù ŒŒ A Û ŒŒ F Û ŒŒ J Û ŒŒ L Ù ŒŒ N × ŒŒ N gnamegadd-trap-at-procedure-call!ŒC1Rxn€}hG‚ hXI-.,3#4545445544 556Agproc Qg trap-state Qgidx  Qgtrap  5 Qgfilenamefsystem/vm/trap-state.scmŒ Ý ŒŒ  Þ >ŒŒ  ß ŒŒ ß ŒŒ # à ŒŒ * â ŒŒ / â $ŒŒ 3 â ŒŒ 5 à ŒŒ 5 ß ŒŒ < å ŒŒ D ç ŒŒ I ç ŒŒ M ç ŒŒ O å ŒŒ Q ã ŒŒ Q gnamegadd-trace-at-procedure-call!ŒC2RxnƒphG}„ hXO-.,3#4545445544556Ggfile Rg user-line Rg trap-state  Rgidx  Rgtrap  4 Rgfilenamefsystem/vm/trap-state.scmŒ é ŒŒ  ê >ŒŒ  ë ŒŒ ë ŒŒ # ì ŒŒ * í (ŒŒ 4 ì ŒŒ 4 ë ŒŒ ; 𠌌 C ò ŒŒ H ò ŒŒ N ò ŒŒ P 𠌌 R î ŒŒ R  gnamegadd-trap-at-source-location!ŒC3Rxo…q.hi]LL6agframe  gfilenamefsystem/vm/trap-state.scmŒ ü ŒŒ ü ŒŒ  ChG}† h`U-.,3#4545445O544 556Mgframe Yghandler Yg trap-state  Ygidx  Ygtrap  = Ygfilenamefsystem/vm/trap-state.scmŒ õ ŒŒ  ÷ :ŒŒ  ø ŒŒ ø ŒŒ # ù ŒŒ ( û ŒŒ = ù ŒŒ = ø ŒŒ D ÿ ŒŒ L  ŒŒ Q  ŒŒ U  ŒŒ W ÿ ŒŒ Y ý ŒŒ Y  gnameg#add-ephemeral-trap-at-frame-finish!ŒC4R}‡ˆ‰Š‹Œh@Ù] $/45$"45456CÑgsource  :gt  'gfilenamefsystem/vm/trap-state.scmŒ  ŒŒ   ŒŒ  ŒŒ   ŒŒ   ŒŒ $  5ŒŒ (  ŒŒ /  ,ŒŒ 7  ŒŒ 9  ŒŒ  : gnameg source-stringŒCR’x“o”h\]CTgf  gfilenamefsystem/vm/trap-state.scmŒ  ŒŒ   C“hw]45L‡€Cogf  gfilenamefsystem/vm/trap-state.scmŒ  ŒŒ   .ŒŒ  &ŒŒ  !ŒŒ   C••h€]45L“$L6Cxgf  gfilenamefsystem/vm/trap-state.scmŒ  ŒŒ   ŒŒ  ŒŒ   ŒŒ   ŒŒ   CqhG–}—˜™hè§-/03 #45##45454$"O$"45 O4 55 4 $$ " 45"($4455"445556Ÿgframe  çghandler  çg trap-state   çginto?   çg instruction?   çgsource  9 çgidx  B çg predicate  Z €gfp  o }gtrap  ç gfilenamefsystem/vm/trap-state.scmŒ  ŒŒ   3ŒŒ 3  ŒŒ 9  ŒŒ <  ŒŒ B  ŒŒ E  ŒŒ M  ŒŒ Z  ŒŒ b  ŒŒ i  ŒŒ o  ŒŒ  ŒŒ  ŒŒ  ŒŒ ”  ŒŒ ¡ ! ŒŒ § " ŒŒ © # ŒŒ ® $ ŒŒ ³ $ ŒŒ · $ ŒŒ Á % ŒŒ  & ŒŒ Ç & ŒŒ È & (ŒŒ Ð & ŒŒ Õ ' ŒŒ Ú ' ŒŒ Û ' *ŒŒ ã ' ŒŒ å  ŒŒ ç  ŒŒ"  ç  ginto?S Œg instruction?S Œgnamegadd-ephemeral-stepping-trap!ŒC5RxnhGh8Ý-.,3#4545456Õgtrap 4gname 4g trap-state  4gidx  4gfilenamefsystem/vm/trap-state.scmŒ ) ŒŒ  ) 5ŒŒ  * ŒŒ * ŒŒ ' - ŒŒ 4 + ŒŒ 4  gnameg add-trap!ŒC(RC€gm  ,gfilenamefsystem/vm/trap-state.scmŒ   ŒŒ - / ŒŒ 6 / ŒŒ g 1 ŒŒ u 7 ŒŒ - = ŒŒ y C ŒŒ Õ J ŒŒ . Q ŒŒ I X ŒŒ < ] ŒŒ ² a ŒŒ B i ŒŒ 6 t ŒŒ 0 y ŒŒ ý ~ ŒŒ õ ‡ ŒŒ ö — ŒŒ ÿ — ŒŒ ( ™ ŒŒ Ë Ÿ ŒŒ ˜ ¨ ŒŒ r µ ŒŒ Y ¸ ŒŒ E ¼ ŒŒ 4 À ŒŒ % Ä ŒŒ ä È ŒŒ Ð Ï ŒŒ "y Ò ŒŒ $< Ý ŒŒ & é ŒŒ (p õ ŒŒ )¬  ŒŒ /"  ŒŒ 0P ) ŒŒ%  0R C6PK!È£<…… vm/frame.gonu„[µü¤GOOF----LE-8-2.0m]E4hê] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gvm¤ gframe¤ ¤ gfilenameS¤ fsystem/vm/frame.scm¤ gimportsS¤ gbase¤ gpmatch¤  ¤ ¤ gprogram¤ ¤ ¤ g instruction¤ ¤ ¤ gobjcode¤ ¤ ¤ ¤ gexportsS¤ gframe-bindings¤ gframe-lookup-binding¤ gframe-binding-ref¤ gframe-binding-set!¤ gframe-next-source¤ !gframe-call-representation¤ "gframe-environment¤ #gframe-object-binding¤ $gframe-object-name¤ %gframe-return-values¤ & !"#$% ¤ 'gset-current-module¤ ('¤ )'¤ *gframe-procedure¤ +gprogram?¤ ,gprogram-bindings-for-ip¤ -gframe-instruction-pointer¤ .g binding:name¤ /gframe-local-set!¤ 0g binding:index¤ 1gerror¤ 2fvariable not bound in frame¤ 3gframe-local-ref¤ 4gframe-arguments¤ 5gprogram-source¤ 6gprogram-sources-pre-retire¤ 7gcatch¤ 87¤ 97¤ :gprocedure-name¤ ;gprogram-arguments-alist¤ gassq-ref¤ ?grequired¤ @goptional¤ Agkeyword¤ Bgrest¤ Cgmap¤ Dgiota¤C5hh³]4    &54)>"G*+,-h(º] 4545$ 456C²gframe  %gp %gfilenamefsystem/vm/frame.scmŒ ! ŒŒ  " ŒŒ " ŒŒ # ŒŒ  # ŒŒ  $ #ŒŒ # $ ŒŒ $ % ŒŒ  % gnamegframe-bindingsŒCR.h8] "#(C45&CŽ"ÿÿÝ45"ÿÿÐùgframe  6gvar  6gbindings   )gfilenamefsystem/vm/frame.scmŒ ' ŒŒ  ( ŒŒ ) ŒŒ  + ŒŒ  + ŒŒ  + ŒŒ  ) ŒŒ  , ŒŒ # . ŒŒ ) . ŒŒ ) ( ŒŒ * ( ŒŒ 6 ( ŒŒ  6 gnamegframe-lookup-bindingŒCR/012h8é] 445$" 4556ágframe  4gvar  4gval   4gt   .gfilenamefsystem/vm/frame.scmŒ 0 ŒŒ  2 ŒŒ 3 ŒŒ  3 ŒŒ ! 4 ŒŒ % 4 ŒŒ + 4 ŒŒ 0 2 ŒŒ 4 1 ŒŒ  4 gnamegframe-binding-set!ŒCR3012h8×] 445$" 4556Ïgframe  2gvar  2gt   .gfilenamefsystem/vm/frame.scmŒ 7 ŒŒ  9 ŒŒ : ŒŒ  : ŒŒ ! ; ŒŒ % ; ŒŒ + ; ŒŒ 0 9 ŒŒ 2 8 ŒŒ  2 gnamegframe-binding-refŒCR!h…]45ŽC}gframe  gfilenamefsystem/vm/frame.scmŒ A ŒŒ  B ŒŒ B ŒŒ  gnamegframe-argumentsŒC4R*+5-6h0È] 4545$45456CÀgframe  ,gproc ,gfilenamefsystem/vm/frame.scmŒ J ŒŒ  K ŒŒ K ŒŒ L ŒŒ  L ŒŒ  N ŒŒ " O ŒŒ * M ŒŒ + P ŒŒ  , gnamegframe-next-sourceŒC R*9:hN]L6Fgfilenamefsystem/vm/frame.scmŒ e ŒŒ  e ŒŒ   Ch[-13CSgargs gfilenamefsystem/vm/frame.scmŒ e ŒŒ C+;-30<=h8]ˆ$^4L5$4L455"4L5’$ 4L5"4LŽ—5ŒCˆ$^4L5$4L455"4L5’$ 4L5"4LŽ—5ŒCˆ$#4LŽ54LŽ—5ŒŒC$74L5$ L4564L5’$L6CC greq  5gopt  5gkey   5grest   5gi   5gsym  Tgt   Qgsym  q ¹gt  | ¶gt   3 gfilenamefsystem/vm/frame.scmŒ t ŒŒ  z ŒŒ y ŒŒ { #ŒŒ { ŒŒ  m ŒŒ  l ŒŒ n ŒŒ % n 6ŒŒ - n ŒŒ 4 o ŒŒ ; o ŒŒ ? l ŒŒ @ p ŒŒ N s ŒŒ U | ŒŒ Z | ŒŒ c | 1ŒŒ e | ŒŒ f { ŒŒ j } ŒŒ n y ŒŒ q ~ #ŒŒ q ~ ŒŒ t m ŒŒ | l ŒŒ … n ŒŒ Š n 6ŒŒ ’ n ŒŒ ™ o ŒŒ   o ŒŒ ¤ l ŒŒ ¥ p ŒŒ ³ s ŒŒ º  ŒŒ Á  ŒŒ È  1ŒŒ Ê  ŒŒ Ë ~ ŒŒ Ï € ŒŒ Ó y ŒŒ Ö ŒŒ Ø ‚ ŒŒ ß ‚ .ŒŒ â ‚ ŒŒ ã ƒ ŒŒ ì ƒ #ŒŒ ñ ƒ 2ŒŒ ó ƒ ŒŒ ô ŒŒ ü y ŒŒ ý m ŒŒ  l ŒŒ  n 6ŒŒ  n ŒŒ  o ŒŒ $ o ŒŒ ( l ŒŒ 0 p ŒŒ 2 s ŒŒ 4 ‡ ŒŒ>  5 gnameglpŒC>?@ABC3h`]L6Xgi  gfilenamefsystem/vm/frame.scmŒ Š ŒŒ ‹ ŒŒ  CD<hE]!454O5$"45$4455"$‰OQ44  5$"4  5$"4  5$"4  5$" 5"4O44555ŒC=gframe  ùgp ùgt   -gt  K ÷glp  \ Øgt  o gt  Š œgt  ¥ ·gt  À Ò gfilenamefsystem/vm/frame.scmŒ b ŒŒ  c ŒŒ c ŒŒ e ŒŒ  e ŒŒ . g ŒŒ 8 g ŒŒ 9 h ŒŒ > h 'ŒŒ F h ŒŒ K f ŒŒ \ t ŒŒ g t ŒŒ m t 2ŒŒ o t ŒŒ o t ŒŒ ~ t =ŒŒ ‚ u ŒŒ ˆ u 2ŒŒ Š u ŒŒ Š u ŒŒ ™ u =ŒŒ v ŒŒ £ v 2ŒŒ ¥ v ŒŒ ¥ v ŒŒ ´ v <ŒŒ ¸ w ŒŒ ¾ w 3ŒŒ À w ŒŒ À w ŒŒ Õ t ŒŒ Ý Š ŒŒ ç Œ ŒŒ ê Œ ŒŒ ò Œ ŒŒ ô Š ŒŒ ø d ŒŒ'  ù gnamegframe-call-representationŒC!RC.hx]454L5ŒCpgbinding  gfilenamefsystem/vm/frame.scmŒ ” ŒŒ  • ŒŒ • &ŒŒ  • ŒŒ   ChŠ]O456‚gframe  gfilenamefsystem/vm/frame.scmŒ “ ŒŒ – ŒŒ  ” ŒŒ   gnamegframe-environmentŒC"RhH#] "2(" 45‚$ ˆ$CCŽ"ÿÿÎ45"ÿÿÁgframe  Egobj  Egbs   8gfilenamefsystem/vm/frame.scmŒ ˜ ŒŒ  ™ ŒŒ š ŒŒ š ŒŒ  š ŒŒ  š 8ŒŒ  š ŒŒ  š ŒŒ " ™ ŒŒ % › ŒŒ ) › ŒŒ , › ŒŒ 2 ™ "ŒŒ 8 ™ ŒŒ 9 ™ ŒŒ E ™ ŒŒ  E gnamegframe-object-bindingŒC#R#.h ª] 45$6C¢gframe  gobj  gt  gfilenamefsystem/vm/frame.scmŒ ŒŒ  ž ŒŒ ž ŒŒ   gnamegframe-object-nameŒC$R<3C3hr]LLL˜ ˜–6jgi  gfilenamefsystem/vm/frame.scmŒ ¦ ŒŒ § %ŒŒ  § "ŒŒ  § ŒŒ   CDh0ç]454™5O456ßgframe  -glen -gnvalues   -gfilenamefsystem/vm/frame.scmŒ £ ŒŒ  ¤ ŒŒ ¤ ŒŒ ¥ ŒŒ  ¥ )ŒŒ  ¥ ŒŒ  ¤ ŒŒ % ¨ ŒŒ - ¦ ŒŒ  - gnamegframe-return-valuesŒC%RC«gm  ,gfilenamefsystem/vm/frame.scmŒ   ŒŒ - ! ŒŒ | ' ŒŒ ¼ 0 ŒŒ ê 7 ŒŒ ˜ A ŒŒ « J ŒŒ Ø b ŒŒ 5 “ ŒŒ ¶ ˜ ŒŒ • ŒŒ b £ ŒŒ  d C6PK!ó“ºWMMvm/instruction.gonu„[µü¤GOOF----LE-8-2.05]4h)] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gvm¤ g instruction¤ ¤ gfilenameS¤ fsystem/vm/instruction.scm¤ gexportsS¤ ginstruction-list¤ g instruction?¤ ginstruction-length¤ ginstruction-pops¤ ginstruction-pushes¤ ginstruction->opcode¤ gopcode->instruction¤  ¤ gset-current-module¤ ¤ ¤ gload-extension¤ g string-append¤ f libguile-¤ geffective-version¤ fscm_init_instructions¤C5h@‹]4    54>"Gi4i4i556ƒgm  (gfilenamefsystem/vm/instruction.scmŒ   ŒŒ -  ŒŒ 3  ŒŒ 4  +ŒŒ <  ŒŒ >  ŒŒ @  ŒŒ  @ C6PK!ZkWú–ú–vm/coverage.gonu„[µü¤GOOF----LE-8-2.0â–]X4hø?] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gvm¤ gcoverage¤ ¤ gfilenameS¤ fsystem/vm/coverage.scm¤ gimportsS¤ ¤  ¤ gframe¤ ¤ ¤ gprogram¤ ¤ ¤ gsrfi¤ gsrfi-1¤ ¤ ¤ gsrfi-9¤ ¤ ¤ gsrfi-11¤ ¤ ¤ gsrfi-26¤ ¤ ! ¤ "!¤ #gexportsS¤ $gwith-code-coverage¤ %gcoverage-data?¤ &ginstrumented-source-files¤ 'ginstrumented/executed-lines¤ (gline-execution-counts¤ )gprocedure-execution-count¤ *gcoverage-data->lcov¤ +$%&'()*¤ ,gset-current-module¤ -,¤ .,¤ /ghashq¤ 0gprogram-objcode¤ 1g hashq-proc¤ 2gfind¤ 3g assq-proc¤ 4gframe-procedure¤ 5gframe-instruction-pointer¤ 6ghashx-create-handle!¤ 7ghashv-create-handle!¤ 8gmake-hash-table¤ 9gvm-trace-level¤ :g vm-next-hook¤ ;gset-vm-trace-level!¤ g call-with-vm¤ ?gmake-coverage-data¤ @g¤ Ag%%make-coverage-data-procedure¤ Bgmake-syntax-transformer¤ CB¤ DB¤ Eg%make-coverage-data¤ Fgmacro¤ Gg $sc-dispatch¤ HG¤ IG¤ Jg_¤ Kgany¤ LJKKKK¤ Mg syntax-object¤ Nglambda¤ Ogm-8d25f648290-30¤ Pgtop¤ QOP¤ Rgribcage¤ Sgt-8d25f648290-2c¤ Tgt-8d25f648290-2d¤ Ugt-8d25f648290-2e¤ Vgt-8d25f648290-2f¤ WSTUV¤ XQQQQ¤ Yfl-8d25f648290-35¤ Zfl-8d25f648290-36¤ [fl-8d25f648290-37¤ \fl-8d25f648290-38¤ ]YZ[\¤ ^RWX]¤ _R¤ `gx¤ a`¤ bQ¤ cfl-8d25f648290-32¤ dc¤ eRabd¤ fgshift¤ gg proc-name¤ hgargs¤ igh¤ jP¤ kjj¤ lfl-1e8ba8b5a-2ba¤ mfl-1e8ba8b5a-2bb¤ nlm¤ oRikn¤ pgkey¤ qgvalue¤ rgname¤ sgformals¤ tgbody¤ upqrst¤ vjjjjj¤ wfl-1e8ba8b5a-2ad¤ xfl-1e8ba8b5a-2ae¤ yfl-1e8ba8b5a-2af¤ zfl-1e8ba8b5a-2b0¤ {fl-1e8ba8b5a-2b1¤ |wxyz{¤ }Ruv|¤ ~gmake-procedure-name¤ ~¤ €j¤ fl-1e8ba8b5a-29d¤ ‚¤ ƒR€‚¤ „j¤ …fl-1e8ba8b5a-29c¤ †…¤ ‡Ra„†¤ ˆQ^_ef____o}ƒ‡ ¤ ‰ghygiene¤ Љ¤ ‹MNˆŠ¤ Œgprocedure->ip-counts¤ j^_e¤ މ¤ MŒŽ¤ gprocedure->sources¤ ‘Mޤ ’gfile->procedures¤ “M’ޤ ”gfile->line-counts¤ •M”ޤ –‘“•¤ —g make-struct¤ ˜gm-8d25f648290-2a¤ ™˜P¤ šgt-1e8ba8b5a-38d¤ ›gt-1e8ba8b5a-38c¤ œgt-1e8ba8b5a-38b¤ š›œ¤ žgm-1e8ba8b5a-38e¤ ŸžP¤  ŸŸŸ¤ ¡fl-1e8ba8b5a-392¤ ¢fl-1e8ba8b5a-393¤ £fl-1e8ba8b5a-394¤ ¤¡¢£¤ ¥R ¤¤ ¦g ctor-args¤ §¦¤ ¨fl-1e8ba8b5a-37a¤ ©¨¤ ªR§„©¤ «gctor¤ ¬gfield¤ ­«¬¤ ®fl-1e8ba8b5a-376¤ ¯fl-1e8ba8b5a-377¤ °®¯¤ ±R­k°¤ ²gform¤ ³g type-name¤ ´gconstructor-spec¤ µg field-names¤ ¶²³´µ¤ ·jjjj¤ ¸fl-1e8ba8b5a-36b¤ ¹fl-1e8ba8b5a-36c¤ ºfl-1e8ba8b5a-36d¤ »fl-1e8ba8b5a-36e¤ ¼¸¹º»¤ ½R¶·¼¤ ¾g record-layout¤ ¿gfunctional-setters¤ Àgsetters¤ Ágcopier¤ Âggetters¤ Ãg constructor¤ Äggetter-identifiers¤ Ågfield-identifiers¤ ƾ¿ÀÁÂÃÄŤ Çjjjjjjjj¤ Èfl-1e8ba8b5a-343¤ Éfl-1e8ba8b5a-341¤ Êfl-1e8ba8b5a-33f¤ Ëfl-1e8ba8b5a-33d¤ Ìfl-1e8ba8b5a-33b¤ Ífl-1e8ba8b5a-339¤ Îfl-1e8ba8b5a-337¤ Ïfl-1e8ba8b5a-335¤ ÐÈÉÊËÌÍÎϤ ÑRÆÇФ Òfl-1e8ba8b5a-334¤ ÓÒ¤ ÔRa„Ó¤ Õ™^_ef_¥___ª±_½ÑÔ¤ ÖM—ÕŠ¤ ×M@ޤ ØM ÕŠ¤ ÙÖר‘“•¤ Ú‹–Ù¤ Ûgeach-any¤ ÜJÛŒ¤ Ýgsyntax-violation¤ Þݤ ßݤ àfWrong number of arguments¤ ág identifier?¤ âᤠãᤠäj_e¤ åMA䎤 æÝ¤ çݤ èf-source expression failed to match any pattern¤ égrecord-type-vtable¤ êé¤ ëé¤ ìgpwpwpwpw¤ ígdefault-record-printer¤ îí¤ ïí¤ ðŒ’”¤ ñgset-struct-vtable-name!¤ òñ¤ óñ¤ ôgvtable-offset-user¤ õô¤ öô¤ ÷g%coverage-data?-procedure¤ øJK¤ ùgm-8d25f648290-43¤ úùP¤ ûgt-8d25f648290-42¤ üû¤ ýú¤ þfl-8d25f648290-48¤ ÿþ¤ Rüýÿ¤ fl-8d25f648290-45¤ ¤ Raý¤ ú_f____o}ƒ‡ ¤ MNФ gobj¤ gt-1e8ba8b5a-47e¤ gt-1e8ba8b5a-478¤  gt-1e8ba8b5a-479¤  gt-1e8ba8b5a-47a¤  gt-1e8ba8b5a-47d¤  gt-1e8ba8b5a-47c¤  gt-1e8ba8b5a-47b¤      ¤ gm-1e8ba8b5a-47f¤ P¤ ¤ fl-1e8ba8b5a-483¤ fl-1e8ba8b5a-484¤ fl-1e8ba8b5a-485¤ fl-1e8ba8b5a-486¤ fl-1e8ba8b5a-487¤ fl-1e8ba8b5a-488¤ fl-1e8ba8b5a-489¤ ¤ R¤ g copier-id¤ ¤ fl-1e8ba8b5a-476¤ ¤ R„¤  g ctor-name¤ ! ¤ "fl-1e8ba8b5a-46e¤ #"¤ $R!„#¤ %µ¤ &fl-1e8ba8b5a-46c¤ '&¤ (R%„'¤ )glayout¤ *)¤ +fl-1e8ba8b5a-46a¤ ,+¤ -R*„,¤ .g immutable?¤ /.¤ 0fl-1e8ba8b5a-468¤ 10¤ 2R/„1¤ 3g field-count¤ 43¤ 5fl-1e8ba8b5a-466¤ 65¤ 7R4„6¤ 8g getter-ids¤ 98¤ :fl-1e8ba8b5a-463¤ ;:¤ <R9„;¤ =g field-ids¤ >=¤ ?fl-1e8ba8b5a-460¤ @?¤ AR>„@¤ Bgpredicate-name¤ Cg field-spec¤ D.²³´BC¤ Ejjjjjj¤ Ffl-1e8ba8b5a-453¤ Gfl-1e8ba8b5a-454¤ Hfl-1e8ba8b5a-455¤ Ifl-1e8ba8b5a-456¤ Jfl-1e8ba8b5a-457¤ Kfl-1e8ba8b5a-458¤ LFGHIJK¤ MRDEL¤ N™_f______$_(_-_2_7_<_AMÑÔ¤ OMNФ PO¤ Qgand¤ RMQNФ Sgstruct?¤ TMSNФ UTO¤ Vgeq?¤ WMVNФ Xg struct-vtable¤ YMXNФ ZYO¤ [j_¤ \M@[ޤ ]WZ\¤ ^RU]¤ _P^¤ `j_¤ aM÷`ޤ bgthrow-bad-struct¤ cb¤ db¤ egdata-procedure->ip-counts¤ fg$%data-procedure->ip-counts-procedure¤ ggfree-id¤ hg %%on-error¤ igm-8d25f648290-4f¤ jiP¤ kj¤ lfl-8d25f648290-51¤ ml¤ nRakm¤ oj_nf____o}ƒ‡ ¤ pMhoФ qgp¤ rqK¤ sg%%type¤ tgt-1e8ba8b5a-3a5¤ ugt-1e8ba8b5a-3a6¤ vgt-1e8ba8b5a-3a7¤ wgt-1e8ba8b5a-3a8¤ xgt-1e8ba8b5a-3a9¤ ygt-1e8ba8b5a-3aa¤ zgt-1e8ba8b5a-3ab¤ {tuvwxyz¤ |gm-1e8ba8b5a-3ac¤ }|P¤ ~}}}}}}}¤ fl-1e8ba8b5a-3b0¤ €fl-1e8ba8b5a-3b1¤ fl-1e8ba8b5a-3b2¤ ‚fl-1e8ba8b5a-3b3¤ ƒfl-1e8ba8b5a-3b4¤ „fl-1e8ba8b5a-3b5¤ …fl-1e8ba8b5a-3b6¤ †€‚ƒ„…¤ ‡R{~†¤ ˆggetter¤ ‰gindex¤ Šˆ‰¤ ‹fl-1e8ba8b5a-3a3¤ Œfl-1e8ba8b5a-3a4¤ ‹Œ¤ ŽRŠk¤ ³8¤ jjj¤ ‘fl-1e8ba8b5a-39e¤ ’fl-1e8ba8b5a-39f¤ “fl-1e8ba8b5a-3a0¤ ”‘’“¤ •R”¤ –™_nf_‡___Ž_•ÑÔ¤ —Ms–Ф ˜g—¤ ™Jr˜K¤ šgck¤ ›gerr¤ œgs¤ ›œ¤ žjj¤ Ÿfl-8d25f648290-54¤  fl-8d25f648290-55¤ ¡Ÿ ¤ ¢Rž¡¤ £j¢_nf____o}ƒ‡ ¤ ¤Mš£Š¤ ¥gquote¤ ¦M¥£Š¤ §j¢_n¤ ¨M@§Ž¤ ©¦¨¤ ª©¤ «g%%index¤ ¬M«–Ф ­g¬¤ ®Jr­K¤ ¯fl-8d25f648290-59¤ °fl-8d25f648290-5a¤ ±¯°¤ ²Rž±¤ ³j²_nf____o}ƒ‡ ¤ ´Mš³Š¤ µM¥³Š¤ ¶²_n¤ ·M ¶Ž¤ ¸µ·¤ ¹¸¤ ºg%%copier¤ »Mº–Ф ¼g»¤ ½Jr¼K¤ ¾fl-8d25f648290-5e¤ ¿fl-8d25f648290-5f¤ À¾¿¤ ÁRžÀ¤ ÂjÁ_nf____o}ƒ‡ ¤ ÃMšÂФ ÄM¥ÂФ Åg%%-set-fields¤ ÆjÁ_n¤ ÇMůޤ ÈÄǤ ÉȤ Êgt-8d25f648290-4e¤ Ëʤ Ìfl-8d25f648290-63¤ Í̤ ÎRËkͤ ÏjÎ_nf____o}ƒ‡ ¤ ÐMNÏŠ¤ Ñ™Î_nf_‡___Ž_•ÑÔ¤ ÒMœÑФ ÓÒ¤ Ôgif¤ ÕMÔÑŠ¤ ÖMVÑŠ¤ ×MXÑŠ¤ Ø×Ò¤ ÙjÎ_n¤ ÚM@ÙŽ¤ ÛÖØÚ¤ Üg struct-ref¤ ÝMÜÑŠ¤ ÞÎ_n¤ ßM ÞŽ¤ àÝÒߤ áMbÑŠ¤ âM¥ÑФ ãMeÙŽ¤ äâ㤠åáÒä¤ æÕÛàå¤ çÐÓæ¤ èj_n¤ éMf莤 êgdata-procedure->sources¤ ëg"%data-procedure->sources-procedure¤ ìgm-8d25f648290-6a¤ íìP¤ îí¤ ïfl-8d25f648290-6c¤ ðï¤ ñRaîð¤ òí_ñf____o}ƒ‡ ¤ óMhòФ ôgó¤ õôK¤ ö™_ñf_‡___Ž_•ÑÔ¤ ÷MsöФ øg÷¤ ùJõøK¤ úíí¤ ûfl-8d25f648290-6f¤ üfl-8d25f648290-70¤ ýûü¤ þRúý¤ ÿíþ_ñf____o}ƒ‡ ¤ MšÿФ M¥ÿФ jþ_ñ¤ M@ޤ ¤ ¤ M«öФ g¤ JõK¤  fl-8d25f648290-74¤  fl-8d25f648290-75¤    ¤  Rú ¤  í _ñf____o}ƒ‡ ¤ Mš Š¤ M¥ Ф  _ñ¤ M ޤ ¤ ¤ MºöФ g¤ JõK¤ fl-8d25f648290-79¤ fl-8d25f648290-7a¤ ¤ Rú¤ í_ñf____o}ƒ‡ ¤ MšŠ¤ M¥Š¤ j_ñ¤ MÅŽ¤  ¤ ! ¤ "gt-8d25f648290-69¤ #"¤ $fl-8d25f648290-7e¤ %$¤ &R#î%¤ 'í&_ñf____o}ƒ‡ ¤ (MN'Ф )™&_ñf_‡___Ž_•ÑÔ¤ *Mœ)Ф +*¤ ,MÔ)Ф -MV)Ф .MX)Ф /.*¤ 0j&_ñ¤ 1M@0ޤ 2-/1¤ 3MÜ)Ф 4&_ñ¤ 5M 4ޤ 63*5¤ 7Mb)Ф 8M¥)Ф 9Mê0ޤ :89¤ ;7*:¤ <,26;¤ =(+<¤ >j_ñ¤ ?Më>ޤ @gdata-file->procedures¤ Ag %data-file->procedures-procedure¤ Bgm-8d25f648290-85¤ CBP¤ DC¤ Efl-8d25f648290-87¤ FE¤ GRaDF¤ HC_Gf____o}ƒ‡ ¤ IMhHФ JgI¤ KJK¤ L™_Gf_‡___Ž_•ÑÔ¤ MMsLФ NgM¤ OJKNK¤ PCC¤ Qfl-8d25f648290-8a¤ Rfl-8d25f648290-8b¤ SQR¤ TRPS¤ UCT_Gf____o}ƒ‡ ¤ VMšUФ WM¥UФ XjT_G¤ YM@Xޤ ZWY¤ [Z¤ \M«LФ ]g\¤ ^JK]K¤ _fl-8d25f648290-8f¤ `fl-8d25f648290-90¤ a_`¤ bRPa¤ cCb_Gf____o}ƒ‡ ¤ dMšcФ eM¥cФ fb_G¤ gM fޤ heg¤ ih¤ jMºLФ kgj¤ lJKkK¤ mfl-8d25f648290-94¤ nfl-8d25f648290-95¤ omn¤ pRPo¤ qCp_Gf____o}ƒ‡ ¤ rMšqФ sM¥qФ tjp_G¤ uMÅtޤ vsu¤ wv¤ xgt-8d25f648290-84¤ yx¤ zfl-8d25f648290-99¤ {z¤ |RyD{¤ }C|_Gf____o}ƒ‡ ¤ ~MN}Ф ™|_Gf_‡___Ž_•ÑÔ¤ €MœŠ¤ €¤ ‚MÔŠ¤ ƒMVФ „MXФ …„€¤ †j|_G¤ ‡M@†Ž¤ ˆƒ…‡¤ ‰MÜŠ¤ Š|_G¤ ‹M ŠŽ¤ Œ‰€‹¤ MbФ ŽM¥Š¤ M@†Ž¤ ޤ ‘€¤ ’‚ˆŒ‘¤ “~’¤ ”j_G¤ •MA”ޤ –gdata-file->line-counts¤ —g!%data-file->line-counts-procedure¤ ˜gm-8d25f648290-a0¤ ™˜P¤ 𙤠›fl-8d25f648290-a2¤ œ›¤ Rašœ¤ ž™_f____o}ƒ‡ ¤ ŸMhžŠ¤  gŸ¤ ¡ K¤ ¢™_f_‡___Ž_•ÑÔ¤ £Ms¢Š¤ ¤g£¤ ¥J¡¤K¤ ¦™™¤ §fl-8d25f648290-a5¤ ¨fl-8d25f648290-a6¤ ©§¨¤ ªR¦©¤ «™ª_f____o}ƒ‡ ¤ ¬Mš«Š¤ ­M¥«Š¤ ®jª_¤ ¯M@®Ž¤ °­¯¤ ±°¤ ²M«¢Š¤ ³g²¤ ´J¡³K¤ µfl-8d25f648290-aa¤ ¶fl-8d25f648290-ab¤ ·µ¶¤ ¸R¦·¤ ¹™¸_f____o}ƒ‡ ¤ ºMš¹Š¤ »M¥¹Š¤ ¼¸_¤ ½M ¼Ž¤ ¾»½¤ ¿¾¤ ÀMº¢Š¤ ÁgÀ¤ ÂJ¡ÁK¤ Ãfl-8d25f648290-af¤ Äfl-8d25f648290-b0¤ ÅÃĤ ÆR¦Å¤ Ç™Æ_f____o}ƒ‡ ¤ ÈMšÇФ ÉM¥ÇФ ÊjÆ_¤ ËMÅÊŽ¤ ÌÉˤ Í̤ Îgt-8d25f648290-9f¤ ÏΤ Ðfl-8d25f648290-b4¤ ÑФ ÒRϚѤ Ó™Ò_f____o}ƒ‡ ¤ ÔMNÓŠ¤ Õ™Ò_f_‡___Ž_•ÑÔ¤ ÖMœÕФ ×Ö¤ ØMÔÕŠ¤ ÙMVÕŠ¤ ÚMXÕŠ¤ ÛÚÖ¤ ÜjÒ_¤ ÝM@ÜŽ¤ ÞÙÛݤ ßMÜÕŠ¤ àÒ_¤ áM àŽ¤ âßÖᤠãMbÕŠ¤ äM¥ÕФ åM–ÜŽ¤ æäå¤ çãÖæ¤ èØÞâç¤ éÔ×è¤ êj_¤ ëM—ꎤ ìgeach¤ íKK¤ îìí¤ ïK ðK ñKðŒ¤ òg %%set-fields¤ ógdummy¤ ôgcheck?¤ õgexpr¤ öóôœˆõ¤ ÷gm-8d25f648290-bb¤ ø÷P¤ ùø™™™™¤ úfl-8d25f648290-c0¤ ûfl-8d25f648290-c1¤ üfl-8d25f648290-c2¤ ýfl-8d25f648290-c3¤ þfl-8d25f648290-c4¤ ÿúûüýþ¤ Röùÿ¤ ø¤ fl-8d25f648290-bd¤ ¤ Ra¤ gt-1e8ba8b5a-3c4¤ gt-1e8ba8b5a-3c6¤ gt-1e8ba8b5a-3c5¤ ¤  gm-1e8ba8b5a-3c7¤   P¤     ¤  fl-1e8ba8b5a-3cb¤  fl-1e8ba8b5a-3cc¤ fl-1e8ba8b5a-3cd¤   ¤ R ¤ fl-1e8ba8b5a-3c1¤ fl-1e8ba8b5a-3c2¤ fl-1e8ba8b5a-3c3¤ ¤ R¤ ™_f____ÑÔ ¤ MòФ j_¤ M@ޤ Meޤ Mꎤ M@ޤ M–ޤ ¤ gmap¤  ¤ !¤ "glist¤ #g hash-for-each¤ $gprogram-sources*¤ %g source:file¤ &gfor-each¤ 'g source:line¤ (ghash-create-handle!¤ )gmax¤ *g append-map¤ +gclosed-over-procedures¤ ,gclosest-source-line¤ -g hashq-ref¤ .g source:addr¤ /gmodule-procedures¤ 0gloaded-modules¤ 1gand=>¤ 2g hashx-ref¤ 3g hashv-ref¤ 4gprogram?¤ 5gprogram-sources¤ 6g hashq-set!¤ 7ghash-ref¤ 8gfile-procedures¤ 9g hash-fold¤ : Œ¤ ;g alist-cons¤ g procedure?¤ ?gmodule-obarray¤ @gmemq¤ Agfold¤ Bgappend¤ Cg vector->list¤ Dgprogram-objects¤ E¤ Fgprogram-free-variables¤ Ggformat¤ HfTN:~%¤ Ig search-path¤ Jg %load-path¤ Kgstring?¤ LfSF:~A~%¤ Mgsource:line-for-user¤ Ngprocedure-name¤ Of anonymous-l~a¤ Pf FN:~A,~A~%¤ Qf FNDA:~A,~A~%¤ Rf DA:~A,~A~%¤ SfLH: ~A~%¤ TfLF: ~A~%¤ Ufend_of_record~%¤ Vgcurrent-error-port¤ Wf"skipping unknown source file: ~a~%¤C5hpRø]4    "#+54.>"G/0h‘]456‰gproc  gn  gfilenamefsystem/vm/coverage.scmŒ 0 ŒŒ  2 ŒŒ  2 ŒŒ   gnameg hashq-procŒC1R020h|]L45‚Ctgpair  gfilenamefsystem/vm/coverage.scmŒ : ŒŒ  ; ŒŒ ; 'ŒŒ ; ŒŒ ; ŒŒ   Ch®] 45O6¦gproc  galist  gcode  gfilenamefsystem/vm/coverage.scmŒ 4 ŒŒ  9 ŒŒ 9 ŒŒ  : ŒŒ   gnameg assq-procŒC3R4561378h`h])45454M5"/HŽKJ$4J 5Ž—C45"ÿÿÑ"ÿÿÍ`gframe  [gproc [gip   [g proc-entry  " [g ip-counts  ) Wgip-entry  @ Kgfilenamefsystem/vm/coverage.scmŒ G ŒŒ  I ŒŒ I ŒŒ J ŒŒ  I ŒŒ  K ŒŒ " I ŒŒ ( M ŒŒ . N ŒŒ 6 O ŒŒ 7 P ŒŒ @ P ŒŒ G Q $ŒŒ H Q !ŒŒ I Q ŒŒ N S #ŒŒ S S ŒŒ W T ŒŒ W M ŒŒ  [ gnamegcollect!ŒC89:;<h i]4LL—>"GLL6agfilenamefsystem/vm/coverage.scmŒ ] ŒŒ  ^ ŒŒ ^ 4ŒŒ  ^ ŒŒ  _ ŒŒ   C;=h Y]4LL>"GLL6Qgfilenamefsystem/vm/coverage.scmŒ b ŒŒ  c ŒŒ  d ŒŒ   C>? h¨*]2HOQ4 ô5K4545OOQQ4>"GV4> X4>"G" G4J5E"gvm  ¢gthunk  ¢gprocedure->ip-counts   ¢gcollect!  ¢glevel  * ‘ghook  * ‘gpre  D ‘gpost  D ‘gargs  ’ ¢ gfilenamefsystem/vm/coverage.scmŒ > ŒŒ  E ŒŒ  Z %ŒŒ $ [ %ŒŒ * Z ŒŒ 9 \ ŒŒ p a ŒŒ ~ \ ŒŒ • Y ŒŒ ˜ f ŒŒ ¢ f ŒŒ  ¢ gnamegwith-code-coverageŒg documentationf™Run THUNK, a zero-argument procedure, using VM; instrument VM to collect code coverage data. Return code coverage data and the values returned by THUNK.ŒC$R@hó]¨Cëgprocedure->ip-counts  gprocedure->sources  gfile->procedures   gfile->line-counts   gfilenamefsystem/vm/coverage.scmŒ m ŒŒ   gnameg%%make-coverage-data-procedureŒCAR4DEFILÚh’]CŠgt-8d25f648290-2c  gt-8d25f648290-2d  gt-8d25f648290-2e   gt-8d25f648290-2f      CÜßEàhY]L6Qga  gfilenamefsystem/vm/coverage.scmŒ  m ŒŒ  CJãhI]L6Agfilenamefsystem/vm/coverage.scmŒ  m ŒŒ   Cåh]C   Cçè hpŠ]45$@45$ O@45$4O?$@  6  6‚gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/vm/coverage.scmŒ m ŒŒ  n C5ERëìï@ð¨4ó@>"G ö–Aiª@R@h€]¦$§‚CCxgobj  gfilenamefsystem/vm/coverage.scmŒ m ŒŒ   gnameg%coverage-data?-procedureŒC÷R4D%FIø_h8]C0gt-8d25f648290-42    CÜß%àhY]L6Qga  gfilenamefsystem/vm/coverage.scmŒ  m ŒŒ  CJãhI]L6Agfilenamefsystem/vm/coverage.scmŒ  m ŒŒ   Cah]C   Cçè hpŠ]45$@45$ O@45$4O?$@  6  6‚gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/vm/coverage.scmŒ m ŒŒ  n C5%R@deh‰]§& ©C6gs  gfilenamefsystem/vm/coverage.scmŒ m ŒŒ   gnameg$%data-procedure->ip-counts-procedureŒCfR4DeFI™¤ªh:]ŒŒC2gerr  gs    C®´¹h:]ŒŒC2gerr  gs    C½ÃÉh:]ŒŒC2gerr  gs    Cøçh8]C0gt-8d25f648290-4e    CÜßeàhY]L6Qga  gfilenamefsystem/vm/coverage.scmŒ  m ŒŒ  CJãhI]L6Agfilenamefsystem/vm/coverage.scmŒ  m ŒŒ   Céh]C   Cçèh¸Æ]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66¾gx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/vm/coverage.scmŒ m ŒŒ  ³ C5eR@dêh‡]§& ©C6gs  gfilenamefsystem/vm/coverage.scmŒ m ŒŒ   gnameg"%data-procedure->sources-procedureŒCëR4DêFIùh:]ŒŒC2gerr  gs    Ch:]ŒŒC2gerr  gs    C!h:]ŒŒC2gerr  gs    Cø=h8]C0gt-8d25f648290-69    CÜßêàhY]L6Qga  gfilenamefsystem/vm/coverage.scmŒ  m ŒŒ  CJãhI]L6Agfilenamefsystem/vm/coverage.scmŒ  m ŒŒ   C?h]C   Cçèh¸Æ]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66¾gx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/vm/coverage.scmŒ m ŒŒ  ³ C5êR@d@h …]§& ©C6}gs  gfilenamefsystem/vm/coverage.scmŒ m ŒŒ   gnameg %data-file->procedures-procedureŒCAR4D@FIOV[h:]ŒŒC2gerr  gs    C^dih:]ŒŒC2gerr  gs    Clrwh:]ŒŒC2gerr  gs    Cø“h8]C0gt-8d25f648290-84    CÜß@àhY]L6Qga  gfilenamefsystem/vm/coverage.scmŒ  m ŒŒ  CJãhI]L6Agfilenamefsystem/vm/coverage.scmŒ  m ŒŒ   C•h]C   Cçèh¸Æ]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66¾gx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/vm/coverage.scmŒ m ŒŒ  ³ C5@R@d–h †]§& ©C6~gs  gfilenamefsystem/vm/coverage.scmŒ m ŒŒ   gnameg!%data-file->line-counts-procedureŒC—R4D–FI¥¬±h:]ŒŒC2gerr  gs    C´º¿h:]ŒŒC2gerr  gs    CÂÈÍh:]ŒŒC2gerr  gs    Cøéh8]C0gt-8d25f648290-9f    CÜß–àhY]L6Qga  gfilenamefsystem/vm/coverage.scmŒ  m ŒŒ  CJãhI]L6Agfilenamefsystem/vm/coverage.scmŒ  m ŒŒ   Cëh]C   Cçèh¸Æ]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66¾gx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/vm/coverage.scmŒ m ŒŒ  ³ C5–R4DÅFIñ!"h v]45ŒŒŒŒŒCngdummy  gcheck?  gs   ggetter   gexpr      Cçèh(Ä] 45$@6¼gx  "gtmp "gfilenamefsystem/vm/coverage.scmŒ m ŒŒ  " g macro-typeg syntax-rulesŒgpatternsgcheck?gsggettergexprg...C5ÅR8@#$%&%'(87)hXK]!45454L5Ž$" 4 ô54Ž 54Ž 5CCgsource  Qgfile  Qgline   Qg file-entry   Qg line-entry  A Qgfilenamefsystem/vm/coverage.scmŒ ¢ ŒŒ  £ -ŒŒ ¤ -ŒŒ  £ !ŒŒ  ’ ŒŒ  ’ ŒŒ # “ ŒŒ ' “ ŒŒ . ” !ŒŒ 6 ” ŒŒ 7 • ŒŒ < • 0ŒŒ A • ŒŒ A • ŒŒ F – ŒŒ K – $ŒŒ N – ŒŒ O – ŒŒ  Q C*$hj]L6bgt-8d25f648290-118  gfilenamefsystem/vm/coverage.scmŒ ¦ +ŒŒ  C+#,(87)hP@]4L54LL5Ž$" 4 ô54Ž 54Ž5C8gip  Kgcount  Kgline  Kg file-entry   Kg line-entry  : Kgfilenamefsystem/vm/coverage.scmŒ « ŒŒ  ¬ -ŒŒ ¬ !ŒŒ  ’ ŒŒ  ’ ŒŒ  “ ŒŒ “ ŒŒ ' ” !ŒŒ / ” ŒŒ 0 • ŒŒ 5 • 0ŒŒ : • ŒŒ : • ŒŒ ? – ŒŒ D – $ŒŒ H – ŒŒ I – ŒŒ  K C hh"]4L5ˆ$ 45"$;4LO4LO455>"G LO6Cgproc  fg ip-counts  fgsources  fgfile  ! fgfilenamefsystem/vm/coverage.scmŒ ™ ŒŒ  š %ŒŒ š ŒŒ  › *ŒŒ  › %ŒŒ  œ *ŒŒ  œ 7ŒŒ  œ *ŒŒ ! š ŒŒ ) ŒŒ * ¡ ŒŒ 4 ¦ ŒŒ > § +ŒŒ F ¦ ŒŒ K ¡ ŒŒ d ª ŒŒ  f C&-&$%&,(87)hP,]4L54LL5Ž$" 4 ô54Ž 54Ž 5C$gip  Jgline Jg file-entry   Jg line-entry  : Jgfilenamefsystem/vm/coverage.scmŒ » )ŒŒ  ¼ 7ŒŒ ¼ +ŒŒ  ’ ŒŒ  ’ ŒŒ  “ ŒŒ “ ŒŒ ' ” !ŒŒ / ” ŒŒ 0 • ŒŒ 5 • 0ŒŒ : • ŒŒ : • ŒŒ ? – ŒŒ D – $ŒŒ G – ŒŒ H – ŒŒ  J C.hHæ]4L5ˆ$ 45"$LO456CÞgproc  Cgsources Cgfile  ! Cgfilenamefsystem/vm/coverage.scmŒ µ ŒŒ  ¶ 1ŒŒ ¶ !ŒŒ  · 6ŒŒ  · 1ŒŒ  ¸ 6ŒŒ  ¸ CŒŒ  ¸ 6ŒŒ ! ¶ !ŒŒ ) ¹ #ŒŒ 7 ¾ )ŒŒ A º (ŒŒ  C C+h(]4L5$CLLO456ygproc  %gfilenamefsystem/vm/coverage.scmŒ ³ ŒŒ  ´ ŒŒ  ´ ŒŒ  ¿ ŒŒ % µ ŒŒ  % C*/0 hxw]!4 ô54 d54 d5¨4O>"G4O44 55>"GCogprocedure->ip-counts  rgprocedure->sources rgfile->procedures   rgfile->line-counts   rgdata  + rgfilenamefsystem/vm/coverage.scmŒ ƒ ŒŒ  ‡ ŒŒ ‡ ŒŒ ˆ ŒŒ  ‡ ŒŒ  ‰ ŒŒ  ‡ ŒŒ + Š ŒŒ + ‡ ŒŒ . ™ ŒŒ I ³ ŒŒ W À ŒŒ \ À ,ŒŒ b À ŒŒ g ³ ŒŒ  r gnamegmake-coverage-dataŒC?R$1213@de.3h¤] 4L5 6œg ip-counts  gentry-ip gfilenamefsystem/vm/coverage.scmŒ Í ŒŒ  Ï "ŒŒ  Ï /ŒŒ Ï "ŒŒ Ï ŒŒ  Ð ŒŒ   C hH] 45ˆ$04§& ©" 455 O6Cgdata  Fgproc  Fgsources  Fgfilenamefsystem/vm/coverage.scmŒ Ä ŒŒ  É ŒŒ É ŒŒ  Ê ŒŒ  Ê ŒŒ  Ë ŒŒ Ì ŒŒ ; Ë ŒŒ D Ë ŒŒ  F gnamegprocedure-execution-countŒg documentationfReturn the number of times PROC's code was executed, according to DATA, or #f if PROC was not executed. When PROC is a closure, the number of times its code was executed is returned, not the number of times this code associated with this particular closure was executed.ŒC)R-@dê45@%(6 hÀè]*4§& ©" 455$C45$„45§& ©" 45§&  ©" 45ˆ$8454 54 >"GŽŒCCCàgdata  ¿gproc  ¿gt  # ¿gsources  u ½gp->s  u ½gf->p  u ½gfile  Š ºgentry  – ºgfilenamefsystem/vm/coverage.scmŒ Ò ŒŒ  Ô ŒŒ  Ô ŒŒ # Ô ŒŒ # Ô ŒŒ / Õ ŒŒ 9 Õ ŒŒ : Ö ŒŒ C × ŒŒ ] Ø ŒŒ u Ö ŒŒ ~ Ù ŒŒ ‚ Ù ŒŒ ƒ Ú ŒŒ ˆ Ú ,ŒŒ Š Ú ŒŒ Š Ú ŒŒ Û ŒŒ ” Û >ŒŒ – Û ŒŒ – Ú ŒŒ ™ Ü ŒŒ µ Ý .ŒŒ ¶ Ý #ŒŒ · Ý ŒŒ  ¿ gnamegprogram-sources*ŒC$R7@d@h(¥]§&  ©" 456gdata  $gfile  $gfilenamefsystem/vm/coverage.scmŒ á ŒŒ  ã ŒŒ " ã .ŒŒ $ ã ŒŒ  $ gnamegfile-proceduresŒC8R17@d–9h(õ]Ž— ”$—"ŒCígline  "gcount  "g instr+exec   "ginstr   "gexec   "gfilenamefsystem/vm/coverage.scmŒ ë ŒŒ  ì 'ŒŒ  í 'ŒŒ  ì ŒŒ  î "ŒŒ  ï &ŒŒ  ï "ŒŒ  ð &ŒŒ ! î ŒŒ  " C:hv]6ng line-counts  gfilenamefsystem/vm/coverage.scmŒ ê ŒŒ  ò ŒŒ ë ŒŒ  Ch8p] H44§&  ©" 4555KJJŽDhgdata  8gfile  8g instr+exec   8gfilenamefsystem/vm/coverage.scmŒ å ŒŒ  é ŒŒ é ŒŒ  é ŒŒ * é ŒŒ . é ŒŒ 3 õ ŒŒ 6 õ ŒŒ 8 õ ŒŒ  8 gnameginstrumented/executed-linesŒg documentationfdReturn the number of instrumented and the number of executed source lines in FILE according to DATA.ŒC'R17@d–9;hv]6ng line-counts  gfilenamefsystem/vm/coverage.scmŒ û ŒŒ  ü !ŒŒ ü ŒŒ  Ch0<]4§&  ©" 45564gdata  *gfile  *gfilenamefsystem/vm/coverage.scmŒ ÷ ŒŒ  ú ŒŒ ú ŒŒ & ú ŒŒ * ú ŒŒ  * gnamegline-execution-countsŒg documentationfrReturn a list of line number/execution count pairs for FILE, or #f if FILE is not among the files covered by DATA.ŒC(R9h]ŒC…gfile  gcounts  gfiles   gfilenamefsystem/vm/coverage.scmŒ  ŒŒ   ŒŒ   C@d–h(+]§&  ©" 456#gdata  $gfilenamefsystem/vm/coverage.scmŒ þ ŒŒ   ŒŒ  ŒŒ $  ŒŒ  $ gnameginstrumented-source-filesŒg documentationfxReturn the list of `instrumented' source files, i.e., source files whose code was loaded at the time DATA was collected.ŒC&R89-6<h8»]4M5$C4M>"GL45Œ6³gname  7gmodule  7gresult   7gfilenamefsystem/vm/coverage.scmŒ  ŒŒ   ŒŒ   ŒŒ   ŒŒ *  ŒŒ 5  ŒŒ 7  ŒŒ  7 ChŽ]LLO6†gmodules  gresult  gfilenamefsystem/vm/coverage.scmŒ  ŒŒ   ŒŒ   gnamegloopŒC<=h0Ù]H45KOQ44556Ñgseen  -gloop  -gfilenamefsystem/vm/coverage.scmŒ  ŒŒ   ŒŒ   ŒŒ   ŒŒ "  )ŒŒ %  9ŒŒ (  )ŒŒ *  ŒŒ +  ŒŒ -  ŒŒ  - gnamegloaded-modulesŒC0R9>h(×] $45$ŒCCCÏgbinding  %gvar  %gresult   %gvalue  "gfilenamefsystem/vm/coverage.scmŒ  ŒŒ   ŒŒ  ŒŒ  ŒŒ  ŒŒ   ŒŒ   ŒŒ  ! ŒŒ  % C?h—]456gmodule  gfilenamefsystem/vm/coverage.scmŒ  ŒŒ  $ ŒŒ  % ŒŒ   ŒŒ   gnamegmodule-proceduresŒC/R.'hXc]"1(C45”$CŽ45"ÿÿψ$ 45""ÿÿ±[gsources  Ugip  Ugsources   7gline   7gsource   7gfilenamefsystem/vm/coverage.scmŒ ' ŒŒ  + ŒŒ - ŒŒ  / ŒŒ  / ŒŒ  0 ŒŒ  0 ŒŒ " 0 ŒŒ ( 2 ŒŒ ) 2 "ŒŒ 7 2 ŒŒ 7 + ŒŒ < , ŒŒ @ , ŒŒ A , +ŒŒ F , 8ŒŒ H , +ŒŒ U + ŒŒ  U gnamegclosest-source-lineŒC,R4@ABCDEF hX] 45$F45$CLŒ4445$"54556Cgproc  Vgresult  Vgt  3 Fgfilenamefsystem/vm/coverage.scmŒ 6 ŒŒ  8 ŒŒ 8 ŒŒ  8 "ŒŒ  8 ŒŒ & 9 ŒŒ ' : ŒŒ * : ŒŒ - : (ŒŒ 3 : $ŒŒ C : ?ŒŒ H : ŒŒ I ; ŒŒ Q : ŒŒ S 9 ŒŒ  V gnamegloopŒC4ABCDEF hX]OQ45$64445$"54556Cgproc  Rgloop Rgt  0 Cgfilenamefsystem/vm/coverage.scmŒ 4 ŒŒ 6 ŒŒ  8 ŒŒ  8 ŒŒ # 7 ŒŒ $ : ŒŒ ' : ŒŒ * : (ŒŒ 0 : $ŒŒ @ : ?ŒŒ E : ŒŒ F ; ŒŒ N : ŒŒ P 9 ŒŒ Q 7 ŒŒ  R gnamegclosed-over-proceduresŒC+RGH&8IJKGL&4$MNGOP1)GQhp]LL6hgcount  gfilenamefsystem/vm/coverage.scmŒ S ŒŒ  T (ŒŒ  T ŒŒ   C h€{]45$p4L5ˆ$\4545$" 454L>"G4 L5 LO6CCsgproc  gsources  }gline  ' {gt  0 Kgname  K {gfilenamefsystem/vm/coverage.scmŒ I ŒŒ  K ŒŒ K ŒŒ  L ŒŒ  L ŒŒ  M ŒŒ  M ŒŒ N ŒŒ % N 3ŒŒ ' N ŒŒ ' N ŒŒ * O !ŒŒ 0 O ŒŒ ? P !ŒŒ D P ,ŒŒ H P !ŒŒ K N ŒŒ N Q ŒŒ T Q ŒŒ ] Q ŒŒ h R ŒŒ { R ŒŒ   gnameg dump-functionŒCGRh ½]ŽL—6µg line+count  gline  gcount   gfilenamefsystem/vm/coverage.scmŒ _ ŒŒ  ` /ŒŒ  a /ŒŒ  ` "ŒŒ  b 1ŒŒ  c ,ŒŒ  b $ŒŒ   C('STUVWhЛ]!4L54545$Ÿ4L>"G4LLO>"G4 LO4 L5>"G4 L> G4L >"G4L >"GL6456“gfile  Ïgprocs  Ïgpath   Ïginstr  ºgexec  ºgfilenamefsystem/vm/coverage.scmŒ X ŒŒ  Y ŒŒ Z ŒŒ  Y ŒŒ  [ ŒŒ # [ ŒŒ $ ] ŒŒ * ] #ŒŒ 1 ] ŒŒ : ^ ŒŒ U _ ŒŒ _ d ŒŒ l _ ŒŒ u f $ŒŒ „ e ŒŒ ‰ g ŒŒ g %ŒŒ – g ŒŒ Ÿ h ŒŒ ¥ h %ŒŒ ¬ h ŒŒ À i #ŒŒ  i ŒŒ Å k ŒŒ Ë l ŒŒ Ï k ŒŒ  Ï C&h0×]4>"GO456Ïgdata  *gport  *gfilenamefsystem/vm/coverage.scmŒ C ŒŒ  W ŒŒ W ŒŒ  W ŒŒ " n ŒŒ * X ŒŒ  * gnamegcoverage-data->lcovŒg documentationfTraverse code coverage information DATA, as obtained with `with-code-coverage', and write coverage information in the LCOV format to PORT. The report will include all the modules loaded at the time coverage data was gathered, even if their code was not executed.ŒC*RCðgm  ,grtd t œgfilenamefsystem/vm/coverage.scmŒ   ŒŒ ä 0 ŒŒ Y 4 ŒŒ ] > ŒŒ v m ŒŒ 1B ƒ ŒŒ 4™ Ä ŒŒ 7t Ò ŒŒ 8a á ŒŒ ;ó å ŒŒ > ÷ ŒŒ @6 þ ŒŒ C  ŒŒ Dó  ŒŒ FÇ ' ŒŒ Iñ 4 ŒŒ Rj C ŒŒ  Rl C6PK!iØv´@@ vm/trace.gonu„[µü¤GOOF----LE-8-2.0(]h4hÂ] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gvm¤ gtrace¤ ¤ gfilenameS¤ fsystem/vm/trace.scm¤ gimportsS¤ gbase¤ gsyntax¤  ¤ ¤ ¤ ¤ gframe¤ ¤ ¤ gprogram¤ ¤ ¤ gobjcode¤ ¤ ¤ gtraps¤ ¤ ¤ grnrs¤ g bytevectors¤ ! ¤ "!¤ #g instruction¤ $#¤ %$¤ &gice-9¤ 'gformat¤ (&'¤ )(¤ *"%) ¤ +gexportsS¤ ,gtrace-calls-in-procedure¤ -gtrace-calls-to-procedure¤ .gtrace-instructions-in-procedure¤ /gcall-with-trace¤ 0,-./¤ 1gset-current-module¤ 21¤ 31¤ 4g*objcode-header-len*¤ 5g string-append¤ 6g string-length¤ 7f¤ 8g build-prefix¤ 9f| ¤ :f~d> ¤ ;gcurrent-error-port¤ gprint-application¤ ?gframe-num-locals¤ @gframe-local-ref¤ Af~d< ¤ Bf ~ano values ¤ Cf~a~d values:~{ ~a~} ¤ Dgmap¤ Ef~v:@y¤ Fgframe-return-values¤ Gg print-return¤ HgwidthS¤ IH Œ¤ JgvmS¤ KJ Œ¤ LgprefixS¤ ML Œ¤ Ng max-indentS¤ ON Œ¤ PIKMO¤ Qgthe-vm¤ Rftrace: ¤ Sgtrap-calls-to-procedure¤ Tgtrap-calls-in-dynamic-extent¤ UN Œ¤ VIKU¤ Wg#trap-instructions-in-dynamic-extent¤ Xgframe-instruction-pointer¤ Ygprogram-objcode¤ Zgframe-procedure¤ [gobjcode->bytecode¤ \f~8d: ~a ¤ ]gopcode->instruction¤ ^gcalls?S¤ _^ Œ¤ `g instructions?S¤ a` Œ¤ bH Œ¤ cJ Œ¤ dN Œ¤ e_abcd¤ fgset-vm-trace-level!¤ ggvm-trace-level¤C5h@–]4    *+0543>"G 4R56'7h`x]"M‘$64545–’$45—"ÿÿÅ456 "ÿÿ¨pgprefix  ^gdepth  ^ginfix   ^gnumeric-format   ^g max-indent   ^gindent   Sgn   Sgfilenamefsystem/vm/trace.scmŒ & ŒŒ  ' ŒŒ ) ŒŒ  ( ŒŒ  * ŒŒ  + ŒŒ  + #ŒŒ & + ŒŒ ) + ŒŒ - ( ŒŒ . , ŒŒ 9 , 'ŒŒ A , ŒŒ H . #ŒŒ S . ŒŒ S ' ŒŒ U ' ŒŒ ^ ' ŒŒ  ^ gnameg build-prefixŒC8R89:';<=h0%] 4545456gframe  )gdepth  )gwidth   )gprefix   )g max-indent   )gprefix   )gfilenamefsystem/vm/trace.scmŒ 0 ŒŒ  1 ŒŒ 1 +ŒŒ 1 1ŒŒ  1 ŒŒ  1 ŒŒ  2 ŒŒ  2 !ŒŒ ! 5 ŒŒ ) 2 ŒŒ  ) gnamegprint-applicationŒC>R?@89A';B<CD'Ehh]L6`gval  gfilenamefsystem/vm/trace.scmŒ H ŒŒ  I !ŒŒ I ŒŒ  CFhˆé]454™545 †$ 456 †$45 4 ˜5645 4  O4 556ágframe  ‚gdepth  ‚gwidth   ‚gprefix   ‚g max-indent   ‚glen  ‚gnvalues   ‚gprefix  & ‚gfilenamefsystem/vm/trace.scmŒ 7 ŒŒ  8 ŒŒ 8 ŒŒ 9 ŒŒ  9 )ŒŒ  9 ŒŒ  8 ŒŒ  : ŒŒ : ,ŒŒ " : 2ŒŒ & : ŒŒ & 8 ŒŒ 0 ; ŒŒ 3 = ŒŒ 9 = $ŒŒ = = ŒŒ E ; ŒŒ H ? ŒŒ N ? $ŒŒ S B ŒŒ \ B &ŒŒ ^ B ŒŒ ` ? ŒŒ c F ŒŒ i F $ŒŒ n H ŒŒ x J ŒŒ € H ŒŒ ‚ F ŒŒ  ‚ gnameg print-returnŒCGRPQRS>h]LLL6‡gframe  gdepth  gfilenamefsystem/vm/trace.scmŒ O ŒŒ  P ŒŒ   gnameg apply-handlerŒCGh]LLL6ˆgframe  gdepth  gfilenamefsystem/vm/trace.scmŒ Q ŒŒ  R ŒŒ   gnamegreturn-handlerŒCJhh'-/03# P#45## (˜OO6gproc  agwidth  agvm   agprefix   ag max-indent   agfilenamefsystem/vm/trace.scmŒ L ŒŒ $ L =ŒŒ 2 M +ŒŒ ? N /ŒŒ a S ŒŒ  a gwidthS ŒgvmS ŒgprefixS Œg max-indentS Œgnamegtrace-calls-to-procedureŒC-RPQRT>h]LLL6‡gframe  gdepth  gfilenamefsystem/vm/trace.scmŒ Y ŒŒ  Z ŒŒ   gnameg apply-handlerŒCGh]LLL6ˆgframe  gdepth  gfilenamefsystem/vm/trace.scmŒ [ ŒŒ  \ ŒŒ   gnamegreturn-handlerŒCJhh'-/03# P#45## (˜OO6gproc  agwidth  agvm   agprefix   ag max-indent   agfilenamefsystem/vm/trace.scmŒ V ŒŒ $ V =ŒŒ 2 W +ŒŒ ? X /ŒŒ a ] ŒŒ  a gwidthS ŒgvmS ŒgprefixS Œg max-indentS Œgnamegtrace-calls-in-procedureŒC,RVQWXYZ[4'\] h8]45445545–¶456 gframe  8gip 8gobjcode   8gopcode  & 8gfilenamefsystem/vm/trace.scmŒ b ŒŒ  c ŒŒ c ŒŒ d ŒŒ  d %ŒŒ  d ŒŒ  c ŒŒ  e &ŒŒ % f &ŒŒ & e ŒŒ & c ŒŒ - g ŒŒ 0 g ŒŒ 8 g ŒŒ  8 gnameg trace-nextŒCJhH-/03# P#45# (˜6ügproc  Cgwidth  Cgvm   Cg max-indent   Cgfilenamefsystem/vm/trace.scmŒ ` ŒŒ $ ` DŒŒ 5 a 6ŒŒ C i ŒŒ  C gwidthS ŒgvmS Œg max-indentS Œgnamegtrace-instructions-in-procedureŒC.ReQ,JHN.fghPŽ]L$4LLLL5N"L$4LLLL5N"L4L5—6†gfilenamefsystem/vm/trace.scmŒ t ŒŒ  u ŒŒ w ŒŒ  v ŒŒ ' y ŒŒ ( { ŒŒ < z ŒŒ E } $ŒŒ L } ŒŒ N } ŒŒ  N CfghX ]4L4L5™>"GM$4M>"G"M$4M>"G"NNC˜gfilenamefsystem/vm/trace.scmŒ  ŒŒ  € ŒŒ  € $ŒŒ  € ŒŒ  € ŒŒ " ŒŒ # ŒŒ < ‚ ŒŒ = ‚ ŒŒ S ƒ ŒŒ V „ ŒŒ  X C,JHN.fghPŽ]L$4LLLL5N"L$4LLLL5N"L4L5—6†gfilenamefsystem/vm/trace.scmŒ t ŒŒ  u ŒŒ w ŒŒ  v ŒŒ ' y ŒŒ ( { ŒŒ < z ŒŒ E } $ŒŒ L } ŒŒ N } ŒŒ  N CfghX ]4L4L5™>"GM$4M>"G"M$4M>"G"NNC˜gfilenamefsystem/vm/trace.scmŒ  ŒŒ  € ŒŒ  € $ŒŒ  € ŒŒ  € ŒŒ " ŒŒ # ŒŒ < ‚ ŒŒ = ‚ ŒŒ S ƒ ŒŒ V „ ŒŒ  X CfghX ]4L4L5™>"GM$4M>"G"M$4M>"G"NNC˜gfilenamefsystem/vm/trace.scmŒ  ŒŒ  € ŒŒ  € $ŒŒ  € ŒŒ  € ŒŒ " ŒŒ # ŒŒ < ‚ ŒŒ = ‚ ŒŒ S ƒ ŒŒ V „ ŒŒ  X Ch؆-/03### P#45# (˜HHOO4O>"GV4>X4O>"GCX4O>"GF~gthunk  Ñgcalls?  Ñg instructions?   Ñgwidth   Ñgvm   Ñg max-indent   Ñg call-trap  K Ñg inst-trap  K Ñgfilenamefsystem/vm/trace.scmŒ o ŒŒ 6 p )ŒŒ G p ?ŒŒ K q ŒŒ p s ŒŒ  Ñ gcalls?S Œg instructions?S ŒgwidthS ŒgvmS Œg max-indentS Œgnamegcall-with-traceŒC/RCŽgm  ,gfilenamefsystem/vm/trace.scmŒ   ŒŒ 1 $ ŒŒ # & ŒŒ ˜ 0 ŒŒ ¼ 7 ŒŒ Ê L ŒŒ Ú V ŒŒ § ` ŒŒ 9 o ŒŒ  ; C6PK!7*9Q99 vm/objcode.gonu„[µü¤GOOF----LE-8-2.0!]4h] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gvm¤ gobjcode¤ ¤ gfilenameS¤ fsystem/vm/objcode.scm¤ gexportsS¤ gobjcode?¤ g objcode-meta¤ gbytecode->objcode¤ gobjcode->bytecode¤ g load-objcode¤ g write-objcode¤ g word-size¤ g byte-order¤  ¤ gset-current-module¤ ¤ ¤ gload-extension¤ g string-append¤ f libguile-¤ geffective-version¤ fscm_init_objcodes¤C5h@‡]4    54>"Gi4i4i556gm  (gfilenamefsystem/vm/objcode.scmŒ   ŒŒ -  ŒŒ 3  ŒŒ 4  +ŒŒ <  ŒŒ >  ŒŒ @  ŒŒ  @ C6PK!j~Yžû=û= vm/program.gonu„[µü¤GOOF----LE-8-2.0ã=]Š4hI ] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gvm¤ gprogram¤ ¤ gfilenameS¤ fsystem/vm/program.scm¤ gimportsS¤ gbase¤ gpmatch¤  ¤ ¤ g instruction¤ ¤ ¤ gobjcode¤ ¤ ¤ grnrs¤ g bytevectors¤ ¤ ¤ gsrfi¤ gsrfi-1¤ ¤ ¤ gsrfi-26¤ ¤ ! ¤ "!¤ #gexportsS¤ $g make-program¤ %g make-binding¤ &g binding:name¤ 'gbinding:boxed?¤ (g binding:index¤ )g binding:start¤ *g binding:end¤ +g source:addr¤ ,g source:line¤ -g source:column¤ .g source:file¤ /gsource:line-for-user¤ 0gprogram-sources¤ 1gprogram-sources-pre-retire¤ 2gprogram-source¤ 3gprogram-bindings¤ 4gprogram-bindings-by-index¤ 5gprogram-bindings-for-ip¤ 6gprogram-arities¤ 7g program-arity¤ 8g arity:start¤ 9g arity:end¤ :g arity:nreq¤ ;g arity:nopt¤ garity:allow-other-keys?¤ ?gprogram-arguments-alist¤ @gprogram-lambda-list¤ Ag program-meta¤ Bgprogram-objcode¤ Cgprogram?¤ Dgprogram-objects¤ Egprogram-module¤ Fg program-base¤ Ggprogram-free-variables¤ Hgprogram-num-free-variables¤ Igprogram-free-variable-ref¤ Jgprogram-free-variable-set!¤ K$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJ'¤ Lgset-current-module¤ ML¤ NL¤ Ogload-extension¤ Pg string-append¤ Qf libguile-¤ Rgeffective-version¤ Sfscm_init_programs¤ Tglist-ref¤ Ug*bytecode-header-len*¤ Vgopcode->instruction¤ Wg load-program¤ Xginstruction-length¤ Ygbytecode-instruction-length¤ Zgobjcode->bytecode¤ [greverse¤ \gerror¤ ]f unexpected¤ ^gmap¤ _gcdr¤ `gsort!¤ agassv-ref¤ bgappend!¤ cgcollapse-locals¤ df bad arity¤ egrequired¤ fgoptional¤ ggkeyword¤ hgallow-other-keys?¤ igrest¤ jgextents¤ kgarglist->arguments-alist¤ lgstring->symbol¤ mf_¤ nglength¤ ogarity->arguments-alist¤ pgand=>¤ qgarguments-alist->lambda-list¤ rgassq-ref¤ sgkeyword->symbol¤ tgcar¤ ugappend¤ vu¤ wu¤ xgoptionalS¤ ygkeyS¤ zgunfold¤ {g1+¤ |gformat¤ }f#¤ ~gprocedure-name¤ f~a at ~a:~a:~a¤ €gnumber->string¤ gobject-address¤ ‚f¤ ƒf¤ „f¤ …f ¤ †g string-join¤ ‡gobject->string¤ ˆf | ¤ ‰g write-program¤C5hH1¡]4    "#K54N>"G4Oi4PiQ4Ri55S>"GhÆ]C¾gname  gboxed?  gindex   gstart   gend   gfilenamefsystem/vm/program.scmŒ 5 ŒŒ  6 ŒŒ   gnameg make-bindingŒC%RThx] 6pgb  gfilenamefsystem/vm/program.scmŒ 7 ŒŒ 7 ŒŒ  gnameg binding:nameŒC&RThz] 6rgb  gfilenamefsystem/vm/program.scmŒ 8 ŒŒ 8 ŒŒ  gnamegbinding:boxed?ŒC'RThy] 6qgb  gfilenamefsystem/vm/program.scmŒ 9 ŒŒ 9 ŒŒ  gnameg binding:indexŒC(RThy] 6qgb  gfilenamefsystem/vm/program.scmŒ : ŒŒ : ŒŒ  gnameg binding:startŒC)RThw] 6ogb  gfilenamefsystem/vm/program.scmŒ ; ŒŒ ; ŒŒ  gnameg binding:endŒC*Rh|]Ctgsource  gfilenamefsystem/vm/program.scmŒ = ŒŒ  > ŒŒ   gnameg source:addrŒC+Rh|]ŽCtgsource  gfilenamefsystem/vm/program.scmŒ ? ŒŒ  @ ŒŒ   gnameg source:fileŒC.Rh|]ŽŽCtgsource  gfilenamefsystem/vm/program.scmŒ A ŒŒ  B ŒŒ   gnameg source:lineŒC,Rh~]ŽŽŽCvgsource  gfilenamefsystem/vm/program.scmŒ C ŒŒ  D ŒŒ   gnameg source:columnŒC-R,h]45—C…gsource  gfilenamefsystem/vm/program.scmŒ I ŒŒ  J ŒŒ J ŒŒ  gnamegsource:line-for-userŒC/R URUVWXhh™]–4¶5&—º –º–"645 ’$"—¶ Ÿ –¶ Ÿ– –¶–"45—C‘gbytecode  hgip  hgidx   hginst   hgfilenamefsystem/vm/program.scmŒ Q ŒŒ  R ŒŒ  R ŒŒ S ŒŒ  S $ŒŒ  S ŒŒ  R ŒŒ  V ŒŒ  U ŒŒ " W 1ŒŒ # W ŒŒ * X 1ŒŒ + X ŒŒ , W ŒŒ 1 Y ŒŒ 9 Y ŒŒ = U ŒŒ B \ .ŒŒ C \ ŒŒ F \ ŒŒ M ] .ŒŒ N ] ŒŒ Q ] ŒŒ R \ ŒŒ Y ^ )ŒŒ Z ^ ŒŒ [ \ ŒŒ ` a ŒŒ g U ŒŒ  h gnamegbytecode-instruction-lengthŒCYRZB[Y\]0h˜é]I4455"n(6ˆ$PŽ"6 ’$  4 5– "ÿÿᎌŒ "ÿÿ¤ "ÿÿ¾645 "ÿÿágproc  •gbv  •gin   ‚gout   ‚gip   ‚gv  # ‚gvx  2 |gvy  2 |gip  : pgnext : p gfilenamefsystem/vm/program.scmŒ m ŒŒ  n ŒŒ  n ŒŒ  n ŒŒ  n ŒŒ  o ŒŒ  r ŒŒ t ŒŒ # v ŒŒ # v ŒŒ : x ŒŒ ? z ŒŒ C z ŒŒ H { #ŒŒ Q { ŒŒ Y { ŒŒ \ | ŒŒ a } ŒŒ p | ŒŒ p x ŒŒ € € ŒŒ ‚ € ŒŒ ‚ o ŒŒ ƒ o ŒŒ Š p ŒŒ • o ŒŒ  • gnamegprogram-sources-pre-retireŒC1R^_`hƒ]’C{gx  gy  gfilenamefsystem/vm/program.scmŒ † ŒŒ  † )ŒŒ  † 1ŒŒ † &ŒŒ  Ca(bh€†]!"n(4564455$$4>"GŽ"ÿÿ¬45ŒŽ"ÿÿ’"ÿÿ‡~glocs  gret  tglocs   tgb   tgt  . tgfilenamefsystem/vm/program.scmŒ ‚ ŒŒ  ƒ ŒŒ „ ŒŒ  … ŒŒ  … ŒŒ  ‡ ŒŒ  ‡ ŒŒ ! ‰ ŒŒ & ‰ ŒŒ . ‰ ŒŒ . ˆ ŒŒ 7 ‹ ŒŒ @ ‹ #ŒŒ E ‹ ŒŒ R Œ ŒŒ Z Œ ŒŒ [ Ž ŒŒ f Ž )ŒŒ i Ž ŒŒ l ŒŒ t Ž ŒŒ t ƒ ŒŒ u ƒ ŒŒ  ƒ ŒŒ   gnamegcollapse-localsŒCcR3ch ª] 45$6C¢gprog  gt gfilenamefsystem/vm/program.scmŒ “ ŒŒ  ” ŒŒ ” ŒŒ  • ŒŒ   gnamegprogram-bindings-by-indexŒC4R[)*4hˆÃ]"m(6Ž"I("F" Ž"ÿÿç45“$45“$ Œ""ÿÿË"ÿÿÇ"ÿÿ®"ÿÿ“45"ÿÿƒ»gprog  ƒgip  ƒgin   sgout   sgbinds   bgfilenamefsystem/vm/program.scmŒ — ŒŒ  ˜ ŒŒ ™ ŒŒ  š ŒŒ  › ŒŒ  œ ŒŒ  ŒŒ , ¢ !ŒŒ 2 ¢ ŒŒ 2 ŒŒ 3 ž ŒŒ 8 ž (ŒŒ : ž ŒŒ = ž ŒŒ A ŒŒ D   ŒŒ I   &ŒŒ K   ŒŒ L ž ŒŒ S ¡ ŒŒ V ¡ ŒŒ b œ ŒŒ e œ ŒŒ k œ ŒŒ s › ŒŒ s ˜ ŒŒ t ˜ ŒŒ { ˜ 6ŒŒ ƒ ˜ ŒŒ  ƒ gnamegprogram-bindings-for-ipŒC5R\dh8¼]ˆ$$Žˆ$ ŽC66´ga  5gvx  -gvy   -gfilenamefsystem/vm/program.scmŒ ¤ ŒŒ  ¥ ŒŒ ) ¥ 3ŒŒ - ¥ ,ŒŒ 1 ¥ 3ŒŒ 5 ¥ ,ŒŒ  5 gnameg arity:startŒC8R\dh8ª] ˆ$ Žˆ$ŽC66¢ga  1gvy )gfilenamefsystem/vm/program.scmŒ ¦ ŒŒ  § ŒŒ % § 1ŒŒ ) § *ŒŒ - § 1ŒŒ 1 § *ŒŒ  1 gnameg arity:endŒC9Rh8—]ˆ$,Žˆ$Žˆ$ŽC C C Cga  7gvy 5gvy   3gfilenamefsystem/vm/program.scmŒ ¨ ŒŒ  © ŒŒ  7 gnameg arity:nreqŒC:RhP§]ˆ$>Žˆ$,Žˆ$Žˆ$ŽC C C C CŸga  Igvy Ggvy   Egvy  , Cgfilenamefsystem/vm/program.scmŒ ª ŒŒ  « ŒŒ  I gnameg arity:noptŒC;Rh`¸]!ˆ$PŽˆ$>Žˆ$,Žˆ$Žˆ$ŽCCCCCC°ga  [gvy Ygvy   Wgvy  , Ugvy  < Sgfilenamefsystem/vm/program.scmŒ ¬ ŒŒ  ­ ŒŒ  [ gnameg arity:rest?ŒCR689hhl]45$U"I(C$7" Ž"ÿÿå45’$45“$C"ÿÿÑ"ÿÿÍC"ÿÿ¯Cdgprog  hgip  hgarities  hgarities   ^gfilenamefsystem/vm/program.scmŒ ³ ŒŒ  ´ ŒŒ ´ ŒŒ  µ ŒŒ  ¶ ŒŒ  · ŒŒ * ¼ ŒŒ 0 ¼ ŒŒ 0 · ŒŒ 1 ¹ ŒŒ 6 ¹ 'ŒŒ 8 ¹ ŒŒ ; ¹ ŒŒ ? · ŒŒ B º ŒŒ G º )ŒŒ I º ŒŒ J º ŒŒ N ¹ ŒŒ Q » ŒŒ ] ¸ ŒŒ ^ ¶ ŒŒ  h gnameg program-arityŒC7Refghijhˆ8]Qˆ$xŽˆ$eŽˆ$RŽˆ$?Žˆ$,Ž  ŒŒŒŒ Œ ŒCCCCCC0garglist  ƒgvx  gvy   gvx  gvy  gvx  1 }gvy  1 }gvx  B {gvy  B {gvx S ygvy S y gfilenamefsystem/vm/program.scmŒ ¾ ŒŒ  ¿ ŒŒ Y Á ŒŒ  ƒ gnamegarglist->arguments-alistŒCkRlmhk]6cgi  gfilenamefsystem/vm/program.scmŒ Ì "ŒŒ  Ì >ŒŒ  Ì .ŒŒ   C^(&ht]4545ŒClgx  gfilenamefsystem/vm/program.scmŒ Î ŒŒ  Ï ŒŒ Ï 1ŒŒ  Ï ŒŒ   C58ah ‚] 4L5$CL6zgi  gt gfilenamefsystem/vm/program.scmŒ Ò ŒŒ  Ó ŒŒ Ó ŒŒ  Õ ŒŒ   Cn=e[fgh>i:;<h@ -.,3 #H444555OK"Í ’$*™4J 5Œ  —  "ÿÿÎ ’$*™4J 5Œ  —  "ÿÿœ$24J 4455–5 —  "ÿÿd 4 5Œ 4 5Œ 45Œ 45Œ ŒC454545   "ÿÿgprog :garity :gmake-placeholder  :g var-by-index   :grbinds  . <gnreq  B greq  B gnopt  B gopt  B grest?  B grest B gn B  gfilenamefsystem/vm/program.scmŒ É ŒŒ  Î ŒŒ  Ð ŒŒ $ Ñ 0ŒŒ , Ð ŒŒ . Î ŒŒ . Î ŒŒ B × ŒŒ F Ü ŒŒ J Û ŒŒ M Ý ŒŒ N Ý ŒŒ W Ý ŒŒ b Þ ŒŒ t Ý ŒŒ x ß ŒŒ | Û ŒŒ ƒ á ŒŒ „ á ŒŒ á ŒŒ ” â ŒŒ ¦ à ŒŒ ¬ Û ŒŒ ¶ å ŒŒ » å ŒŒ ¾ å (ŒŒ Æ å ŒŒ Ç å ŒŒ É å ŒŒ Ì æ ŒŒ Þ ä ŒŒ à è ŒŒ á è ŒŒ è è ŒŒ ë é ŒŒ ò è ŒŒ õ ê ŒŒ ü è ŒŒ ÿ ë ŒŒ  è ŒŒ  × ŒŒ  × ŒŒ  × *ŒŒ  Ø ŒŒ  Ø *ŒŒ  Ù ŒŒ : × ŒŒ0 :  gnamegarity->arguments-alistŒCoR7oh0,-.,3#45$6C$gprog 0gip 0garity   0gfilenamefsystem/vm/program.scmŒ ï ŒŒ  ñ ŒŒ  ñ ŒŒ & ò ŒŒ . ó ŒŒ 0 gnamegprogram-arguments-alistŒg documentationfPReturns the signature of the given procedure in the form of an association list.ŒC?Rp?qh(-.,3#456øgprog $gip $gfilenamefsystem/vm/program.scmŒ õ ŒŒ  ÷ ŒŒ $ ÷ ŒŒ $ gnamegprogram-lambda-listŒg documentationfMReturns the signature of the given procedure in the form of an argument list.ŒC@Rref^stgiwxy h¸`]!45$"45$"4445$"5545$" 4 ˆ$  Œ"4 ˆ$  Œ"556Xgarguments-alist  ¸gt gt & 8gt K ]gt j |greq | ¸gopt  | ¸gkey  | ¸grest  | ¸ gfilenamefsystem/vm/program.scmŒ ù ŒŒ  ú ŒŒ ú +ŒŒ ú ŒŒ ú ŒŒ  ú 6ŒŒ  û ŒŒ $ û +ŒŒ & û ŒŒ & û ŒŒ 5 û 6ŒŒ 9 ü ŒŒ > ý ŒŒ C ý ŒŒ I ý 9ŒŒ K ý ŒŒ K ý ŒŒ Z ý CŒŒ _ ý ŒŒ a ü ŒŒ b þ ŒŒ h þ ,ŒŒ j þ ŒŒ j þ ŒŒ y þ 3ŒŒ | ú ŒŒ ‰ ÿ ŒŒ Ž  ŒŒ ’  ŒŒ —  ŒŒ œ  .ŒŒ ÿ ŒŒ ¢  ŒŒ ¦  ŒŒ «  ŒŒ °  )ŒŒ ´ ÿ ŒŒ&  ¸ gnamegarguments-alist->lambda-listŒCqRHzhb]L•CZgi  gfilenamefsystem/vm/program.scmŒ  ŒŒ   ŒŒ   CIhh]L6`gt-46b52c6efc-47d  gfilenamefsystem/vm/program.scmŒ  ŒŒ  C{h ë] 45OO 6ãgprog  gcount gfilenamefsystem/vm/program.scmŒ  ŒŒ   ŒŒ  ŒŒ  ŒŒ  gnamegprogram-free-variablesŒg documentationf*Return the list of free variables of PROG.ŒCGR|}~p2|€.‚ƒ/- hPÓ] 44L5 545$"$"454 56Ëgs  Kgt  ;gfilenamefsystem/vm/program.scmŒ  ŒŒ   "ŒŒ   ŒŒ  /ŒŒ   ŒŒ   #ŒŒ   ŒŒ 0  #ŒŒ 2  )ŒŒ 8  ;ŒŒ <  ŒŒ C  8ŒŒ K  ŒŒ  K C€6„P…†^‡qoh}]44L556uga  gfilenamefsystem/vm/program.scmŒ  'ŒŒ   *ŒŒ   +ŒŒ   *ŒŒ   )ŒŒ   Cˆh˜£] 45$"344 5O5$"445 54 5$„"$ "4  4 4O5556›gprog  •gport  •gt   Sgt  1 Pgarities  Z “gfilenamefsystem/vm/program.scmŒ  ŒŒ   ŒŒ  ŒŒ   ŒŒ   ŒŒ !  ŒŒ 1  ŒŒ 1  ŒŒ @  ŒŒ C  ŒŒ M  ŒŒ T  ŒŒ Z  ŒŒ b  ŒŒ e  "ŒŒ j  ŒŒ n  ŒŒ p  ŒŒ u  ŒŒ y  ŒŒ z  ŒŒ }  "ŒŒ Œ  "ŒŒ Ž  ŒŒ  ŒŒ •  ŒŒ  • gnameg write-programŒC‰RC™gm  ,gfilenamefsystem/vm/program.scmŒ   ŒŒ - 2 ŒŒ 2 2 ŒŒ 8 2 ŒŒ 9 2 +ŒŒ A 2 ŒŒ C 3 ŒŒ H 2 ŒŒ 9 5 ŒŒ Ó 7 ŒŒ u 8 ŒŒ  9 ŒŒ ´ : ŒŒ R ; ŒŒ ç = ŒŒ  ? ŒŒ  A ŒŒ ± C ŒŒ ` I ŒŒ e M ŒŒ „ Q ŒŒ $ m ŒŒ é ‚ ŒŒ Í “ ŒŒ 6 — ŒŒ ? ¤ ŒŒ 5 ¦ ŒŒ  ¨ ŒŒ  ª ŒŒ C ¬ ŒŒ ê ® ŒŒ ˜ ° ŒŒ ‡ ³ ŒŒ c ¾ ŒŒ $Ë É ŒŒ &? ï ŒŒ 'ƒ õ ŒŒ *à ù ŒŒ ,î  ŒŒ 1F  ŒŒ)  1H C6PK!Žîp£t£t vm/traps.gonu„[µü¤GOOF----LE-8-2.0‹t]Ú4hU] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gvm¤ gtraps¤ ¤ gfilenameS¤ fsystem/vm/traps.scm¤ gimportsS¤ gbase¤ gpmatch¤  ¤ ¤ ¤ ¤ gframe¤ ¤ ¤ gprogram¤ ¤ ¤ gobjcode¤ ¤ ¤ g instruction¤ ¤ ¤ gxref¤ ¤ ! ¤ "grnrs¤ #g bytevectors¤ $"#¤ %$¤ &!%¤ 'gexportsS¤ (gtrap-at-procedure-call¤ )gtrap-in-procedure¤ *gtrap-instructions-in-procedure¤ +gtrap-at-procedure-ip-in-range¤ ,gtrap-at-source-location¤ -gtrap-frame-finish¤ .gtrap-in-dynamic-extent¤ /gtrap-calls-in-dynamic-extent¤ 0g#trap-instructions-in-dynamic-extent¤ 1gtrap-calls-to-procedure¤ 2gtrap-matching-instructions¤ 3()*+,-./012 ¤ 4gset-current-module¤ 54¤ 64¤ 7gmake-syntax-transformer¤ 87¤ 97¤ :g arg-check¤ ;gmacro¤ <¤ ?gany¤ @????¤ Ag syntax-object¤ Bgif¤ Cgtop¤ DC¤ Egribcage¤ Fgdummy¤ Ggarg¤ Hg predicate?¤ Igmessage¤ JFGHI¤ Kg m-1f68148ae-0¤ LKC¤ MLDDD¤ Nf l-1f68148ae-5¤ Of l-1f68148ae-6¤ Pf l-1f68148ae-7¤ Qf l-1f68148ae-8¤ RNOPQ¤ SEJMR¤ TE¤ Ugx¤ VU¤ WL¤ Xf l-1f68148ae-2¤ YX¤ ZEVWY¤ [DSTZ¤ \ghygiene¤ ]\¤ ^AB[]¤ _gnot¤ `A_[]¤ agerror¤ bAa[]¤ cfbad argument ~a: ~a¤ dAc[]¤ egquote¤ fAe[]¤ g???¤ hFGH¤ iLDD¤ jf l-1f68148ae-e¤ kf l-1f68148ae-f¤ lfl-1f68148ae-10¤ mjkl¤ nEhim¤ oDnTZ¤ pABo]¤ qA_o]¤ rAao]¤ sfbad argument ~a: expected ~a¤ tAso]¤ uAeo]¤ vgsyntax-violation¤ wv¤ xv¤ yf-source expression failed to match any pattern¤ zftrap already enabled¤ {ftrap already disabled¤ |gnew-disabled-trap¤ }gnew-enabled-trap¤ ~g procedure¤ gframe-procedure¤ €gprogram?¤ gprogram-objcode¤ ‚g frame-matcher¤ ƒgvmS¤ „ƒ Œ¤ …gclosure?S¤ †… Œ¤ ‡g our-frame?S¤ ˆ‡ Œ¤ ‰„†ˆ¤ Šgthe-vm¤ ‹g procedure?¤ Œgproc¤ ghandler¤ Žg add-hook!¤ g vm-apply-hook¤ g remove-hook!¤ ‘g current-frameS¤ ’‘ Œ¤ “ƒ Œ¤ ”… Œ¤ •‡ Œ¤ –’“”•¤ —g enter-handler¤ ˜g exit-handler¤ ™gwarn¤ šfalready in proc¤ ›gframe-previous¤ œgvm-push-continuation-hook¤ gvm-pop-continuation-hook¤ žgvm-abort-continuation-hook¤ Ÿgvm-restore-continuation-hook¤  g next-handler¤ ¡g vm-next-hook¤ ¢gnumber?¤ £ginteger?¤ ¤gexact?¤ ¥gnon-negative-integer?¤ ¦gpositive-integer?¤ §gand-map¤ ¨grange?¤ ©gor-map¤ ªg in-range?¤ «grange¤ ¬g frame-address¤ ­gframe-instruction-pointer¤ ®gobjcode->bytecode¤ ¯gprogram-last-ip¤ °f unexpected¤ ±gfor-each¤ ²g assv-set!¤ ³gassv-ref¤ ´gsort!¤ µgprogram-sources-pre-retire¤ ¶gprogram-sources-by-line¤ ·fno instructions found at¤ ¸f:¤ ¹f ; using line¤ ºfinstead¤ »fno instructions found for¤ ¼gsource->ip-range¤ ½gsource-closures¤ ¾gsource-procedures¤ ¿gsource-closures-or-procedures¤ À’“¤ Ágstring?¤ Âgfile¤ Ãg user-line¤ Ägmap¤ ÅfNo procedures found at ~a:~a.¤ ƃ Œ¤ ÇÆ¤ Ègframe?¤ Égreturn-handler¤ Êg abort-handler¤ Ëf.return-or-abort traps may only be enabled once¤ Ì‘ Œ¤ ̓ Œ¤ Î… Œ¤ χ Œ¤ ÐÌÍÎϤ Ñg apply-handler¤ Ò‘ Œ¤ Ó… Œ¤ Ô‡ Œ¤ ÕÒÆÓÔ¤ Öglength¤ ×gdelq¤ Ø„¤ Ùg frame-pred¤C5hc]4    &'3546>"G49:;>@^`bdfh(k]Ccgdummy  $garg  $g predicate?   $gmessage   $  $ Cgpqrtuh0V]CNgdummy  )garg  )g predicate?   )  ) Cxyh@à]45$@45$@6Øgx  9gtmp 9gtmp  " 9gfilenamefsystem/vm/traps.scmŒ N ŒŒ  9 g macro-typeg syntax-rulesŒgpatternsgargg predicate?gmessagegargg predicate?C5:Raza{hP¤-.,3#M$"4>"G4L>"GNLCœgframe Igfilenamefsystem/vm/traps.scmŒ c ŒŒ  d ŒŒ d ŒŒ $ d ŒŒ ) d ŒŒ 2 e ŒŒ D f ŒŒ I gnameg disable-trapŒChX£-.,3#M$4>"G"4L>"GNLLLOC›gframe Rgfilenamefsystem/vm/traps.scmŒ ] ŒŒ  ^ ŒŒ  ^ ŒŒ ^ ŒŒ % ^ ŒŒ 2 _ ŒŒ F ` ŒŒ R gnameg enable-trapŒCh Ô]HOQCÌgvm  genable  gdisable   genabled?   g enable-trap   gfilenamefsystem/vm/traps.scmŒ V ŒŒ  W ŒŒ   gnamegnew-disabled-trapŒC|R|h¿]456·gvm  gframe  genable   gdisable   gfilenamefsystem/vm/traps.scmŒ k ŒŒ  l ŒŒ  l ŒŒ   gnamegnew-enabled-trapŒC}R~€h8¹] 45L&C45$454L5‚CC±gframe  2g frame-proc 2gfilenamefsystem/vm/traps.scmŒ s ŒŒ  t ŒŒ t ŒŒ  u ŒŒ  u ŒŒ  v ŒŒ v ŒŒ ! w ŒŒ ( x ŒŒ / w ŒŒ  2 Chj]45L‚Cbgframe  gfilenamefsystem/vm/traps.scmŒ y ŒŒ  z ŒŒ z ŒŒ  Ch0È] ¦$ 45"$OCOCÀgproc  .gmatch-objcode?  .gproc   .gfilenamefsystem/vm/traps.scmŒ n ŒŒ  o ŒŒ o ŒŒ p ŒŒ  o ŒŒ  r ŒŒ  . gnameg frame-matcherŒC‚R‰Š‚‹asŒ‹h]4L5$L6C…gframe  gfilenamefsystem/vm/traps.scmŒ „ ŒŒ  … ŒŒ … ŒŒ  † ŒŒ   gnameg apply-hookŒC}Žhm]4L5L6egframe  gfilenamefsystem/vm/traps.scmŒ Š ŒŒ  ‹ ŒŒ  ‹ ŒŒ   Chm]4L5L6egframe  gfilenamefsystem/vm/traps.scmŒ Œ ŒŒ  ŒŒ  ŒŒ   Ch°M-/03#45## 4545$"4>"G45$"4 >"G OQ  O O6Egproc  ­ghandler  ­gvm   ­gclosure?   ­g our-frame?   ­g apply-hook  ­gfilenamefsystem/vm/traps.scmŒ ~ ŒŒ  ~ 8ŒŒ 0 € -ŒŒ ; ŒŒ ` ‚ ŒŒ ­ ˆ ŒŒ  ­  gvmS Œgclosure?S Œg our-frame?S Œgnamegtrap-at-procedure-callŒC(R–Š‚‹asŒ‹—˜™šhXÌ]M$4L>"GN"4L5$%M$64L>"GNCCÄgframe  Sgfilenamefsystem/vm/traps.scmŒ ³ ŒŒ  ´ ŒŒ ¯ ŒŒ  ° ŒŒ " ¶ ŒŒ , ¶ ŒŒ 2 ¦ ŒŒ 6 § ŒŒ : § ŒŒ ; © ŒŒ O ª ŒŒ  S gnameg apply-hookŒCh(‘]M$4L>"GNCC‰gframe  !gfilenamefsystem/vm/traps.scmŒ ¹ ŒŒ  º ŒŒ ¯ ŒŒ  ° ŒŒ  ! gnamegpush-cont-hookŒC›™šhh] M$4L>"GN"4L455$.45M$64L>"GNCCýgframe  agframe 8 _gfilenamefsystem/vm/traps.scmŒ ½ ŒŒ  ¾ ŒŒ ¯ ŒŒ  ° ŒŒ " À ŒŒ % À ŒŒ - À ŒŒ 1 À ŒŒ 2 Á ŒŒ 8 Á ŒŒ @ ¦ ŒŒ D § ŒŒ H § ŒŒ I © ŒŒ ] ª ŒŒ  a gnameg pop-cont-hookŒC™šhXÌ]M$4L>"GN"4L5$%M$64L>"GNCCÄgframe  Sgfilenamefsystem/vm/traps.scmŒ à ŒŒ  Ä ŒŒ ¯ ŒŒ  ° ŒŒ " Æ ŒŒ , Æ ŒŒ 2 ¦ ŒŒ 6 § ŒŒ : § ŒŒ ; © ŒŒ O ª ŒŒ  S gnameg abort-hookŒC™šhXÎ]M$4L>"GN"4L5$%M$64L>"GNCCÆgframe  Sgfilenamefsystem/vm/traps.scmŒ É ŒŒ  Ê ŒŒ ¯ ŒŒ  ° ŒŒ " Ì ŒŒ , Ì ŒŒ 2 ¦ ŒŒ 6 § ŒŒ : § ŒŒ ; © ŒŒ O ª ŒŒ  S gnameg restore-hookŒC}ŽœžŸ™š hÀ4]44L5L>"G44L5L>"G44L5L>"G44L5L>"G44L5L>"G$24L5$%M$64L>"GNCCC,gframe  ¹gfilenamefsystem/vm/traps.scmŒ Ñ ŒŒ  Ò ŒŒ  Ò ŒŒ  Ò ŒŒ  Ó ŒŒ  Ó ŒŒ , Ó ŒŒ 5 Ô ŒŒ 8 Ô ŒŒ E Ô ŒŒ N Õ ŒŒ Q Õ ŒŒ ^ Õ ŒŒ g Ö ŒŒ j Ö ŒŒ w Ö ŒŒ … × ŒŒ † × ŒŒ × ŒŒ – ¦ ŒŒ š § ŒŒ ž § ŒŒ Ÿ © ŒŒ ³ ª ŒŒ  ¹ CœžŸh˜ø]M$4L>"GN"44L5L>"G44L5L>"G44L5L>"G44L5L>"G4L5L6ðgframe  ’gfilenamefsystem/vm/traps.scmŒ Ù ŒŒ  Ú ŒŒ ¯ ŒŒ  ° ŒŒ " Ü ŒŒ % Ü ŒŒ 2 Ü ŒŒ ; Ý ŒŒ > Ý ŒŒ K Ý ŒŒ T Þ ŒŒ W Þ ŒŒ d Þ ŒŒ m ß ŒŒ p ß ŒŒ } ß ŒŒ ˆ à ŒŒ ’ à ŒŒ  ’ ChX9-/03 ##45## 4545$"4>"G45$"4 >"G45$"4 >"GH O O  O O O QQ Q Q Q     O     O61gproc  Qg enter-handler  Qg exit-handler   Qg current-frame   Qgvm   Qgclosure?   Qg our-frame?   Qgin-proc?  ³ Qg apply-hook  ê Qgpush-cont-hook ê Qg pop-cont-hook ê Qg abort-hook ê Qg restore-hook ê Q gfilenamefsystem/vm/traps.scmŒ ŒŒ # ž 4ŒŒ 9   (ŒŒ D ¡ ŒŒ i ¢ ŒŒ Ž £ ŒŒ ³ ¤ ŒŒ Q Ï ŒŒ  Q  g current-frameS ŒgvmS Œgclosure?S Œg our-frame?S Œgnamegtrap-in-procedureŒC)R–Š‚‹asŒ‹ ˜hŒ]4L5$L6C„gframe  gfilenamefsystem/vm/traps.scmŒ í ŒŒ  î ŒŒ î ŒŒ  ï ŒŒ   gnameg next-hookŒC)Ž¡h8¬]44L5L>"G$4L5$L6CC¤gframe  6gfilenamefsystem/vm/traps.scmŒ ñ ŒŒ  ò ŒŒ  ò ŒŒ  ò ŒŒ ! ó ŒŒ " î ŒŒ , î ŒŒ 2 ï ŒŒ  6 gnamegenterŒC¡h(‡]4L>"G4L5L6gframe  !gfilenamefsystem/vm/traps.scmŒ õ ŒŒ  ö ŒŒ  ÷ ŒŒ ! ÷ ŒŒ  ! gnamegexitŒC‘ƒ‡hð±-/03##45## 4545$"4>"G45$"4 >"G45$"4 >"G OQ  OO6 ©gproc  ìg next-handler  ìg exit-handler   ìg current-frame   ìgvm   ìgclosure?   ìg our-frame?   ìg next-hook  » ìgfilenamefsystem/vm/traps.scmŒ ä ŒŒ # å AŒŒ 9 è *ŒŒ D é ŒŒ i ê ŒŒ Ž ë ŒŒ ì ù ŒŒ  ì  g current-frameS ŒgvmS Œgclosure?S Œg our-frame?S Œgnamegtrap-instructions-in-procedureŒC*R¢£¤h0À]45$ 45$45$ ’€CCCC¸gx  /gfilenamefsystem/vm/traps.scmŒ ý ŒŒ  þ ŒŒ þ ŒŒ  þ ŒŒ  þ ŒŒ  þ ŒŒ # þ ŒŒ & þ 0ŒŒ ( þ +ŒŒ  / gnamegnon-negative-integer?ŒC¥R¢£¤h0³]45$45$45$ ”CCCC«gx  .gfilenamefsystem/vm/traps.scmŒ  ŒŒ   ŒŒ  ŒŒ   ŒŒ   ŒŒ   ŒŒ #  ŒŒ &  +ŒŒ  . gnamegpositive-integer?ŒC¦R§¥h Ÿ]ˆ$45$Ž6CC—gx  gfilenamefsystem/vm/traps.scmŒ  ŒŒ   ŒŒ  ŒŒ  ŒŒ   .ŒŒ   ŒŒ   ŒŒ   .ŒŒ   ŒŒ  Ch„]‰$6C|gx  gfilenamefsystem/vm/traps.scmŒ  ŒŒ   ŒŒ  ŒŒ   ŒŒ   gnamegrange?ŒC¨R©h‰]L“$LŽ’CCgbounds  gfilenamefsystem/vm/traps.scmŒ  ŒŒ   ŒŒ   ŒŒ  ŒŒ   ŒŒ   ŒŒ   Chˆ]O6€grange  gi  gfilenamefsystem/vm/traps.scmŒ  ŒŒ   ŒŒ   gnameg in-range?ŒCªR–Š‚‹asŒ‹¨«¨h@ç] ","NCˆ$’$ Ž"ÿÿÜ"ÿÿÜ"ÿÿØM"ÿÿÌßgfp  :gframes  2gfilenamefsystem/vm/traps.scmŒ  ŒŒ   ŒŒ  ! ŒŒ   ŒŒ   ŒŒ   ŒŒ   #ŒŒ   ŒŒ !  ŒŒ $  ŒŒ *  ŒŒ 2  ŒŒ  : gnameg cull-frames!ŒC¬­ªhpk]!45454L>"G4L5Mˆ$ M‘"$$CMŽNC$ MŒNL6Ccgframe  ogfp  ogip   og now-in-range?  A og was-in-range?  A ogfilenamefsystem/vm/traps.scmŒ # ŒŒ  $ ŒŒ % ŒŒ  $ ŒŒ  & ŒŒ ' ' ŒŒ 2 ( "ŒŒ 6 ( ŒŒ 9 ( 6ŒŒ < ( 3ŒŒ A ' ŒŒ K ) ŒŒ Q + ŒŒ V , ŒŒ X , ŒŒ ` ) ŒŒ e . ŒŒ g . ŒŒ m / ŒŒ  o gnameg next-handlerŒC*¬h(¼]Mˆ$M45‘$MŽNCCC´gframe  #gfilenamefsystem/vm/traps.scmŒ 1 ŒŒ  2 ŒŒ 2 ŒŒ 3 ŒŒ 3 !ŒŒ  3 ŒŒ  2 ŒŒ  4 ŒŒ  4 ŒŒ  # gnameg exit-handlerŒC‘ƒ‡høï-/03 ##45## 4545$"4>"G4 5$"4  >"G45$"4 >"GH OO QQ  O6 çgproc  ógrange  óghandler   óg current-frame   ógvm   ógclosure?   óg our-frame?   ógfp-stack  ³ óg cull-frames!  È óg next-handler È ó gfilenamefsystem/vm/traps.scmŒ  ŒŒ #  @ŒŒ 9  )ŒŒ D  ŒŒ i  ŒŒ Ž  ŒŒ ³  ŒŒ ³  ŒŒ ó 6 ŒŒ  ó  g current-frameS ŒgvmS Œgclosure?S Œg our-frame?S Œgnamegtrap-at-procedure-ip-in-rangeŒC+R®h™]4455 ºC‘gprog  gfilenamefsystem/vm/traps.scmŒ = ŒŒ  > ŒŒ  > 0ŒŒ  > ŒŒ  > ŒŒ   gnamegprogram-last-ipŒC¯Ra°¯±²³h0Ë] 4MŽ4M5$"Œ5NCÃgpair  0gt  )gfilenamefsystem/vm/traps.scmŒ T ŒŒ  V ŒŒ V $ŒŒ W $ŒŒ  X (ŒŒ  X 8ŒŒ  X (ŒŒ  X $ŒŒ & Y (ŒŒ * W ŒŒ , V ŒŒ . U ŒŒ  0 C´h]’Cygx  gy  gfilenamefsystem/vm/traps.scmŒ [ ŒŒ  [ (ŒŒ  [ 0ŒŒ [ %ŒŒ  Cµ h ·]R"ˆ$ÌŽˆ$«Žˆ$‰Žˆ$g އ$L Žˆ$0Ž  ˆ$   Ž Œ "45 " 45ŒŒŒ" "45"45"45"ÿÿ-H4O>"G4J>"GJC45"ÿþê¯gproc  gfile  gsources    gout    gv   Ñgvx  " Ãgvy  " Ãgvx  3 ²gvy  3 ²gvx A ¡gv ^ †gvx j xgalist  Ú   gfilenamefsystem/vm/traps.scmŒ @ ŒŒ  A ŒŒ C ŒŒ C ŒŒ  D ŒŒ  E ŒŒ  E ŒŒ L G ŒŒ P G ŒŒ U I *ŒŒ V I #ŒŒ Z I ŒŒ ] J +ŒŒ ^ J #ŒŒ u L &ŒŒ } M +ŒŒ M 2ŒŒ ƒ M +ŒŒ N 2ŒŒ ” N #ŒŒ • H ŒŒ ˜ H ŒŒ ¦ Q ŒŒ ª Q ŒŒ ¬ Q ŒŒ » Q ŒŒ ½ Q ŒŒ Ì Q ŒŒ Î Q ŒŒ Ù D ŒŒ Ú R ŒŒ Ú R ŒŒ Ý S ŒŒ ö [ ŒŒ  A ŒŒ  A ŒŒ  B ŒŒ  A ŒŒ'   gnamegprogram-sources-by-lineŒC¶R©™·¸¹ºh@ì]L‘$ŽCL”$#4LL>"GŽCCägline-and-ranges  ?gfilenamefsystem/vm/traps.scmŒ _ ŒŒ  a ŒŒ  a ŒŒ ` ŒŒ  b ŒŒ  c ŒŒ  c ŒŒ  ` ŒŒ  d ŒŒ  d ŒŒ # d 8ŒŒ ' e ŒŒ * e 'ŒŒ , e =ŒŒ 1 d ŒŒ < f ŒŒ  ? C¶™»¸h@ú] 4O455$C4>"GCògproc  >gfile  >gline   >gt   >gfilenamefsystem/vm/traps.scmŒ ^ ŒŒ  _ ŒŒ  h ŒŒ  _ ŒŒ  _ ŒŒ % j ŒŒ ) j ŒŒ - j /ŒŒ 4 j ŒŒ = k ŒŒ  > gnamegsource->ip-rangeŒC¼R½¾h(ê] 45ˆ$D45Dâgfile  %gline  %gclosures  %gfilenamefsystem/vm/traps.scmŒ m ŒŒ  n ŒŒ n ŒŒ  o ŒŒ  o ŒŒ  p ŒŒ  q ŒŒ % q ŒŒ  % gnamegsource-closures-or-proceduresŒC¿RÀŠÁasÂÁ¦Ã¦‹‹¿}ļ+‘ƒ…h(™] 4LL™5LLLL6 ‘gproc  &grange  &gfilenamefsystem/vm/traps.scmŒ … ŒŒ  † !ŒŒ † =ŒŒ  † !ŒŒ  † ŒŒ & ‡ ŒŒ  & CaÅh0ˆ]4LLLLLLOL5NM( LL6C€gframe  .gfilenamefsystem/vm/traps.scmŒ ‚ ŒŒ  „ ŒŒ  ƒ ŒŒ " Œ ŒŒ &  ŒŒ ,  ŒŒ  . C±hc]L6[gtrap  gfilenamefsystem/vm/traps.scmŒ  ŒŒ   $ŒŒ   Ch m]4OM>"GNCegframe  gfilenamefsystem/vm/traps.scmŒ Ž ŒŒ   ŒŒ   ŒŒ  ChØ¢-/03##4545$"4>"G45$"4  >"G4 5$"4  >"GH4™> GOO6šgfile  Ôg user-line  Ôghandler   Ôg current-frame   Ôgvm   Ôgtraps  ™ Ôgprocs  © Ôg closures?  © Ôgfilenamefsystem/vm/traps.scmŒ w ŒŒ # x :ŒŒ * y ŒŒ O z ŒŒ t { ŒŒ ™ | ŒŒ œ ~ ŒŒ £ ~ 7ŒŒ ¨ ~ ŒŒ ¬ } ŒŒ Ô € ŒŒ  Ô  g current-frameS ŒgvmS Œgnamegtrap-at-source-locationŒC,RÇŠÈasȋɋʬ¬h(¢]M$45M& NL6CCšgframe  "gfilenamefsystem/vm/traps.scmŒ ž ŒŒ  Ÿ ŒŒ Ÿ ŒŒ  Ÿ ŒŒ  ¡ ŒŒ  ¢ ŒŒ  " gnameg pop-cont-hookŒC¬h(¨]M$45M’$ NL6CC gframe  #gfilenamefsystem/vm/traps.scmŒ ¤ ŒŒ  ¥ ŒŒ ¥ ŒŒ  ¥ ŒŒ  ¥ ŒŒ  § ŒŒ  ¨ ŒŒ  # gnameg abort-hookŒC}aËŽžŸh`Ç]M$"4>"G44L5L>"G44L5L>"G4L5L6¿gframe  ]gfilenamefsystem/vm/traps.scmŒ ¬ ŒŒ  ­ ŒŒ ® ŒŒ  ® ŒŒ  ® ŒŒ  ¯ ŒŒ " ¯ ŒŒ / ¯ ŒŒ 8 ° ŒŒ ; ° ŒŒ H ° ŒŒ S ± ŒŒ ] ± ŒŒ  ] CžŸhH¬]N44L5L>"G44L5L>"G4L5L6¤gframe  Dgfilenamefsystem/vm/traps.scmŒ ² ŒŒ  ³ ŒŒ  ´ ŒŒ ´ ŒŒ  ´ ŒŒ  µ ŒŒ " µ ŒŒ / µ ŒŒ : ¶ ŒŒ D ¶ ŒŒ  D Chà_-/03#4545$"4>"G45$"4  >"G45$"4  >"G4 5H OOQQOO6Wgframe  Úgreturn-handler  Úg abort-handler   Úgvm   Úgfp  – Úg pop-cont-hook  ª Úg abort-hook  ª Úgfilenamefsystem/vm/traps.scmŒ ˜ ŒŒ  ™ &ŒŒ ! š ŒŒ F › ŒŒ k œ ŒŒ  ŒŒ –  ŒŒ Ú ª ŒŒ  Ú  gvmS Œgnamegtrap-frame-finishŒC-RЊ‚‹asŒ‹—ÉÊh ]4M>"GNL6…gframe  gfilenamefsystem/vm/traps.scmŒ É ŒŒ  Ê ŒŒ  Ë ŒŒ  Ì ŒŒ   gnameg abort-hookŒC-h Ž]4M>"GNL6†gframe  gfilenamefsystem/vm/traps.scmŒ Ä ŒŒ  Å ŒŒ  Æ ŒŒ  Ç ŒŒ   gnameg return-hookŒCƒhH¨]M$"4L5$,4L>"G4LLOLL5NCC gframe  Fgfilenamefsystem/vm/traps.scmŒ Î ŒŒ  Ï ŒŒ  Ï ŒŒ  Ï ŒŒ  Ñ ŒŒ + Ó ŒŒ B Ò ŒŒ  F gnameg apply-hookŒC}Žhm]4L5L6egframe  gfilenamefsystem/vm/traps.scmŒ Ø ŒŒ  Ù ŒŒ  Ù ŒŒ   ChHš]M$+4M>"GN4L>"G"N4L5L6’gframe  Cgfilenamefsystem/vm/traps.scmŒ Ú ŒŒ  Û ŒŒ Ê ŒŒ  Ë ŒŒ  Ì ŒŒ 6 Ý ŒŒ 9 Þ ŒŒ C Þ ŒŒ  C Ch(-/03 ##45## 4545$"4>"G45$"4 >"G45$"4 >"G45$"4 >"GH O  O Q  Q  O O6gproc  $g enter-handler  $greturn-handler   $g abort-handler   $g current-frame   $gvm   $gclosure?   $g our-frame?   $g exit-trap  Ø $g abort-hook ð $g apply-hook ð $ gfilenamefsystem/vm/traps.scmŒ » ŒŒ # ¼ 9ŒŒ 9 ¾ -ŒŒ D ¿ ŒŒ i À ŒŒ Ž Á ŒŒ ³  ŒŒ Ø à ŒŒ $ Ö ŒŒ  $  g current-frameS ŒgvmS Œgclosure?S Œg our-frame?S Œgnamegtrap-in-dynamic-extentŒC.R–Š‚‹asŒ‹ÑÉh„]M—NC|gframe  gfilenamefsystem/vm/traps.scmŒ ì ŒŒ  í ŒŒ  í ŒŒ  gnameg trace-pushŒCh Œ]4LM>"GM™NC„gframe  gfilenamefsystem/vm/traps.scmŒ ï ŒŒ  𠌌  ñ ŒŒ  ñ ŒŒ   gnameg trace-popŒCh|]LM6tgframe  gfilenamefsystem/vm/traps.scmŒ ó ŒŒ ô ŒŒ  gnameg trace-applyŒC.ŽœhHµ]44L5L>"G44L5L>"G4L5L6­gframe  Agfilenamefsystem/vm/traps.scmŒ ø ŒŒ  ù ŒŒ  ù ŒŒ  ù ŒŒ  ú ŒŒ  ú ŒŒ , ú ŒŒ 7 û ŒŒ A û ŒŒ  A gnamegenterŒCœhH¶]44L5L>"G44L5L>"G4L5L6®gframe  Agfilenamefsystem/vm/traps.scmŒ  ŒŒ  þ ŒŒ  þ ŒŒ  þ ŒŒ  ÿ ŒŒ  ÿ ŒŒ , ÿ ŒŒ 7  ŒŒ A  ŒŒ  A gnamegreturnŒCœhHµ]44L5L>"G44L5L>"G4L5L6­gframe  Agfilenamefsystem/vm/traps.scmŒ  ŒŒ  þ ŒŒ  þ ŒŒ  þ ŒŒ  ÿ ŒŒ  ÿ ŒŒ , ÿ ŒŒ 7  ŒŒ A  ŒŒ  A gnamegabortŒC‘ƒ‡h  -/03 ##45## 4545$"4>"G45$"4 >"G45$"4 >"G H O O  O QQ Q   O  O  O6 gproc  g apply-handler  greturn-handler   g current-frame   gvm   gclosure?   g our-frame?   g *call-depth*  ³ g trace-push  Ï g trace-pop Ï g trace-apply Ï  gfilenamefsystem/vm/traps.scmŒ ã ŒŒ # ä ?ŒŒ 9 ç (ŒŒ D è ŒŒ i é ŒŒ Ž ê ŒŒ ³ ë ŒŒ   ŒŒ    g current-frameS ŒgvmS Œgclosure?S Œg our-frame?S Œgnamegtrap-calls-in-dynamic-extentŒC/RÕŠ‚‹asŒ‹ h{]L6sgframe  gfilenamefsystem/vm/traps.scmŒ  ŒŒ   ŒŒ   gnameg trace-nextŒC.Ž¡h]4L5L6wgframe  gfilenamefsystem/vm/traps.scmŒ  ŒŒ   ŒŒ   ŒŒ   gnamegenterŒC¡h€]4L5L6xgframe  gfilenamefsystem/vm/traps.scmŒ  ŒŒ   ŒŒ   ŒŒ   gnamegreturnŒC¡h]4L5L6wgframe  gfilenamefsystem/vm/traps.scmŒ " ŒŒ   ŒŒ   ŒŒ   gnamegabortŒC‘ƒ‡hÈ’-/03##45## 4545$"4>"G45$"4 >"G OQ  O OO6 Šgproc  Çg next-handler  Çg current-frame   Çgvm   Çgclosure?   Çg our-frame?   Çg trace-next  • Çgfilenamefsystem/vm/traps.scmŒ  ŒŒ #  FŒŒ 9  /ŒŒ D  ŒŒ i  ŒŒ Ç % ŒŒ  Ç  g current-frameS ŒgvmS Œgclosure?S Œg our-frame?S Œgnameg#trap-instructions-in-dynamic-extentŒC0RÇŠ‹asŒ‹ÑÉÖ¬-×h0 ]4M>"G4MM5NNLL6˜gframe  *gfilenamefsystem/vm/traps.scmŒ ? ŒŒ  : ŒŒ  < ŒŒ  ; ŒŒ " = ŒŒ * A ŒŒ  * gnameg return-hookŒC×h(–]4M>"G4MM5NNCŽgframe  $gfilenamefsystem/vm/traps.scmŒ D ŒŒ  : ŒŒ  < ŒŒ  ; ŒŒ " = ŒŒ  $ gnameg abort-hookŒCƒh`÷]4M54L>"G45&CH4LLOLOL5KJMŒNCïgframe  \gdepth \g finish-trap  . \gfilenamefsystem/vm/traps.scmŒ 2 ŒŒ  3 ŒŒ 3 ŒŒ 5 ŒŒ 7 ŒŒ + 7 ŒŒ . 8 ŒŒ 1 H ŒŒ S G ŒŒ X J ŒŒ Z I ŒŒ  \ gnameg apply-hookŒC±hf]L6^gdisable  gfilenamefsystem/vm/traps.scmŒ _ ŒŒ  _ $ŒŒ   Ch n-.,3#L4L56fgframe gfilenamefsystem/vm/traps.scmŒ [ ŒŒ  \ )ŒŒ \ ŒŒ ChHš-.,3#4OM>"GN4L5LOC’gframe Dgtrap 8 Dgfilenamefsystem/vm/traps.scmŒ ^ ŒŒ  _ ŒŒ / a #ŒŒ 1 a ŒŒ 2 b &ŒŒ 8 b ŒŒ D Ch„]LLOC|gtrap  gfilenamefsystem/vm/traps.scmŒ Y ŒŒ   gnamegwith-pending-finish-disablersŒC(ƒhÐ-/03#4545$"4>"G45$"4>"G45$"4 >"GH O OQQ4  56ˆgproc  Ég apply-handler  Égreturn-handler   Égvm   Égpending-finish-traps  Ég apply-hook  ¦ Égwith-pending-finish-disablers  ¦ Égfilenamefsystem/vm/traps.scmŒ + ŒŒ  , ,ŒŒ ! - ŒŒ F . ŒŒ k / ŒŒ 0 ŒŒ 0 ŒŒ » e ŒŒ É d ŒŒ  É  gvmS Œgnamegtrap-calls-to-procedureŒC1RØŠ‹asÙ‹hŒ]4L5$L6C„gframe  gfilenamefsystem/vm/traps.scmŒ n ŒŒ  o ŒŒ o ŒŒ  p ŒŒ   gnameg next-hookŒC}Ž¡hm]4L5L6egframe  gfilenamefsystem/vm/traps.scmŒ t ŒŒ  u ŒŒ  u ŒŒ   C¡hm]4L5L6egframe  gfilenamefsystem/vm/traps.scmŒ v ŒŒ  w ŒŒ  w ŒŒ   C h˜ü-/03#4545$"4>"G45$"4>"G OQ  O O6ôg frame-pred  “ghandler  “gvm   “g next-hook  s “gfilenamefsystem/vm/traps.scmŒ i ŒŒ  j /ŒŒ ! k ŒŒ F l ŒŒ “ r ŒŒ  “  gvmS Œgnamegtrap-matching-instructionsŒC2RCgm  ,gfilenamefsystem/vm/traps.scmŒ  8 ŒŒ × V ŒŒ  k ŒŒ [ n ŒŒ P ~ ŒŒ ¼ ŒŒ ü ä ŒŒ ! ý ŒŒ !þ  ŒŒ #  ŒŒ $Û  ŒŒ ,  ŒŒ ,Ü = ŒŒ 2z @ ŒŒ 5 ^ ŒŒ 6= m ŒŒ ;­ w ŒŒ B* ˜ ŒŒ I“ » ŒŒ R( ã ŒŒ W-  ŒŒ _ƒ + ŒŒ c i ŒŒ  c C6PK!‘V/$$vm/vm.gonu„[µü¤GOOF----LE-8-2.0 ]'4hô] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gvm¤ ¤ gfilenameS¤ fsystem/vm/vm.scm¤ gexportsS¤ gvm?¤ gmake-vm¤ gthe-vm¤ g call-with-vm¤ gvm:ip¤ gvm:sp¤ gvm:fp¤ gvm-trace-level¤ gset-vm-trace-level!¤ g vm-engine¤ gset-vm-engine!¤ gset-default-vm-engine!¤ gvm-push-continuation-hook¤ gvm-pop-continuation-hook¤ g vm-apply-hook¤ g vm-next-hook¤ gvm-abort-continuation-hook¤ gvm-restore-continuation-hook¤   ¤ gset-current-module¤ ¤ !¤ "gload-extension¤ #g string-append¤ $f libguile-¤ %geffective-version¤ &f scm_init_vm¤C5h@‚]4   54!>"G"i4#i$4%i55&6zgm  (gfilenamefsystem/vm/vm.scmŒ   ŒŒ - ŒŒ 3 ŒŒ 4 +ŒŒ < ŒŒ > ! ŒŒ @ ŒŒ  @ C6PK!,¶„#û&û& vm/inspect.gonu„[µü¤GOOF----LE-8-2.0ã&]t4hÍ] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gvm¤ ginspect¤ ¤ gfilenameS¤ fsystem/vm/inspect.scm¤ gimportsS¤ gbase¤ gpmatch¤  ¤ ¤ gsyntax¤  ¤ ¤ ¤ ¤ gframe¤ ¤ ¤ glanguage¤ gassembly¤ g disassemble¤ ¤ gselectS¤ g %disassemble¤ Œ¤ ¤ ! ¤ "gice-9¤ #grdelim¤ $"#¤ %$¤ &g pretty-print¤ '"&¤ ('¤ )gformat¤ *")¤ +*¤ ,gprogram¤ -,¤ .-¤ /!%(+. ¤ 0gexportsS¤ 1¤ 2gset-current-module¤ 32¤ 42¤ 5gmake-hash-table¤ 6g hash-for-each¤ 7g hashq-set!¤ 8g hashq-ref¤ 9g reverse-hashq¤ :gcatch¤ ;gwrong-number-of-args¤ g eof-object?¤ ?gchar=?¤ @g read-char¤ Ag repl-reader¤ Bgchar-whitespace?¤ Cg unread-char¤ Dgread¤ Egreverse¤ Fg read-args¤ Gg make-module¤ Hgthrow¤ Igquit¤ Jgset-procedure-property!¤ Kgname¤ Lgmodule-define!¤ Mg module-add!¤ Ngq¤ Ogmodule-local-variable¤ Pgcontinue¤ Qgcont¤ Rgc¤ Sgprint¤ Tgp¤ Ugwrite¤ Vgw¤ Wgdisplay¤ Xgd¤ YfError disassembling object: ~a ¤ Zgx¤ [gmodule-obarray¤ \gprocedure-name¤ ]f~a~{ ~:@(~a~)~}~?~%~a~&~%¤ ^gprogram-lambda-list¤ _f"~#[~:;~40t(aliases: ~@{~a~^, ~})~]¤ `gdelq¤ agprocedure-documentation¤ bfInvalid command ~s.~%¤ cf#Try `help' for a list of commands~%¤ dgsort¤ eghash-map->list¤ fgstringstring¤ hfAvailable commands:~%~%¤ igfor-each¤ jghelp¤ kgh¤ lg?¤ mgapply¤ ngcurrent-error-port¤ of)Invalid arguments to ~a. Try `help ~a'.~%¤ pgnewline¤ qf$~&Unknown command: ~a. Try `help'.~%¤ rgsave-module-excursion¤ sf~20@y inspect> ¤C5hy]4    /01544>"G5678h]L4L5Œ6‡gk  gv  gfilenamefsystem/vm/inspect.scmŒ % ŒŒ & !ŒŒ  & 2ŒŒ  & !ŒŒ  & ŒŒ  & ŒŒ   Ch(™] 454O>"GC‘gh  %gret  %gfilenamefsystem/vm/inspect.scmŒ " ŒŒ  # ŒŒ  # ŒŒ $ ŒŒ  % gnameg reverse-hashqŒC9R:;:<hs-13L6kgk gargs gfilenamefsystem/vm/inspect.scmŒ / ŒŒ 0 ŒŒ ChX]LLO6Pgfilenamefsystem/vm/inspect.scmŒ , ŒŒ  - ŒŒ  - ŒŒ   Chs-13L6kgk gargs gfilenamefsystem/vm/inspect.scmŒ 1 ŒŒ 2 ŒŒ Ch§]OO6Ÿgthunk  gbad-args-thunk  gfilenamefsystem/vm/inspect.scmŒ * ŒŒ  + ŒŒ  + ŒŒ   gnamegcatch-bad-argumentsŒC=R>?@ABCDE h@û]!"–45$C4 5$45"ÿÿÌ45$45"ÿÿ«4>"G4545""Š45$64 5$645$45"ÿÿ·4>"G45Œ45"ÿÿv45"ÿþÆógprompt  @gchr  œgreader  & 4greader  G Ugreader  o }gtok  } œgreader  † ”gout   *gchr    *greader  Ó ágreader  ý  gtok   *greader   "greader , :gfilenamefsystem/vm/inspect.scmŒ 4 ŒŒ  9 ŒŒ  ; ŒŒ  : ŒŒ  ; ŒŒ  < ŒŒ $ : ŒŒ & 8 ŒŒ ) 6 ŒŒ : < ŒŒ ; = ŒŒ E : ŒŒ G 8 ŒŒ J 6 ŒŒ [ = ŒŒ \ ? ŒŒ o @ ŒŒ r 6 ŒŒ } @ ŒŒ „ A ŒŒ † 8 ŒŒ ‰ 6 ŒŒ œ A ŒŒ   B ŒŒ ¡ D ŒŒ « C ŒŒ ± D ŒŒ ² E ŒŒ ¾ C ŒŒ Ä E ŒŒ Å F ŒŒ Ï C ŒŒ Ó 8 ŒŒ Ö 6 ŒŒ é F ŒŒ ê H ŒŒ ý I ŒŒ  6 ŒŒ  I ŒŒ  J ŒŒ  8 ŒŒ  6 ŒŒ * J ŒŒ , 8 ŒŒ / 6 ŒŒ @ K ŒŒ/  @ gnameg read-argsŒCFRGHIh]6‡gfilenamefsystem/vm/inspect.scmŒ a ŒŒ  c ŒŒ  c ŒŒ   gnamegcŒg documentationfQuit the inspector.ŒCJKILMNOPQR&h¢]L6šgfilenamefsystem/vm/inspect.scmŒ e ŒŒ  g ŒŒ   gnamegcŒg documentationf.Print the current object using `pretty-print'.ŒCSTh›]ML6“gfilenamefsystem/vm/inspect.scmŒ i ŒŒ  k ŒŒ   gnamegcŒg documentationf'Print the current object using `write'.ŒCUVh]ML6•gfilenamefsystem/vm/inspect.scmŒ m ŒŒ  o ŒŒ   gnamegcŒg documentationf)Print the current object using `display'.ŒCWX:hP]L6Hgfilenamefsystem/vm/inspect.scmŒ t ŒŒ  u ŒŒ   C)Yhm-136egargs gfilenamefsystem/vm/inspect.scmŒ v ŒŒ  w ŒŒ  w ŒŒ  Ch»]LO6³gfilenamefsystem/vm/inspect.scmŒ q ŒŒ  s ŒŒ   gnamegcŒg documentationfGDisassemble the current object, which should be objcode or a procedure.ŒCZ9[O\)]^_`8a hH ]4L5454544L554 56gcmd  Dgv Dgp   Dgcanonical-name   Dgfilenamefsystem/vm/inspect.scmŒ | ŒŒ  } ŒŒ } ŒŒ  ~ ŒŒ  } ŒŒ   !ŒŒ  } ŒŒ ŒŒ # ‚ #ŒŒ + ƒ ŒŒ , „ ŒŒ 1 „ )ŒŒ ; „ ŒŒ < … ŒŒ D ŒŒ  D gnameghelp-cmdŒC)bcO\]^_`8ade\hz]6rgk  gv  gfilenamefsystem/vm/inspect.scmŒ ‘ ŒŒ  ’ +ŒŒ ’ ŒŒ  Cfghƒ]45456{gx  gy  gfilenamefsystem/vm/inspect.scmŒ ” ŒŒ  • $ŒŒ – $ŒŒ  • ŒŒ   Chihèi-.,3#44L55OLQ$~"4>"G6Š$S4L5$B4L545 4 5 4 4 55456"ÿÿŠ"ÿÿ†44554>"G6agcmd ägrhash ! äghelp-cmd  , ägv  v ¯gp  { ¯gcanonical-name  „ ¯gnames  Ç ägfilenamefsystem/vm/inspect.scmŒ y ŒŒ  { ŒŒ  { "ŒŒ ! { ŒŒ ! { ŒŒ 9 † ŒŒ > Œ ŒŒ C Œ ŒŒ J Œ ŒŒ W ŒŒ Y ŒŒ Y ˆ ŒŒ \ ‰ ŒŒ ` ˆ ŒŒ a ‰ ŒŒ m ‰ ŒŒ n } ŒŒ v } ŒŒ { ~ ŒŒ { } ŒŒ ~  !ŒŒ „ } ŒŒ ‹ ŒŒ Ž ‚ #ŒŒ – ƒ ŒŒ — „ ŒŒ œ „ )ŒŒ ¦ „ ŒŒ § … ŒŒ ¯ ŒŒ ¸ ŒŒ » ŒŒ Ç ŒŒ Ç ŒŒ Ê — ŒŒ Ï — ŒŒ Ô — ŒŒ ä ˜ ŒŒ' ä gnamegcŒg documentationfShow this help message.ŒCjkl:mO=h[]LL@Sgfilenamefsystem/vm/inspect.scmŒ ¡ ŒŒ  ¢ ŒŒ ¢ ŒŒ  C)no\h v]454L54L56ngfilenamefsystem/vm/inspect.scmŒ £ ŒŒ  ¤ ŒŒ ¥ ŒŒ ¦ ŒŒ  ¦ 0ŒŒ  ¤ ŒŒ   C>pHI)nq h€2-13Š$ 4L5"$OO645$4>"G64 4 5 >"GC*gcmd {gargs {gt   {gproc  ) ?gfilenamefsystem/vm/inspect.scmŒ š ŒŒ œ ŒŒ  œ ŒŒ  ŒŒ  › ŒŒ ) Ÿ ŒŒ ) Ÿ ŒŒ ?   ŒŒ @ © ŒŒ J › ŒŒ K ª ŒŒ ^ « ŒŒ ` « ŒŒ a ­ ŒŒ d ­ ŒŒ j ® ŒŒ q ­ ŒŒ { gnameghandleŒCr2F)shk]L6cgfilenamefsystem/vm/inspect.scmŒ ^ ŒŒ  _ ŒŒ _ ŒŒ  gnamegpromptŒCh []4L>"GLO6Sgfilenamefsystem/vm/inspect.scmŒ · ŒŒ  ¸ ŒŒ  ¹ ŒŒ   Ch8]")4LO4LLO5>"G"ÿÿ×"ÿÿÓwgfilenamefsystem/vm/inspect.scmŒ ² ŒŒ  ³ ŒŒ  ´ ŒŒ  ¶ ŒŒ # ´ ŒŒ / º ŒŒ / ³ ŒŒ  3 Chu-13Emgk gargs gfilenamefsystem/vm/inspect.scmŒ » ŒŒ ¼ ŒŒ C hп]A45HHHHHH4>"G4>"G44 5>"G4 4 5>"G4 4 5>"G4 4 5>"GK OQ4>"G4>"G44 5>"GKOQ4>"G4>"G44 5>"GKOQ4>"G4>"G44 5>"GKOQ4>"G4>"G44 5>"GKOQ4>"G4>"G44 5>"G44 5>"GKO6·gx  Ëgcommands  Ëgquit   Ëgprint   Ëgwrite   Ëgdisplay   Ëg disassemble   Ëghelp   Ëgc   Ägc  Î !gc  , gc  Œ ágc  ë >gc  H ¸gfilenamefsystem/vm/inspect.scmŒ R ŒŒ  ] ŒŒ  ] ŒŒ  a ŒŒ Î e ŒŒ , i ŒŒ Œ m ŒŒ ë q ŒŒ H y ŒŒ ¾ ± ŒŒ Ë ± ŒŒ  Ë gnameginspectŒCRCqgm  ,gfilenamefsystem/vm/inspect.scmŒ   ŒŒ Ä " ŒŒ : * ŒŒ – 4 ŒŒ ú R ŒŒ  ü C6PK!ø³Õ:«&«& foreign.gonu„[µü¤GOOF----LE-8-2.0“&]û4h€] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gforeign¤ ¤ gfilenameS¤ fsystem/foreign.scm¤ gimportsS¤ grnrs¤ g bytevectors¤   ¤ ¤ gsrfi¤ gsrfi-1¤ ¤ ¤ gsrfi-9¤ ¤ ¤ ggnu¤ ¤ ¤ ¤ gexportsS¤ gvoid¤ gfloat¤ gdouble¤ gshort¤ gunsigned-short¤ !gint¤ "g unsigned-int¤ #glong¤ $g unsigned-long¤ %gsize_t¤ &gssize_t¤ 'g ptrdiff_t¤ (gint8¤ )guint8¤ *guint16¤ +gint16¤ ,guint32¤ -gint32¤ .guint64¤ /gint64¤ 0gsizeof¤ 1galignof¤ 2g %null-pointer¤ 3g null-pointer?¤ 4gpointer?¤ 5g make-pointer¤ 6g pointer->scm¤ 7g scm->pointer¤ 8gpointer-address¤ 9gpointer->bytevector¤ :gbytevector->pointer¤ ;gset-pointer-finalizer!¤ pointer¤ >gpointer->string¤ ?gpointer->procedure¤ @g make-c-struct¤ Agparse-c-struct¤ Bgdefine-wrapped-pointer-type¤ C !"#$%&'()*+,-./0123456789:;<=>?@AB'¤ Dgset-current-module¤ ED¤ FD¤ Ggload-extension¤ Hg string-append¤ If libguile-¤ Jgeffective-version¤ Kfscm_init_foreign¤ Lgdefined?¤ Mgprocedure->pointer¤ Ngcall-with-deferred-observers¤ ON¤ PN¤ Qgmodule-export!¤ RQ¤ SQ¤ Tgcurrent-module¤ UT¤ VT¤ WM¤ Xg*¤ Ygerror¤ Zfwhat machine is this?¤ [gbytevector-pointer-ref¤ \gbytevector-pointer-set!¤ ]g"bytevector-ieee-single-native-set!¤ ^]¤ _]¤ `g"bytevector-ieee-double-native-set!¤ a`¤ b`¤ cgbytevector-s8-set!¤ dc¤ ec¤ fgbytevector-u8-set!¤ gf¤ hf¤ igbytevector-s16-native-set!¤ ji¤ ki¤ lgbytevector-u16-native-set!¤ ml¤ nl¤ ogbytevector-s32-native-set!¤ po¤ qo¤ rgbytevector-u32-native-set!¤ sr¤ tr¤ ugbytevector-s64-native-set!¤ vu¤ wu¤ xgbytevector-u64-native-set!¤ yx¤ zx¤ {g *writers*¤ |g!bytevector-ieee-single-native-ref¤ }|¤ ~|¤ g!bytevector-ieee-double-native-ref¤ €¤ ¤ ‚gbytevector-s8-ref¤ ƒ‚¤ „‚¤ …gbytevector-u8-ref¤ †…¤ ‡…¤ ˆgbytevector-s16-native-ref¤ ‰ˆ¤ Šˆ¤ ‹gbytevector-u16-native-ref¤ Œ‹¤ ‹¤ Žgbytevector-s32-native-ref¤ ޤ ޤ ‘gbytevector-u32-native-ref¤ ’‘¤ “‘¤ ”gbytevector-s64-native-ref¤ •”¤ –”¤ —gbytevector-u64-native-ref¤ ˜—¤ ™—¤ šg *readers*¤ ›galign¤ œgwrite-c-struct¤ gassv-ref¤ žftoo few values¤ Ÿftoo many values¤  g read-c-struct¤ ¡greverse¤ ¢gmake-bytevector¤ £gfold¤ ¤gmake-syntax-transformer¤ ¥¤¤ ¦¤¤ §gmacro¤ ¨g $sc-dispatch¤ ©¨¤ ª¨¤ «g_¤ ¬gany¤ ­«¬¬¬¬¬¤ ®g datum->syntax¤ ¯ggensym¤ °fwrap¤ ±g syntax-object¤ ²gbegin¤ ³gtop¤ ´³¤ µgribcage¤ ¶µ¤ ·g%wrap¤ ¸·¤ ¹´¤ ºfl-40afcf54ff-e4¤ »º¤ ¼µ¸¹»¤ ½g type-name¤ ¾gpred¤ ¿gwrap¤ Àgunwrap¤ Ágprint¤ ½¾¿ÀÁ¤ ô´´´´¤ Äfl-40afcf54ff-d8¤ Åfl-40afcf54ff-d9¤ Æfl-40afcf54ff-da¤ Çfl-40afcf54ff-db¤ Èfl-40afcf54ff-dc¤ ÉÄÅÆÇȤ ʵÂÃɤ Ëgstx¤ Ìˤ Ífl-40afcf54ff-d5¤ Îͤ ϵ̹Τ д¶¼Ê¶Ï¤ Ñghygiene¤ ÒѤ Ó±²ÐÒ¤ Ôgdefine-record-type¤ Õ±ÔÐÒ¤ Ögpointer¤ ×±ÖÐÒ¤ Ø×¤ Ùgdefine¤ Ú±ÙÐÒ¤ Ûglet¤ ܱÛÐÒ¤ Ýgptr->obj¤ Þ±ÝÐÒ¤ ßgmake-weak-value-hash-table¤ à±ßÐÒ¤ á± ¸ÐÒ¤ âàᤠãÞ⤠ä㤠åglambda¤ æ±åÐÒ¤ çgptr¤ è±çÐÒ¤ éè¤ êgor¤ ë±êÐÒ¤ ìghash-ref¤ í±ìÐÒ¤ îíÞè¤ ïgo¤ ð±ïÐÒ¤ ñg hash-set!¤ ò±ñÐÒ¤ óòÞèð¤ ôóð¤ õgset-record-type-printer!¤ ö±õÐÒ¤ ÷gsyntax-violation¤ ø÷¤ ù÷¤ úf-source expression failed to match any pattern¤C5h0Á]4   C54F>"G4Gi4HiI4Ji55K>"G8hÅ]45 ‘C½gpointer  gfilenamefsystem/foreign.scmŒ B ŒŒ  D ŒŒ D ŒŒ  gnameg null-pointer?Œg documentationf+Return true if POINTER is the null pointer.ŒC3R4LiM5$4PSVWhE]456=gfilenamefsystem/foreign.scmŒ G ŒŒ  C>"G"40iX5 †$¤5hz]¼6rgbv  goffset  gfilenamefsystem/foreign.scmŒ P ŒŒ Q ŒŒ Q ŒŒ  C"± †$Ÿ5hz]º6rgbv  goffset  gfilenamefsystem/foreign.scmŒ R ŒŒ S ŒŒ S ŒŒ  C" 4YiZ5[R40iX5 †$®8h‹]45ÎCƒgbv  goffset  gptr   gfilenamefsystem/foreign.scmŒ X ŒŒ  Y 1ŒŒ  Y ŒŒ   C"Á †$¯8h‹]45ÌCƒgbv  goffset  gptr   gfilenamefsystem/foreign.scmŒ Z ŒŒ  [ 1ŒŒ  [ ŒŒ   C" 4YiZ5\Ri_ŒibŒ(ieŒ)ihŒ+ikŒ*inŒ-iqŒ,itŒ/iwŒ.izŒX\iŒ {Ri~ŒiŒ(i„Œ)i‡Œ+iŠŒ*iŒ-iŒ,i“Œ/i–Œ.i™ŒX[iŒ šRhŸ]™™¡—C—goff  g alignment  gfilenamefsystem/foreign.scmŒ y ŒŒ  z ŒŒ  z ŒŒ z ŒŒ z ŒŒ  gnamegalignŒC›R›1œ{0YžŸ h°>],"˜ˆ$ˆ$r4455ˆ$4>"G"445>"G45–ŽŽ"ÿÿ€6(C 6"ÿÿX6gbv  ®goffset  ®gtypes   ®gvals   ®goffset   žgtypes   žgvals   žgtype   †goffset  ' † gfilenamefsystem/foreign.scmŒ | ŒŒ  } ŒŒ  ŒŒ ~ ŒŒ  ‚ ŒŒ  ~ ŒŒ  † ŒŒ  † ŒŒ  ‡ ŒŒ  ‡ #ŒŒ ' ‡ ŒŒ ' † ŒŒ , ˆ ŒŒ 0 ˆ ŒŒ 1 ‰ ŒŒ : ‰ &ŒŒ = ‰ 2ŒŒ B ‰ ŒŒ O Š ŒŒ P Š ŒŒ _ Š 1ŒŒ d Š ŒŒ o ‹ ŒŒ v ‹ ŒŒ y ‹ %ŒŒ | ‹ 1ŒŒ † ‹ ŒŒ Š ƒ ŒŒ Ž ƒ ŒŒ ” € ŒŒ • € ŒŒ š ŒŒ ž ŒŒ ž } ŒŒ#  ® gnamegwrite-c-structŒCœR›10 š¡hxà]+"cˆ$V445545–Žˆ$45"4455Œ"ÿÿ£6"ÿÿŽØgbv  xgoffset  xgtypes   xgoffset   igtypes   igvals   igtype   cgoffset  cgfilenamefsystem/foreign.scmŒ ŒŒ  Ž ŒŒ ŒŒ ŒŒ  ” ŒŒ  ” ŒŒ  • ŒŒ  • #ŒŒ • ŒŒ ” ŒŒ % – ŒŒ , – ŒŒ / – %ŒŒ 2 — ŒŒ 6 — ŒŒ 7 ˜ ŒŒ @ ˜ /ŒŒ B ˜ ŒŒ G ™ ŒŒ H ™ ŒŒ V ™ ŒŒ Y — ŒŒ c – ŒŒ i ‘ ŒŒ i Ž ŒŒ n Ž /ŒŒ x Ž ŒŒ  x gnameg read-c-structŒC R¢0œ:h0Ë] 445 54 >"G6Ãgtypes  .gvals  .gbv   .gfilenamefsystem/foreign.scmŒ œ ŒŒ  ŒŒ  ŒŒ  ŒŒ  ŒŒ  ž ŒŒ . Ÿ ŒŒ  . gnameg make-c-structŒC@R£0›1h ™]454455–C‘gtype  gtotal  gfilenamefsystem/foreign.scmŒ ¢ ŒŒ  £ ŒŒ ¤ ŒŒ  ¤ &ŒŒ  ¤ ŒŒ  £ ŒŒ   C 9h ¿] 4 545 6·gforeign  gtypes  gsize  gfilenamefsystem/foreign.scmŒ ¡ ŒŒ  ¢ ŒŒ ¢ ŒŒ  § ŒŒ  § ŒŒ   gnamegparse-c-structŒCAR4¦B§ª­®¯°ÓÕØ×ÚÜäæéëîðôöhhè] 4455Œ       ŒŒŒCàg type-name  egpred  egwrap   egunwrap   egprint   egtmp   egfilenamefsystem/foreign.scmŒ  · ŒŒ  · 2ŒŒ · :ŒŒ  · 2ŒŒ  · ŒŒ  · ŒŒ  e Cùúh(Ñ] 45$@6Égstx  "gtmp "gfilenamefsystem/foreign.scmŒ ¯ ŒŒ  " g documentationfSDefine helper procedures to wrap pointer objects into Scheme objects with a disjoint type. Specifically, this macro defines PRED, a predicate for the new Scheme type, WRAP, a procedure that takes a pointer object and returns an object that satisfies PRED, and UNWRAP which does the reverse. PRINT must name a user-defined object printer.ŒC5BRC¹gm  ,gkey Ï 2gkey > »gfilenamefsystem/foreign.scmŒ   ŒŒ - : ŒŒ 2 : ŒŒ 8 : !ŒŒ 9 : -ŒŒ A : ŒŒ C ; ŒŒ H : ŒŒ 8 B ŒŒ 9 F ŒŒ ? F ŒŒ A F ŒŒ E F ŒŒ F G ŒŒ Ç O ŒŒ Í O ŒŒ Ï O ŒŒ Ï O ŒŒ ' T ŒŒ - T ŒŒ / T ŒŒ 5 N ŒŒ 6 W ŒŒ < W ŒŒ > W ŒŒ > W ŒŒ ° \ ŒŒ ¶ \ ŒŒ ¸ \ ŒŒ ¾ V ŒŒ Å _ ŒŒ  ^ ŒŒ  l ŒŒ d k ŒŒ " y ŒŒ 9 | ŒŒ ³ ŒŒ Æ œ ŒŒ ’ ¡ ŒŒ(  0 C6PK!eÒRJMDMDrepl/server.gonu„[µü¤GOOF----LE-8-2.05D]Ç4hÌ] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ grepl¤ gserver¤ ¤ gfilenameS¤ fsystem/repl/server.scm¤ gimportsS¤ ¤  ¤ gice-9¤ gthreads¤ ¤ ¤ grdelim¤ ¤ ¤ gmatch¤ ¤ ¤ giconv¤ ¤ ¤ grnrs¤ g bytevectors¤ ¤ ¤ gio¤ !gports¤ " !¤ #"¤ $gsrfi¤ %gsrfi-1¤ &$%¤ '&¤ (gsrfi-26¤ )$(¤ *)¤ +#'* ¤ ,gexportsS¤ -gmake-tcp-server-socket¤ .gmake-unix-domain-server-socket¤ /g run-server¤ 0g spawn-server¤ 1gstop-server-and-clients!¤ 2-./01¤ 3gset-current-module¤ 43¤ 53¤ 6g*open-sockets*¤ 7g make-mutex¤ 8g sockets-lock¤ 9g lock-mutex¤ :9¤ ;9¤ <¤ ?g assq-remove!¤ @g close-port¤ Ag close-socket!¤ Bgadd-open-socket!¤ Cgerror¤ DC¤ EC¤ Ffno matching pattern¤ GghostS¤ HG Œ¤ IgaddrS¤ JI Œ¤ KgportS¤ LK Œ¤ MHJL¤ Ng inet-aton¤ OgINADDR_LOOPBACK¤ Pgsocket¤ QgPF_INET¤ Rg SOCK_STREAM¤ Sg setsockopt¤ Tg SOL_SOCKET¤ Ug SO_REUSEADDR¤ Vgbind¤ WgAF_INET¤ XgpathS¤ YX Œ¤ ZY¤ [f/tmp/guile-socket¤ \gPF_UNIX¤ ]gAF_UNIX¤ ^gdelete-duplicates¤ _g filter-map¤ `gand=>¤ agmodule-variable¤ bgthe-root-module¤ cg variable-ref¤ dgEINTR¤ egEAGAIN¤ fg EWOULDBLOCK¤ gdef¤ hg errs-to-retry¤ ig run-server*¤ jg serve-client¤ kgcatch¤ lgselect¤ mgmemq¤ ngaccept¤ ogsystem-error-errno¤ pgmemv¤ qgwarn¤ rfError accepting client¤ sgsleep¤ tgpipe¤ ugfcntl¤ vgF_SETFL¤ wg O_NONBLOCK¤ xgF_GETFL¤ yg sigaction¤ zgSIGPIPE¤ {gSIG_IGN¤ |gdisplay¤ }g force-output¤ ~glisten¤ gcall-with-new-thread¤ €¤ ¤ ‚g%thread-handler¤ ƒ‚¤ „‚¤ …gclose¤ †gcurrent-thread¤ ‡gset-thread-cleanup!¤ ˆg cancel-thread¤ ‰gguard-against-http-request¤ Šgwith-continuation-barrier¤ ‹gcurrent-input-port¤ Œgcurrent-output-port¤ gcurrent-error-port¤ Žgcurrent-warning-port¤ g parameter?¤ ¤ ‘¤ ’g scm-error¤ “gwrong-type-arg¤ ”f parameterize¤ •fNot a parameter: ~S¤ –g *repl-stack*¤ —g start-repl¤ ˜g port-closed?¤ ™g port-encoding¤ šgset-port-encoding!¤ ›gwith-temporary-port-encoding¤ œg port-line¤ g port-column¤ žgset-port-line!¤ Ÿgset-port-column!¤  gwith-saved-port-line+column¤ ¡g char-ready?¤ ¢gget-bytevector-some¤ £g bytevector?¤ ¤gbytevector->string¤ ¥f ISO-8859-1¤ ¦gstring-concatenate-reverse¤ §gsetvbuf¤ ¨g_IOFBF¤ ©gdrain-input-and-close¤ ªgucs-range->char-set¤ «g make-regexp¤ ¬g string-append¤ ­f2^(OPTIONS|GET|HEAD|POST|PUT|DELETE|TRACE|CONNECT) ¤ ®f[^ ]+ ¤ ¯fHTTP/[0-9]+.[0-9]+$¤ °g string-every¤ ±g regexp-exec¤ ²gpermissive-http-request-line?¤ ³gread-delimited¤ ´f ¤ µgpeek¤ ¶g eof-object?¤ ·gdone¤ ¸g%make-void-port¤ ¹frw¤ ºgcall-with-port¤ »g dup->port¤ ¼fw¤ ½gformat¤ ¾f³ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ POSSIBLE BREAK-IN ATTEMPT ON THE REPL SERVER @@ @@ BY AN HTTP INTER-PROTOCOL EXPLOITATION ATTACK. See: @@ @@ @@ @@ Possible HTTP request received: ~S @@ The associated socket has been closed. @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ¤ ¿g unread-string¤ Àgcheck-for-http-request¤ Ág%set-port-property!¤ Âgguard-against-http-request?¤ Ãg%port-property¤ Ägmaybe-check-for-http-request¤ Åg add-hook!¤ Ægbefore-read-hook¤C5h¸1»]4    +,2545>"G6R47i58R8;hI]L6Agfilenamefsystem/repl/server.scmŒ / ŒŒ   C>hI]L6Agfilenamefsystem/repl/server.scmŒ / ŒŒ   C?6@hX¨] OO4O>"GV45 X4O>"G6 gs  Tgx  Ngfilenamefsystem/repl/server.scmŒ . ŒŒ  / ŒŒ + 0 ŒŒ 5 0 ŒŒ 7 / ŒŒ T 3 ŒŒ  T gnameg close-socket!ŒCAR8;hI]L6Agfilenamefsystem/repl/server.scmŒ 7 ŒŒ   C>hI]L6Agfilenamefsystem/repl/server.scmŒ 7 ŒŒ   C6hh½] OO4O>"GVŒŒ X4O>"GCX4O>"GFµgs  cg force-close  cgx   cgfilenamefsystem/repl/server.scmŒ 6 ŒŒ  7 ŒŒ / 8 ŒŒ 4 8 ŒŒ 7 7 ŒŒ  c gnamegadd-open-socket!ŒCBR8;hI]L6Agfilenamefsystem/repl/server.scmŒ < ŒŒ   C>hI]L6Agfilenamefsystem/repl/server.scmŒ < ŒŒ   C6EF1 hÈ](OO4O>"GV("Tˆ$?Žˆ$Ž "4455"4455X4O>"G$4>"G6Cgx  ©gv , gw  F {gx  F {gx  T cgt © Çgfilenamefsystem/repl/server.scmŒ : ŒŒ  < ŒŒ , = ŒŒ ^ @ ŒŒ h = ŒŒ ’ < ŒŒ © ; ŒŒ ² C ŒŒ Å D ŒŒ  Ç gnamegstop-server-and-clients!ŒC1RMNOPQRSTUVW hˆ-/03##$ 45"# ‘4 54 >"G4  >"GCghost  †gaddr  †gport   †gsock  R †gfilenamefsystem/repl/server.scmŒ F ŒŒ ( H ŒŒ ) H )ŒŒ I J ŒŒ R J ŒŒ U K ŒŒ l L ŒŒ  † ghostS ŒgaddrS ŒgportS Œgnamegmake-tcp-server-socketŒC-RZ[P\RSTUV] h`Ð-/03#4 54 >"G4  >"GCÈgpath  Ygsock ' Ygfilenamefsystem/repl/server.scmŒ O ŒŒ  O 5ŒŒ  P ŒŒ ' P ŒŒ * Q ŒŒ A R ŒŒ  Y gpathS Œgnamegmake-unix-domain-server-socketŒC.R4^i4_i`abchl]456dgname  gfilenamefsystem/repl/server.scmŒ Y ŒŒ  Z ŒŒ  Z ŒŒ   Cg55hR-ijh(Œ-.,3#456„g server-socket !gfilenamefsystem/repl/server.scmŒ ^ ŒŒ  ^ /ŒŒ ! _ ŒŒ ! gnameg run-serverŒC/Rklmnh(«]4M54M5$CL6£g ready-ports #gfilenamefsystem/repl/server.scmŒ s ŒŒ  t ŒŒ  t 8ŒŒ t <ŒŒ t ŒŒ t ŒŒ t ŒŒ  v ŒŒ  v ŒŒ # w ŒŒ  # CophqrshPÂ-134545$L64>"G4 >"GL6ºgk-args Lgerr  Lgfilenamefsystem/repl/server.scmŒ x ŒŒ y ŒŒ  y ŒŒ  { ŒŒ  z ŒŒ # | ŒŒ $ ~ ŒŒ ( ~ ŒŒ / ~ ŒŒ 8 € ŒŒ L ŒŒ L Ch o]LLLOLO6ggfilenamefsystem/repl/server.scmŒ q ŒŒ  r ŒŒ   gnamegaccept-new-clientŒCtuvwxyz{B|}h u]4!M>"GM6mgfilenamefsystem/repl/server.scmŒ i ŒŒ  j ŒŒ  k ŒŒ   gnamegshutdown-serverŒC~hJ]LLL6Bgfilenamefsystem/repl/server.scmŒ ŒŒ  C„…hq]BHHHHOQ45KJKJŽKJK445¡>"G4 >"G4  O>"G4  >"G"b$2Ž 4  O>"G45"ÿÿÈ4J>"G4J>"G645"ÿÿ“ig server-socket  g serve-client  gshutdown-pipes   gshutdown-read-pipe   gshutdown-write-pipe   gmonitored-ports   gaccept-new-client   gclient  £ g client-socket  ¯ Ûg client-addr ¯ Û gfilenamefsystem/repl/server.scmŒ b ŒŒ % d ŒŒ . e ŒŒ 3 f ŒŒ < n ŒŒ ? „ ŒŒ H † ŒŒ Q … ŒŒ V „ ŒŒ _ ˆ ŒŒ s ‰ ŒŒ Œ Š ŒŒ £ ‹ ŒŒ © ŒŒ ¬ Ž ŒŒ ¯ ŒŒ ¯ Ž ŒŒ ´ ŒŒ Ñ ‘ ŒŒ Û ‘ ŒŒ Ü ’ ŒŒ î “ ŒŒ  ” ŒŒ  ‹ ŒŒ  ‹ ŒŒ  ‹ ŒŒ   gnameg run-server*ŒCiR-/hJ]L6Bgfilenamefsystem/repl/server.scmŒ — ŒŒ   C„h(‘-.,3#45O6‰g server-socket &gfilenamefsystem/repl/server.scmŒ – ŒŒ  – 1ŒŒ & — ŒŒ & gnameg spawn-serverŒC0R†‡AhS]L6Kgfilenamefsystem/repl/server.scmŒ ŒŒ  +ŒŒ   CBˆhS]L6Kgfilenamefsystem/repl/server.scmŒ Ÿ ŒŒ  Ÿ (ŒŒ   C‰Š‹ŒŽ‘’“”•–— hÜ] 45$"4 >"G45$"4 >"G45$"4 >"G45$"4 >"G © © © ©4 ©L54 ©L54 ©L54 ©L5Y Y4 > Z"ZCZFÔgt-3d081069b-c3 gt-3d081069b-c4 gt-3d081069b-c5  gt-3d081069b-c6  gfilenamefsystem/repl/server.scmŒ ¤ ŒŒ ¥ ŒŒ û © #ŒŒ þ ª ŒŒ   C h`Ó] 454O>"G4O>"G4>"GO6Ëgclient  [gaddr  [gthread   >gfilenamefsystem/repl/server.scmŒ ™ ŒŒ  › ŒŒ  › ŒŒ ŒŒ # Ÿ ŒŒ ? ¡ ŒŒ [ £ ŒŒ  [ gnameg serve-clientŒCjR˜™šh w]4L5$C4L5NLM6ogfilenamefsystem/repl/server.scmŒ Á ŒŒ   ŒŒ  ŒŒ  à ŒŒ  à ŒŒ Ä ŒŒ  C˜™šh w]4L5$C4L5NLM6ogfilenamefsystem/repl/server.scmŒ Æ ŒŒ  Ç ŒŒ Ç ŒŒ  È ŒŒ  È ŒŒ É ŒŒ  C˜™šh w]4L5$C4L5NLM6ogfilenamefsystem/repl/server.scmŒ Á ŒŒ   ŒŒ  ŒŒ  à ŒŒ  à ŒŒ Ä ŒŒ  C˜™šh w]4L5$C4L5NLM6ogfilenamefsystem/repl/server.scmŒ Æ ŒŒ  Ç ŒŒ Ç ŒŒ  È ŒŒ  È ŒŒ É ŒŒ  C˜™šh w]4L5$C4L5NLM6ogfilenamefsystem/repl/server.scmŒ Æ ŒŒ  Ç ŒŒ Ç ŒŒ  È ŒŒ  È ŒŒ É ŒŒ  ChxS] HHOO4O>"GV4>X4O>"GCX4O>"GFKgport  wgencoding  wgthunk   wgsaved-encoding   wgfilenamefsystem/repl/server.scmŒ ¼ ŒŒ  ¿ ŒŒ À ŒŒ  w gnamegwith-temporary-port-encodingŒg documentationfaCall THUNK in a dynamic environment in which the encoding of PORT is temporarily set to ENCODING.ŒC›R˜œh(€]4L5$C4L5N4L5NCxgfilenamefsystem/repl/server.scmŒ Ð ŒŒ  Ñ ŒŒ Ñ ŒŒ  Ò ŒŒ  Ò ŒŒ  Ó ŒŒ ! Ó ŒŒ  # C˜žŸh0n]4L5$C4LM>"GLM6fgfilenamefsystem/repl/server.scmŒ Õ ŒŒ  Ö ŒŒ Ö ŒŒ  × ŒŒ + Ø ŒŒ  + C˜œh(€]4L5$C4L5N4L5NCxgfilenamefsystem/repl/server.scmŒ Ð ŒŒ  Ñ ŒŒ Ñ ŒŒ  Ò ŒŒ  Ò ŒŒ  Ó ŒŒ ! Ó ŒŒ  # C˜žŸh0n]4L5$C4LM>"GLM6fgfilenamefsystem/repl/server.scmŒ Õ ŒŒ  Ö ŒŒ Ö ŒŒ  × ŒŒ + Ø ŒŒ  + C˜žŸh0n]4L5$C4LM>"GLM6fgfilenamefsystem/repl/server.scmŒ Õ ŒŒ  Ö ŒŒ Ö ŒŒ  × ŒŒ + Ø ŒŒ  + Chxt]HHOO4O>"GV4>X4O>"GCX4O>"GFlgport  vgthunk  vg saved-line   vg saved-column   vgfilenamefsystem/repl/server.scmŒ Ë ŒŒ  Î ŒŒ  Ï ŒŒ  v gnamegwith-saved-port-line+columnŒg documentationfƒSave the line and column of PORT before entering THUNK, and restore their previous values upon normal or non-local exit from THUNK.ŒC R¡¢£¤¥¦hP]"<4L5$ 4L5"45$45Œ"ÿÿÊ6"ÿÿ½úgchunks  Bgresult  Bgfilenamefsystem/repl/server.scmŒ â ŒŒ  ã ŒŒ  ä ŒŒ  ä ŒŒ  å ŒŒ  ä ŒŒ æ ŒŒ * æ ŒŒ + ç ŒŒ 1 ç 5ŒŒ 3 ç ŒŒ 6 ç ŒŒ < ç ŒŒ B é ŒŒ B ã ŒŒ C ã ŒŒ I ã ŒŒ  I C§¨hS]L6Kgfilenamefsystem/repl/server.scmŒ Þ ŒŒ á ŒŒ  C@hS]L6Kgfilenamefsystem/repl/server.scmŒ ê ŒŒ  ì ŒŒ   Chp2] OQOO4O>"GV4>X4O>"GCX4O>"GF*gsocket  igthunk igfilenamefsystem/repl/server.scmŒ Ú ŒŒ Ý ŒŒ  i gnamegdrain-input-and-closeŒg documentationfDrain input from SOCKET using ISO-8859-1 encoding until it would block, and then close it. Return the drained input as a string.ŒC©R4ªi ~54«i4¬i­®¯55°±h ß]4L5$L6C×gline  gfilenamefsystem/repl/server.scmŒ ÷ ŒŒ  ü ŒŒ  ü ŒŒ  ý ŒŒ   g documentationfQReturn true if LINE might plausibly be an HTTP request-line, otherwise return #f.ŒCO²R›¥ ³´µ¶·²¸¹‹ŒŽ©º»¼½¾¬hƒ]4LL56{gt-3d081069b-183  gfilenamefsystem/repl/server.scmŒ - ŒŒ  - ŒŒ 5 ŒŒ  - ŒŒ   C¿h¨Q]4L545$C45$s454 >"G4 >"G4 >"G4 >"G4 L54 5O6L6Igv £g void-port / |g drained-input ƒ ›gfilenamefsystem/repl/server.scmŒ  ŒŒ   ŒŒ   !ŒŒ  /ŒŒ  ŒŒ   ŒŒ   ŒŒ )  ŒŒ -  /ŒŒ /  ŒŒ /  ŒŒ 2 ! ŒŒ D " ŒŒ V # ŒŒ h $ ŒŒ } ( "ŒŒ ƒ ( ŒŒ ˆ , ŒŒ Ž , ,ŒŒ , ŒŒ › , ŒŒ £ ; ŒŒ  £ ChS]LLO6Kgfilenamefsystem/repl/server.scmŒ  ŒŒ   ŒŒ   ChT]O6Lgsocket  gfilenamefsystem/repl/server.scmŒ ÿ ŒŒ   'ŒŒ   ŒŒ   gnamegcheck-for-http-requestŒg documentationf«Check for a possible HTTP request in the initial input from SOCKET. If one is found, close the socket and print a report to STDERR (fdes 2). Otherwise, put back the bytes.ŒCÀRÁÂh ]6gsocket  gfilenamefsystem/repl/server.scmŒ = ŒŒ  D ŒŒ D ŒŒ  gnamegguard-against-http-requestŒg documentationf\Arrange for the Guile REPL to check for an HTTP request in the initial input from SOCKET, in which case the socket will be closed. This guards against HTTP inter-protocol exploitation attacks, a scenario whereby an attacker can, via an HTML page, cause a web browser to send data to TCP servers listening on a loopback interface or private network.ŒC‰R‹ÃÂÀ˜ÁhP’-.,3#4545$(4>"G45$C6CŠgsocket Pgfilenamefsystem/repl/server.scmŒ F ŒŒ  G ŒŒ  K ŒŒ K ŒŒ " K ŒŒ & K ŒŒ ' L ŒŒ 9 M ŒŒ C M ŒŒ K N "ŒŒ N N ŒŒ P gnamegmaybe-check-for-http-requestŒg documentationfšApply check-for-http-request to SOCKET if previously requested by guard-against-http-request. This procedure is intended to be added to before-read-hook.ŒCÄRÅiÆiÄi6³gm  ,gcs 't (œgrx 't (œgfilenamefsystem/repl/server.scmŒ   ŒŒ - ( ŒŒ 0 ( ŒŒ 1 * ŒŒ : * ŒŒ  . ŒŒ  6 ŒŒ Ò : ŒŒ “ F ŒŒ ë O ŒŒ ì X ŒŒ ñ Y ŒŒ – \ ŒŒ ˜ Y ŒŒ š X ŒŒ W ŒŒ g ^ ŒŒ ä b ŒŒ  – ŒŒ N ™ ŒŒ ž ¼ ŒŒ #G Ë ŒŒ 'U Ú ŒŒ 'V ñ ŒŒ 'a ò ŒŒ 'f ó ŒŒ 'l ô ŒŒ 'n õ ŒŒ 'p ö ŒŒ 'r ó ŒŒ 't ò ŒŒ 't ñ ŒŒ (Ÿ î ŒŒ -w ÿ ŒŒ /¤ = ŒŒ 1¥ F ŒŒ 1³ Q ŒŒ&  1³ C6PK!”Á)?d'd'repl/error-handling.gonu„[µü¤GOOF----LE-8-2.0L']4hº] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ grepl¤ gerror-handling¤ ¤ gfilenameS¤ fsystem/repl/error-handling.scm¤ gimportsS¤ gbase¤ gpmatch¤  ¤ ¤ gvm¤ g trap-state¤ ¤ ¤ gdebug¤ ¤ ¤ gice-9¤ gformat¤ ¤ ¤ ¤ gexportsS¤ gcall-with-error-handling¤ gwith-error-handling¤ ¤ !gset-current-module¤ "!¤ #!¤ $gcall-with-output-string¤ %g vector-length¤ &gprint-exception¤ 'g error-string¤ (gon-errorS¤ )( Œ¤ *g post-errorS¤ +* Œ¤ ,g pass-keysS¤ -, Œ¤ .g trap-handlerS¤ /. Œ¤ 0)+-/¤ 1gcatch¤ 2gquit¤ 32¤ 4gcurrent-input-port¤ 5gcurrent-output-port¤ 6gcurrent-error-port¤ 7g%stacks¤ 8gnarrow-stack->vector¤ 9g make-stack¤ :f Trap ~d: ~a¤ ;g make-debug¤ gwith-error-to-port¤ ?f~a~%¤ @fEntering a new prompt. ¤ Af0Type `,bt' for a backtrace or `,q' to continue. ¤ B¤ Cg start-repl¤ DBC¤ EBC¤ FgdebugS¤ Ggpass¤ Hgdisabled¤ Igerror¤ JfUnknown trap-handler strategy¤ Kgwith-default-trap-handler¤ Lg %start-stack¤ Mgreport¤ Ngmemq¤ Ogthrow¤ Pgrun-hook¤ Qgbefore-error-hook¤ Rgafter-error-hook¤ Sg force-output¤ Tg procedure?¤ UfUnknown post-error strategy¤ Vg backtrace¤ Wg print-frames¤ XfUnknown on-error strategy¤ Ygmake-syntax-transformer¤ ZY¤ [Y¤ \gmacro¤ ]g $sc-dispatch¤ ^]¤ _]¤ `gany¤ a``¤ bg syntax-object¤ cgtop¤ dc¤ egribcage¤ fgdummy¤ ggform¤ hfg¤ igm-82c280f576c6227-80¤ jic¤ kjd¤ lfl-82c280f576c6227-85¤ mfl-82c280f576c6227-86¤ nlm¤ oehkn¤ pe¤ qgx¤ rq¤ sj¤ tfl-82c280f576c6227-82¤ ut¤ versu¤ wdopv¤ xghygiene¤ yx¤ zbwy¤ {glambda¤ |b{wy¤ }gsyntax-violation¤ ~}¤ }¤ €f-source expression failed to match any pattern¤C5hxr]4     54#>"G$%&h(¦] 4L5’$L £"LL6žgport  &gframe  &gfilenamefsystem/repl/error-handling.scmŒ & ŒŒ  ' ŒŒ ' ŒŒ  ' ŒŒ  ' 3ŒŒ  ' ŒŒ & ( ŒŒ  & Ch¨]O6 gstack  gkey  gargs   gfilenamefsystem/repl/error-handling.scmŒ $ ŒŒ  % ŒŒ   gnameg error-stringŒC'R013456789:;<=>?@AEFhP±]L$?4L>"G4>"G4>"G"L6©gfilenamefsystem/repl/error-handling.scmŒ L ŒŒ  M ŒŒ O ŒŒ  O ŒŒ  O ŒŒ  P ŒŒ # P ŒŒ ( P ŒŒ 1 Q ŒŒ 6 Q ŒŒ ; Q ŒŒ I R ŒŒ O R ŒŒ  O ChY]LLLLO6Qgfilenamefsystem/repl/error-handling.scmŒ 4 ŒŒ  5 ŒŒ   ChY]LLLLLO6Qgfilenamefsystem/repl/error-handling.scmŒ 2 ŒŒ  3 ŒŒ   C hp‡]#[ˆ$ [Ž"445  $ "5$45"4 5LLLO6gframe  pgtrap-idx  pg trap-name   pgtag   pgstack  2 pg error-msg  L pgdebug  Y pgfilenamefsystem/repl/error-handling.scmŒ 8 ŒŒ  9 ŒŒ 9 ŒŒ  : ŒŒ  9 ŒŒ  ; ŒŒ  < ŒŒ * F ŒŒ 2 ; ŒŒ 2 9 ŒŒ : G ŒŒ ; H ŒŒ @ H 'ŒŒ F H ŒŒ L 9 ŒŒ O J ŒŒ Y 9 ŒŒ p 1 ŒŒ  p gnamegdebug-trap-handlerŒCGh°]C¨gframe  gtrap-idx  g trap-name   gfilenamefsystem/repl/error-handling.scmŒ T ŒŒ   gnamegnull-trap-handlerŒCHIJ1KLhY]L6Qgfilenamefsystem/repl/error-handling.scmŒ a ŒŒ a ŒŒ  ChY]MLO6Qgfilenamefsystem/repl/error-handling.scmŒ _ ŒŒ  ` ŒŒ   CMNO<=>PQ&RShHq]4>"G4LLL>"G4>"GL6igfilenamefsystem/repl/error-handling.scmŒ j ŒŒ  k ŒŒ  l ŒŒ , m ŒŒ C n ŒŒ  C ChY]LLLLO6Qgfilenamefsystem/repl/error-handling.scmŒ 4 ŒŒ  5 ŒŒ   ChY]LLLLO6Qgfilenamefsystem/repl/error-handling.scmŒ 2 ŒŒ  3 ŒŒ   Ch@–-134L5$@4LLLO>"GCŽgkey ?gargs ?gfilenamefsystem/repl/error-handling.scmŒ e ŒŒ f ŒŒ  f ŒŒ  g ŒŒ  1 ŒŒ ? CNOh Ž-134L5$@C†gkey gargs gfilenamefsystem/repl/error-handling.scmŒ q ŒŒ r ŒŒ  r ŒŒ  s ŒŒ CTNOh(Œ-134L5$"L@„gk $gargs $gfilenamefsystem/repl/error-handling.scmŒ v ŒŒ w ŒŒ  w ŒŒ $ w ŒŒ $ CUN789';<=>?@AEFhHµ]4L>"G4>"G4>"GL6­gfilenamefsystem/repl/error-handling.scmŒ Ž ŒŒ  ŒŒ  ŒŒ  ŒŒ  ŒŒ  ŒŒ " ŒŒ + ‘ ŒŒ 0 ‘ ŒŒ 5 ‘ ŒŒ ? ’ ŒŒ E ’ ŒŒ  E ChY]LLLO6Qgfilenamefsystem/repl/error-handling.scmŒ 4 ŒŒ  5 ŒŒ   ChY]LLLLO6Qgfilenamefsystem/repl/error-handling.scmŒ 2 ŒŒ  3 ŒŒ   C hxJ-134L5$C[ˆ$ [Ž"445  $ "5454 5LLLO6Bgkey wgargs wgtag  * wgstack  H wg error-msg  U wgdebug  b wgfilenamefsystem/repl/error-handling.scmŒ | ŒŒ } ŒŒ  } ŒŒ  ~ ŒŒ ~ ŒŒ $  ŒŒ * ~ ŒŒ - € ŒŒ 0 ŒŒ @ Š ŒŒ H € ŒŒ H ~ ŒŒ K ‹ !ŒŒ U ~ ŒŒ X Œ ŒŒ b ~ ŒŒ w 1 ŒŒ w CN<=>PQ&RShHv]4>"G4LLL>"G4>"GL6ngfilenamefsystem/repl/error-handling.scmŒ ˜ ŒŒ  ™ ŒŒ  š ŒŒ , › ŒŒ C œ ŒŒ  C ChY]LLLLO6Qgfilenamefsystem/repl/error-handling.scmŒ 4 ŒŒ  5 ŒŒ   ChY]LLLLO6Qgfilenamefsystem/repl/error-handling.scmŒ 2 ŒŒ  3 ŒŒ   Ch@‘-134L5$C4LLLO>"GC‰gkey 9gargs 9gfilenamefsystem/repl/error-handling.scmŒ ” ŒŒ • ŒŒ  • ŒŒ  1 ŒŒ 9 CVN789<=>WPQ&RShX]4L>"G4>"G4LLL>"G4>"GL6wgfilenamefsystem/repl/error-handling.scmŒ ¨ ŒŒ  © ŒŒ  ª ŒŒ ' « ŒŒ > ¬ ŒŒ U ­ ŒŒ  U ChY]LLLLLO6Qgfilenamefsystem/repl/error-handling.scmŒ 4 ŒŒ  5 ŒŒ   ChY]LLLLLO6Qgfilenamefsystem/repl/error-handling.scmŒ 2 ŒŒ  3 ŒŒ   Chp-134L5$C[ˆ$ [Ž"445  $ "54LLLO>"GCÿgkey mgargs mgtag  * mgframes  H mgfilenamefsystem/repl/error-handling.scmŒ Ÿ ŒŒ   ŒŒ    ŒŒ  ¡ ŒŒ ¡ ŒŒ $ ¢ ŒŒ * ¡ ŒŒ - £ ŒŒ 0 ¤ ŒŒ @ ¦ 'ŒŒ H £ ŒŒ H ¡ ŒŒ K 1 ŒŒ m Chw-13Cogkey gargs gfilenamefsystem/repl/error-handling.scmŒ ° ŒŒ CNOh(-134L5$"L@ˆgk $gargs $gfilenamefsystem/repl/error-handling.scmŒ µ ŒŒ ¶ ŒŒ  ¶ ŒŒ $ ¶ ŒŒ $ CXhxŠ-/03 ####454545HO Q †$ "& †$ " †$" 4  5KO†$O"5†$ O"!45$ O" 4 5†$O"d†$O"J†$O"0 †$"!45$ O" 4 56‚gthunk  xgon-error  xg post-error   xg pass-keys   xg trap-handler   xgin  J xgout  J xgerr  J xgle-trap-handler  Q xgdebug-trap-handler ] x gfilenamefsystem/repl/error-handling.scmŒ * ŒŒ  + -ŒŒ % + AŒŒ / , .ŒŒ 9 , EŒŒ < - ŒŒ A . ŒŒ F / ŒŒ J - ŒŒ o X ŒŒ “ \ ŒŒ — \ ŒŒ › \ ŒŒ ² c ŒŒ Ø u ŒŒ â u ŒŒ ð x ŒŒ ô x ŒŒ ø x ŒŒ  z ŒŒ V ´ ŒŒ ` ´ ŒŒ n · ŒŒ r · ŒŒ v · ŒŒ x ^ ŒŒ  x gon-errorS Œg post-errorS Œg pass-keysS Œg trap-handlerS Œgnamegcall-with-error-handlingŒCR4[\_az|h?]C7gdummy  gform     C€h(ª] 45$@6¢gx  "gtmp "gfilenamefsystem/repl/error-handling.scmŒ ¹ ŒŒ  " g macro-typeg syntax-rulesŒgpatternsgformC5RCjgm  ,gfilenamefsystem/repl/error-handling.scmŒ   ŒŒ ã $ ŒŒ  * ŒŒ  q C6PK!Cõãŵ³µ³repl/command.gonu„[µü¤GOOF----LE-8-2.0³]84h/<] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ grepl¤ gcommand¤ ¤ gfilenameS¤ fsystem/repl/command.scm¤ gimportsS¤ gbase¤ gsyntax¤  ¤ ¤ gpmatch¤  ¤ ¤ gcompile¤  ¤ ¤ gcommon¤ ¤ ¤ gdebug¤ ¤ ¤ gvm¤ gobjcode¤ ¤ ¤ !gprogram¤ "!¤ #"¤ $g trap-state¤ %$¤ &%¤ '¤ ('¤ )gframe¤ *)¤ +gselectS¤ ,gframe-return-values¤ -,¤ .*+-¤ /gice-9¤ 0gformat¤ 1/0¤ 21¤ 3gsession¤ 4/3¤ 54¤ 6g documentation¤ 7/6¤ 87¤ 9g and-let-star¤ :/9¤ ;:¤ =¤ ?gcontrol¤ @/?¤ A@¤ Bg pretty-print¤ C/B¤ Dgpp¤ EBDŒ¤ FE¤ GC+F¤ Hginspect¤ IH¤ Jg%inspect¤ KHJŒ¤ LK¤ MI+L¤ Ngstatprof¤ ON¤ PO¤ Q #&(.258;>AGMP¤ RgexportsS¤ Sg meta-command¤ Tgdefine-meta-command¤ UST¤ Vg autoloadsS¤ Wglanguage¤ X W¤ Yglookup-language¤ Zglanguage-reader¤ [YZ¤ \gtrace¤ ]\¤ ^gcall-with-trace¤ _^¤ `X[]_¤ agset-current-module¤ ba¤ ca¤ dghelp¤ egh¤ fde¤ ggshow¤ hg¤ igapropos¤ jga¤ kij¤ lgdescribe¤ mgd¤ nlm¤ odfhkn¤ pgmodule¤ qgm¤ rpq¤ sgimport¤ tguse¤ ust¤ vgload¤ wgl¤ xvw¤ ygreload¤ zgre¤ {yz¤ |gbinding¤ }gb¤ ~|}¤ gin¤ €¤ prux{~€¤ ‚gL¤ ƒW‚¤ „Wƒ¤ …gc¤ †…¤ ‡g compile-file¤ ˆgcc¤ ‰‡ˆ¤ Šgexpand¤ ‹gexp¤ ŒŠ‹¤ goptimize¤ Žgopt¤ ޤ g disassemble¤ ‘gx¤ ’‘¤ “gdisassemble-file¤ ”gxx¤ •“”¤ –†‰Œ’•¤ —gprofile¤ ˜gtime¤ ™gt¤ š˜™¤ ›gpr¤ œ—›¤ gtr¤ ž\¤ Ÿ—šœž¤  g backtrace¤ ¡gbt¤ ¢ ¡¤ £gup¤ ¤£¤ ¥gdown¤ ¦¥¤ §gfr¤ ¨)§¤ ©g procedure¤ ªgproc¤ «©ª¤ ¬glocals¤ ­¬¤ ®g error-message¤ ¯gerror¤ °®¯¤ ±gbreak¤ ²gbr¤ ³gbp¤ ´±²³¤ µgbreak-at-source¤ ¶gbreak-at¤ ·gbs¤ ¸µ¶·¤ ¹gstep¤ ºgs¤ »¹º¤ ¼gstep-instruction¤ ½gsi¤ ¾¼½¤ ¿gnext¤ Àgn¤ Á¿À¤ Âgnext-instruction¤ Ãgni¤ ÄÂä Ågfinish¤ ÆÅ¤ Çg tracepoint¤ Ègtp¤ ÉÇȤ Êgtraps¤ Ëʤ Ìgdelete¤ Ígdel¤ ÎÌͤ Ïgdisable¤ ÐϤ Ñgenable¤ ÒѤ Óg registers¤ Ôgregs¤ ÕÓÔ¤ Ö¢¤¦¨«­°´¸»¾ÁÄÆÉËÎÐÒÕ¤ ×gi¤ ØHפ ÙBD¤ ÚHØÙ¤ Ûggc¤ ÜÛ¤ Ýg statistics¤ Þgstat¤ ßÝÞ¤ àgoption¤ ágo¤ âàᤠãgquit¤ ägq¤ ågcontinue¤ ægcont¤ çãä忤 èÜßâç¤ éo„–ŸÖÚè¤ êg*command-table*¤ ëgwarranty¤ ìgw¤ íëì¤ îgcopying¤ ïî…¤ ðgversion¤ ñgv¤ òðñ¤ ógíïò¤ ôó¤ õg *show-table*¤ ög group-name¤ ÷ggroup-commands¤ øgmake-hash-table¤ ùg*command-infos*¤ úg command-name¤ ûgcommand-abbrevs¤ üg hashq-ref¤ ýg command-info¤ þgcommand-info-procedure¤ ÿgcommand-procedure¤ gprocedure-documentation¤ g command-doc¤ gmake-command-info¤ gcommand-info-arguments-reader¤ g substring¤ g string-index¤ g command-usage¤ gcommand-summary¤ gassq¤  g lookup-group¤  gmemq¤  glookup-command¤  f$~:(~A~) Commands~:[~; [abbrev]~]:~2%¤  gfor-each¤ gdisplay-summary¤ gnewline¤ g display-group¤ gdisplay¤ fUsage: ¤ gdisplay-command¤ g string-length¤ f [,~A~{ ,~A~}]¤ f¤ f ,~A~A~A - ~A ¤ fabbrevs too long¤ f~%~v_¤ f~v_¤ gcatch¤ gread¤ f)Throw to key `~a' while reading command: ¤ g display-error¤ gcurrent-output-port¤  f8Throw to key `~a' with args `~s' while reading command. ¤ !g force-output¤ "g read-command¤ #gread-command-arguments¤ $gand=>¤ %fUnknown meta command: ~A~%¤ &fMeta-command not a symbol: ~s~%¤ 'g hashq-set!¤ (gappend¤ )gadd-meta-command!¤ *gmake-syntax-transformer¤ +*¤ ,*¤ -gmacro¤ .g $sc-dispatch¤ /.¤ 0.¤ 1gany¤ 211¤ 3geach-any¤ 431Œ¤ 514Œ¤ 625Œ¤ 713Œ¤ 817Œ¤ 968Œ¤ :19Œ¤ ;g syntax-object¤ gribcage¤ ?gdummy¤ @gname¤ Agcategory¤ Bg expression0¤ Cgdatums¤ Dg docstring¤ Egb0¤ Fgb1¤ G?@ABCDEF ¤ Hgm-3ee4d7042b-92¤ IH<¤ JI======== ¤ Kfl-3ee4d7042b-97¤ Lfl-3ee4d7042b-98¤ Mfl-3ee4d7042b-99¤ Nfl-3ee4d7042b-9a¤ Ofl-3ee4d7042b-9b¤ Pfl-3ee4d7042b-9c¤ Qfl-3ee4d7042b-9d¤ Rfl-3ee4d7042b-9e¤ Sfl-3ee4d7042b-9f¤ TKLMNOPQRS ¤ U>GJT¤ V>¤ W‘¤ XI¤ Yfl-3ee4d7042b-94¤ ZY¤ [>WXZ¤ \=UV[¤ ]ghygiene¤ ^]¤ _;)\^¤ `gquote¤ a;`\^¤ bglambda*¤ c;b\^¤ d(¤ e(¤ fglambda¤ g;f\^¤ hgdefine¤ i;h\^¤ jghandle-read-error¤ k;j\^¤ lg form-name¤ m;l\^¤ ngkey¤ o;n\^¤ pgargs¤ q;p\^¤ rkmoq¤ s;\^¤ tgunquote¤ u;t\^¤ vgsubr¤ w;v\^¤ xuw¤ ygmsg¤ z;y\^¤ {uz¤ |uq¤ }grest¤ ~;}\^¤ x{|u~¤ €;0\^¤ ;\^¤ ‚fDThrow to key `~a' while reading ~@[argument `~A' of ~]command `~A': ¤ ƒ;‚\^¤ „;\^¤ …;\^¤ †;\^¤ ‡†¤ ˆ„…‡wzq~¤ ‰ˆ¤ Šgelse¤ ‹;Š\^¤ ŒfTThrow to key `~a' with args `~s' while reading ~@[ argument `~A' of ~]command `~A'. ¤ ;Œ\^¤ Žgabort¤ ;Ž\^¤ ¤ ‘¤ ’g%¤ “;’\^¤ ”glet*¤ •;”\^¤ –gmap¤ —–¤ ˜–¤ ™;\^¤ šg repl-reader¤ ›;š\^¤ œ;\^¤ goptionalS¤ ž;\^¤ Ÿgport¤  ;Ÿ\^¤ ¡gcurrent-input-port¤ ¢;¡\^¤ £¢¤ ¤ £¤ ¥ž¤¤ ¦;Z\^¤ §g repl-language¤ ¨;§\^¤ ©gcurrent-module¤ ª;©\^¤ «ª¤ ¬ «¤ ­gk¤ ®;­\^¤ ¯®qŒ¤ °®q¤ ±;(\^¤ ²glist¤ ³;²\^¤ ´glet¤ µ;´\^¤ ¶gopen-input-string¤ ·;¶\^¤ ¸g read-line¤ ¹;¸\^¤ º¹¤ »·º¤ ¼ »¤ ½¼¤ ¾glp¤ ¿;¾\^¤ Àgout¤ Á;À\^¤ Âa¤ ÃÁ¤ Ää Å;‘\^¤ Æ;\^¤ ÇÆ ¤ ÈÅǤ ÉȤ Êgif¤ Ë;Ê\^¤ Ìg eof-object?¤ Í;Ì\^¤ ÎÍŤ Ïgreverse¤ Ð;Ï\^¤ ÑÐÁ¤ Ògcons¤ Ó;Ò\^¤ ÔÓÅÁ¤ Õ¿Ô¤ ÖËÎÑÕ¤ ×µÉÖ¤ ص¿Äפ Ùµ½Ø¤ ÚgÙ¤ Ûk…®q¤ Üg¯Û¤ Ý™Úܤ Þݤ ß®¤ àgß…¤ áठâ11Œ¤ ã2⌤ äã8Œ¤ å1䌤 æ?@ACDEF¤ çI=======¤ èfl-3ee4d7042b-ae¤ éfl-3ee4d7042b-af¤ êfl-3ee4d7042b-b0¤ ëfl-3ee4d7042b-b1¤ ìfl-3ee4d7042b-b2¤ ífl-3ee4d7042b-b3¤ îfl-3ee4d7042b-b4¤ ïfl-3ee4d7042b-b5¤ ðèéêëìíîï¤ ñ>æçð¤ ò=ñV[¤ ó;Tò^¤ ô15Œ¤ õô8Œ¤ ö1õŒ¤ ÷?@BCDEF¤ øfl-3ee4d7042b-c0¤ ùfl-3ee4d7042b-c1¤ úfl-3ee4d7042b-c2¤ ûfl-3ee4d7042b-c3¤ üfl-3ee4d7042b-c4¤ ýfl-3ee4d7042b-c5¤ þfl-3ee4d7042b-c6¤ ÿfl-3ee4d7042b-c7¤ øùúûüýþÿ¤ >÷ç¤ =V[¤ ;T^¤ ;^¤ ¤ 1⌤ 8Œ¤ 1Œ¤  ?@CDEF¤  I======¤  fl-3ee4d7042b-d3¤  fl-3ee4d7042b-d4¤  fl-3ee4d7042b-d5¤ fl-3ee4d7042b-d6¤ fl-3ee4d7042b-d7¤ fl-3ee4d7042b-d8¤ fl-3ee4d7042b-d9¤    ¤ >  ¤ =V[¤ ;T^¤ ;^¤ ¤ gsyntax-violation¤ ¤ ¤ f-source expression failed to match any pattern¤ fCommand Groups: ¤ fhelp all¤ fList all commands¤ gsymbol->string¤  g string-append¤ !fhelp ¤ "fList ¤ #f commands¤ $fFType `,help -c COMMAND' to show documentation of a particular command.¤ %g-c¤ &fUnknown command: ~A~%¤ 'fBad arguments: ~A~%¤ (fUnknown command or group: ~A~%¤ )gall¤ *gdefault-prompt-tag¤ +@*¤ ,@*¤ -fUnknown topic: ~A~%¤ .g *warranty*¤ /g *copying*¤ 0g *version*¤ 1g->string¤ 2gobject-documentation¤ 3g repl-parse¤ 4g module-ref¤ 5g repl-eval¤ 6gform¤ 7f ~A~24t~A ¤ 8g repl-options¤ 9grepl-option-set!¤ :geval¤ ;grepl-option-ref¤ g module-name¤ ?gresolve-module¤ @g module-uses¤ Agresolve-interface¤ Bg module-use!¤ CfNo such module: ~A~%¤ Dgload-in-vicinity¤ ED¤ FD¤ Gf system/repl¤ Hg reload-module¤ Igmodule-for-each¤ Jf~23A ~A ¤ KgensureS¤ Lgsave-module-excursion¤ Mg repl-print¤ NfFInvalid arguments to `in': expected a single expression or a command. ¤ OfNo such module: ~s ¤ Pf6Happy hacking with ~a! To switch back, type `,L ~a'. ¤ Qglanguage-title¤ Rg language-name¤ Sgcurrent-language¤ Tgsetter¤ UT¤ VT¤ Wg repl-compile¤ Xgobjcode?¤ Ygguile:disassemble¤ ZgoptsS¤ [g repl-expand¤ \grun-hook¤ ]gbefore-print-hook¤ ^g repl-optimize¤ _gassembly¤ `W_¤ a`¤ b`¤ cgprogram?¤ df9Argument to ,disassemble not a procedure or objcode: ~a~%¤ eg load-objcode¤ fg gc-run-time¤ ggget-internal-real-time¤ hgget-internal-run-time¤ if8;; ~,6Fs real time, ~,6Fs run time. ~,6Fs spent in GC. ¤ je1.0¤ kginternal-time-units-per-second¤ lgrepl-prepare-eval-thunk¤ mgwidthS¤ ngterminal-width¤ ogdefine-stack-command¤ pg_¤ qpŒ¤ rg datum->syntax¤ sgframes¤ tgmessage¤ ug for-trap?¤ vgindex¤ wgcur¤ x1111111¤ ygt-3ee4d7042b-8e0¤ zgt-3ee4d7042b-8e1¤ {gt-3ee4d7042b-8e2¤ |gt-3ee4d7042b-8e3¤ }gt-3ee4d7042b-8e6¤ ~gt-3ee4d7042b-8e5¤ gt-3ee4d7042b-8e4¤ €yz{|}~¤ gm-3ee4d7042b-8e7¤ ‚<¤ ƒ‚‚‚‚‚‚‚¤ „fl-3ee4d7042b-8eb¤ …fl-3ee4d7042b-8ec¤ †fl-3ee4d7042b-8ed¤ ‡fl-3ee4d7042b-8ee¤ ˆfl-3ee4d7042b-8ef¤ ‰fl-3ee4d7042b-8f0¤ Šfl-3ee4d7042b-8f1¤ ‹„…†‡ˆ‰Š¤ Œ>€ƒ‹¤ gbody¤ Žgbody*¤ @pDޤ ======¤ ‘fl-3ee4d7042b-8d4¤ ’fl-3ee4d7042b-8d5¤ “fl-3ee4d7042b-8d6¤ ”fl-3ee4d7042b-8d7¤ •fl-3ee4d7042b-8d8¤ –fl-3ee4d7042b-8d9¤ —‘’“”•–¤ ˜>—¤ ™=¤ šfl-3ee4d7042b-8d1¤ ›š¤ œ>W™›¤ =VŒ˜Vœ¤ ž;T^¤ Ÿ;´^¤  ;^¤ ¡g repl-debug¤ ¢;¡^¤ £;Ê^¤ ¤g letrec-syntax¤ ¥;¤^¤ ¦gidentifier-syntax¤ §;¦^¤ ¨g debug-frames¤ ©;¨^¤ ª© ¤ «§ª¤ ¬«¤ ­gdebug-error-message¤ ®;­^¤ ¯® ¤ °§¯¤ ±°¤ ²gdebug-for-trap?¤ ³;²^¤ ´³ ¤ µ§´¤ ¶µ¤ ·gid¤ ¸;·^¤ ¹g debug-index¤ º;¹^¤ »º ¤ ¼¸»¤ ½gset!¤ ¾;½^¤ ¿;‹^¤ À¾¸¿¤ Á¾»¿¤ ÂÀÁ¤ ç¼Â¤ Ää Åg vector-ref¤ Æ;Å^¤ Ç;0^¤ È;^¤ ÉfNothing to debug.~%¤ Ê;É^¤ ËÇÈʤ Ìˤ Ím Œ¤ Îgfull?S¤ ÏÎ Œ¤ ÐÍϤ Ñg print-frames¤ ÒgcountS¤ Óg for-trap?S¤ Ôginteger?¤ ÕfBInvalid argument to `up': expected a positive integer for COUNT.~%¤ Ög vector-length¤ ×fAlready at outermost frame. ¤ Øg print-frame¤ ÙgindexS¤ Úg next-source?S¤ ÛfDInvalid argument to `down': expected a positive integer for COUNT.~%¤ ÜfAlready at innermost frame. ¤ ÝfGInvalid argument to `frame': expected a non-negative integer for IDX.~%¤ ÞfNo such frame.~%¤ ßgframe-procedure¤ àm Œ¤ áठâg print-locals¤ ãf~a~%¤ ägstring?¤ åfNo error message¤ æg procedure?¤ çgadd-trap-at-procedure-call!¤ èfTrap ~a: ~a.~%¤ ég trap-name¤ êfNot a procedure: ~a¤ ëgadd-trap-at-source-location!¤ ìgdefault-prompt-handler¤ í@ì¤ î@ì¤ ïgframe->stack-vector¤ ðgframe-previous¤ ñfNo return values.~%¤ òfReturn values:~%¤ ó¤ ôg start-repl¤ õgdebugS¤ ög make-debug¤ ÷grepl-pop-continuation-resumer¤ øfReturn from ~a¤ ùg#add-ephemeral-trap-at-frame-finish!¤ úgrepl-next-resumer¤ ûf Step into ~a¤ ügadd-ephemeral-stepping-trap!¤ ýginto?S¤ þg instruction?S¤ ÿgadd-trace-at-procedure-call!¤ g list-traps¤ fNo traps set.~%¤ f ~a: ~a~a~%¤ g trap-enabled?¤ f (disabled)¤ g delete-trap!¤ f.expected a trap index (a non-negative integer)¤ g disable-trap!¤ g enable-trap!¤  gprint-registers¤  gwidth¤  f!Set screen width to ~a columns.~%¤  gtimes¤  ggc-stats¤ g repl-tm-stats¤ g repl-gc-stats¤ gassq-ref¤ ggc-times¤ gdisplay-diff-stat¤ f GC times:¤ ftimes¤ g heap-size¤ gheap-free-size¤ gdisplay-stat-title¤ f Memory size:¤ fcurrent¤ flimit¤ g display-stat¤ fheap¤ fbytes¤ gheap-total-allocated¤ fBytes allocated:¤  fdiff¤ !ftotal¤ "f allocated¤ #g gc-time-taken¤ $fGC time taken:¤ %gdisplay-time-stat¤ &g tms:utime¤ 'g tms:stime¤ (g tms:cutime¤ )g tms:cstime¤ *fProcess time spent:¤ +fuser¤ ,fsystem¤ -f child user¤ .f child system¤ /f~~20~AA ~~10@A /~~10@A ~~A~~%¤ 0f@¤ 1f~10,2F¤ 2gexact->inexact¤ 3fs¤ 4f----¤ 5e 1000000.0¤ 6fmips¤ 7gdisplay-mips-stat¤C5hÈoC]4    QRUV`5 4c>"GéêRôõRhx]Cpgg  gfilenamefsystem/repl/command.scmŒ J ŒŒ  J ŒŒ   gnameg group-nameŒCöRh|]ŽCtgg  gfilenamefsystem/repl/command.scmŒ K ŒŒ  K ŒŒ   gnameggroup-commandsŒC÷R4øi5ùRhz]Crgc  gfilenamefsystem/repl/command.scmŒ N ŒŒ  N ŒŒ   gnameg command-nameŒCúRh}]ŽCugc  gfilenamefsystem/repl/command.scmŒ O ŒŒ  O ŒŒ   gnamegcommand-abbrevsŒCûRüùúh‚]456zgc  gfilenamefsystem/repl/command.scmŒ P ŒŒ  P 4ŒŒ  P ŒŒ   gnameg command-infoŒCýRþýh‡]456gc  gfilenamefsystem/repl/command.scmŒ Q ŒŒ  Q 6ŒŒ Q ŒŒ  gnamegcommand-procedureŒCÿRÿh]456ygc  gfilenamefsystem/repl/command.scmŒ R ŒŒ  R 1ŒŒ R ŒŒ  gnameg command-docŒCRh ]ŒC˜gproc  garguments-reader  gfilenamefsystem/repl/command.scmŒ T ŒŒ  U ŒŒ   gnamegmake-command-infoŒCRh‡]Cginfo  gfilenamefsystem/repl/command.scmŒ W ŒŒ  X ŒŒ   gnamegcommand-info-procedureŒCþRhŽ]ŽC†ginfo  gfilenamefsystem/repl/command.scmŒ Z ŒŒ  [ ŒŒ   gnamegcommand-info-arguments-readerŒCRh £] 45 4 56›gc  gdoc gfilenamefsystem/repl/command.scmŒ ] ŒŒ  ^ ŒŒ ^ ŒŒ  _ ŒŒ  _ ŒŒ   gnameg command-usageŒCRh@ï]454 5—4 5$ 66çgc  <gdoc <gstart   <gt  " <gfilenamefsystem/repl/command.scmŒ a ŒŒ  b ŒŒ b ŒŒ c ŒŒ  c ŒŒ  b ŒŒ  d ŒŒ " d ŒŒ 4 e ŒŒ < f ŒŒ  < gnamegcommand-summaryŒCRêh}]6ugname  gfilenamefsystem/repl/command.scmŒ h ŒŒ i ŒŒ  gnameg lookup-groupŒC Rê hx;-.,3#"N"4(ŽŽ"ÿÿç45$CŽ"ÿÿÈ( (C"ÿÿº"ÿÿ¶"ÿÿ§3gkey sgtable sggroups   hgcommands   hgfilenamefsystem/repl/command.scmŒ k ŒŒ  l ŒŒ $ m ŒŒ ' o ŒŒ * o ŒŒ 3 o ŒŒ 4 p ŒŒ ; p ŒŒ = p ŒŒ A m ŒŒ D p %ŒŒ J q ŒŒ R q ŒŒ R m ŒŒ ^ m ŒŒ h l ŒŒ k l &ŒŒ s l ŒŒ s gnameglookup-commandŒC R0 ö ûh(Š]45L$ 45"456‚gc  &gfilenamefsystem/repl/command.scmŒ u ŒŒ  v ŒŒ  w ŒŒ  w +ŒŒ  w ?ŒŒ  x ŒŒ & v ŒŒ  & C÷hXÌ-.,3#445>"G4O45>"G6Äggroup Sgabbrev? Sgfilenamefsystem/repl/command.scmŒ s ŒŒ  t ŒŒ  t ŒŒ  t 4ŒŒ ) t ŒŒ 2 u ŒŒ < y ŒŒ G u ŒŒ S z ŒŒ S gnameg display-groupŒCRh0³]4>"G445>"G6«gcommand  /gfilenamefsystem/repl/command.scmŒ | ŒŒ  } ŒŒ  } ŒŒ } ŒŒ  ~ ŒŒ  ~ ŒŒ # ~ ŒŒ /  ŒŒ  / gnamegdisplay-commandŒCR0¯ hˆ]45ˆ$4Ž5"45 ”$ 45"0– ”$4  ˜–5"4 ˜˜56 gusage  „gabbrevs  „gsummary   „g usage-len  „gabbrevs  & „g abbrevs-len  / „gfilenamefsystem/repl/command.scmŒ ŒŒ  ‚ ŒŒ ‚ ŒŒ  ƒ ŒŒ  ƒ ŒŒ  „ ŒŒ  „ !ŒŒ  „ 1ŒŒ  „ ?ŒŒ „ ŒŒ & … ŒŒ & ‚ ŒŒ ) † ŒŒ / ‚ ŒŒ 6 ‡ ŒŒ = Š ŒŒ A ‰ ŒŒ B ‹ ŒŒ F ‹ ŒŒ J ‹ ŒŒ S Œ ŒŒ V Œ ŒŒ Z ‰ ŒŒ [ ŒŒ ` ŒŒ g &ŒŒ h !ŒŒ j ŒŒ o ŒŒ t ŒŒ y ŒŒ ~ ŒŒ „ ‡ ŒŒ"  „ gnamegdisplay-summaryŒCRhT]6Lgfilenamefsystem/repl/command.scmŒ • ŒŒ  • ŒŒ   C0 !hèd-13ˆ$«Žˆ$yŽˆ$GŽ4>"G445>"G"4>"G"4>"G"4>"G4>"GC\gkey ägargs ägvx   ·gvy   ·gvx  ' –gvy  ' –gvx  8 ugvy  8 ugfilenamefsystem/repl/command.scmŒ – ŒŒ — ŒŒ = ™ ŒŒ B ™ ŒŒ I ™ ŒŒ R š ŒŒ V š ŒŒ g š ŒŒ z œ ŒŒ  œ ŒŒ ˆ œ ŒŒ   œ ŒŒ © œ ŒŒ Á œ ŒŒ Ê œ ŒŒ Ó ž ŒŒ ä Ch]6wgrepl  gfilenamefsystem/repl/command.scmŒ “ ŒŒ ” ŒŒ  gnameg read-commandŒC"Rýh³]44556«gc  grepl  gfilenamefsystem/repl/command.scmŒ ¡ ŒŒ  ¢ ŒŒ  ¢ "ŒŒ  ¢ ŒŒ  ¢ ŒŒ   gnamegread-command-argumentsŒC#R" $#ÿhp]4L5L@hgargs  gfilenamefsystem/repl/command.scmŒ ­ ŒŒ  ­ (ŒŒ  ­ !ŒŒ   C0%& hX]45&CŠ$.45$45O666grepl  Rgcommand Rgt  " Igfilenamefsystem/repl/command.scmŒ ¤ ŒŒ  ¥ ŒŒ ¥ ŒŒ  ¦ ŒŒ  § ŒŒ  ¨ ŒŒ  ¦ ŒŒ  ª ŒŒ " ¦ ŒŒ - ¬ ŒŒ @ ¬ ŒŒ E ¯ ŒŒ I ¯ ŒŒ N © ŒŒ R © ŒŒ  R gnameg meta-commandŒCSR'ùê(hh~] 445>"G$>45$4Ž5C45 CCvgname  egcategory  egproc   egargument-reader   egentry  . cgfilenamefsystem/repl/command.scmŒ ± ŒŒ  ² ŒŒ ² #ŒŒ  ² ŒŒ % ³ ŒŒ & ´ ŒŒ . ´ ŒŒ 6 µ ŒŒ 9 ¶ ŒŒ > ¶ $ŒŒ C ¶ 6ŒŒ F ¶ 0ŒŒ H ¶ ŒŒ I ¶ ŒŒ L ¸ ŒŒ W ¹ /ŒŒ Z ¹ ŒŒ ] ¹ ŒŒ _ ¸ ŒŒ a · ŒŒ  e gnamegadd-meta-command!ŒC)R4,T-0:_acegirsq€ƒom‰‹‘“•˜™g›œc¥¦¨¬¯ka°hH9] L Œ   ŒŒC1gtmp-3ee4d7042b-ab  F  F C±³Þáh¨Õ, 3 45ŒŒŒŒŒ     ŒŒ   ŒŒŒ4O5ŒŒŒŒŒCÍgdummy  ¥gname  ¥gcategory   ¥grepl   ¥g expression0   ¥gdatums   ¥g docstring   ¥gb0   ¥gb1   ¥   ¥ Cåóh(²,3ŒŒŒŒŒŒŒCªgdummy  "gname  "gcategory   "grepl   "gdatums   "g docstring   "gb0   "gb1   "  " Cöh(µ,3ŒŒŒŒŒŒŒŒC­gdummy  !gname  !grepl   !g expression0   !gdatums   !g docstring   !gb0   !gb1   !  ! Ch œ]ŒŒŒŒŒŒŒŒC”gdummy  gname  grepl   gdatums   g docstring   gb0   gb1      C hh]!45$@45$@45$@45$ @  6gx  ggtmp ggtmp  " ggtmp  9 ggtmp  P ggfilenamefsystem/repl/command.scmŒ ¼ ŒŒ  g g macro-typeg syntax-rulesŒgpatternsgnamegcategorygreplg expression0g...gdatumsŒŒŒg docstringgb0gb1g...gnamegcategorygreplgdatumsŒŒg docstringgb0gb1g...gnamegreplg expression0g...gdatumsŒŒŒg docstringgb0gb1g...gnamegreplgdatumsŒŒg docstringgb0gb1g...C5TR4)id d ö !"#h8]445545456 gg  1gname  1gusage   1gheader  & 1gfilenamefsystem/repl/command.scmŒ  ŒŒ   ŒŒ   .ŒŒ   ŒŒ   ŒŒ   ŒŒ   .ŒŒ   ŒŒ   ŒŒ   ŒŒ  /ŒŒ $  <ŒŒ &  ŒŒ &  ŒŒ 1  ŒŒ  1 Cê$%0&'( )h j-13(y445>"G4>"G4>"G4   Ž>"G4 >"G4 >"G 6"a"$"ç"‰"]ˆ$MŽ&2ˆ$"Ž( 66666ˆ$Ž( 6"ÿÿ"ÿÿ{ˆ$OŽ&9ˆ$.Ž(45$ 456"ÿÿ-"ÿÿ)"ÿÿ%"ÿÿ!"ÿÿˆ$.Ž(45$ 456"ÿþè"ÿþä"ÿþàˆ$.Ž(45$ 456"ÿþ«"ÿþ§"ÿþ£ˆ$(Ž&(  6"ÿþt"ÿþp"ÿþlbgrepl  gargs  gvx  © ðgvy  © ðgvx   Þgvy   Þgvx   gvy   gvx  . wgvy  . wgvx  G ogvy  G ogvx  ˆ °gvy  ˆ °gvx  Á égvy  Á égvx  ú gvy  ú gfilenamefsystem/repl/command.scmŒ ú ŒŒ   ŒŒ   ŒŒ   ŒŒ   "ŒŒ   ŒŒ   ŒŒ '  ŒŒ +  ŒŒ 0  ŒŒ 9  ŒŒ =  ŒŒ @  $ŒŒ E  ŒŒ N  ŒŒ U  ŒŒ Z  ŒŒ c  ŒŒ s  ŒŒ w  ŒŒ |  ŒŒ ˆ  ŒŒ Œ  ŒŒ Ñ ! ŒŒ Õ ! ŒŒ Ú # ŒŒ Þ # ŒŒ ã # ŒŒ ç # ŒŒ ì # ŒŒ ð # ŒŒ õ # ŒŒ ù # ŒŒ ù  ŒŒ   ŒŒ   ŒŒ   ŒŒ R  ŒŒ \  ŒŒ _  ŒŒ g  ŒŒ k  ŒŒ “  ŒŒ   ŒŒ    ŒŒ ¨  ŒŒ ¬  ŒŒ Ì  ŒŒ Ö  ŒŒ Ù  ŒŒ á  ŒŒ å  ŒŒ   ŒŒ   ŒŒ7  g documentationfÃhelp [all | GROUP | [-c] COMMAND] Show help. With one argument, tries to look up the argument as a group name, giving help on that group if successful. Otherwise tries to look up the argument as a command, giving help on the command. If there is a command whose name is also a group name, use the ,help -c COMMAND form to give help on the command instead of the group. Without any argument, a list of help commands and command groups are displayed.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ ú ŒŒ  > C0‚dŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ ú ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ ú ŒŒ  , C>"G4)igõ ÿ0-' h¨Õ-13(4>"G6ˆ$qŽ(A45$44556Ž( 66( 666Ígrepl ¨gargs ¨gvx  4 Ÿgvy  4 Ÿgvx  c gvy  c gvx  ƒ Ÿgvy  ƒ Ÿgfilenamefsystem/repl/command.scmŒ % ŒŒ  / ŒŒ  1 ŒŒ  1 ŒŒ  1 ŒŒ ' 2 ŒŒ * / ŒŒ ? 3 ŒŒ K / ŒŒ L 4 ŒŒ O 4 ŒŒ Y 4 ŒŒ ] 4 ŒŒ ` / ŒŒ r 6 ŒŒ v 6 ŒŒ { 8 ŒŒ  8 ŒŒ / ŒŒ ’ 6 ŒŒ – 6 ŒŒ › 8 ŒŒ Ÿ 8 ŒŒ ¤ 8 ŒŒ ¨ 8 ŒŒ ¨ g documentationfshow [TOPIC] Gives information about Guile. With one argument, tries to show a particular piece of information; currently supported topics are `warranty' (or `w'), `copying' (or `c'), and `version' (or `v'). Without any argument, a list of topics is displayed.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ % ŒŒ  > C0‚gŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ % ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ % ŒŒ  , C>"G4)ië.h³]4>"G6«grepl  gfilenamefsystem/repl/command.scmŒ > ŒŒ  A ŒŒ  B ŒŒ   g documentationf.show warranty Details on the lack of warranty.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ > ŒŒ  > C0‚댎hèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ > ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ > ŒŒ  , C>"G4)iî/h¢]4>"G6šgrepl  gfilenamefsystem/repl/command.scmŒ D ŒŒ  G ŒŒ  H ŒŒ   g documentationfshow copying Show the LGPLv3.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ D ŒŒ  > C0‚hèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ D ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ D ŒŒ  , C>"G4)ið0h¦]4>"G6žgrepl  gfilenamefsystem/repl/command.scmŒ J ŒŒ  M ŒŒ  N ŒŒ   g documentationf!show version Version information.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ J ŒŒ  > C0‚ðŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ J ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ J ŒŒ  , C>"G4)iii1hÇ]456¿grepl  gregexp  gfilenamefsystem/repl/command.scmŒ P ŒŒ  S ŒŒ S ŒŒ  g documentationf.apropos REGEXP Find bindings/modules/packages.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ P ŒŒ  > C0‚iŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ P ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ P ŒŒ  , C>"G4)il234©5hP9] 4445Š$4455" 455>"G61grepl  Igform  Iginput   6gfilenamefsystem/repl/command.scmŒ U ŒŒ  X ŒŒ  Y ŒŒ Z ŒŒ  Z ŒŒ  [ ŒŒ  [ ŒŒ  \ ŒŒ  \ ŒŒ & \ ŒŒ + ] ŒŒ 8 Y ŒŒ = X ŒŒ I ^ ŒŒ  I g documentationf,describe OBJ Show description/documentation.ŒC0‚lŒŽhà ]3ˆ$·Žˆ$Žˆ$KŽ4>"G445>"G"4>"G"4>"G"4>"G6g form-name  ßgkey  ßgargs   ßgvx   ¼gvy   ¼gvx  —gvy  —gvx  1 rgvy  1 r gfilenamefsystem/repl/command.scmŒ U ŒŒ  ß gnameghandle-read-errorŒC,š¡Z§©h0^-.,3#4544L55456Vgport .gfilenamefsystem/repl/command.scmŒ U ŒŒ . ChJ]LO6Bgfilenamefsystem/repl/command.scmŒ U ŒŒ   C6hm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ U ŒŒ  C(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ U ŒŒ  > Chm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ U ŒŒ  C hPœ]45U64OO544O5>XCXFGC”grepl  Mghandle-read-error  Mgform  $ Bgk  F Mgfilenamefsystem/repl/command.scmŒ U ŒŒ  M C>"G4)ià 07h‚]Ž6zgspec  gfilenamefsystem/repl/command.scmŒ e ŒŒ  f ŒŒ f +ŒŒ f 6ŒŒ  f ŒŒ   C89:©; h –-13( 456"Bˆ$9Žˆ$&Ž(44556CCCˆ$1Ž(445>"G 6"ÿÿ†"ÿÿ‚Žgrepl žgargs žgvx  - `gvy  - `gvx  > ^gvy  > ^gvx  o šgvy  o šgfilenamefsystem/repl/command.scmŒ ` ŒŒ  c ŒŒ  g ŒŒ  e ŒŒ c ŒŒ O n !ŒŒ T n +ŒŒ Z n !ŒŒ \ n ŒŒ b c ŒŒ z i ŒŒ } i ŒŒ Š i ŒŒ – j ŒŒ š c ŒŒ ž g documentationf*option [NAME] [EXP] List/show/set options.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ ` ŒŒ  > C0‚àŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ ` ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ ` ŒŒ  , C>"G4)iã<ãhœ]6”grepl  gfilenamefsystem/repl/command.scmŒ p ŒŒ  s ŒŒ  s ŒŒ   g documentationfquit Quit this session.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ p ŒŒ  > C0‚㌎hèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ p ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ p ŒŒ  , C>"G4)ip=>©a?hhk-13(44556ˆ$8Ž(‰$ 456456456456cgrepl ggargs ggvx  * \gvy  * \gfilenamefsystem/repl/command.scmŒ z ŒŒ  } ŒŒ  ~ ŒŒ  ~ ŒŒ  ~ ŒŒ  ~ ŒŒ } ŒŒ 7  ŒŒ ; } ŒŒ > € ŒŒ F € ŒŒ I  #ŒŒ Q  ŒŒ T  #ŒŒ \  ŒŒ _  #ŒŒ g  ŒŒ g g documentationf5module [MODULE] Change modules / Show current module.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ z ŒŒ  > C0‚pŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ z ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ z ŒŒ  , C>"G4)is =–>@©AB©0Ch(½] 45$ 4566µgname  %gmod %gfilenamefsystem/repl/command.scmŒ ‡ ŒŒ  ˆ ŒŒ ˆ ŒŒ  ‰ ŒŒ  Š ŒŒ  Š ŒŒ ! ‹ ŒŒ % ‹ ŒŒ  % gnameguseŒCh0-13(44455566ÿgrepl .gargs .gfilenamefsystem/repl/command.scmŒ ƒ ŒŒ  Œ ŒŒ   ŒŒ   (ŒŒ   5ŒŒ "  (ŒŒ $  ŒŒ &  ŒŒ . Ž ŒŒ . g documentationf9import [MODULE ...] Import modules / List those imported.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ ƒ ŒŒ  > C0‚sŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ ƒ ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ ƒ ŒŒ  , C>"G4)ivFG1hÌ]456Ägrepl  gfile  gfilenamefsystem/repl/command.scmŒ  ŒŒ  “ ŒŒ  “ ŒŒ  “ ŒŒ   g documentationf,load FILE Load a file in the current module.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ  ŒŒ  > C0‚vŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ  ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ  ŒŒ  , C>"G4)iyH©?hhu-13( 456ˆ$8Ž(‰$ 456456456456mgrepl bgargs bgvx  % Wgvy  % Wgfilenamefsystem/repl/command.scmŒ • ŒŒ  ˜ ŒŒ  ™ ŒŒ  ™ ŒŒ  ˜ ŒŒ 2 š ŒŒ 6 ˜ ŒŒ 9 › ŒŒ A › ŒŒ D œ ŒŒ L œ ŒŒ O œ ŒŒ W œ ŒŒ Z œ ŒŒ b œ ŒŒ b g documentationfQreload [MODULE] Reload the given module, or the current module if none was given.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ • ŒŒ  > C0‚yŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ • ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ • ŒŒ  , C>"G4)i|I0Jh|]6tgk  gv  gfilenamefsystem/repl/command.scmŒ ¡ ŒŒ  ¡ ,ŒŒ ¡ !ŒŒ  C©h£]456›grepl  gfilenamefsystem/repl/command.scmŒ ž ŒŒ  ¢ ŒŒ ¡ ŒŒ  g documentationfbinding List current bindings.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ ž ŒŒ  > C0‚|ŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ ž ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ ž ŒŒ  , C>"G4)i?Kt Laÿ h(x]4L>"G44L55LL@pgfilenamefsystem/repl/command.scmŒ ¬ ŒŒ  ­ ŒŒ  ® ŒŒ  ® (ŒŒ ® ŒŒ & ® ŒŒ  & CM:0NO h½-13 45$؈$µŽ&‡ˆ$dŽ(845$O6(456  6(456  6(456  6(456  6(456  6  6µgrepl ügmodule ügcommand-or-expression  ügargs  ügm   ügvx  ( ×gvy  ( ×gvx  A Ÿgvy  A Ÿ gfilenamefsystem/repl/command.scmŒ ¤ ŒŒ § ŒŒ  § ŒŒ  ¨ ŒŒ  © ŒŒ L ª &ŒŒ V © ŒŒ g « ŒŒ m © ŒŒ r ± ŒŒ | ± ŒŒ ³ ŒŒ ƒ ³ ŒŒ ‰ © ŒŒ Ž ± ŒŒ ˜ ± ŒŒ ³ ŒŒ Ÿ ³ ŒŒ ¥ © ŒŒ ª ± ŒŒ ´ ± ŒŒ ¹ ³ ŒŒ » ³ ŒŒ Á © ŒŒ Æ ± ŒŒ Ð ± ŒŒ Õ ³ ŒŒ × ³ ŒŒ Ý © ŒŒ â ± ŒŒ ì ± ŒŒ ñ ³ ŒŒ ó ³ ŒŒ ø ´ ŒŒ ü ´ ŒŒ$ ü  g documentationf[in MODULE COMMAND-OR-EXPRESSION Evaluate an expression or command in the context of module.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ ¤ ŒŒ  > C0‚ŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ ¤ ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ ¤ ŒŒ  , C>"G4)iWY§0PQRSV hX%]454544545>"G4>"G456grepl  Tgname  Tglang   Tgcur   Tgfilenamefsystem/repl/command.scmŒ » ŒŒ  ¾ ŒŒ ¿ ŒŒ  ¾ ŒŒ  À ŒŒ  À ŒŒ  Á ŒŒ " Á "ŒŒ - À ŒŒ 6  ŒŒ T à ŒŒ  T g documentationf#language LANGUAGE Change languages.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ » ŒŒ  > C0‚WŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ » ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ » ŒŒ  , C>"G4)iW3XYMh0ÿ] 445545$66÷grepl  -gform  -gx   -gfilenamefsystem/repl/command.scmŒ Ê ŒŒ  Í ŒŒ  Í ŒŒ  Í ŒŒ  Í ŒŒ  Î ŒŒ  Î ŒŒ % Î ŒŒ - Ï ŒŒ  - g documentationf#compile EXP Generate compiled code.ŒC0‚ŒŽhà ]3ˆ$·Žˆ$Žˆ$KŽ4>"G445>"G"4>"G"4>"G"4>"G6g form-name  ßgkey  ßgargs   ßgvx   ¼gvy   ¼gvx  —gvy  —gvx  1 rgvy  1 r gfilenamefsystem/repl/command.scmŒ Ê ŒŒ  ß gnameghandle-read-errorŒC,š¡Z§©h0^-.,3#4544L55456Vgport .gfilenamefsystem/repl/command.scmŒ Ê ŒŒ . ChJ]LO6Bgfilenamefsystem/repl/command.scmŒ Ê ŒŒ   C6hm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ Ê ŒŒ  C(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ Ê ŒŒ  > Chm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ Ê ŒŒ  C hPœ]45U64OO544O5>XCXFGC”grepl  Mghandle-read-error  Mgform  $ Bgk  F Mgfilenamefsystem/repl/command.scmŒ Ê ŒŒ  M C>"G4)i‡‡1ZhÍ-13456Ågrepl gfile gopts  gfilenamefsystem/repl/command.scmŒ Ñ ŒŒ Ô ŒŒ  Ô ŒŒ   g documentationf!compile-file FILE Compile a file.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ Ñ ŒŒ  > C0‚‡ŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ Ñ ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ Ñ ŒŒ  , C>"G4)iŠ[3\]Dh0ñ] 44554>"G6égrepl  .gform  .gx   .gfilenamefsystem/repl/command.scmŒ Ö ŒŒ  Ù ŒŒ  Ù ŒŒ  Ù ŒŒ  Ù ŒŒ  Ú ŒŒ . Û ŒŒ  . g documentationf'expand EXP Expand any macros in a form.ŒC0‚ŠŒŽhà ]3ˆ$·Žˆ$Žˆ$KŽ4>"G445>"G"4>"G"4>"G"4>"G6g form-name  ßgkey  ßgargs   ßgvx   ¼gvy   ¼gvx  —gvy  —gvx  1 rgvy  1 r gfilenamefsystem/repl/command.scmŒ Ö ŒŒ  ß gnameghandle-read-errorŒC,š¡Z§©h0^-.,3#4544L55456Vgport .gfilenamefsystem/repl/command.scmŒ Ö ŒŒ . ChJ]LO6Bgfilenamefsystem/repl/command.scmŒ Ö ŒŒ   C6hm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ Ö ŒŒ  C(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ Ö ŒŒ  > Chm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ Ö ŒŒ  C hPœ]45U64OO544O5>XCXFGC”grepl  Mghandle-read-error  Mgform  $ Bgk  F Mgfilenamefsystem/repl/command.scmŒ Ö ŒŒ  M C>"G4)i^3\]Dh0] 44554>"G6 grepl  .gform  .gx   .gfilenamefsystem/repl/command.scmŒ Ý ŒŒ  à ŒŒ  à ŒŒ  à ŒŒ  à ŒŒ  á ŒŒ . â ŒŒ  . g documentationfGoptimize EXP Run the optimizer on a piece of code and print the result.ŒC0‚ŒŽhà ]3ˆ$·Žˆ$Žˆ$KŽ4>"G445>"G"4>"G"4>"G"4>"G6g form-name  ßgkey  ßgargs   ßgvx   ¼gvy   ¼gvx  —gvy  —gvx  1 rgvy  1 r gfilenamefsystem/repl/command.scmŒ Ý ŒŒ  ß gnameghandle-read-errorŒC,š¡Z§©h0^-.,3#4544L55456Vgport .gfilenamefsystem/repl/command.scmŒ Ý ŒŒ . ChJ]LO6Bgfilenamefsystem/repl/command.scmŒ Ý ŒŒ   C6hm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ Ý ŒŒ  C(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ Ý ŒŒ  > Chm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ Ý ŒŒ  C hPœ]45U64OO544O5>XCXFGC”grepl  Mghandle-read-error  Mgform  $ Bgk  F Mgfilenamefsystem/repl/command.scmŒ Ý ŒŒ  M C>"GbhŠ]6‚gx  gfilenamefsystem/repl/command.scmŒ ä ŒŒ  å ŒŒ  å ŒŒ   gnamegguile:disassembleŒCYR4)i53cXY0dhH9]445545$"45$661grepl  Egform  Egobj   Egt   2gfilenamefsystem/repl/command.scmŒ ç ŒŒ  ê ŒŒ  ê ŒŒ  ê ŒŒ  ê ŒŒ  ë ŒŒ  ë ŒŒ ) ë ŒŒ 6 ë ŒŒ < ì ŒŒ A í ŒŒ E í ŒŒ  E g documentationf1disassemble EXP Disassemble a compiled procedure.ŒC0‚ŒŽhà ]3ˆ$·Žˆ$Žˆ$KŽ4>"G445>"G"4>"G"4>"G"4>"G6g form-name  ßgkey  ßgargs   ßgvx   ¼gvy   ¼gvx  —gvy  —gvx  1 rgvy  1 r gfilenamefsystem/repl/command.scmŒ ç ŒŒ  ß gnameghandle-read-errorŒC,š¡Z§©h0^-.,3#4544L55456Vgport .gfilenamefsystem/repl/command.scmŒ ç ŒŒ . ChJ]LO6Bgfilenamefsystem/repl/command.scmŒ ç ŒŒ   C6hm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ ç ŒŒ  C(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ ç ŒŒ  > Chm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ ç ŒŒ  C hPœ]45U64OO544O5>XCXFGC”grepl  Mghandle-read-error  Mgform  $ Bgk  F Mgfilenamefsystem/repl/command.scmŒ ç ŒŒ  M C>"G4)i“Ye1hÒ]44556Êgrepl  gfile  gfilenamefsystem/repl/command.scmŒ 𠌌  ó ŒŒ  ó #ŒŒ  ó ŒŒ  ó ŒŒ   g documentationf)disassemble-file FILE Disassemble a file.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ 𠌌  > C0‚“ŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ 𠌌 â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ 𠌌  , C>"G4)i˜fgh53M0ijk hD]:45454544554545454>"G4˜ › ›˜ › ›˜ › ›>"GC<grepl  ‰gform  ‰ggc-start   ‰g real-start   ‰g run-start   ‰gresult  ' ‰grun-end  . ‰greal-end  5 ‰ggc-end  < ‰ gfilenamefsystem/repl/command.scmŒ ú ŒŒ  ý ŒŒ  ý ŒŒ þ ŒŒ  ý ŒŒ  ÿ ŒŒ  ý ŒŒ   ŒŒ   !ŒŒ '  ŒŒ ' ý ŒŒ *  ŒŒ . ý ŒŒ 1  ŒŒ 5 ý ŒŒ 8  ŒŒ < ý ŒŒ ?  ŒŒ S  ŒŒ X  ŒŒ ]  ŒŒ _  ŒŒ `  ŒŒ h  ŒŒ j  ŒŒ k  ŒŒ s  ŒŒ u  ŒŒ v  ŒŒ ~  ŒŒ  ‰ g documentationftime EXP Time execution.ŒC0‚˜ŒŽhà ]3ˆ$·Žˆ$Žˆ$KŽ4>"G445>"G"4>"G"4>"G"4>"G6g form-name  ßgkey  ßgargs   ßgvx   ¼gvy   ¼gvx  —gvy  —gvx  1 rgvy  1 r gfilenamefsystem/repl/command.scmŒ ú ŒŒ  ß gnameghandle-read-errorŒC,š¡Z§©h0^-.,3#4544L55456Vgport .gfilenamefsystem/repl/command.scmŒ ú ŒŒ . ChJ]LO6Bgfilenamefsystem/repl/command.scmŒ ú ŒŒ   C6hm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ ú ŒŒ  C(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ ú ŒŒ  > Chm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ ú ŒŒ  C hPœ]45U64OO544O5>XCXFGC”grepl  Mghandle-read-error  Mgform  $ Bgk  F Mgfilenamefsystem/repl/command.scmŒ ú ŒŒ  M C>"G4)i—Nl3h Ü-134455@Ôgrepl gform gopts  gfilenamefsystem/repl/command.scmŒ  ŒŒ  ŒŒ   'ŒŒ   ŒŒ   ŒŒ   g documentationfprofile EXP Profile execution.ŒC0‚—ŒŽhà ]3ˆ$·Žˆ$Žˆ$KŽ4>"G445>"G"4>"G"4>"G"4>"G6g form-name  ßgkey  ßgargs   ßgvx   ¼gvy   ¼gvx  —gvy  —gvx  1 rgvy  1 r gfilenamefsystem/repl/command.scmŒ  ŒŒ  ß gnameghandle-read-errorŒC,š¡Z§©h0^-.,3#4544L55456Vgport .gfilenamefsystem/repl/command.scmŒ  ŒŒ . ChJ]LO6Bgfilenamefsystem/repl/command.scmŒ  ŒŒ   C6hm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ  ŒŒ  C(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ  ŒŒ  > Chm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ  ŒŒ  C hPœ]45U64OO544O5>XCXFGC”grepl  Mghandle-read-error  Mgform  $ Bgk  F Mgfilenamefsystem/repl/command.scmŒ  ŒŒ  M C>"G4)i\^l3mnh(á-13445545@Ùgrepl &gform &gopts  &gfilenamefsystem/repl/command.scmŒ  ŒŒ  ŒŒ   'ŒŒ   ŒŒ   ŒŒ &  ŒŒ &  g documentationftrace EXP Trace execution.ŒC0‚\ŒŽhà ]3ˆ$·Žˆ$Žˆ$KŽ4>"G445>"G"4>"G"4>"G"4>"G6g form-name  ßgkey  ßgargs   ßgvx   ¼gvy   ¼gvx  —gvy  —gvx  1 rgvy  1 r gfilenamefsystem/repl/command.scmŒ  ŒŒ  ß gnameghandle-read-errorŒC,š¡Z§©h0^-.,3#4544L55456Vgport .gfilenamefsystem/repl/command.scmŒ  ŒŒ . ChJ]LO6Bgfilenamefsystem/repl/command.scmŒ  ŒŒ   C6hm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ  ŒŒ  C(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ  ŒŒ  > Chm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ  ŒŒ  C hPœ]45U64OO544O5>XCXFGC”grepl  Mghandle-read-error  Mgform  $ Bgk  F Mgfilenamefsystem/repl/command.scmŒ  ŒŒ  M C>"G4,o-0qrstuvw0xžŸ ¢£¥¬±¶Ä§ÆÌhhì]LLLŒŒLLŒŒ Œ Œ  LLŒŒŒ ŒŒŒCägt-3ee4d7042b-8e0  bgt-3ee4d7042b-8e1  bgt-3ee4d7042b-8e2   bgt-3ee4d7042b-8e3   bgt-3ee4d7042b-8e6   bgt-3ee4d7042b-8e5   bgt-3ee4d7042b-8e4   b  b C hxž]4545454545454545$ O@  6–gname  ugrepl  ugargs   ug docstring   ugbody   ugbody*   ugtmp  D ugtmp  O ugfilenamefsystem/repl/command.scmŒ  + ŒŒ + /ŒŒ + ŒŒ - ŒŒ  - /ŒŒ  - ŒŒ  / ŒŒ  / /ŒŒ  / ŒŒ  1 ŒŒ $ 1 /ŒŒ & 1 ŒŒ ' 5 ŒŒ - 5 /ŒŒ / 5 ŒŒ 0 7 &ŒŒ 6 7 <ŒŒ 8 7 &ŒŒ 9 8 &ŒŒ ? 8 <ŒŒ A 8 &ŒŒ D & ŒŒ  u Ch(k] 45$@6cgx  "gtmp "gfilenamefsystem/repl/command.scmŒ # ŒŒ  " C5oR4)i Ðn¡Ñ¨ÒmÎÓ²0É hhº-/03##45#45$ 45 4 56   6²grepl  hgcount  hgwidth   hgfull?   hgdebug  9 hgfilenamefsystem/repl/command.scmŒ < ŒŒ # = .ŒŒ 3 < ŒŒ a C ŒŒ f < ŒŒ  h gwidthS Œgfull?S Œg documentationfºbacktrace [COUNT] [#:width W] [#:full? F] Print a backtrace. Print a backtrace of all stack frames, or innermost COUNT frames. If COUNT is negative, the last COUNT frames will be shown.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ < ŒŒ  > C0‚ ŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ < ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ < ŒŒ  , C>"G4)i£¡Ô0Õ¹Ö¨×VØÙÚ²Éh@Z-.,3# 45$45€$" “$645–4455•${454455™‘$644 54455™>"G 4545£ 45 45 ‘$ 4 5"644 545–>"G 4545£ 45 45 ‘$ 4 5"66Rgrepl @gcount @gdebug   @gt  , @gfilenamefsystem/repl/command.scmŒ I ŒŒ % P ŒŒ , P ŒŒ , P ŒŒ = P ŒŒ D O ŒŒ I Q ŒŒ K Q ŒŒ U R ŒŒ V R ŒŒ b R ŒŒ f O ŒŒ n T ŒŒ z T ŒŒ { T ŒŒ  S ŒŒ „ U ŒŒ † U ŒŒ ‡ W ŒŒ ‘ W ŒŒ W ŒŒ ¢ W ŒŒ Î Y 'ŒŒ Ó Y "ŒŒ á X ŒŒ â [ ŒŒ õ [ ŒŒ ú [ ŒŒ & ] %ŒŒ + ] ŒŒ 9 \ ŒŒ > I ŒŒ! @ g documentationfˆup [COUNT] Select a calling stack frame. Select and print stack frames that called this one. An argument says how many frames up to go.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ I ŒŒ  > C0‚£ŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ I ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ I ŒŒ  , C>"G4)i¥¡Ô0Û¹ÜVبÙÚ²Éh -.,3# 45$à45€$" “$645˜ ’$Q45 ‘$6445 >"G4 545£ 45 4 5644545˜>"G4 545£ 45 45 ‘$ 4 5"6 6grepl  gcount  gdebug    gt  , @gfilenamefsystem/repl/command.scmŒ _ ŒŒ % f ŒŒ , f ŒŒ , f ŒŒ = f ŒŒ D e ŒŒ I g ŒŒ K g ŒŒ U h ŒŒ W h ŒŒ [ e ŒŒ c j ŒŒ h i ŒŒ m k ŒŒ o k ŒŒ p m ŒŒ ¬ n ŒŒ ­ p ŒŒ À p ŒŒ Å p ŒŒ ñ r %ŒŒ ö r ŒŒ  q ŒŒ  _ ŒŒ  g documentationf‰down [COUNT] Select a called stack frame. Select and print stack frames called by this one. An argument says how many frames down to go.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ _ ŒŒ  > C0‚¥ŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ _ ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ _ ŒŒ  , C>"G4)i)¡Ô0ÝÖ¨V¹ØÙÚ²ÞÉhÛ-.,3#45$Î$‘45€$" ’$64455’$P445>"G 4545£ 45 45 ‘$ 4 5"6 6 4545£ 45 45 ‘$ 4 5"66Ógrepl ùgidx ùgdebug   ùgt  2 Fgfilenamefsystem/repl/command.scmŒ t ŒŒ * z ŒŒ + } ŒŒ 2 } ŒŒ 2 } ŒŒ C } ŒŒ J | ŒŒ O ~ ŒŒ Q ~ ŒŒ T  ŒŒ `  ŒŒ d | ŒŒ e € ŒŒ ¡ ‚ 'ŒŒ ¦ ‚ "ŒŒ ´  ŒŒ ¹ „ ŒŒ » „ ŒŒ ß † *ŒŒ ä † %ŒŒ ò … ŒŒ ÷ t ŒŒ ù g documentationflframe [IDX] Show a frame. Show the selected frame. With an argument, select a frame by index, then show it.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ t ŒŒ  > C0‚)ŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ t ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ t ŒŒ  , C>"G4)i©¡Mߨ¹0Éh8Ô] 45$44545£566Ìgrepl  2gdebug 2gfilenamefsystem/repl/command.scmŒ ˆ ŒŒ  ‹ ŒŒ + ‹ ŒŒ 0 ˆ ŒŒ  2 g documentationf5procedure Print the procedure for the selected frame.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ ˆ ŒŒ  > C0‚©ŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ ˆ ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ ˆ ŒŒ  , C>"G4)i¬án¡â¨¹m0É hP-/03#4545$4545£6 6grepl  Mgwidth  Mgdebug  ' Mgfilenamefsystem/repl/command.scmŒ  ŒŒ   0ŒŒ !  ŒŒ F ’ ŒŒ K  ŒŒ  M gwidthS Œg documentationfQlocals Show local variables. Show locally-bound variables in the selected frame.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ  ŒŒ  > C0‚¬ŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ  ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ  ŒŒ  , C>"G4)i®¡0ãä­åÉh@3] 45$$4455$ 45"66+grepl  <gdebug <gfilenamefsystem/repl/command.scmŒ ” ŒŒ  š ŒŒ  š ŒŒ & š ŒŒ 3 š 2ŒŒ 5 š ŒŒ : ” ŒŒ  < g documentationfyerror-message Show error message. Display the message associated with the error that started the current debugging REPL.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ ” ŒŒ  > C0‚®ŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ ” ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ ” ŒŒ  , C>"G4)i±53æç0èé¯ê h@~]445545$45456 6vgrepl  @gform  @gproc   @gidx  & 8gfilenamefsystem/repl/command.scmŒ œ ŒŒ  ¡ ŒŒ  ¡ ŒŒ  ¡ ŒŒ  ¡ ŒŒ  ¢ ŒŒ  ¢ ŒŒ ¤ ŒŒ & ¤ ŒŒ - ¥ ŒŒ 0 ¥ *ŒŒ 8 ¥ ŒŒ < £ ŒŒ @ £ ŒŒ  @ g documentationfabreak PROCEDURE Break on calls to PROCEDURE. Starts a recursive prompt when PROCEDURE is called.ŒC0‚±ŒŽhà ]3ˆ$·Žˆ$Žˆ$KŽ4>"G445>"G"4>"G"4>"G"4>"G6g form-name  ßgkey  ßgargs   ßgvx   ¼gvy   ¼gvx  —gvy  —gvx  1 rgvy  1 r gfilenamefsystem/repl/command.scmŒ œ ŒŒ  ß gnameghandle-read-errorŒC,š¡Z§©h0^-.,3#4544L55456Vgport .gfilenamefsystem/repl/command.scmŒ œ ŒŒ . ChJ]LO6Bgfilenamefsystem/repl/command.scmŒ œ ŒŒ   C6hm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ œ ŒŒ  C(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ œ ŒŒ  > Chm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ œ ŒŒ  C hPœ]45U64OO544O5>XCXFGC”grepl  Mghandle-read-error  Mgform  $ Bgk  F Mgfilenamefsystem/repl/command.scmŒ œ ŒŒ  M C>"G4)iµë0èéh8â]Š$ 45"45456Úgrepl  3gfile  3gline   3gfile   3gidx  ! 3gfilenamefsystem/repl/command.scmŒ § ŒŒ  ­ ŒŒ ­ ŒŒ ­ !ŒŒ  ­ ŒŒ  ® ŒŒ ! ® ŒŒ ( ¯ ŒŒ + ¯ &ŒŒ 3 ¯ ŒŒ  3 g documentationf×break-at-source FILE LINE Break when control reaches the given source location. Starts a recursive prompt when control reaches line LINE of file FILE. Note that the given source location must be inside a procedure.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ § ŒŒ  > C0‚µŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ § ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ § ŒŒ  , C>"Gî,Žïðhƒ]L44556{gframe  gfilenamefsystem/repl/command.scmŒ » ŒŒ  ½ ŒŒ ¾ ŒŒ  ½ ŒŒ  ¼ ŒŒ   Ch[]OCSgk  gfilenamefsystem/repl/command.scmŒ · ŒŒ  C0ã,ñò Mhd]L6\gx  gfilenamefsystem/repl/command.scmŒ Æ ŒŒ Æ 'ŒŒ  C4Aóôõöh S]4> G4L>"G45(4>"G",4>"G4 LO>"G4 4  5 54 L56Kgfrom ›gstack ›gvals  0 ~gfilenamefsystem/repl/command.scmŒ  ¶ ŒŒ  ´ ŒŒ  À ŒŒ  À ŒŒ ! À ŒŒ * Á ŒŒ 0 Á ŒŒ 8  ŒŒ 9 à ŒŒ > à ŒŒ C à ŒŒ P Å ŒŒ U Å ŒŒ Z Å ŒŒ c Æ ŒŒ  Ç ŒŒ ‚ Ç ŒŒ † Ç )ŒŒ ˆ Ç ŒŒ Š Ç >ŒŒ Œ Ç ŒŒ È ŒŒ › Ç ŒŒ  › Ch0È]45U4O>XCXFG@Àgrepl  .gmsg  .ghandler   .gargs  # .gfilenamefsystem/repl/command.scmŒ ± ŒŒ  ´ ŒŒ  . gnamegrepl-pop-continuation-resumerŒC÷R4)iÅ¡÷0ø¨¹ù<ãÉ h`\]45$G444545£5544545£>"G 6 6Tgrepl  _gdebug _ghandler  / Xgfilenamefsystem/repl/command.scmŒ Ê ŒŒ  Ï ŒŒ  Ð ŒŒ  Ð "ŒŒ - Ð ŒŒ / Ï ŒŒ / Ï ŒŒ 2 Ñ ŒŒ V Ò ŒŒ X Ò ŒŒ ] Ê ŒŒ  _ g documentationfifinish Run until the current frame finishes. Resume execution, breaking when the current frame finishes.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ Ê ŒŒ  > C0‚ÅŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ Ê ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ Ê ŒŒ  , C>"Gî,Žïhq]L456igframe  gfilenamefsystem/repl/command.scmŒ Ü ŒŒ  Ý ŒŒ Ý ŒŒ  Ch[]OCSgk  gfilenamefsystem/repl/command.scmŒ Ø ŒŒ  C0ã4Aóôõö h@Ì]454L>"G4455 4  L56Ägstack =gfilenamefsystem/repl/command.scmŒ  × ŒŒ × ŒŒ Þ ŒŒ  Þ ŒŒ  Þ ŒŒ ! ß ŒŒ $ ß ŒŒ ( ß 'ŒŒ * ß ŒŒ , ß <ŒŒ . ß ŒŒ 1 à ŒŒ = ß ŒŒ  = Ch0©]45U4O>XCXFG@¡gmsg  ,ghandler  ,gargs  ! ,gfilenamefsystem/repl/command.scmŒ Ô ŒŒ  × ŒŒ  , gnamegrepl-next-resumerŒCúR4)i¹¡0û¨¹üúýþ<ãÉ hhd]45$K44545£544545£45 >"G  6 6\grepl  cgdebug cgmsg  ( \gfilenamefsystem/repl/command.scmŒ â ŒŒ  ç ŒŒ  ç ŒŒ ( ç ŒŒ ( ç ŒŒ + è ŒŒ = è &ŒŒ N è ŒŒ Z ê ŒŒ \ ê ŒŒ a â ŒŒ  c g documentationfustep Step until control reaches a different source location. Step until control reaches a different source location.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ â ŒŒ  > C0‚¹ŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ â ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ â ŒŒ  , C>"G4)i¼¡0û¨¹üúýþ<ãÉ hhk]45$K44545£544545£45 >"G  6 6cgrepl  cgdebug cgmsg  ( \gfilenamefsystem/repl/command.scmŒ ì ŒŒ  ñ ŒŒ  ñ ŒŒ ( ñ ŒŒ ( ñ ŒŒ + ò ŒŒ = ò &ŒŒ N ò ŒŒ Z ô ŒŒ \ ô ŒŒ a ì ŒŒ  c g documentationf|step-instruction Step until control reaches a different instruction. Step until control reaches a different VM instruction.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ ì ŒŒ  > C0‚¼ŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ ì ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ ì ŒŒ  , C>"G4)i¿¡0û¨¹üúýþ<ãÉ hhŽ]45$K44545£544545£45 >"G  6 6†grepl  cgdebug cgmsg  ( \gfilenamefsystem/repl/command.scmŒ ö ŒŒ  û ŒŒ  û ŒŒ ( û ŒŒ ( û ŒŒ + ü ŒŒ = ü &ŒŒ N ü ŒŒ Z þ ŒŒ \ þ ŒŒ a ö ŒŒ  c g documentationfŸnext Step until control reaches a different source location in the current frame. Step until control reaches a different source location in the current frame.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ ö ŒŒ  > C0‚¿ŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ ö ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ ö ŒŒ  , C>"G4)i¡0û¨¹üúýþ<ãÉ hh•]45$K44545£544545£45 >"G  6 6grepl  cgdebug cgmsg  ( \gfilenamefsystem/repl/command.scmŒ  ŒŒ   ŒŒ   ŒŒ (  ŒŒ (  ŒŒ +  ŒŒ =  &ŒŒ N  ŒŒ Z  ŒŒ \  ŒŒ a  ŒŒ  c g documentationf¦next-instruction Step until control reaches a different instruction in the current frame. Step until control reaches a different VM instruction in the current frame.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ  ŒŒ  > C0‚ÂŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ  ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ  ŒŒ  , C>"G4)iÇ53æÿ0èé¯ê h@Ê]445545$45456 6Âgrepl  @gform  @gproc   @gidx  & 8gfilenamefsystem/repl/command.scmŒ  ŒŒ   ŒŒ   ŒŒ   ŒŒ   ŒŒ   ŒŒ   ŒŒ  ŒŒ &  ŒŒ -  ŒŒ 0  *ŒŒ 8  ŒŒ <  ŒŒ @  ŒŒ  @ g documentationf­tracepoint PROCEDURE Add a tracepoint to PROCEDURE. A tracepoint will print out the procedure and its arguments, when it is called, and its return value(s) when it returns.ŒC0‚ÇŒŽhà ]3ˆ$·Žˆ$Žˆ$KŽ4>"G445>"G"4>"G"4>"G"4>"G6g form-name  ßgkey  ßgargs   ßgvx   ¼gvy   ¼gvx  —gvy  —gvx  1 rgvy  1 r gfilenamefsystem/repl/command.scmŒ  ŒŒ  ß gnameghandle-read-errorŒC,š¡Z§©h0^-.,3#4544L55456Vgport .gfilenamefsystem/repl/command.scmŒ  ŒŒ . ChJ]LO6Bgfilenamefsystem/repl/command.scmŒ  ŒŒ   C6hm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ  ŒŒ  C(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ  ŒŒ  > Chm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ  ŒŒ  C hPœ]45U64OO544O5>XCXFGC”grepl  Mghandle-read-error  Mgform  $ Bgk  F Mgfilenamefsystem/repl/command.scmŒ  ŒŒ  M C>"G4)iÊ0 0éh(œ]4545$"6”gidx  %gfilenamefsystem/repl/command.scmŒ  ŒŒ   ŒŒ  ŒŒ  ! ŒŒ  ! ŒŒ  ! 4ŒŒ # ! 7ŒŒ %  ŒŒ  % Ch 3] 45(66+grepl  gtraps  gfilenamefsystem/repl/command.scmŒ  ŒŒ   ŒŒ   ŒŒ   ŒŒ   ŒŒ   ŒŒ   ŒŒ   g documentationfxtraps Show the set of currently attached traps. Show the set of currently attached traps (breakpoints and tracepoints).ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ  ŒŒ  > C0‚ÊŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ  ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ  ŒŒ  , C>"G4)iÌÔ¯h Ú]45$66Ògrepl  gidx  gfilenamefsystem/repl/command.scmŒ $ ŒŒ  ) ŒŒ ) ŒŒ  + ŒŒ  * ŒŒ  * ŒŒ   g documentationf)delete IDX Delete a trap. Delete a trap.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ $ ŒŒ  > C0‚ÌŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ $ ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ $ ŒŒ  , C>"G4)iÏÔ¯h Ý]45$66Õgrepl  gidx  gfilenamefsystem/repl/command.scmŒ - ŒŒ  2 ŒŒ 2 ŒŒ  4 ŒŒ  3 ŒŒ  3 ŒŒ   g documentationf,disable IDX Disable a trap. Disable a trap.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ - ŒŒ  > C0‚ÏŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ - ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ - ŒŒ  , C>"G4)iÑÔ¯h Ú]45$66Ògrepl  gidx  gfilenamefsystem/repl/command.scmŒ 6 ŒŒ  ; ŒŒ ; ŒŒ  = ŒŒ  < ŒŒ  < ŒŒ   g documentationf)enable IDX Enable a trap. Enable a trap.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ 6 ŒŒ  > C0‚ÑŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ 6 ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ 6 ŒŒ  , C>"G4)iÓ¡ ¨¹0Éh0Û] 45$4545£66Ógrepl  +gdebug +gfilenamefsystem/repl/command.scmŒ ? ŒŒ $ D ŒŒ ) ? ŒŒ  + g documentationfEregisters Print registers. Print the registers of the current frame.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ ? ŒŒ  > C0‚ÓŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ ? ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ ? ŒŒ  , C>"G4)i n0 h8-.,3#4>"G456grepl 3gx 3gfilenamefsystem/repl/command.scmŒ F ŒŒ  L ŒŒ , M ŒŒ - M 1ŒŒ 3 M ŒŒ 3 g documentationfpwidth [X] Set debug output width. Set the number of screen columns in the output from `backtrace' and `locals'.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ F ŒŒ  > C0‚ ŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ F ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ F ŒŒ  , C>"G4)iHl3 Jh(] 44455> G6ùgrepl  &gform  &gargs   &gfilenamefsystem/repl/command.scmŒ U ŒŒ  X ŒŒ  X ŒŒ X 2ŒŒ  X ŒŒ  X ŒŒ & Z ŒŒ  & g documentationf4inspect EXP Inspect the result(s) of evaluating EXP.ŒC0‚HŒŽhà ]3ˆ$·Žˆ$Žˆ$KŽ4>"G445>"G"4>"G"4>"G"4>"G6g form-name  ßgkey  ßgargs   ßgvx   ¼gvy   ¼gvx  —gvy  —gvx  1 rgvy  1 r gfilenamefsystem/repl/command.scmŒ U ŒŒ  ß gnameghandle-read-errorŒC,š¡Z§©h0^-.,3#4544L55456Vgport .gfilenamefsystem/repl/command.scmŒ U ŒŒ . ChJ]LO6Bgfilenamefsystem/repl/command.scmŒ U ŒŒ   C6hm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ U ŒŒ  C(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ U ŒŒ  > Chm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ U ŒŒ  C hPœ]45U64OO544O5>XCXFGC”grepl  Mghandle-read-error  Mgform  $ Bgk  F Mgfilenamefsystem/repl/command.scmŒ U ŒŒ  M C>"G4)iBl3 \]Dh m]4>"G6egx  gfilenamefsystem/repl/command.scmŒ b ŒŒ  c ŒŒ  d ŒŒ   Ch( ] 44455> G6grepl  &gform  &gargs   &gfilenamefsystem/repl/command.scmŒ \ ŒŒ  _ ŒŒ  _ ŒŒ _ 2ŒŒ  _ ŒŒ  _ ŒŒ & a ŒŒ  & g documentationf>pretty-print EXP Pretty-print the result(s) of evaluating EXP.ŒC0‚BŒŽhà ]3ˆ$·Žˆ$Žˆ$KŽ4>"G445>"G"4>"G"4>"G"4>"G6g form-name  ßgkey  ßgargs   ßgvx   ¼gvy   ¼gvx  —gvy  —gvx  1 rgvy  1 r gfilenamefsystem/repl/command.scmŒ \ ŒŒ  ß gnameghandle-read-errorŒC,š¡Z§©h0^-.,3#4544L55456Vgport .gfilenamefsystem/repl/command.scmŒ \ ŒŒ . ChJ]LO6Bgfilenamefsystem/repl/command.scmŒ \ ŒŒ   C6hm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ \ ŒŒ  C(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ \ ŒŒ  > Chm-13L6egk gargs gfilenamefsystem/repl/command.scmŒ \ ŒŒ  C hPœ]45U64OO544O5>XCXFGC”grepl  Mghandle-read-error  Mgform  $ Bgk  F Mgfilenamefsystem/repl/command.scmŒ \ ŒŒ  M C>"G4)iÛÛh’]6Šgrepl  gfilenamefsystem/repl/command.scmŒ l ŒŒ  o ŒŒ   g documentationfgc Garbage collection.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ l ŒŒ  > C0‚ÛŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ l ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ l ŒŒ  , C>"G4)iÝ   !"#$%&'()*+,-.V&h€;]a4545454545454 >"G4 >"G4 54 54 >"G4˜>"G4 >"G45454 >"G4>"G4 >"G45454 >"G4>"G4 >"G4545454545454545    4  >"G4!>"G4">"G4#  >"G4$  >"G4 >"G    44%5>"G4%563grepl  |gthis-tms  |gthis-gcs   |glast-tms   |glast-gcs   |g this-times  4 gg last-times  4 gg this-heap  y Åg this-free  y Åg this-alloc  ×  g last-alloc  ×  g this-total  2 xg last-total  2 xg this-utime  ° Vg last-utime  ° Vg this-stime  ° Vg last-stime  ° Vg this-cutime ° Vg last-cutime ° Vg this-cstime ° Vg last-cstime ° Vgfilenamefsystem/repl/command.scmŒ q ŒŒ  t ŒŒ  u ŒŒ v ŒŒ  w ŒŒ  t ŒŒ # y ŒŒ ) y *ŒŒ + y ŒŒ , z ŒŒ 2 z *ŒŒ 4 z ŒŒ 4 y ŒŒ 9 { ŒŒ = { ŒŒ D { >ŒŒ I { ŒŒ R | ŒŒ h ~ ŒŒ n ~ )ŒŒ p ~ ŒŒ q  ŒŒ w  *ŒŒ y  ŒŒ y ~ ŒŒ ~ € ŒŒ ‚ € ŒŒ „ € )ŒŒ † € 3ŒŒ ‹ € ŒŒ ”  ŒŒ ˜  ŒŒ ž  ŒŒ ¢  @ŒŒ §  ŒŒ ° ‚ ŒŒ Æ „ ŒŒ Ì „ )ŒŒ Î „ ŒŒ Ï … ŒŒ Õ … )ŒŒ × … ŒŒ × „ ŒŒ Ü † ŒŒ à † ŒŒ â † -ŒŒ ä † 4ŒŒ é † ŒŒ ò ‡ ŒŒ ö ‡ ŒŒ ý ‡ >ŒŒ  ‡ ŒŒ  ˆ ŒŒ ! Š ŒŒ ' Š )ŒŒ ) Š ŒŒ * ‹ ŒŒ 0 ‹ )ŒŒ 2 ‹ ŒŒ 2 Š ŒŒ 7 Œ ŒŒ ; Œ ŒŒ = Œ +ŒŒ ? Œ 2ŒŒ D Œ ŒŒ M  ŒŒ Q  ŒŒ Z  ŒŒ c Ž ŒŒ y  ŒŒ € ‘ ŒŒ ‡ ’ ŒŒ Ž “ ŒŒ • ” ŒŒ œ • ŒŒ £ – ŒŒ ª — ŒŒ °  ŒŒ Á ˜ ŒŒ Å ˜ ŒŒ Ç ˜ 0ŒŒ É ˜ 7ŒŒ Î ˜ ŒŒ × ™ ŒŒ Û ™ ŒŒ ä ™ ŒŒ í š ŒŒ ñ š ŒŒ ú š ŒŒ  › ŒŒ  › ŒŒ  › ŒŒ  œ ŒŒ  œ ŒŒ & œ ŒŒ /  ŒŒ W   ŒŒ | ¡ ŒŒc  | g documentationfstatistics Display statistics.ŒC,(¶¸ÌÏh@|]4455"%4545$6Œ"ÿÿÛ"ÿÿÔtgport >gout  7gx   7gfilenamefsystem/repl/command.scmŒ q ŒŒ  > C0‚ÝŒŽhèÔ-13ˆ$´Žˆ$Žˆ$JŽ4>"G445>"G"4>"G"4>"G"4>"G6Ìgk âgargs âgvx   Àgvy   Àgvx  ' œgvy  ' œgvx  8 xgvy  8 xgfilenamefsystem/repl/command.scmŒ q ŒŒ â Ch0k] 45U445>XCXFGCcgrepl  ,gk % ,gfilenamefsystem/repl/command.scmŒ q ŒŒ  , C>"G0/0h0] 4$"56gtitle  )gflag  )gfield1   )gfield2   )gunit   )gfmt   )gfilenamefsystem/repl/command.scmŒ £ ŒŒ  ¤ ŒŒ  ¤ ŒŒ  ¤ 8ŒŒ  ¤ AŒŒ  ¤ DŒŒ  ¤ ŒŒ  ¤ ŒŒ ) ¥ ŒŒ  ) gnameg display-statŒCRh·]6¯gtitle  gfield1  gfield2   gfilenamefsystem/repl/command.scmŒ § ŒŒ ¨ 'ŒŒ  ¨ ŒŒ   gnamegdisplay-stat-titleŒCRhÖ]˜6Îgtitle  gflag  gthis   glast   gunit   gfilenamefsystem/repl/command.scmŒ ª ŒŒ « ŒŒ  « ŒŒ   gnamegdisplay-diff-statŒCR012k3h@8] ˜44›5544›5560gtitle  9gthis  9glast   9gnum  #gfilenamefsystem/repl/command.scmŒ ­ ŒŒ ° ŒŒ ° ŒŒ  ¯ ŒŒ  ¯ ŒŒ  ¯ ŒŒ  ¯ (ŒŒ  ¯ ŒŒ ¯ ŒŒ ) ¯ ŒŒ * ¯ ŒŒ 1 ¯ (ŒŒ 3 ¯ ŒŒ 5 ¯ ŒŒ 7 ° :ŒŒ 9 ° ŒŒ  9 gnamegdisplay-time-statŒC%R40156h`Î]˜˜ ‘$"4››5 ‘$"4››56Ægtitle  [g this-time  [g this-clock   [g last-time   [g last-clock   [gtime   9gclock   9gfilenamefsystem/repl/command.scmŒ ² ŒŒ ¶ ŒŒ  ¶ .ŒŒ  ¶ ŒŒ  ´ ŒŒ  ´ ŒŒ  ´ ŒŒ $ ´ ŒŒ ) ´ %ŒŒ . ´ .ŒŒ 0 ´ <ŒŒ 1 ´ .ŒŒ 3 ´ ŒŒ = ´ ŒŒ A ´ ŒŒ C ´ ŒŒ H ´ ŒŒ M ´ %ŒŒ R ´ .ŒŒ T ´ <ŒŒ U ´ .ŒŒ W ´ ŒŒ Y · ,ŒŒ [ µ ŒŒ  [ gnamegdisplay-mips-statŒC7RC;gm  0gfilenamefsystem/repl/command.scmŒ   ŒŒ 2 3 ŒŒ 5 2 ŒŒ 7 H ŒŒ : G ŒŒ Ë J ŒŒ _ K ŒŒ ` M ŒŒ i M ŒŒ ý N ŒŒ  O ŒŒ = P ŒŒ ê Q ŒŒ • R ŒŒ L T ŒŒ ê W ŒŒ ’ Z ŒŒ o ] ŒŒ » a ŒŒ a h ŒŒ / k ŒŒ H s ŒŒ O | ŒŒ  ŒŒ › “ ŒŒ  ¡ ŒŒ ª ¤ ŒŒ ² ± ŒŒ !° ú ŒŒ .q % ŒŒ 5™ > ŒŒ : D ŒŒ >Q J ŒŒ B© P ŒŒ G U ŒŒ O ` ŒŒ U¡ p ŒŒ Yá z ŒŒ _Y ƒ ŒŒ e9  ŒŒ i± • ŒŒ o) ž ŒŒ t ¤ ŒŒ |A » ŒŒi Ê ŒŒ‰ Ñ ŒŒ Ö ŒŒ• Ý ŒŒn ä ŒŒo ç ŒŒ¥b 𠌌©á ú ŒŒ³2  ŒŒº’  ŒŒÆ’ < ŒŒÌi I ŒŒÓ¹ _ ŒŒÚ‘ t ŒŒá) ˆ ŒŒåá  ŒŒêù ” ŒŒð œ ŒŒøJ § ŒŒì ± ŒŒí Ê ŒŒ Ô ŒŒ Ž â ŒŒ ì ŒŒ™ ö ŒŒA  ŒŒ!ñ  ŒŒ*r  ŒŒ0I $ ŒŒ4á - ŒŒ9 6 ŒŒ> ? ŒŒBÉ F ŒŒG± U ŒŒOJ \ ŒŒW’ l ŒŒ[Á q ŒŒiè £ ŒŒjË § ŒŒkÒ ª ŒŒml ­ ŒŒo ² ŒŒW oÄ C6PK!©'Çfã,ã, repl/repl.gonu„[µü¤GOOF----LE-8-2.0Ë,]·4h" ] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ grepl¤ ¤ gfilenameS¤ fsystem/repl/repl.scm¤ gimportsS¤ gbase¤ gsyntax¤   ¤ ¤ gpmatch¤  ¤ ¤ gcompile¤  ¤ ¤ glanguage¤  ¤ ¤ gvm¤ ¤ ¤ gerror-handling¤ ¤ ¤ gcommon¤ ¤ ! ¤ "gcommand¤ #"¤ $#¤ %gice-9¤ &gcontrol¤ '%&¤ ('¤ )!$( ¤ *gexportsS¤ +g start-repl¤ ,grun-repl¤ -+,¤ .gset-current-module¤ /.¤ 0.¤ 1g read-char¤ 2g eof-object?¤ 3gread-scheme-line-comment¤ 4gread¤ 5gread-scheme-datum-comment¤ 6g language-name¤ 7gscheme¤ 8g peek-char¤ 9g unread-char¤ :g read-comment¤ ;gmeta¤ gwith-input-from-port¤ ?gflush-leading-whitespace¤ @glanguage-reader¤ Ag meta-reader¤ Bg char-ready?¤ Cgflush-all-input¤ Dgcatch¤ Eg repl-reader¤ Fg repl-prompt¤ Gg repl-language¤ Hgcurrent-module¤ Igquit¤ Jgthrow¤ Kgformat¤ Lgcurrent-output-port¤ MfWhile reading expression: ¤ Ngprint-exception¤ Ogprompting-meta-read¤ PgdebugS¤ QP Œ¤ RQ¤ Sgcurrent-language¤ Tg start-repl*¤ Ug parameter?¤ VU¤ WU¤ Xg scm-error¤ Ygwrong-type-arg¤ Zf parameterize¤ [fNot a parameter: ~S¤ \g run-repl*¤ ]g make-repl¤ ^gmake-syntax-transformer¤ _^¤ `^¤ agabort-on-error¤ bgmacro¤ cg $sc-dispatch¤ dc¤ ec¤ fgany¤ gfff¤ hg syntax-object¤ igtop¤ ji¤ kgribcage¤ lgdummy¤ mgstring¤ ngexp¤ olmn¤ pgm-1e9e6487f-43¤ qpi¤ rqjj¤ sfl-1e9e6487f-48¤ tfl-1e9e6487f-49¤ ufl-1e9e6487f-4a¤ vstu¤ wkorv¤ xk¤ ygx¤ zy¤ {q¤ |fl-1e9e6487f-45¤ }|¤ ~kz{}¤ jwx~¤ €ghygiene¤ €¤ ‚hD¤ ƒh¤ „glambda¤ …h„¤ †gkey¤ ‡h†¤ ˆgargs¤ ‰hˆ¤ Ї‰Œ¤ ‹hK¤ Œf While ~A:~%¤ hŒ¤ ŽhN¤ hL¤ ¤ ‘h¤ ’Ž‘‡‰¤ “gabort¤ ”h“¤ •”¤ –’•¤ —gsyntax-violation¤ ˜—¤ ™—¤ šf-source expression failed to match any pattern¤ ›gdefault-prompt-tag¤ œg %start-stack¤ œ¤ žœ¤ Ÿ'›¤  '›¤ ¡g *repl-stack*¤ ¢g repl-welcome¤ £g meta-command¤ ¤fWhile executing meta-command:~%¤ ¥gnewline¤ ¦gflush-to-newline¤ §gcall-with-error-handling¤ ¨grepl-prepare-eval-thunk¤ ©g repl-parse¤ ªfparsing expression¤ «fcompiling expression¤ ¬grun-hook¤ ­gbefore-eval-hook¤ ®gon-errorS¤ ¯grepl-option-ref¤ °gon-error¤ ±gfor-each¤ ²g repl-print¤ ³g trap-handlerS¤ ´gdisabled¤ µgchar-whitespace?¤ ¶gchar=?¤C5hèá]4   )*-540>"G12h8ì]"*4545$C †$C"ÿÿÖ"ÿÿÒägport  4gch 0gt   0gfilenamefsystem/repl/repl.scmŒ ) ŒŒ  * ŒŒ  + ŒŒ + ŒŒ  , ŒŒ  , ŒŒ & - ŒŒ * , ŒŒ + - ŒŒ 0 . ŒŒ 0 * ŒŒ  4 gnamegread-scheme-line-commentŒC3R4h‡]6gport  gfilenamefsystem/repl/repl.scmŒ 0 ŒŒ  1 ŒŒ   gnamegread-scheme-datum-commentŒC5R6713859h°] 45&š;†$&4>"G4>"GC#†$`4>"G45;†$&4>"G4>"GC4#>"GCCC glang  «gport  «gch   «gkey  ` §gfilenamefsystem/repl/repl.scmŒ 4 ŒŒ  5 ŒŒ 5 !ŒŒ  5 ŒŒ  6 ŒŒ  8 ŒŒ + 9 ŒŒ G 6 ŒŒ H < ŒŒ Z = ŒŒ ` = ŒŒ l ? ŒŒ ~ @ ŒŒ ’ G ŒŒ  « gnameg read-commentŒC:R;"Œ?21<:@hX¸]4545$6,†$4>"GC4LL5$C4L5LL6°gch  Rgfilenamefsystem/repl/repl.scmŒ W ŒŒ  X ŒŒ  X ŒŒ Y ŒŒ  Y ŒŒ  Z ŒŒ  [ ŒŒ ! Y ŒŒ " \ ŒŒ 5 ^ ŒŒ C Y ŒŒ F ` ŒŒ R ` ŒŒ  R Ch0k-.,3#45LLO6cgport *gfilenamefsystem/repl/repl.scmŒ U ŒŒ  U ŒŒ * V ŒŒ * Ch‚]OCzglang  genv  gfilenamefsystem/repl/repl.scmŒ T ŒŒ  gnameg meta-readerŒCARB281Ch8¢]45$$4455$C4>"G6Cšgfilenamefsystem/repl/repl.scmŒ b ŒŒ  c ŒŒ c ŒŒ d ŒŒ  d ŒŒ  d ŒŒ  c ŒŒ  f ŒŒ / g ŒŒ  1 gnamegflush-all-inputŒCCRDEFhO]L6Ggfilenamefsystem/repl/repl.scmŒ s ŒŒ  s ŒŒ   CAGHh o]LO44L54556ggfilenamefsystem/repl/repl.scmŒ r ŒŒ t ŒŒ  t ŒŒ  t 5ŒŒ  t ŒŒ  s ŒŒ   CIJKLMNCh`¼-13†$@445>"G445>"G4>"GC´gkey ]gargs ]gfilenamefsystem/repl/repl.scmŒ u ŒŒ  v ŒŒ  x ŒŒ  z ŒŒ  z ŒŒ $ z 'ŒŒ ) z ŒŒ 2 { ŒŒ 5 { ŒŒ C { ŒŒ L | ŒŒ ] Ch]O6ygrepl  gfilenamefsystem/repl/repl.scmŒ p ŒŒ  q ŒŒ   gnamegprompting-meta-readŒCORRSTOh8§-/03#45#6Ÿglang  3gdebug  3gfilenamefsystem/repl/repl.scmŒ … ŒŒ  … &ŒŒ 3 † ŒŒ  3 gdebugS Œgnameg start-replŒC+RSWXYZ[\] hXæ] 45$"4>"G ©4 ©5Y445>ZCZFÞglang  Xgdebug  Xgprompting-meta-read   Xgt-1e9e6487f-3e   Xgfilenamefsystem/repl/repl.scmŒ ‰ ŒŒ  Œ ŒŒ B ŒŒ E ŒŒ T ŒŒ  X gnameg start-repl*ŒCTR4`abeg‚ƒ…Š‹–h(R]ŒŒŒCJgdummy  &gstring  &gexp   &  & C™šh(©] 45$@6¡gx  "gtmp "gfilenamefsystem/repl/repl.scmŒ ŒŒ  " g macro-typeg syntax-rulesŒgpatternsgstringgexpC5aR\Ohx]6pgrepl  gfilenamefsystem/repl/repl.scmŒ ˜ ŒŒ ™ ŒŒ  gnamegrun-replŒC,R›žhQ]L6Igfilenamefsystem/repl/repl.scmŒ ž !ŒŒ  ž 1ŒŒ   ChI]LO6Agfilenamefsystem/repl/repl.scmŒ  ž !ŒŒ   ChQ]LL6Igfilenamefsystem/repl/repl.scmŒ   /ŒŒ    :ŒŒ   Ch8¹]45U4O>XCXFGO"ÿÿϱgthunk  3gk  3gproc   3gfilenamefsystem/repl/repl.scmŒ œ ŒŒ  ŒŒ ŒŒ 3   ŒŒ  3 gnamegwith-stack-and-promptŒC ¡¢<D£hQ]L6Igfilenamefsystem/repl/repl.scmŒ ¬ ŒŒ  ­ ŒŒ   CI“K¤NLh8³-13&64>"G456«gk 8gargs 8gfilenamefsystem/repl/repl.scmŒ ® ŒŒ ¯ ŒŒ  ¯ ŒŒ  ° ŒŒ  ² ŒŒ  ² "ŒŒ " ² ŒŒ - ³ (ŒŒ 8 ³ ŒŒ 8 C2¥“¦§DI D¨D©hQ]LL6Igfilenamefsystem/repl/repl.scmŒ Å 'ŒŒ Æ )ŒŒ  CKŒªNL“h@-134>"G445>"G6wgkey <gargs <gfilenamefsystem/repl/repl.scmŒ Å 'ŒŒ  Å 7ŒŒ  Å 'ŒŒ < Ch Z]L4LLO56Rgfilenamefsystem/repl/repl.scmŒ  $ŒŒ  Å 'ŒŒ  à &ŒŒ   CKŒ«NL“h@ˆ-134>"G445>"G6€gkey <gargs <gfilenamefsystem/repl/repl.scmŒ  $ŒŒ  Å 'ŒŒ   4ŒŒ   $ŒŒ < C¬­§hQ]LL6Igfilenamefsystem/repl/repl.scmŒ É ŒŒ  Ê "ŒŒ   C®¯°±²ha]L6Ygv  gfilenamefsystem/repl/repl.scmŒ Î "ŒŒ Ï $ŒŒ  Chxí]45UI4LLO54L>"G4LO 4 L 5> X" G " G  LO6ågthunk  Ogk U _gl ` rgfilenamefsystem/repl/repl.scmŒ ¾ ŒŒ  Á ŒŒ  $ŒŒ  Á ŒŒ Ç ŒŒ 4 È ŒŒ B Ë +ŒŒ H Ë AŒŒ J Ë +ŒŒ O È ŒŒ X Á ŒŒ _ Ì )ŒŒ c ¿ ŒŒ r Î ŒŒ  r C“ht-136lgk gargs gfilenamefsystem/repl/repl.scmŒ Ñ ŒŒ  Ò ŒŒ  ChZ]LLLO6Rgfilenamefsystem/repl/repl.scmŒ ¼ ŒŒ  ½ ŒŒ  ½ ŒŒ   C®¯°³´h(]OQ45U[$"ŒY[Ž(4>"G""¹45†$"&4O>"G"j4 5$%4 >"G4 >"G":4 >"G4 O45>"G4 >"G"ÿÿG"ÿÿC Z"XCXFGCgrepl  (gprompting-meta-read  (gwith-stack-and-prompt  (gt  2gexp  ^ gk   (gstatus   (gfilenamefsystem/repl/repl.scmŒ › ŒŒ  ¢ ŒŒ £ ŒŒ / £ <ŒŒ 3 £ ŒŒ 9 ¤ ŒŒ = ¤ ŒŒ > ¥ ŒŒ W ¦ ŒŒ X § ŒŒ ^ § ŒŒ d © ŒŒ h ¨ ŒŒ u « ŒŒ “ ´ ŒŒ ¨ ŒŒ ž µ ŒŒ ® ¶ ŒŒ ± ¶ ŒŒ ¶ ¶ ŒŒ à º ŒŒ Ó » ŒŒ ã Ó ŒŒ é Ó /ŒŒ ë Ó ŒŒ ï Ô ŒŒ ô » ŒŒ ý Õ ŒŒ  Ö ŒŒ  ¦ ŒŒ ! ¢ ŒŒ  ( gnameg run-repl*ŒC\R82µ1?h@Å]4545$C45$4>"G6C½gch  9gfilenamefsystem/repl/repl.scmŒ Û ŒŒ  Ü ŒŒ  Ü ŒŒ Ý ŒŒ  Ý ŒŒ  Þ ŒŒ " Ý ŒŒ # Þ !ŒŒ 6 Þ -ŒŒ  9 gnamegflush-leading-whitespaceŒC?RB82µ1¶¦hXá]45$G4545$"45$#4>"G4 5$C6CCÙgch  Rgfilenamefsystem/repl/repl.scmŒ á ŒŒ  â ŒŒ â ŒŒ ã ŒŒ  ã ŒŒ  ä ŒŒ  ä ŒŒ # ä (ŒŒ - ä ŒŒ . æ ŒŒ > ç ŒŒ J ç ŒŒ P è ŒŒ  T gnamegflush-to-newlineŒC¦RCÙgm  ,gfilenamefsystem/repl/repl.scmŒ   ŒŒ g ) ŒŒ  0 ŒŒ î 4 ŒŒ ð R !ŒŒ ò R 'ŒŒ ó R ŒŒ ö R ŒŒ u T ŒŒ m b ŒŒ d p ŒŒ b … ŒŒ Á ‰ ŒŒ ë ˜ ŒŒ b › ŒŒ ˆ Û ŒŒ ä á ŒŒ  æ C6PK!<5§^77repl/common.gonu„[µü¤GOOF----LE-8-2.07]ª4h|] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ grepl¤ gcommon¤ ¤ gfilenameS¤ fsystem/repl/common.scm¤ gimportsS¤ gbase¤ gsyntax¤  ¤ ¤ gcompile¤  ¤ ¤ glanguage¤  ¤ ¤ gmessage¤  ¤ ¤ gvm¤ gprogram¤ ¤ ¤ gice-9¤ gcontrol¤ ¤ ! ¤ "ghistory¤ #"¤ $#¤ %!$¤ &gexportsS¤ 'g¤ (g make-repl¤ )g repl-language¤ *g repl-options¤ +g repl-tm-stats¤ ,g repl-gc-stats¤ -g repl-debug¤ .g repl-welcome¤ /g repl-prompt¤ 0g repl-read¤ 1g repl-compile¤ 2grepl-prepare-eval-thunk¤ 3g repl-eval¤ 4g repl-expand¤ 5g repl-optimize¤ 6g repl-parse¤ 7g repl-print¤ 8grepl-option-ref¤ 9grepl-option-set!¤ :grepl-default-option-set!¤ ;grepl-default-prompt-set!¤ string¤ >g user-error¤ ?g *warranty*¤ @g *copying*¤ Ag *version*¤ B'()*+,-./0123456789:;<=>?@A¤ Cg autoloadsS¤ Dgtree-il¤ Egoptimize¤ FDE¤ Gg optimize!¤ HG¤ IFH¤ Jgset-current-module¤ KJ¤ LJ¤ Mgformat¤ NfGNU Guile ~A Copyright (C) 1995-2016 Free Software Foundation, Inc. Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'. This program is free software, and you are welcome to redistribute it under certain conditions; type `,show c' for details.¤ Ogversion¤ PfqGuile is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Guile is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see .¤ Qf8Guile is distributed WITHOUT ANY WARRANTY. The following sections from the GNU General Public License, version 3, should make that clear. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. See , for more details.¤ Rgmake-record-type¤ Sf¤ Tgoptions¤ Ugtm-stats¤ Vggc-stats¤ Wgdebug¤ XTUVW¤ Ygrecord-constructor¤ Zg%compute-initargs¤ [grecord-predicate¤ \grepl?¤ ]gmake-procedure-with-setter¤ ^grecord-accessor¤ _grecord-modifier¤ `g copy-tree¤ agcompile-options¤ bg%auto-compilation-options¤ c¤ dgtrace¤ ed¤ fginterp¤ gf¤ hgprompt¤ igstring?¤ jgthunk?¤ kg procedure?¤ lgerror¤ mfInvalid prompt¤ ngprint¤ ofInvalid print procedure¤ pg value-history¤ qgvalue-history-enabled?¤ rgenable-value-history!¤ sgdisable-value-history!¤ tg->bool¤ ugon-error¤ vg backtrace¤ wgreport¤ xgpass¤ yf)Bad on-error value ~a; expected one of ~a¤ zWvwx¤ {grepl-default-options¤ |g %make-repl¤ }glanguageS¤ ~g language?¤ glookup-language¤ €goptionsS¤ gtm-statsS¤ ‚gtimes¤ ƒggc-statsS¤ „gdebugS¤ …gdisplay¤ †gnewline¤ ‡fEnter `,help' for help. ¤ ˆf ~A@~A~A> ¤ ‰g language-name¤ Šg module-name¤ ‹gcurrent-module¤ Œglength¤ g *repl-stack*¤ Žf¤ f [~a]¤ glanguage-reader¤ ‘gcurrent-input-port¤ ’grepl-compile-options¤ “gfromS¤ ”gtoS¤ •gobjcode¤ –goptsS¤ —genvS¤ ˜g decompile¤ ™glanguage-parser¤ šglanguage-evaluator¤ ›g make-program¤ œglanguage-compilers¤ gdefault-prompt-handler¤ ž ¤ Ÿ ¤  gdefault-prompt-tag¤ ¡  ¤ ¢  ¤ £grun-hook¤ ¤gbefore-print-hook¤ ¥gwrite¤ ¦gassq¤ §funknown repl option¤ ¨gobject->string¤ ©gthrow¤C5hø¹]4    %&BCI5 4L>"G4MiN4Oi55ARP@RQ?R4RiSX5'RTUVW4Yi'i5Zh.-13L4L5@&gargs   CO(R4[i'i5\R4]i4^i'i54_i'i55)R4]i4^i'iT54_i'iT55*R4]i4^i'iU54_i'iU55+R4]i4^i'iV54_i'iV55,R4]i4^i'iW54_i'iW55-R4`iabicŒŒeghih\]LCTgrepl  gfilenamefsystem/repl/common.scmŒ u &ŒŒ   Cjhd]L6\grepl  gfilenamefsystem/repl/common.scmŒ v %ŒŒ  v 4ŒŒ   CklmhH¦]$<45$OC45$OC45$C6Cžgprompt  Fgfilenamefsystem/repl/common.scmŒ r ŒŒ  s ŒŒ u ŒŒ  s ŒŒ  v ŒŒ & s ŒŒ / w ŒŒ 9 s ŒŒ @ x !ŒŒ D x ŒŒ  F Cnkloh …]$45$C6C}gprint  gfilenamefsystem/repl/common.scmŒ y ŒŒ  z ŒŒ | ŒŒ  z ŒŒ  } ŒŒ  } ŒŒ  Cp4qi5rsth8~]$4>"G"4>"G6vgx  2gfilenamefsystem/repl/common.scmŒ € ŒŒ  ŒŒ ŒŒ  'ŒŒ 2 ‚ ŒŒ  2 CuWWvwxlyzh@‡]&"&"&"‚$C6gx  ?gfilenamefsystem/repl/common.scmŒ † ŒŒ ‡ ŒŒ 2 ‡ ŒŒ 9 ‰ ŒŒ = … ŒŒ ? ‰ ŒŒ  ? C5{R(i|R|}~€`{‚ƒV„ hPÄ-.,3#45$"45454 5 4 5 6 ¼glang Ngdebug Ngfilenamefsystem/repl/common.scmŒ Œ ŒŒ  ŒŒ $ ŒŒ + ŒŒ 4 ŒŒ = ‘ ŒŒ D ’ ŒŒ N ŒŒ N gnameg make-replŒC(R…A†‡h@¢]4>"G4>"G4>"G6šgrepl  :gfilenamefsystem/repl/common.scmŒ • ŒŒ  – ŒŒ  — ŒŒ % ˜ ŒŒ 8 ™ ŒŒ : ™ ŒŒ  : gnameg repl-welcomeŒC.R8hMˆ‰)Š‹ŒŽ hp|]45$6445544554  [$Ž"5 ‘$ " 4 56tgrepl  ngt ngt  : Mglevel  O lgfilenamefsystem/repl/common.scmŒ › ŒŒ  ŒŒ ŒŒ ŒŒ œ ŒŒ  ž ŒŒ    ŒŒ    ŒŒ "   *ŒŒ *   ŒŒ + ¡ ŒŒ . ¡ ŒŒ 4 ¡ ŒŒ 5 ¢ ŒŒ : ¢ !ŒŒ J ¤ (ŒŒ O ¢ ŒŒ O ¢ ŒŒ T ¥ ŒŒ Y ¥ ŒŒ [ ¥ ŒŒ ` ¥ #ŒŒ e ¥ .ŒŒ i ¥ #ŒŒ n   ŒŒ  n gnameg repl-promptŒC/R)‘‹h Ä] 445545456¼grepl  greader  gfilenamefsystem/repl/common.scmŒ § ŒŒ  ¨ ŒŒ  ¨ !ŒŒ  ¨ ŒŒ  ¨ ŒŒ  © ŒŒ  © !ŒŒ  © ŒŒ   gnameg repl-readŒC0R8ah]6‡grepl  gfilenamefsystem/repl/common.scmŒ « ŒŒ  ¬ ŒŒ ¬ ŒŒ  gnamegrepl-compile-optionsŒC’R)’“”•–—‹ h0á]45454 56 Ùgrepl  -gform  -gfrom   -gopts   -gfilenamefsystem/repl/common.scmŒ ® ŒŒ  ¯ ŒŒ ° ŒŒ  ¯ ŒŒ ± #ŒŒ ' ² ŒŒ - ± ŒŒ  - gnameg repl-compileŒC1R)’˜“”D–—‹ h@û]45454 4 55 6ógrepl  :gform  :gfrom   :gopts   :gfilenamefsystem/repl/common.scmŒ ´ ŒŒ  µ ŒŒ ¶ ŒŒ  µ ŒŒ  · ŒŒ # · .ŒŒ * ¸ ŒŒ 0 · ŒŒ 4 ¹ ŒŒ : · ŒŒ  : gnameg repl-expandŒC4R)’˜G“”D–—‹ hH]454544  4 55 4 556grepl  Fgform  Fgfrom   Fgopts   Fgfilenamefsystem/repl/common.scmŒ » ŒŒ  ¼ ŒŒ ½ ŒŒ  ¼ ŒŒ  ¾ ŒŒ  ¾ ŒŒ & ¾ 9ŒŒ - ¿ )ŒŒ 3 ¾ ŒŒ 4 À ŒŒ < ¾ ŒŒ @  ŒŒ F ¾ ŒŒ  F gnameg repl-optimizeŒC5R™)h Ï] 4455$6CÇgrepl  gform  gparser   gfilenamefsystem/repl/common.scmŒ Ä ŒŒ  Å ŒŒ  Å !ŒŒ  Å ŒŒ  Å ŒŒ  Æ ŒŒ  Æ ŒŒ   gnameg repl-parseŒC6Rš)›1œ8f‹h\]LL456Tgfilenamefsystem/repl/common.scmŒ Í ŒŒ  Í ŒŒ Í ŒŒ  C hhC]4455" 456$84455„$" 45$ OC"ÿÿµ"ÿÿ±;grepl  cgform  cgeval   cgt  4 Mgfilenamefsystem/repl/common.scmŒ È ŒŒ  É ŒŒ  É #ŒŒ  É ŒŒ  É ŒŒ  Î ŒŒ ! Î ŒŒ ! Ê ŒŒ ( Ë ŒŒ + Ë ,ŒŒ 3 Ë ŒŒ 4 Ë ŒŒ 4 Ë ŒŒ B Ì ŒŒ H Ì 'ŒŒ J Ì ŒŒ Q Ê ŒŒ  c gnamegrepl-prepare-eval-thunkŒC2R2Ÿ¢hK]L6Cgfilenamefsystem/repl/common.scmŒ  Ò ŒŒ   Ch8Ù]4545U4O>XCXFG@Ñgrepl  7gform  7gthunk  7ghandler   7gargs  , 7gfilenamefsystem/repl/common.scmŒ Ð ŒŒ  Ñ ŒŒ Ñ ŒŒ  Ò ŒŒ  7 gnameg repl-evalŒC3R£¤8n¥†hPä] &C4>"G45$64>"G6Ügrepl  Ngval  Ngt  ( Ngfilenamefsystem/repl/common.scmŒ Ô ŒŒ Õ ŒŒ × ŒŒ Ù ŒŒ & Ù ŒŒ ( Ù ŒŒ ( Ø ŒŒ 8 Ú ŒŒ 9 à ŒŒ N á ŒŒ  N gnameg repl-printŒC7R¦*l§h0à] 4455$" 45ŽCØgrepl  -gkey  -gt   *gfilenamefsystem/repl/common.scmŒ ã ŒŒ  ä ŒŒ  ä ŒŒ  ä ŒŒ  ä ŒŒ  å ŒŒ # å ŒŒ ' å ŒŒ + ä ŒŒ  - gnamegrepl-option-refŒC8R¦*l§khPU] 4455$" 45Ž4ŽŽ5$4ŽŽ5"CMgrepl  Pgkey  Pgval   Pgt   *gspec  * Pgfilenamefsystem/repl/common.scmŒ ç ŒŒ  è ŒŒ  è ŒŒ  è ŒŒ  è ŒŒ  é ŒŒ # é ŒŒ ' é ŒŒ * è ŒŒ / ê ŒŒ 0 ë ŒŒ 5 ë ŒŒ 9 ë ŒŒ = ë ŒŒ > ì ŒŒ A ì ŒŒ G ì ŒŒ N ê ŒŒ  P gnamegrepl-option-set!ŒC9R¦{l§khP9] 45$" 45Ž4ŽŽ5$4ŽŽ5"C1gkey  Kgval  Kgt  %gspec  % Kgfilenamefsystem/repl/common.scmŒ ï ŒŒ  𠌌 𠌌  ñ ŒŒ  ñ ŒŒ " ñ ŒŒ % 𠌌 * ò ŒŒ + ó ŒŒ 0 ó ŒŒ 4 ó ŒŒ 8 ó ŒŒ 9 ô ŒŒ < ô ŒŒ B ô ŒŒ I ò ŒŒ  K gnamegrepl-default-option-set!ŒC:R:hh•]6gprompt  gfilenamefsystem/repl/common.scmŒ ÷ ŒŒ  ø ŒŒ ø ŒŒ  gnamegrepl-default-prompt-set!ŒC;R…†h|]4>"G6tgx  gfilenamefsystem/repl/common.scmŒ ÿ ŒŒ  ÿ ŒŒ  ÿ ŒŒ   gnamegputsŒCstringŒC=R©>h—-136gmsg gargs gfilenamefsystem/repl/common.scmŒ  ŒŒ  ŒŒ   ŒŒ  gnameg user-errorŒC>RC±gm  0gslots t Ûg constructor t Ûgfilenamefsystem/repl/common.scmŒ   ŒŒ 1 ( ŒŒ 8 ( ŒŒ 9 - 7ŒŒ A ( ŒŒ D ' ŒŒ F 0 ŒŒ I / ŒŒ K ? ŒŒ N > ŒŒ \ j ŒŒ ¡ n ŒŒ § o ŒŒ k  ŒŒ A o ŒŒ / n ŒŒ 2 m ŒŒ 9 ‹ ŒŒ w Œ ŒŒ u • ŒŒ › ŒŒ § ŒŒ B « ŒŒ | ® ŒŒ Þ ´ ŒŒ k » ŒŒ r Ä ŒŒ ¶ È ŒŒ < Ð ŒŒ  Ô ŒŒ » ã ŒŒ € ç ŒŒ $ ï ŒŒ à ÷ ŒŒ  ÿ ŒŒ *  ŒŒ ò  ŒŒ&  ô C6PK!<67y,y, repl/debug.gonu„[µü¤GOOF----LE-8-2.0a,]±4h- ] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ grepl¤ gdebug¤ ¤ gfilenameS¤ fsystem/repl/debug.scm¤ gimportsS¤ gbase¤ gpmatch¤  ¤ ¤ gsyntax¤  ¤ ¤ glanguage¤  ¤ ¤ gvm¤ ¤ ¤ gframe¤ ¤ ¤ gice-9¤ grdelim¤ ¤ ¤ !g pretty-print¤ "!¤ #"¤ $gformat¤ %$¤ &%¤ 'ginspect¤ ('¤ )gselectS¤ *g%inspect¤ +'*Œ¤ ,+¤ -(),¤ .gprogram¤ /.¤ 0/¤ 1 #&-0 ¤ 2gexportsS¤ 3g¤ 4g make-debug¤ 5gdebug?¤ 6g debug-frames¤ 7g debug-index¤ 8gdebug-error-message¤ 9gdebug-for-trap?¤ :gterminal-width¤ ;gprint-registers¤ g print-frames¤ ?g frame->module¤ @g stack->vector¤ Agnarrow-stack->vector¤ Bgframe->stack-vector¤ C3456789:;<=>?@AB¤ Dgset-current-module¤ ED¤ FD¤ Ggmake-record-type¤ Hf¤ Igframes¤ Jgindex¤ Kg error-message¤ Lg for-trap?¤ MIJKL¤ Ngrecord-predicate¤ Ogmake-procedure-with-setter¤ Pgrecord-accessor¤ Qgrecord-modifier¤ Rg make-fluid¤ Sgcatch¤ TS¤ US¤ Vgstring->number¤ Wggetenv¤ XfCOLUMNS¤ Yginteger?¤ Zgexact?¤ [gerror¤ \f-Expected a column number (a positive integer)¤ ]gmake-hash-table¤ ^g hash-for-each¤ _g hashq-set!¤ `g hashq-ref¤ ag reverse-hashq¤ bgper-line-prefixS¤ cb Œ¤ dc¤ egcurrent-output-port¤ ff ¤ gf~aRegisters:~%¤ hgframe-instruction-pointer¤ igdisplay¤ jgrun-hook¤ kgbefore-print-hook¤ lfip = ~d ¤ mgframe-stack-pointer¤ nf sp = #x~x ¤ og frame-address¤ pf fp = #x~x ¤ qgwidthS¤ rq Œ¤ sb Œ¤ trs¤ ugframe-bindings¤ vf~aNo local variables.~%¤ wf~aLocal variables:~%¤ xgfor-each¤ ygframe-local-ref¤ zg binding:index¤ {gbinding:boxed?¤ |f~a~:[~; (boxed)~] = ~v:@y ¤ }g binding:name¤ ~gindexS¤ ~ Œ¤ €q Œ¤ gfull?S¤ ‚ Œ¤ ƒg last-sourceS¤ „ƒ Œ¤ …g next-source?S¤ †… Œ¤ ‡€‚„†¤ ˆgframe-next-source¤ ‰g frame-source¤ Šg source:file¤ ‹f current input¤ Œf unknown file¤ gand=>¤ Žgsource:line-for-user¤ g source:column¤ f ~&In ~a:~&¤ ‘f~9@a~:[~*~3_~;~3d~] ~v:@y~%¤ ’f~a:~a¤ “f¤ ”gframe-call-representation¤ •f ¤ – Œ¤ —gforward?S¤ ˜— Œ¤ ™gcountS¤ š™ Œ¤ ›g for-trap?S¤ œ› Œ¤ r–˜šœ¤ žg vector-length¤ Ÿgmax¤  gmin¤ ¡gframe-procedure¤ ¢gprogram?¤ £gprogram-module¤ ¤gcurrent-module¤ ¥g make-module¤ ¦g module-use!¤ §g make-variable¤ ¨f3~:[Read-only~;Mutable~] local variable ~a = ~70:@y ¤ ©g module-add!¤ ªg stack-length¤ «g make-vector¤ ¬gframe-previous¤ ­g stack-ref¤ ®g make-stack¤ ¯¤ °g%stacks¤C5hxß]4    12C54F>"G4GiHM53R3hÛ-13¨CÓgframes gindex g error-message  g for-trap?  gdefrec-1f507eb13-0  gfilenamefsystem/repl/debug.scmŒ 9 ŒŒ   gnameg make-debugŒC4R4Ni3i55R4Oi4Pi3iI54Qi3iI556R4Oi4Pi3iJ54Qi3iJ557R4Oi4Pi3iK54Qi3iK558R4Oi4Pi3iL54Qi3iL559R4Ri5UVWXhh]456`gfilenamefsystem/repl/debug.scmŒ E ŒŒ  E 8ŒŒ E @ŒŒ E 8ŒŒ E (ŒŒ  Ch]-13CUgargs gfilenamefsystem/repl/debug.scmŒ E ŒŒ CYZ[\h¨:)]3L[$C4545$#45$ ”$"""$C HC]$(45$45$ ”"""$L\C62gt cgw ! Ugt U cgw e §gfilenamefsystem/repl/debug.scmŒ B ŒŒ D ŒŒ  E ŒŒ ! E ŒŒ $ F ŒŒ . F ŒŒ / F ŒŒ 9 F ŒŒ = F *ŒŒ A F ŒŒ U D ŒŒ e B ŒŒ k I ŒŒ l I ŒŒ v I ŒŒ w I )ŒŒ I ŒŒ … I 4ŒŒ ” I ŒŒ ˜ I ŒŒ £ K ŒŒ § K ŒŒ c  e § CO:R]^_`h]L4L5Œ6‡gk  gv  gfilenamefsystem/repl/debug.scmŒ S ŒŒ T !ŒŒ  T 2ŒŒ  T !ŒŒ  T ŒŒ  T ŒŒ   Ch(™] 454O>"GC‘gh  %gret  %gfilenamefsystem/repl/debug.scmŒ P ŒŒ  Q ŒŒ  Q ŒŒ R ŒŒ  % gnameg reverse-hashqŒCaRdef$ghijklmnophÓ-/03#45#4>"G454>"G4 >"G4 >"G4 54>"G4 >"G4 >"G4 54>"G4 >"G6Ëgframe  gport  gper-line-prefix   gval  G Šgval  ‘ Ôgval  Û gfilenamefsystem/repl/debug.scmŒ X ŒŒ  X 1ŒŒ ( Y 1ŒŒ + _ ŒŒ 1 _ ŒŒ 8 _ ŒŒ A ` ŒŒ G ` ŒŒ J [ ŒŒ ^ \ ŒŒ r ] ŒŒ x ` ŒŒ  ] ŒŒ ‹ a ŒŒ ‘ a ŒŒ ” [ ŒŒ ¨ \ ŒŒ ¼ ] ŒŒ  a ŒŒ É ] ŒŒ Õ b ŒŒ Û b ŒŒ Þ [ ŒŒ ò \ ŒŒ  b ŒŒ  ] ŒŒ   gper-line-prefixS Œgnamegprint-registersŒC;Rte:fu$vwxyz{ijk$|} hpê] 4L45545$"4LL>"G4>"GL4 545L6âgbinding  mgx  )gv ) mgfilenamefsystem/repl/debug.scmŒ m ŒŒ  n ŒŒ  n 2ŒŒ  n ŒŒ  n ŒŒ  o ŒŒ  o ŒŒ p ŒŒ ) n ŒŒ , r ŒŒ @ s ŒŒ Y t ŒŒ Z u ŒŒ a u *ŒŒ m t ŒŒ  m C h€]-/03#45#45#45( 64>"G  O456Ugframe  ~gport  ~gwidth   ~gper-line-prefix   ~gbindings  > ~gfilenamefsystem/repl/debug.scmŒ d ŒŒ  d .ŒŒ ' e $ŒŒ 5 e GŒŒ 8 f ŒŒ > f ŒŒ F g ŒŒ L i ŒŒ P i ŒŒ Q k ŒŒ W k ŒŒ ^ k ŒŒ v v ŒŒ ~ l ŒŒ  ~ gwidthS Œgper-line-prefixS Œgnameg print-localsŒC"G"4  $4   5"45>"G$6Cgframe  Dgport  Dgindex   Dgwidth   Dgfull?   Dg last-source   Dg next-source?   Dgsource  d Dgt  s †gfile  Œ Dgline — Dgcol ¢ Dgt ¹ Ì gfilenamefsystem/repl/debug.scmŒ x ŒŒ  x -ŒŒ 0 y )ŒŒ R  ŒŒ X  ŒŒ d  ŒŒ d  ŒŒ l | ŒŒ m } ŒŒ s } ŒŒ ƒ } !ŒŒ Œ ~ ŒŒ Œ  ŒŒ ŒŒ —  ŒŒ š ‚ ŒŒ ¢  ŒŒ ª ƒ ŒŒ ² | ŒŒ ³ } ŒŒ ¹ } ŒŒ É } !ŒŒ Ò ~ ŒŒ Ó ƒ ŒŒ × ƒ ŒŒ Ü „ ŒŒ â „ ŒŒ é „ ŒŒ ö … ŒŒ ü … ŒŒ  † ŒŒ  † ŒŒ  † ŒŒ  † ŒŒ  † 2ŒŒ  ‡ ŒŒ & … ŒŒ 4 ˆ ŒŒ @ Š (ŒŒ B ‰ ŒŒ)  D gindexS ŒgwidthS Œgfull?S Œg last-sourceS Œg next-source?S Œgnameg print-frameŒC=Re:žŸ =~qƒ…‰ˆh€_-/03 #45#45####45$ ”"$ " 4 –5"$ 45"™"!$ ’$™""ÿÿÍ""ÿÿÅ "ž “$“  “$ˆ £ 4        ‘$"> "G $ " ÿ–" 4  5"% ‘$$ 4 5""ÿÿØ""ÿÿÐ  "ÿÿfCC$"   "ÿÿKWgframes  ygport  ygwidth   ygfull?   ygforward?   ygcount   yg for-trap?   yglen  X yg lower-idx  } yg upper-idx ¾ ygi Ä bg last-source Ä bgframe Û ^ gfilenamefsystem/repl/debug.scmŒ Œ ŒŒ  (ŒŒ ' Ž $ŒŒ R ŒŒ X ŒŒ ` ‘ ŒŒ c ‘ (ŒŒ i ‘ ŒŒ m ‘ ŒŒ s “ ŒŒ { “ ŒŒ } “ ŒŒ } ŒŒ ‰ – ŒŒ Š – &ŒŒ ™ – ŒŒ ” ŒŒ ¦ ” #ŒŒ « ” ŒŒ ® • ŒŒ ¾ ŒŒ Ä ˜ ŒŒ É š ŒŒ Í š ŒŒ Ò š ŒŒ Û › ŒŒ Û › ŒŒ Þ œ ŒŒ ù ž -ŒŒ þ ž (ŒŒ  œ ŒŒ  — ŒŒ " Ÿ ŒŒ ' ¢ ŒŒ 1   ŒŒ 4   ŒŒ 9   ŒŒ ?   ŒŒ @ ¡ ŒŒ ^ Ÿ ŒŒ b ˜ ŒŒ h ˜ ŒŒ y ˜ ŒŒ,  y gwidthS Œgfull?S Œgforward?S ŒgcountS Œg for-trap?S Œgnameg print-framesŒC>R¡¢£¤¥¦xyz{§$¨}© hp ]4L45545$"4544545$">"GL456gbinding  lgx  lgvar  * lgfilenamefsystem/repl/debug.scmŒ ¯ ŒŒ  ° ŒŒ  ° .ŒŒ  ° ŒŒ  ° ŒŒ  ± ŒŒ  ± ŒŒ $ ± 8ŒŒ * ° ŒŒ - ² ŒŒ 2 ³ ŒŒ 3 ´ ŒŒ : µ ŒŒ C ¶ ŒŒ G ¶ ŒŒ J ¶ 1ŒŒ U ² ŒŒ b · !ŒŒ l · ŒŒ  l Cu hx@]4545$]45$"45454>"G4O4 5>"GC68gframe  wgproc wgt   3gmod  3 sgmod*  : sgfilenamefsystem/repl/debug.scmŒ ¨ ŒŒ  © ŒŒ © ŒŒ ª ŒŒ  ª ŒŒ  « ŒŒ  « ŒŒ , « .ŒŒ 3 « ŒŒ 6 ¬ ŒŒ : « ŒŒ = ­ ŒŒ Q ® ŒŒ ] ¸ ŒŒ h ® ŒŒ w º ŒŒ  w gnameg frame->moduleŒC?Rª«¬­h`G]!4545 ”$?"&’$¤—45"ÿÿÞ" 4 5"ÿÿÉ"C?gstack  ^glen ^gv   ^gi  Fgframe  Fgfilenamefsystem/repl/debug.scmŒ ½ ŒŒ  ¾ ŒŒ ¾ ŒŒ ¿ ŒŒ  ¾ ŒŒ  À ŒŒ  À ŒŒ Á ŒŒ %  ŒŒ )  ŒŒ 0 Ä ŒŒ 3 Å ŒŒ 4 Å ŒŒ B Å ŒŒ F Á ŒŒ H Á ŒŒ W Á ŒŒ  ^ gnameg stack->vectorŒC@R®­@¯h0å-1344 5?$6CÝgstack )gargs )gnarrowed   )gfilenamefsystem/repl/debug.scmŒ È ŒŒ É ŒŒ É $ŒŒ  É ŒŒ  É ŒŒ Ê ŒŒ & Ë ŒŒ ( Ì ŒŒ ) gnamegnarrow-stack->vectorŒCAR°A®h8Ë] [ˆ$ [Ž"45  $ "6Ãgframe  1gtag  1gfilenamefsystem/repl/debug.scmŒ Î ŒŒ  Ï ŒŒ Ï ŒŒ  Ð ŒŒ  Ï ŒŒ  Ò ŒŒ ) Ü ŒŒ 1 Ñ ŒŒ  1 gnamegframe->stack-vectorŒCBRC×gm  ,g set-width ë gfilenamefsystem/repl/debug.scmŒ   ŒŒ : 9 ŒŒ å A ŒŒ ë A ŒŒ  @ ŒŒ œ P ŒŒ ® X ŒŒ ( d ŒŒ Ò x ŒŒ â Œ ŒŒ k ¨ ŒŒ * ½ ŒŒ X È ŒŒ v Î ŒŒ  x C6PK!€L¼W:Å:Årepl/coop-server.gonu„[µü¤GOOF----LE-8-2.0"Å]Î4hO^] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ grepl¤ g coop-server¤ ¤ gfilenameS¤ fsystem/repl/coop-server.scm¤ gimportsS¤ gice-9¤ gmatch¤  ¤ ¤ greceive¤  ¤ ¤ gthreads¤  ¤ ¤ gq¤  ¤ ¤ gsrfi¤ gsrfi-9¤ ¤ ¤ ¤ gselectS¤ g start-repl*¤ !gprompting-meta-read¤ " !¤ #"¤ $gserver¤ %$¤ &g run-server*¤ 'gmake-tcp-server-socket¤ (gadd-open-socket!¤ )g close-socket!¤ *gguard-against-http-request¤ +&'()*¤ ,%+¤ -#,¤ .gexportsS¤ /gspawn-coop-repl-server¤ 0gpoll-coop-repl-server¤ 1/0¤ 2gset-current-module¤ 32¤ 42¤ 5g¤ 6g!%%make-coop-repl-server-procedure¤ 7gmake-syntax-transformer¤ 87¤ 97¤ :g%make-coop-repl-server¤ ;gmacro¤ <¤ ?g_¤ @gany¤ A?@@¤ Bg syntax-object¤ Cglambda¤ Dgm-6cff15a80cd23e5-5¤ Egtop¤ FDE¤ Ggribcage¤ Hgt-6cff15a80cd23e5-3¤ Igt-6cff15a80cd23e5-4¤ JHI¤ KFF¤ Lfl-6cff15a80cd23e5-a¤ Mfl-6cff15a80cd23e5-b¤ NLM¤ OGJKN¤ PG¤ Qgx¤ RQ¤ SF¤ Tfl-6cff15a80cd23e5-7¤ UT¤ VGRSU¤ Wgshift¤ Xg proc-name¤ Ygargs¤ ZXY¤ [E¤ \[[¤ ]fl-1e8ba8b5a-2ba¤ ^fl-1e8ba8b5a-2bb¤ _]^¤ `GZ\_¤ agkey¤ bgvalue¤ cgname¤ dgformals¤ egbody¤ fabcde¤ g[[[[[¤ hfl-1e8ba8b5a-2ad¤ ifl-1e8ba8b5a-2ae¤ jfl-1e8ba8b5a-2af¤ kfl-1e8ba8b5a-2b0¤ lfl-1e8ba8b5a-2b1¤ mhijkl¤ nGfgm¤ ogmake-procedure-name¤ po¤ q[¤ rfl-1e8ba8b5a-29d¤ sr¤ tGpqs¤ u[¤ vfl-1e8ba8b5a-29c¤ wv¤ xGRuw¤ yFOPVWPPPP`ntx ¤ zghygiene¤ {z¤ |BCy{¤ }gmutex¤ ~[OPV¤ z¤ €B}~¤ gqueue¤ ‚B~¤ ƒ€‚¤ „g make-struct¤ …gm-6cff15a80cd23e5-1¤ †…E¤ ‡gt-1e8ba8b5a-38d¤ ˆgt-1e8ba8b5a-38c¤ ‰gt-1e8ba8b5a-38b¤ Їˆ‰¤ ‹gm-1e8ba8b5a-38e¤ Œ‹E¤ ŒŒŒ¤ Žfl-1e8ba8b5a-392¤ fl-1e8ba8b5a-393¤ fl-1e8ba8b5a-394¤ ‘ޤ ’GŠ‘¤ “g ctor-args¤ ”“¤ •fl-1e8ba8b5a-37a¤ –•¤ —G”u–¤ ˜gctor¤ ™gfield¤ š˜™¤ ›fl-1e8ba8b5a-376¤ œfl-1e8ba8b5a-377¤ ›œ¤ žGš\¤ Ÿgform¤  g type-name¤ ¡gconstructor-spec¤ ¢g field-names¤ £Ÿ ¡¢¤ ¤[[[[¤ ¥fl-1e8ba8b5a-36b¤ ¦fl-1e8ba8b5a-36c¤ §fl-1e8ba8b5a-36d¤ ¨fl-1e8ba8b5a-36e¤ ©¥¦§¨¤ ªG£¤©¤ «g record-layout¤ ¬gfunctional-setters¤ ­gsetters¤ ®gcopier¤ ¯ggetters¤ °g constructor¤ ±ggetter-identifiers¤ ²gfield-identifiers¤ ³«¬­®¯°±²¤ ´[[[[[[[[¤ µfl-1e8ba8b5a-343¤ ¶fl-1e8ba8b5a-341¤ ·fl-1e8ba8b5a-33f¤ ¸fl-1e8ba8b5a-33d¤ ¹fl-1e8ba8b5a-33b¤ ºfl-1e8ba8b5a-339¤ »fl-1e8ba8b5a-337¤ ¼fl-1e8ba8b5a-335¤ ½µ¶·¸¹º»¼¤ ¾G³´½¤ ¿fl-1e8ba8b5a-334¤ À¿¤ ÁGRuÀ¤ †OPVWP’PPP—žPª¾Á¤ ÃB„Â{¤ ÄB5~¤ ÅB Â{¤ ÆÃÄÅ€‚¤ Ç|ƒÆ¤ Ègeach-any¤ É?ÈŒ¤ Êgsyntax-violation¤ Ëʤ Ìʤ ÍfWrong number of arguments¤ Îg identifier?¤ ÏΤ ÐΤ Ñ[PV¤ ÒB6Ѥ Óʤ Ôʤ Õf-source expression failed to match any pattern¤ Ögrecord-type-vtable¤ ×Ö¤ ØÖ¤ Ùgpwpw¤ Úgdefault-record-printer¤ ÛÚ¤ ÜÚ¤ Ý}¤ Þgset-struct-vtable-name!¤ ßÞ¤ àÞ¤ ágvtable-offset-user¤ âᤠãᤠäg%coop-repl-server?-procedure¤ ågcoop-repl-server?¤ æ?@¤ çgm-6cff15a80cd23e5-14¤ èçE¤ égt-6cff15a80cd23e5-13¤ êé¤ ëè¤ ìfl-6cff15a80cd23e5-19¤ íì¤ îGêëí¤ ïfl-6cff15a80cd23e5-16¤ ðï¤ ñGRëð¤ òèîPñWPPPP`ntx ¤ óBCò{¤ ôgobj¤ õgt-1e8ba8b5a-47e¤ ögt-1e8ba8b5a-478¤ ÷gt-1e8ba8b5a-479¤ øgt-1e8ba8b5a-47a¤ ùgt-1e8ba8b5a-47d¤ úgt-1e8ba8b5a-47c¤ ûgt-1e8ba8b5a-47b¤ üõö÷øùúû¤ ýgm-1e8ba8b5a-47f¤ þýE¤ ÿþþþþþþþ¤ fl-1e8ba8b5a-483¤ fl-1e8ba8b5a-484¤ fl-1e8ba8b5a-485¤ fl-1e8ba8b5a-486¤ fl-1e8ba8b5a-487¤ fl-1e8ba8b5a-488¤ fl-1e8ba8b5a-489¤ ¤ Güÿ¤  g copier-id¤   ¤  fl-1e8ba8b5a-476¤   ¤  G u ¤ g ctor-name¤ ¤ fl-1e8ba8b5a-46e¤ ¤ Gu¤ ¢¤ fl-1e8ba8b5a-46c¤ ¤ Gu¤ glayout¤ ¤ fl-1e8ba8b5a-46a¤ ¤ Gu¤ g immutable?¤ ¤ fl-1e8ba8b5a-468¤ ¤  Gu¤ !g field-count¤ "!¤ #fl-1e8ba8b5a-466¤ $#¤ %G"u$¤ &g getter-ids¤ '&¤ (fl-1e8ba8b5a-463¤ )(¤ *G'u)¤ +g field-ids¤ ,+¤ -fl-1e8ba8b5a-460¤ .-¤ /G,u.¤ 0gpredicate-name¤ 1g field-spec¤ 2Ÿ ¡01¤ 3[[[[[[¤ 4fl-1e8ba8b5a-453¤ 5fl-1e8ba8b5a-454¤ 6fl-1e8ba8b5a-455¤ 7fl-1e8ba8b5a-456¤ 8fl-1e8ba8b5a-457¤ 9fl-1e8ba8b5a-458¤ :456789¤ ;G23:¤ <†îPñWPPPPP PPPP P%P*P/;¾Á¤ =Bô<{¤ >=¤ ?gand¤ @B?<{¤ Agstruct?¤ BBA<{¤ CB=¤ Dgeq?¤ EBD<{¤ Fg struct-vtable¤ GBF<{¤ HG=¤ I[îPñ¤ JB5I¤ KEHJ¤ L@CK¤ Mó>L¤ N[Pñ¤ OBäN¤ Pgthrow-bad-struct¤ QP¤ RP¤ Sgcoop-repl-server-mutex¤ Tg!%coop-repl-server-mutex-procedure¤ Ugfree-id¤ Vg %%on-error¤ Wgm-6cff15a80cd23e5-20¤ XWE¤ YX¤ Zfl-6cff15a80cd23e5-22¤ [Z¤ \GRY[¤ ]XP\WPPPP`ntx ¤ ^BV]{¤ _U^¤ `_@¤ ag%%type¤ bgt-1e8ba8b5a-3a5¤ cgt-1e8ba8b5a-3a6¤ dgt-1e8ba8b5a-3a7¤ egt-1e8ba8b5a-3a8¤ fgt-1e8ba8b5a-3a9¤ ggt-1e8ba8b5a-3aa¤ hgt-1e8ba8b5a-3ab¤ ibcdefgh¤ jgm-1e8ba8b5a-3ac¤ kjE¤ lkkkkkkk¤ mfl-1e8ba8b5a-3b0¤ nfl-1e8ba8b5a-3b1¤ ofl-1e8ba8b5a-3b2¤ pfl-1e8ba8b5a-3b3¤ qfl-1e8ba8b5a-3b4¤ rfl-1e8ba8b5a-3b5¤ sfl-1e8ba8b5a-3b6¤ tmnopqrs¤ uGilt¤ vggetter¤ wgindex¤ xvw¤ yfl-1e8ba8b5a-3a3¤ zfl-1e8ba8b5a-3a4¤ {yz¤ |Gx\{¤ } & ¤ ~[[[¤ fl-1e8ba8b5a-39e¤ €fl-1e8ba8b5a-39f¤ fl-1e8ba8b5a-3a0¤ ‚€¤ ƒG}~‚¤ „†P\WPuPPP|Pƒ¾Á¤ …Ba„{¤ †U…¤ ‡?`†@¤ ˆgck¤ ‰gerr¤ Šgs¤ ‹‰Š¤ ŒXX¤ fl-6cff15a80cd23e5-25¤ Žfl-6cff15a80cd23e5-26¤ ޤ G‹Œ¤ ‘XP\WPPPP`ntx ¤ ’Bˆ‘{¤ “gquote¤ ”B“‘{¤ •[P\¤ –B5•¤ —”–¤ ˜—¤ ™g%%index¤ šB™„{¤ ›Uš¤ œ?`›@¤ fl-6cff15a80cd23e5-2a¤ žfl-6cff15a80cd23e5-2b¤ Ÿž¤  G‹ŒŸ¤ ¡X P\WPPPP`ntx ¤ ¢Bˆ¡{¤ £B“¡{¤ ¤ P\¤ ¥B ¤¤ ¦£¥¤ §¦¤ ¨g%%copier¤ ©B¨„{¤ ªU©¤ «?`ª@¤ ¬fl-6cff15a80cd23e5-2f¤ ­fl-6cff15a80cd23e5-30¤ ®¬­¤ ¯G‹Œ®¤ °X¯P\WPPPP`ntx ¤ ±Bˆ°{¤ ²B“°{¤ ³g%%-set-fields¤ ´[¯P\¤ µB³´¤ ¶²µ¤ ·¶¤ ¸gt-6cff15a80cd23e5-1f¤ ¹¸¤ ºfl-6cff15a80cd23e5-34¤ »º¤ ¼G¹Y»¤ ½X¼P\WPPPP`ntx ¤ ¾BC½{¤ ¿†¼P\WPuPPP|Pƒ¾Á¤ ÀBŠ¿{¤ ÁÀ¤ Âgif¤ ÃB¿{¤ ÄBD¿{¤ ÅBF¿{¤ ÆÅÀ¤ Ç[¼P\¤ ÈB5Ǥ ÉÄÆÈ¤ Êg struct-ref¤ ËBÊ¿{¤ ̼P\¤ ÍB ̤ ÎËÀͤ ÏBP¿{¤ ÐB“¿{¤ ÑBSǤ ÒÐѤ ÓÏÀÒ¤ ÔÃÉÎÓ¤ Õ¾ÁÔ¤ Ö[P\¤ ×BTÖ¤ Øgcoop-repl-server-queue¤ Ùg!%coop-repl-server-queue-procedure¤ Úgm-6cff15a80cd23e5-3b¤ ÛÚE¤ ÜÛ¤ Ýfl-6cff15a80cd23e5-3d¤ Þݤ ßGRÜÞ¤ àÛPßWPPPP`ntx ¤ áBVà{¤ âUᤠãâ@¤ ä†PßWPuPPP|Pƒ¾Á¤ åBaä{¤ æUå¤ ç?ãæ@¤ èÛÛ¤ éfl-6cff15a80cd23e5-40¤ êfl-6cff15a80cd23e5-41¤ ëéê¤ ìG‹èë¤ íÛìPßWPPPP`ntx ¤ îBˆí{¤ ïB“í{¤ ð[ìPߤ ñB5ð¤ òïñ¤ óò¤ ôB™ä{¤ õUô¤ ö?ãõ@¤ ÷fl-6cff15a80cd23e5-45¤ øfl-6cff15a80cd23e5-46¤ ù÷ø¤ úG‹èù¤ ûÛúPßWPPPP`ntx ¤ üBˆû{¤ ýB“û{¤ þúPߤ ÿB þ¤ ýÿ¤ ¤ B¨ä{¤ U¤ ?ã@¤ fl-6cff15a80cd23e5-4a¤ fl-6cff15a80cd23e5-4b¤ ¤ G‹è¤  ÛPßWPPPP`ntx ¤  Bˆ {¤  B“ {¤  [Pߤ  B³ ¤   ¤ ¤ gt-6cff15a80cd23e5-3a¤ ¤ fl-6cff15a80cd23e5-4f¤ ¤ Gܤ ÛPßWPPPP`ntx ¤ BC{¤ †PßWPuPPP|Pƒ¾Á¤ BŠ{¤ ¤ BÂ{¤ BD{¤ BF{¤ ¤ [Pߤ B5¤  ¤ !BÊ{¤ "Pߤ #B "¤ $!#¤ %BP{¤ &B“{¤ 'Bؤ (&'¤ )%(¤ * $)¤ +*¤ ,[Pߤ -BÙ,¤ .geach¤ /@@¤ 0./¤ 1@0Œ¤ 2@1Œ¤ 3@2Œ¤ 4g %%set-fields¤ 5gdummy¤ 6gcheck?¤ 7gexpr¤ 856Šv7¤ 9gm-6cff15a80cd23e5-56¤ :9E¤ ;:††††¤ fl-6cff15a80cd23e5-5d¤ ?fl-6cff15a80cd23e5-5e¤ @fl-6cff15a80cd23e5-5f¤ A<=>?@¤ BG8;A¤ C:¤ Dfl-6cff15a80cd23e5-58¤ ED¤ FGRCE¤ Ggt-1e8ba8b5a-3c4¤ Hgt-1e8ba8b5a-3c6¤ Igt-1e8ba8b5a-3c5¤ JGHI¤ Kgm-1e8ba8b5a-3c7¤ LKE¤ MLLL¤ Nfl-1e8ba8b5a-3cb¤ Ofl-1e8ba8b5a-3cc¤ Pfl-1e8ba8b5a-3cd¤ QNOP¤ RGJMQ¤ Sfl-1e8ba8b5a-3c1¤ Tfl-1e8ba8b5a-3c2¤ Ufl-1e8ba8b5a-3c3¤ VSTU¤ WG}~V¤ X†BPFWPRPPPW¾Á ¤ YB4X{¤ Z[BPF¤ [B5Z¤ \BSZ¤ ]BØZ¤ ^\]¤ _gmap¤ `_¤ a_¤ bglist¤ cg make-mutex¤ dgmake-q¤ egmake-coop-repl-server¤ fg lock-mutex¤ gf¤ hf¤ ig unlock-mutex¤ ji¤ ki¤ lgenq!¤ mgcoop-repl-server-eval¤ ng ¤ og%%make-coop-repl-procedure¤ pg%make-coop-repl¤ q?@@@@¤ rgm-6cff15a80cd23e5-91¤ srE¤ tgt-6cff15a80cd23e5-8d¤ ugt-6cff15a80cd23e5-8e¤ vgt-6cff15a80cd23e5-8f¤ wgt-6cff15a80cd23e5-90¤ xtuvw¤ yssss¤ zfl-6cff15a80cd23e5-96¤ {fl-6cff15a80cd23e5-97¤ |fl-6cff15a80cd23e5-98¤ }fl-6cff15a80cd23e5-99¤ ~z{|}¤ Gxy~¤ €s¤ fl-6cff15a80cd23e5-93¤ ‚¤ ƒGR€‚¤ „sPƒWPPPP`ntx ¤ …BC„{¤ †[Pƒ¤ ‡B}†¤ ˆgcondvar¤ ‰Bˆ†¤ Šgthunk¤ ‹BІ¤ Œgcont¤ BŒ†¤ އ‰‹¤ gm-6cff15a80cd23e5-8b¤ E¤ ‘PƒWP’PPP—žPª¾Á¤ ’B„‘{¤ “Bn†¤ ”B ‘{¤ •’“”‡‰‹¤ –…Ž•¤ —[Pƒ¤ ˜Bo—¤ ™gpwpwpwpw¤ š}ˆŠŒ¤ ›g%coop-repl?-procedure¤ œg coop-repl?¤ gm-6cff15a80cd23e5-a4¤ žE¤ Ÿgt-6cff15a80cd23e5-a3¤  Ÿ¤ ¡ž¤ ¢fl-6cff15a80cd23e5-a9¤ £¢¤ ¤G ¡£¤ ¥fl-6cff15a80cd23e5-a6¤ ¦¥¤ §GR¡¦¤ ¨ž¤P§WPPPP`ntx ¤ ©BC¨{¤ ª¤P§WPPPPP PPPP P%P*P/;¾Á¤ «Bôª{¤ ¬«¤ ­B?ª{¤ ®BAª{¤ ¯®«¤ °BDª{¤ ±BFª{¤ ²±«¤ ³[¤P§¤ ´Bn³¤ µ°²´¤ ¶­¯µ¤ ·©¬¶¤ ¸[P§¤ ¹B›¸¤ ºgcoop-repl-mutex¤ »g%coop-repl-mutex-procedure¤ ¼gm-6cff15a80cd23e5-b0¤ ½¼E¤ ¾½¤ ¿fl-6cff15a80cd23e5-b2¤ À¿¤ ÁGR¾À¤ ½PÁWPPPP`ntx ¤ ÃBVÂ{¤ ÄUä ÅÄ@¤ ÆPÁWPuPPP|Pƒ¾Á¤ ÇBaÆ{¤ ÈUǤ É?ÅÈ@¤ ʽ½¤ Ëfl-6cff15a80cd23e5-b5¤ Ìfl-6cff15a80cd23e5-b6¤ ÍË̤ ÎG‹Êͤ ϽÎPÁWPPPP`ntx ¤ ÐBˆÏ{¤ ÑB“Ï{¤ Ò[ÎPÁ¤ ÓBnÒ¤ ÔÑÓ¤ ÕÔ¤ ÖB™Æ{¤ ×UÖ¤ Ø?Å×@¤ Ùfl-6cff15a80cd23e5-ba¤ Úfl-6cff15a80cd23e5-bb¤ ÛÙÚ¤ ÜG‹ÊÛ¤ ݽÜPÁWPPPP`ntx ¤ ÞBˆÝ{¤ ßB“Ý{¤ àÜPÁ¤ áB ठâßᤠã⤠äB¨Æ{¤ åUä¤ æ?Åå@¤ çfl-6cff15a80cd23e5-bf¤ èfl-6cff15a80cd23e5-c0¤ éçè¤ êG‹Êé¤ ë½êPÁWPPPP`ntx ¤ ìBˆë{¤ íB“ë{¤ îg%%-set-fields¤ ï[êPÁ¤ ðBîï¤ ñíð¤ òñ¤ ógt-6cff15a80cd23e5-af¤ ôó¤ õfl-6cff15a80cd23e5-c4¤ öõ¤ ÷Gô¾ö¤ ø½÷PÁWPPPP`ntx ¤ ùBCø{¤ ú÷PÁWPuPPP|Pƒ¾Á¤ ûBŠú{¤ üû¤ ýBÂú{¤ þBDú{¤ ÿBFú{¤ ÿû¤ [÷PÁ¤ Bn¤ þ¤ BÊú{¤ ÷PÁ¤ B ¤ û¤ BPú{¤  B“ú{¤  Bº¤    ¤  û ¤  ý ¤ ùü ¤ [PÁ¤ B»¤ gcoop-repl-condvar¤ g%coop-repl-condvar-procedure¤ gm-6cff15a80cd23e5-cb¤ E¤ ¤ fl-6cff15a80cd23e5-cd¤ ¤ GR¤ PWPPPP`ntx ¤ BV{¤ U¤ @¤ PWPuPPP|Pƒ¾Á¤ Ba{¤ U¤  ?@¤ !¤ "fl-6cff15a80cd23e5-d0¤ #fl-6cff15a80cd23e5-d1¤ $"#¤ %G‹!$¤ &%PWPPPP`ntx ¤ 'Bˆ&{¤ (B“&{¤ )[%P¤ *Bn)¤ +(*¤ ,+¤ -B™{¤ .U-¤ /?.@¤ 0fl-6cff15a80cd23e5-d5¤ 1fl-6cff15a80cd23e5-d6¤ 201¤ 3G‹!2¤ 43PWPPPP`ntx ¤ 5Bˆ4{¤ 6B“4{¤ 73P¤ 8B 7¤ 968¤ :9¤ ;B¨{¤ <U;¤ =?<@¤ >fl-6cff15a80cd23e5-da¤ ?fl-6cff15a80cd23e5-db¤ @>?¤ AG‹!@¤ BAPWPPPP`ntx ¤ CBˆB{¤ DB“B{¤ E[AP¤ FBîE¤ GDF¤ HG¤ Igt-6cff15a80cd23e5-ca¤ JI¤ Kfl-6cff15a80cd23e5-df¤ LK¤ MGJL¤ NMPWPPPP`ntx ¤ OBCN{¤ PMPWPuPPP|Pƒ¾Á¤ QBŠP{¤ RQ¤ SBÂP{¤ TBDP{¤ UBFP{¤ VUQ¤ W[MP¤ XBnW¤ YTVX¤ ZBÊP{¤ [MP¤ \B [¤ ]ZQ\¤ ^BPP{¤ _B“P{¤ `BW¤ a_`¤ b^Qa¤ cSY]b¤ dORc¤ e[P¤ fBe¤ ggcoop-repl-read-thunk¤ hg%coop-repl-read-thunk-procedure¤ igm-6cff15a80cd23e5-e6¤ jiE¤ kj¤ lfl-6cff15a80cd23e5-e8¤ ml¤ nGRkm¤ ojPnWPPPP`ntx ¤ pBVo{¤ qUp¤ rq@¤ sPnWPuPPP|Pƒ¾Á¤ tBas{¤ uUt¤ v?ru@¤ wjj¤ xfl-6cff15a80cd23e5-eb¤ yfl-6cff15a80cd23e5-ec¤ zxy¤ {G‹wz¤ |j{PnWPPPP`ntx ¤ }Bˆ|{¤ ~B“|{¤ [{Pn¤ €Bn¤ ~€¤ ‚¤ ƒB™s{¤ „Uƒ¤ …?r„@¤ †fl-6cff15a80cd23e5-f0¤ ‡fl-6cff15a80cd23e5-f1¤ ˆ†‡¤ ‰G‹wˆ¤ Šj‰PnWPPPP`ntx ¤ ‹BˆŠ{¤ ŒB“Š{¤ ‰Pn¤ ŽB ¤ ŒŽ¤ ¤ ‘B¨s{¤ ’U‘¤ “?r’@¤ ”fl-6cff15a80cd23e5-f5¤ •fl-6cff15a80cd23e5-f6¤ –”•¤ —G‹w–¤ ˜j—PnWPPPP`ntx ¤ ™Bˆ˜{¤ šB“˜{¤ ›[—Pn¤ œB šœ¤ ž¤ Ÿgt-6cff15a80cd23e5-e5¤  Ÿ¤ ¡fl-6cff15a80cd23e5-fa¤ ¢¡¤ £G k¢¤ ¤j£PnWPPPP`ntx ¤ ¥BC¤{¤ ¦£PnWPuPPP|Pƒ¾Á¤ §BЦ{¤ ¨§¤ ©B¦{¤ ªBD¦{¤ «BF¦{¤ ¬«§¤ ­[£Pn¤ ®Bn­¤ ¯ª¬®¤ °Bʦ{¤ ±£Pn¤ ²B ±¤ ³°§²¤ ´BP¦{¤ µB“¦{¤ ¶Bg­¤ ·µ¶¤ ¸´§·¤ ¹©¯³¸¤ º¥¨¹¤ »[Pn¤ ¼Bh»¤ ½gcoop-repl-cont¤ ¾g%coop-repl-cont-procedure¤ ¿gm-6cff15a80cd23e5-101¤ À¿E¤ ÁÀ¤ Âfl-6cff15a80cd23e5-103¤ ä ÄGRÁä ÅÀPÄWPPPP`ntx ¤ ÆBVÅ{¤ ÇUƤ ÈÇ@¤ ÉPÄWPuPPP|Pƒ¾Á¤ ÊBaÉ{¤ ËUʤ Ì?ÈË@¤ ÍÀÀ¤ Îfl-6cff15a80cd23e5-106¤ Ïfl-6cff15a80cd23e5-107¤ ÐÎϤ ÑG‹ÍФ ÒÀÑPÄWPPPP`ntx ¤ ÓBˆÒ{¤ ÔB“Ò{¤ Õ[ÑPĤ ÖBnÕ¤ ×ÔÖ¤ Ø×¤ ÙB™É{¤ ÚUÙ¤ Û?ÈÚ@¤ Üfl-6cff15a80cd23e5-10b¤ Ýfl-6cff15a80cd23e5-10c¤ ÞÜݤ ßG‹ÍÞ¤ àÀßPÄWPPPP`ntx ¤ áBˆà{¤ âB“à{¤ ãßPĤ äB 㤠åâä¤ æå¤ çB¨É{¤ èUç¤ é?Èè@¤ êfl-6cff15a80cd23e5-110¤ ëfl-6cff15a80cd23e5-111¤ ìêë¤ íG‹Íì¤ îÀíPÄWPPPP`ntx ¤ ïBˆî{¤ ðB“î{¤ ñ[íPĤ òBîñ¤ óðò¤ ôó¤ õgt-6cff15a80cd23e5-100¤ öõ¤ ÷fl-6cff15a80cd23e5-115¤ ø÷¤ ùGöÁø¤ úÀùPÄWPPPP`ntx ¤ ûBCú{¤ üùPÄWPuPPP|Pƒ¾Á¤ ýBŠü{¤ þý¤ ÿBÂü{¤ BDü{¤ BFü{¤ ý¤ [ùPĤ Bn¤ ¤ BÊü{¤ ùPĤ B ¤  ý¤  BPü{¤  B“ü{¤  B½¤    ¤  ý ¤ ÿ ¤ ûþ¤ [PĤ B¾¤ gm-6cff15a80cd23e5-11c¤ E¤ ¤ fl-6cff15a80cd23e5-121¤ fl-6cff15a80cd23e5-122¤ fl-6cff15a80cd23e5-123¤ fl-6cff15a80cd23e5-124¤ fl-6cff15a80cd23e5-125¤ ¤ G8¤ ¤ fl-6cff15a80cd23e5-11e¤ ¤  GR¤ !P WPRPPPW¾Á ¤ "B4!{¤ #[P ¤ $Bn#¤ %Bº#¤ &B#¤ 'Bg#¤ (B½#¤ )%&'(¤ *gset-coop-repl-read-thunk!¤ +g$%set-coop-repl-read-thunk!-procedure¤ ,gm-6cff15a80cd23e5-130¤ -,E¤ .gt-6cff15a80cd23e5-12e¤ /gt-6cff15a80cd23e5-12f¤ 0./¤ 1--¤ 2fl-6cff15a80cd23e5-135¤ 3fl-6cff15a80cd23e5-136¤ 423¤ 5G014¤ 6-¤ 7fl-6cff15a80cd23e5-132¤ 87¤ 9GR68¤ :-5P9WPPPP`ntx ¤ ;BC:{¤ <=¤ ?gm-1e8ba8b5a-3e8¤ @?E¤ A@@¤ Bfl-1e8ba8b5a-3ec¤ Cfl-1e8ba8b5a-3ed¤ DBC¤ EG>AD¤ Fgsetter¤ GcvF¤ Hfl-1e8ba8b5a-3e0¤ Ifl-1e8ba8b5a-3e1¤ Jfl-1e8ba8b5a-3e2¤ KHIJ¤ LGG~K¤ M1w¤ Nfl-1e8ba8b5a-3d7¤ Ofl-1e8ba8b5a-3d8¤ PNO¤ QGM\P¤ Rg field-specs¤ S R¤ Tfl-1e8ba8b5a-3d3¤ Ufl-1e8ba8b5a-3d4¤ VTU¤ WGS\V¤ X5P9WPELPQPW¾Á¤ YBŠX{¤ Zgval¤ [BZX{¤ \Y[¤ ]BÂX{¤ ^BDX{¤ _BFX{¤ `_Y¤ a[5P9¤ bBna¤ c^`b¤ dg struct-set!¤ eBdX{¤ f5P9¤ gB f¤ heYg[¤ iBPX{¤ jB“X{¤ kB*a¤ ljk¤ miYl¤ n]chm¤ o;\n¤ p[P9¤ qB+p¤ rgset-coop-repl-cont!¤ sg%set-coop-repl-cont!-procedure¤ tgm-6cff15a80cd23e5-140¤ utE¤ vgt-6cff15a80cd23e5-13e¤ wgt-6cff15a80cd23e5-13f¤ xvw¤ yuu¤ zfl-6cff15a80cd23e5-145¤ {fl-6cff15a80cd23e5-146¤ |z{¤ }Gxy|¤ ~u¤ fl-6cff15a80cd23e5-142¤ €¤ GR~€¤ ‚u}PWPPPP`ntx ¤ ƒBC‚{¤ „}PWPELPQPW¾Á¤ …BŠ„{¤ †BZ„{¤ ‡…†¤ ˆB„{¤ ‰BD„{¤ ŠBF„{¤ ‹Š…¤ Œ[}P¤ BnŒ¤ މ‹¤ Bd„{¤ }P¤ ‘B ¤ ’…‘†¤ “BP„{¤ ”B“„{¤ •BrŒ¤ –”•¤ —“…–¤ ˜ˆŽ’—¤ ™ƒ‡˜¤ š[P¤ ›Bsš¤ œgmake-condition-variable¤ gmake-coop-repl¤ žgwait-condition-variable¤ Ÿgerror¤  f2coop-repl-read: condvar signaled, but thunk is #f!¤ ¡gcoop-repl-read¤ ¢gcoop-repl-prompt¤ £gstore-repl-cont¤ ¤g *repl-stack*¤ ¥gcurrent-module¤ ¦f"coop-reader: read-thunk is not #f!¤ §gsignal-condition-variable¤ ¨gmake-coop-reader¤ ©geval¤ ªg reader-loop¤ «gq-empty?¤ ¬gdeq!¤ ­Ÿ¤ ®Ÿ¤ ¯fno matching pattern¤ °gnew-repl¤ ±gstart-repl-client¤ ²gcatch¤ ³²¤ ´²¤ µgcall-with-new-thread¤ ¶µ¤ ·µ¤ ¸g%thread-handler¤ ¹¸¤ º¸¤ »gcurrent-language¤ ¼gstart-coop-repl¤ ½gmake-coop-client-proc¤ ¾grun-coop-repl-server¤ ¿g close-fdes¤ Àgfileno¤ Ágwith-continuation-barrier¤ Âgcurrent-input-port¤ Ãgcurrent-output-port¤ Ägcurrent-error-port¤ Ågcurrent-warning-port¤ Æg parameter?¤ ÇÆ¤ ÈÆ¤ Ég scm-error¤ Êgwrong-type-arg¤ Ëf parameterize¤ ÌfNot a parameter: ~S¤ Ígsave-module-excursion¤C5hÐ`]4    -.1544>"G5h¢]¨Cšgmutex  gqueue  gfilenamefsystem/repl/coop-server.scmŒ $ ŒŒ  gnameg!%%make-coop-repl-server-procedureŒC6R49:;>AÇh\]CTgt-6cff15a80cd23e5-3  gt-6cff15a80cd23e5-4    CÉÌ:Íh^]L6Vga  gfilenamefsystem/repl/coop-server.scmŒ  $ ŒŒ  C?ÐhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ  $ ŒŒ   CÒh]C   CÔÕ hp]45$@45$ O@45$4O?$@  6  6‡gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/repl/coop-server.scmŒ $ ŒŒ  n C5:RØÙÜ5ݨ4à5>"G ã–6iª5R5hˆ]¦$§‚CC€gobj  gfilenamefsystem/repl/coop-server.scmŒ $ ŒŒ   gnameg%coop-repl-server?-procedureŒCäR49å;>æMh<]C4gt-6cff15a80cd23e5-13    CÉÌåÍh^]L6Vga  gfilenamefsystem/repl/coop-server.scmŒ  $ ŒŒ  C?ÐhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ  $ ŒŒ   COh]C   CÔÕ hp]45$@45$ O@45$4O?$@  6  6‡gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/repl/coop-server.scmŒ $ ŒŒ  n C5åR5RSh‹]§& ©C6ƒgs  gfilenamefsystem/repl/coop-server.scmŒ $ ŒŒ   gnameg!%coop-repl-server-mutex-procedureŒCTR49S;>‡’˜h:]ŒŒC2gerr  gs    Cœ¢§h:]ŒŒC2gerr  gs    C«±·h:]ŒŒC2gerr  gs    CæÕh<]C4gt-6cff15a80cd23e5-1f    CÉÌSÍh^]L6Vga  gfilenamefsystem/repl/coop-server.scmŒ  $ ŒŒ  C?ÐhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ  $ ŒŒ   C×h]C   CÔÕh¸Ë]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66Ãgx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/repl/coop-server.scmŒ $ ŒŒ  ³ C5SR5RØh‹]§& ©C6ƒgs  gfilenamefsystem/repl/coop-server.scmŒ $ ŒŒ   gnameg!%coop-repl-server-queue-procedureŒCÙR49Ø;>çîóh:]ŒŒC2gerr  gs    Cöüh:]ŒŒC2gerr  gs    C h:]ŒŒC2gerr  gs    Cæ+h<]C4gt-6cff15a80cd23e5-3a    CÉÌØÍh^]L6Vga  gfilenamefsystem/repl/coop-server.scmŒ  $ ŒŒ  C?ÐhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ  $ ŒŒ   C-h]C   CÔÕh¸Ë]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66Ãgx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/repl/coop-server.scmŒ $ ŒŒ  ³ C5ØR49³;>3Y[^abh v]45ŒŒŒŒŒCngdummy  gcheck?  gs   ggetter   gexpr      CÔÕh(É] 45$@6Ágx  "gtmp "gfilenamefsystem/repl/coop-server.scmŒ $ ŒŒ  " g macro-typeg syntax-rulesŒgpatternsgcheck?gsggettergexprg...C5³Rcd5h ­]4545¨C¥gmutex gqueue gfilenamefsystem/repl/coop-server.scmŒ * ŒŒ  + ŒŒ  + 'ŒŒ + ŒŒ   gnamegmake-coop-repl-serverŒCeR5RShhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ 0 ŒŒ   CkhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ 0 ŒŒ   ClØh ¤-13§& ©" 45OO4O>"GV4§& ©" 45Œ>X4O>"GCX4O>"GFœg coop-server žgopcode žgargs  žgx  # žgfilenamefsystem/repl/coop-server.scmŒ - ŒŒ 0 ŒŒ # 0 ŒŒ J 1 ŒŒ O 1 ŒŒ k 2 ŒŒ p 1 ŒŒ r 0 ŒŒ ž  gnamegcoop-repl-server-evalŒg documentationfQueue a new instruction with the symbolic name OPCODE and an arbitrary number of arguments, to be processed the next time COOP-SERVER is polled.ŒCmRnhÂ]¨Cºgmutex  gcondvar  gthunk   gcont   gfilenamefsystem/repl/coop-server.scmŒ 4 ŒŒ   gnameg%%make-coop-repl-procedureŒCoR49p;>q–h¢]Cšgt-6cff15a80cd23e5-8d  gt-6cff15a80cd23e5-8e  gt-6cff15a80cd23e5-8f   gt-6cff15a80cd23e5-90      CÉÌpÍh^]L6Vga  gfilenamefsystem/repl/coop-server.scmŒ  4 ŒŒ  C?ÐhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ  4 ŒŒ   C˜h]C   CÔÕ hp]45$@45$ O@45$4O?$@  6  6‡gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/repl/coop-server.scmŒ 4 ŒŒ  n C5pRØ™Ünš¨4àn>"G ã–oiªnRnh]¦$§‚CCygobj  gfilenamefsystem/repl/coop-server.scmŒ 4 ŒŒ   gnameg%coop-repl?-procedureŒC›R49œ;>æ·h<]C4gt-6cff15a80cd23e5-a3    CÉÌœÍh^]L6Vga  gfilenamefsystem/repl/coop-server.scmŒ  4 ŒŒ  C?ÐhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ  4 ŒŒ   C¹h]C   CÔÕ hp]45$@45$ O@45$4O?$@  6  6‡gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/repl/coop-server.scmŒ 4 ŒŒ  n C5œRnRºh„]§& ©C6|gs  gfilenamefsystem/repl/coop-server.scmŒ 4 ŒŒ   gnameg%coop-repl-mutex-procedureŒC»R49º;>ÉÐÕh:]ŒŒC2gerr  gs    CØÞãh:]ŒŒC2gerr  gs    Cæìòh:]ŒŒC2gerr  gs    Cæh<]C4gt-6cff15a80cd23e5-af    CÉ̺Íh^]L6Vga  gfilenamefsystem/repl/coop-server.scmŒ  4 ŒŒ  C?ÐhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ  4 ŒŒ   Ch]C   CÔÕh¸Ë]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66Ãgx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/repl/coop-server.scmŒ 4 ŒŒ  ³ C5ºRnRh†]§& ©C6~gs  gfilenamefsystem/repl/coop-server.scmŒ 4 ŒŒ   gnameg%coop-repl-condvar-procedureŒCR49;> ',h:]ŒŒC2gerr  gs    C/5:h:]ŒŒC2gerr  gs    C=CHh:]ŒŒC2gerr  gs    Cædh<]C4gt-6cff15a80cd23e5-ca    CÉÌÍh^]L6Vga  gfilenamefsystem/repl/coop-server.scmŒ  4 ŒŒ  C?ÐhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ  4 ŒŒ   Cfh]C   CÔÕh¸Ë]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66Ãgx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/repl/coop-server.scmŒ 4 ŒŒ  ³ C5RnRgh ‰]§& ©C6gs  gfilenamefsystem/repl/coop-server.scmŒ 4 ŒŒ   gnameg%coop-repl-read-thunk-procedureŒChR49g;>v}‚h:]ŒŒC2gerr  gs    C…‹h:]ŒŒC2gerr  gs    C“™žh:]ŒŒC2gerr  gs    Cæºh<]C4gt-6cff15a80cd23e5-e5    CÉÌgÍh^]L6Vga  gfilenamefsystem/repl/coop-server.scmŒ  4 ŒŒ  C?ÐhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ  4 ŒŒ   C¼h]C   CÔÕh¸Ë]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66Ãgx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/repl/coop-server.scmŒ 4 ŒŒ  ³ C5gRnR½h ƒ]§& ©C6{gs  gfilenamefsystem/repl/coop-server.scmŒ 4 ŒŒ   gnameg%coop-repl-cont-procedureŒC¾R49½;>ÌÓØh:]ŒŒC2gerr  gs    CÛáæh:]ŒŒC2gerr  gs    Céïôh:]ŒŒC2gerr  gs    Cæh=]C5gt-6cff15a80cd23e5-100    CÉ̽Íh^]L6Vga  gfilenamefsystem/repl/coop-server.scmŒ  4 ŒŒ  C?ÐhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ  4 ŒŒ   Ch]C   CÔÕh¸Ë]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66Ãgx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/repl/coop-server.scmŒ 4 ŒŒ  ³ C5½R49î;>3"$)abh v]45ŒŒŒŒŒCngdummy  gcheck?  gs   ggetter   gexpr      CÔÕh(É] 45$@6Ágx  "gtmp "gfilenamefsystem/repl/coop-server.scmŒ 4 ŒŒ  " g macro-typeg syntax-rulesŒgpatternsgcheck?gsggettergexprg...C5îRnR*h Ÿ]§& ªC6—gs  gval  gfilenamefsystem/repl/coop-server.scmŒ 4 ŒŒ   gnameg$%set-coop-repl-read-thunk!-procedureŒC+R49*;>Aoh`]CXgt-6cff15a80cd23e5-12e  gt-6cff15a80cd23e5-12f    CÉÌ*Íh^]L6Vga  gfilenamefsystem/repl/coop-server.scmŒ  4 ŒŒ  C?ÐhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ  4 ŒŒ   Cqh]C   CÔÕ hp]45$@45$ O@45$4O?$@  6  6‡gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/repl/coop-server.scmŒ 4 ŒŒ  n C5*RnRrh ™]§& ªC6‘gs  gval  gfilenamefsystem/repl/coop-server.scmŒ 4 ŒŒ   gnameg%set-coop-repl-cont!-procedureŒCsR49r;>A™h`]CXgt-6cff15a80cd23e5-13e  gt-6cff15a80cd23e5-13f    CÉÌrÍh^]L6Vga  gfilenamefsystem/repl/coop-server.scmŒ  4 ŒŒ  C?ÐhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ  4 ŒŒ   C›h]C   CÔÕ hp]45$@45$ O@45$4O?$@  6  6‡gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/repl/coop-server.scmŒ 4 ŒŒ  n C5rRcœnh ¨]4545¨C gmutex gcondvar gfilenamefsystem/repl/coop-server.scmŒ < ŒŒ  = ŒŒ  = ŒŒ = ŒŒ   gnamegmake-coop-replŒCRnRºhhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ B ŒŒ   CkhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ B ŒŒ   CgžŸ * h0¡]§& ©" 45OO4O>"GV§&  ©" 45$"D4§& ©" 45§& ©" 45>"G§&  ©" 45$"4  >"G§&  ª"4 >"GX4O>"G6™g coop-repl  .gx  (gthunk  Ä gthunk ( .gfilenamefsystem/repl/coop-server.scmŒ ? ŒŒ  B ŒŒ  B ŒŒ E C ŒŒ a C ŒŒ f D ŒŒ k D &ŒŒ … E &ŒŒ ¡ D ŒŒ ¬ F ŒŒ Ä F ŒŒ Ì G ŒŒ Ñ H ŒŒ Õ H ŒŒ Ú H ŒŒ å I ŒŒ  B ŒŒ ( A ŒŒ . K ŒŒ  . gnamegcoop-repl-readŒg documentationf5Read an expression via the thunk stored in COOP-REPL.ŒC¡Rn¢hV]LL6Ngfilenamefsystem/repl/coop-server.scmŒ R ŒŒ  R %ŒŒ   Chh]LO6`gexp  gfilenamefsystem/repl/coop-server.scmŒ P ŒŒ  Q ŒŒ   CRrh å]§&  OªC6Ýgcont  g coop-repl  gfilenamefsystem/repl/coop-server.scmŒ M ŒŒ  O ŒŒ  gnamegstore-repl-contŒg documentationf4Save the partial continuation CONT within COOP-REPL.ŒC£R£¢h]L6   Ch0]U4O>XCXFG@ügthunk  )ghandler  )gargs   )gfilenamefsystem/repl/coop-server.scmŒ T ŒŒ  V ŒŒ  V ŒŒ V ŒŒ  ) gnamegcoop-repl-promptŒg documentationf2Apply THUNK within a prompt for cooperative REPLs.ŒC¢R¤¥¤2!h(^]LY4L>"G4L>ZCZFVgfilenamefsystem/repl/coop-server.scmŒ b ŒŒ d ŒŒ  e ŒŒ  ( CnRºhhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ f ŒŒ   CkhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ f ŒŒ   CgŸ¦*§¢hD][45OL§&L ©" 4L5OO4O>"GVL§& L ©" 4L 5$4  >"G"L§& L ª"4L >"G4 L§&L ©" 4L5>"GX4O>"GLWF<grepl   gstack gmodule  g read-thunk  gx  ; gfilenamefsystem/repl/coop-server.scmŒ \ ŒŒ  a ŒŒ ` ŒŒ  ] ŒŒ $ f ŒŒ ; f ŒŒ d g ŒŒ € g ŒŒ h ŒŒ … h ŒŒ Š h ŒŒ ™ i ŒŒ À j ŒŒ Å j #ŒŒ á j ŒŒ ë f ŒŒ  k ŒŒ  k ŒŒ   ChS]OCKg coop-repl  gfilenamefsystem/repl/coop-server.scmŒ X ŒŒ  gnamegmake-coop-readerŒg documentationf»Return a new procedure for reading user input from COOP-REPL. The generated procedure passes the responsibility of reading input to another thread and aborts the cooperative REPL prompt.ŒC¨Rm©¡ªh(S]445>"G6Kg coop-server  'g coop-repl  'gfilenamefsystem/repl/coop-server.scmŒ m ŒŒ  p ŒŒ p %ŒŒ q ŒŒ  p ŒŒ ' r ŒŒ  ' gnameg reader-loopŒg documentationfRun an unbounded loop that reads an expression for COOP-REPL and stores the expression within COOP-SERVER for later evaluation.ŒCªR5RShhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ y ŒŒ   CkhN]L6Fgfilenamefsystem/repl/coop-server.scmŒ y ŒŒ   CØ«¬©n½®¯°±hË]1§& ©" 45OO4O>"GV§& ©" 4545$"45X4O>"G$}" ˆ$èŽ &³ˆ$Žˆ$[Ž(74§ &  ©" 4 5>"G" 44  5>"ðG"é44  5>"ÓG"Ì44  5>"°G"©44  5>"“G"Œ44  5>"pG"iˆ$^Ž&>ˆ$/Ž( 4>"G""ÿþ©""ÿþ¡""ÿþ™""ÿþ‹"CÃg coop-server  gx  ‘gqueue  \ xgop ‘ gw  ª Œgx  ª Œgw  à Lgx  à Lgw  Ø  gw  ¶  gx  ¶  gw  Ó ì gfilenamefsystem/repl/coop-server.scmŒ t ŒŒ  y ŒŒ  y ŒŒ E z ŒŒ \ z ŒŒ _ { ŒŒ i { ŒŒ o | ŒŒ z y ŒŒ ‘ y ŒŒ ™ } ŒŒ ~ ŒŒ Û ‚ ŒŒ  ~ ŒŒ Ö € ŒŒ ô ~ ŒŒ   gnamegpoll-coop-repl-serverŒg documentationfîPoll the cooperative REPL server COOP-SERVER and apply a pending operation if there is one, such as evaluating an expression typed at the REPL prompt. This procedure must be called from the same thread that called spawn-coop-repl-server.ŒC0R´·ªhO]LL6Ggfilenamefsystem/repl/coop-server.scmŒ Œ ŒŒ  Cº »¨h8]454LO>"G45456•g coop-repl  5gfilenamefsystem/repl/coop-server.scmŒ Š ŒŒ  ‹ ŒŒ  ‹ ŒŒ Œ ŒŒ ' ŒŒ - (ŒŒ 5 ŒŒ  5 Chd-13C\gargs gfilenamefsystem/repl/coop-server.scmŒ Š ŒŒ ChØ]O6Ðg coop-server  gfilenamefsystem/repl/coop-server.scmŒ … ŒŒ  Š ŒŒ   gnamegstart-coop-replŒg documentationf5Start a new cooperative REPL process for COOP-SERVER.ŒC¼R&½h]456g coop-server  g server-socket  gfilenamefsystem/repl/coop-server.scmŒ ŒŒ  ’ ŒŒ  ’ ŒŒ   gnamegrun-coop-repl-serverŒg documentationfQStart the cooperative REPL server for COOP-SERVER using the socket SERVER-SOCKET.ŒC¾R'e·¾hO]LL6Ggfilenamefsystem/repl/coop-server.scmŒ › ŒŒ  Cºh@Û-.,3#45454O>"GCÓg server-socket >g coop-server  >gfilenamefsystem/repl/coop-server.scmŒ ” ŒŒ  • $ŒŒ  š ŒŒ  š ŒŒ ! › ŒŒ > gnamegspawn-coop-repl-serverŒg documentationfûCreate and return a new cooperative REPL server object, and spawn a new thread to listen for connections on SERVER-SOCKET. Proper functioning of the REPL server requires that poll-coop-repl-server be called periodically on the returned server object.ŒC/Rm°hˆ]L6€gclient  gaddr  gfilenamefsystem/repl/coop-server.scmŒ £ ŒŒ  ¤ 'ŒŒ ¤ ŒŒ  Ch]OCÿg coop-server  gfilenamefsystem/repl/coop-server.scmŒ   ŒŒ  gnamegmake-coop-client-procŒg documentationfgReturn a new procedure that is used to schedule the creation of a new cooperative REPL for COOP-SERVER.ŒC½R(¿Àha]4L56Ygfilenamefsystem/repl/coop-server.scmŒ ® ŒŒ  ® 2ŒŒ ® &ŒŒ  C*Á¢ÂÃÄÅÈÉÊË̤ͼhX]L6Pgfilenamefsystem/repl/coop-server.scmŒ ¼ ŒŒ  ½ ŒŒ   C´)hX]L6Pgfilenamefsystem/repl/coop-server.scmŒ  ŒŒ  à ŒŒ   Chd-13C\gargs gfilenamefsystem/repl/coop-server.scmŒ  ŒŒ Ch0] 45$"4 >"G45$"4 >"G45$"4 >"G45$"4 >"G © © © ©4 ©L54 ©L54 ©L54 ©L5Y Y4  LO>"GZZ LO6ÿgt-6cff15a80cd23e5-300 "gt-6cff15a80cd23e5-301 "gt-6cff15a80cd23e5-302  "gt-6cff15a80cd23e5-303  "gfilenamefsystem/repl/coop-server.scmŒ µ ŒŒ ¶ ŒŒ û º &ŒŒ þ » ŒŒ 0  ŒŒ  0 ChX]LLO6Pgfilenamefsystem/repl/coop-server.scmŒ ³ ŒŒ  ´ ŒŒ   Ch@8]4O>"G4>"GO60g coop-server  :gclient  :gfilenamefsystem/repl/coop-server.scmŒ ¦ ŒŒ  ® ŒŒ  ° ŒŒ : ² ŒŒ  : gnamegstart-repl-clientŒg documentationfmRun a cooperative REPL for COOP-SERVER within a prompt. All input and output is sent over the socket CLIENT.ŒC±RCgm  ,grtd É ñgrtd m —gfilenamefsystem/repl/coop-server.scmŒ   ŒŒ õ $ ŒŒ 1 * ŒŒ h - ŒŒ N 4 ŒŒ =L < ŒŒ A ? ŒŒ C9 M ŒŒ D¸ T ŒŒ J X ŒŒ K· m ŒŒ Q¦ t ŒŒ TŒ … ŒŒ UÑ ŒŒ X~ ” ŒŒ Z[   ŒŒ `Ì ¦ ŒŒ  `Î C6PK!åôWl`` base/ck.gonu„[µü¤GOOF----LE-8-2.0H]€4hž] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gbase¤ gck¤ ¤ gfilenameS¤ fsystem/base/ck.scm¤ gexportsS¤ ¤ gset-current-module¤ ¤ ¤ gmake-syntax-transformer¤ ¤ ¤ gmacro¤ g $sc-dispatch¤ ¤ ¤ gany¤ gfree-id¤ g syntax-object¤ gquote¤ gtop¤ ¤ gribcage¤ ¤ gx¤ ! ¤ "gm-1e97f9b4a-48¤ #"¤ $#¤ %fl-1e97f9b4a-4a¤ &%¤ '!$&¤ ('¤ )ghygiene¤ *)¤ +(*¤ ,+¤ -,¤ .-¤ /geach-any¤ 0//Œ¤ 10Œ¤ 21-¤ 3gck-arg¤ 4gdummy¤ 5gop¤ 6gea¤ 7gs¤ 8gv¤ 945678¤ :#¤ ;fl-1e97f9b4a-52¤ fl-1e97f9b4a-55¤ ?fl-1e97f9b4a-56¤ @;<=>?¤ A9:@¤ BA'¤ C3B*¤ Dgappend¤ ED¤ FD¤ GB*¤ H/Œ¤ IH¤ J4756¤ K#¤ Lfl-1e97f9b4a-5f¤ Mfl-1e97f9b4a-60¤ Nfl-1e97f9b4a-61¤ Ofl-1e97f9b4a-62¤ PLMNO¤ QJKP¤ RQ'¤ S3R*¤ Tgsyntax-violation¤ UT¤ VT¤ Wf-source expression failed to match any pattern¤ Xgm-1e97f9b4a-68¤ YX¤ ZY¤ [fl-1e97f9b4a-6a¤ \[¤ ]!Z\¤ ^]¤ _^*¤ `_¤ a`¤ ba/Œ¤ c/bŒ¤ dcŒ¤ edŒ¤ fgea1¤ g4758f¤ hY¤ ifl-1e97f9b4a-77¤ jfl-1e97f9b4a-78¤ kfl-1e97f9b4a-79¤ lfl-1e97f9b4a-7a¤ mfl-1e97f9b4a-7b¤ nijklm¤ oghn¤ po]¤ q3p*¤ rp*¤ s/HŒ¤ tsŒ¤ utŒ¤ v4756f¤ wfl-1e97f9b4a-84¤ xfl-1e97f9b4a-85¤ yfl-1e97f9b4a-86¤ zfl-1e97f9b4a-87¤ {fl-1e97f9b4a-88¤ |wxyz{¤ }vh|¤ ~}]¤ ~*¤C5h¨V]4     54>"G4.h<]C4gdummy  gv     C2CFGh k]45ŒŒŒCcgdummy  gop  gea   gs   gv      CISh\]ŒŒŒCTgdummy  gs  gop   gea      CVW hP"]45$@45$@45$@ 6gx  Pgtmp Pgtmp  " Pgtmp  9 Pgfilenamefsystem/base/ck.scmŒ $ ŒŒ  P g macro-typeg syntax-rulesŒgpatternsgquotegvgopg...geag...gsŒgquotegvgsgopgeag...C5R43Ih\]ŒŒCTgdummy  gs  gop   gva     CeqFrh l]45ŒŒŒCdgdummy  gs  gop   gv   gea1      Cuhm]ŒŒCegdummy  gs  gop   gea   gea1      CVW hP6]45$@45$@45$@ 6.gx  Pgtmp Pgtmp  " Pgtmp  9 Pgfilenamefsystem/base/ck.scmŒ . ŒŒ  P g macro-typeg syntax-rulesŒgpatternsgsgopgvag...gsgopg...gquotegvgea1g...gsgopg...geagea1g...C53RCNgm  (gfilenamefsystem/base/ck.scmŒ  ŒŒ  ¥ C6PK!´Ëþ€€ base/types.gonu„[µü¤GOOF----LE-8-2.0í] Ž4h£¶] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gbase¤ gtypes¤ ¤ gfilenameS¤ fsystem/base/types.scm¤ gimportsS¤ grnrs¤ g bytevectors¤  ¤ ¤ gio¤ gports¤  ¤ ¤ gsrfi¤ gsrfi-1¤ ¤ ¤ gsrfi-9¤ ¤ ¤ ggnu¤ ¤ ¤ gsrfi-11¤ ¤ ! ¤ "gsrfi-26¤ #"¤ $#¤ %gsrfi-60¤ &%¤ '&¤ (gice-9¤ )gmatch¤ *()¤ +*¤ ,giconv¤ -(,¤ .-¤ /gformat¤ 0(/¤ 10¤ 2gvlist¤ 3(2¤ 43¤ 5gforeign¤ 65¤ 76¤ 8!$'+.147 ¤ 9gexportsS¤ :g %word-size¤ ;gmemory-backend¤ gdereference-word¤ ?g memory-port¤ @gtype-number->name¤ Aginferior-object?¤ Bginferior-object-kind¤ Cginferior-object-sub-kind¤ Dginferior-object-address¤ Eginferior-fluid?¤ Fginferior-fluid-number¤ Gginferior-struct?¤ Hginferior-struct-name¤ Iginferior-struct-fields¤ Jg scm->object¤ K:;<=>?@ABCDEFGHIJ¤ Lgset-current-module¤ ML¤ NL¤ Ogsizeof¤ Pg*¤ Qg¤ Rg%memory-backend-procedure¤ Sgmake-syntax-transformer¤ TS¤ US¤ Vgmacro¤ Wg $sc-dispatch¤ XW¤ YW¤ Zg_¤ [gany¤ \Z[[[¤ ]g syntax-object¤ ^glambda¤ _g m-1f6d4c535-6¤ `gtop¤ a_`¤ bgribcage¤ cg t-1f6d4c535-3¤ dg t-1f6d4c535-4¤ eg t-1f6d4c535-5¤ fcde¤ gaaa¤ hf l-1f6d4c535-b¤ if l-1f6d4c535-c¤ jf l-1f6d4c535-d¤ khij¤ lbfgk¤ mb¤ ngx¤ on¤ pa¤ qf l-1f6d4c535-8¤ rq¤ sbopr¤ tgshift¤ ug proc-name¤ vgargs¤ wuv¤ x`¤ yxx¤ zfl-1e8ba8b5a-60¤ {fl-1e8ba8b5a-61¤ |z{¤ }bwy|¤ ~gkey¤ gvalue¤ €gname¤ gformals¤ ‚gbody¤ ƒ~€‚¤ „xxxxx¤ …fl-1e8ba8b5a-53¤ †fl-1e8ba8b5a-54¤ ‡fl-1e8ba8b5a-55¤ ˆfl-1e8ba8b5a-56¤ ‰fl-1e8ba8b5a-57¤ Š…†‡ˆ‰¤ ‹bƒ„Ф Œgmake-procedure-name¤ Œ¤ Žx¤ fl-1e8ba8b5a-43¤ ¤ ‘bޤ ’x¤ “fl-1e8ba8b5a-42¤ ”“¤ •bo’”¤ –almstmmmm}‹‘• ¤ —ghygiene¤ ˜—¤ ™]^–˜¤ šgpeek¤ ›xlms¤ œ—¤ ]š›œ¤ žgopen¤ Ÿ]ž›œ¤  g type-name¤ ¡] ›œ¤ ¢Ÿ¡¤ £g make-struct¤ ¤g m-1f6d4c535-1¤ ¥¤`¤ ¦gt-1e8ba8b5a-133¤ §gt-1e8ba8b5a-132¤ ¨gt-1e8ba8b5a-131¤ ©¦§¨¤ ªgm-1e8ba8b5a-134¤ «ª`¤ ¬«««¤ ­fl-1e8ba8b5a-138¤ ®fl-1e8ba8b5a-139¤ ¯fl-1e8ba8b5a-13a¤ °­®¯¤ ±b©¬°¤ ²g ctor-args¤ ³²¤ ´fl-1e8ba8b5a-120¤ µ´¤ ¶b³’µ¤ ·gctor¤ ¸gfield¤ ¹·¸¤ ºfl-1e8ba8b5a-11c¤ »fl-1e8ba8b5a-11d¤ ¼º»¤ ½b¹y¼¤ ¾gform¤ ¿gconstructor-spec¤ Àg field-names¤ Á¾ ¿À¤ Âxxxx¤ Ãfl-1e8ba8b5a-111¤ Äfl-1e8ba8b5a-112¤ Åfl-1e8ba8b5a-113¤ Æfl-1e8ba8b5a-114¤ ÇÃÄÅÆ¤ ÈbÁÂǤ Ég record-layout¤ Êgfunctional-setters¤ Ëgsetters¤ Ìgcopier¤ Íggetters¤ Îg constructor¤ Ïggetter-identifiers¤ Ðgfield-identifiers¤ ÑÉÊËÌÍÎÏФ Òxxxxxxxx¤ Ófl-1e8ba8b5a-e9¤ Ôfl-1e8ba8b5a-e7¤ Õfl-1e8ba8b5a-e5¤ Öfl-1e8ba8b5a-e3¤ ×fl-1e8ba8b5a-e1¤ Øfl-1e8ba8b5a-df¤ Ùfl-1e8ba8b5a-dd¤ Úfl-1e8ba8b5a-db¤ ÛÓÔÕÖרÙÚ¤ ÜbÑÒÛ¤ Ýfl-1e8ba8b5a-da¤ Þݤ ßbo’Þ¤ à¥lmstm±mmm¶½mÈÜߤ á]£à˜¤ â]Q›œ¤ ã] à˜¤ äáâ㟡¤ å™¢ä¤ ægeach-any¤ çZ挤 ègsyntax-violation¤ éè¤ êè¤ ëfWrong number of arguments¤ ìg identifier?¤ íì¤ îì¤ ïxms¤ ð]R ñè¤ òè¤ óf-source expression failed to match any pattern¤ ôgrecord-type-vtable¤ õô¤ öô¤ ÷gpwpwpw¤ øgdefault-record-printer¤ ùø¤ úø¤ ûšž ¤ ügset-struct-vtable-name!¤ ýü¤ þü¤ ÿgvtable-offset-user¤ ÿ¤ ÿ¤ g%memory-backend?-procedure¤ Z[¤ gm-1f6d4c535-17¤ `¤ gt-1f6d4c535-16¤ ¤ ¤  fl-1f6d4c535-1c¤   ¤  b ¤  fl-1f6d4c535-19¤   ¤ bo ¤  mtmmmm}‹‘• ¤ ]^˜¤ gobj¤ gt-1e8ba8b5a-224¤ gt-1e8ba8b5a-21e¤ gt-1e8ba8b5a-21f¤ gt-1e8ba8b5a-220¤ gt-1e8ba8b5a-223¤ gt-1e8ba8b5a-222¤ gt-1e8ba8b5a-221¤ ¤ gm-1e8ba8b5a-225¤ `¤ ¤ fl-1e8ba8b5a-229¤ fl-1e8ba8b5a-22a¤ fl-1e8ba8b5a-22b¤  fl-1e8ba8b5a-22c¤ !fl-1e8ba8b5a-22d¤ "fl-1e8ba8b5a-22e¤ #fl-1e8ba8b5a-22f¤ $ !"#¤ %b$¤ &g copier-id¤ '&¤ (fl-1e8ba8b5a-21c¤ )(¤ *b'’)¤ +g ctor-name¤ ,+¤ -fl-1e8ba8b5a-214¤ .-¤ /b,’.¤ 0À¤ 1fl-1e8ba8b5a-212¤ 21¤ 3b0’2¤ 4glayout¤ 54¤ 6fl-1e8ba8b5a-210¤ 76¤ 8b5’7¤ 9g immutable?¤ :9¤ ;fl-1e8ba8b5a-20e¤ <;¤ =b:’<¤ >g field-count¤ ?>¤ @fl-1e8ba8b5a-20c¤ A@¤ Bb?’A¤ Cg getter-ids¤ DC¤ Efl-1e8ba8b5a-209¤ FE¤ GbD’F¤ Hg field-ids¤ IH¤ Jfl-1e8ba8b5a-206¤ KJ¤ LbI’K¤ Mgpredicate-name¤ Ng field-spec¤ O9¾ ¿MN¤ Pxxxxxx¤ Qfl-1e8ba8b5a-1f9¤ Rfl-1e8ba8b5a-1fa¤ Sfl-1e8ba8b5a-1fb¤ Tfl-1e8ba8b5a-1fc¤ Ufl-1e8ba8b5a-1fd¤ Vfl-1e8ba8b5a-1fe¤ WQRSTUV¤ XbOPW¤ Y¥ mtm%mmmm*m/m3m8m=mBmGmLXÜߤ Z]Y˜¤ [Z¤ \gand¤ ]]\Y˜¤ ^gstruct?¤ _]^Y˜¤ `_Z¤ ageq?¤ b]aY˜¤ cg struct-vtable¤ d]cY˜¤ edZ¤ fx m¤ g]Qfœ¤ hbeg¤ i]`h¤ j[i¤ kxm¤ l]kœ¤ mgthrow-bad-struct¤ nm¤ om¤ pgmemory-backend-peek¤ qg%memory-backend-peek-procedure¤ rgfree-id¤ sg %%on-error¤ tgm-1f6d4c535-23¤ ut`¤ vu¤ wfl-1f6d4c535-25¤ xw¤ ybovx¤ zumytmmmm}‹‘• ¤ {]sz˜¤ |r{¤ }|[¤ ~g%%type¤ gt-1e8ba8b5a-14b¤ €gt-1e8ba8b5a-14c¤ gt-1e8ba8b5a-14d¤ ‚gt-1e8ba8b5a-14e¤ ƒgt-1e8ba8b5a-14f¤ „gt-1e8ba8b5a-150¤ …gt-1e8ba8b5a-151¤ †€‚ƒ„…¤ ‡gm-1e8ba8b5a-152¤ ˆ‡`¤ ‰ˆˆˆˆˆˆˆ¤ Šfl-1e8ba8b5a-156¤ ‹fl-1e8ba8b5a-157¤ Œfl-1e8ba8b5a-158¤ fl-1e8ba8b5a-159¤ Žfl-1e8ba8b5a-15a¤ fl-1e8ba8b5a-15b¤ fl-1e8ba8b5a-15c¤ ‘Š‹ŒŽ¤ ’b†‰‘¤ “ggetter¤ ”gindex¤ •“”¤ –fl-1e8ba8b5a-149¤ —fl-1e8ba8b5a-14a¤ ˜–—¤ ™b•y˜¤ š C&¤ ›xxx¤ œfl-1e8ba8b5a-144¤ fl-1e8ba8b5a-145¤ žfl-1e8ba8b5a-146¤ Ÿœž¤  bš›Ÿ¤ ¡¥mytm’mmm™m Üߤ ¢]~¡˜¤ £r¢¤ ¤Z}£[¤ ¥gck¤ ¦gerr¤ §gs¤ ¨¦§¤ ©uu¤ ªfl-1f6d4c535-28¤ «fl-1f6d4c535-29¤ ¬ª«¤ ­b¨©¬¤ ®u­mytmmmm}‹‘• ¤ ¯]¥®˜¤ °gquote¤ ±]°®˜¤ ²x­my¤ ³]Q²œ¤ ´±³¤ µ´¤ ¶g%%index¤ ·]¶¡˜¤ ¸r·¤ ¹Z}¸[¤ ºfl-1f6d4c535-2d¤ »fl-1f6d4c535-2e¤ ¼º»¤ ½b¨©¼¤ ¾u½mytmmmm}‹‘• ¤ ¿]¥¾˜¤ À]°¾˜¤ Á½my¤ Â] Áœ¤ ÃÀ¤ Ää Åg%%copier¤ Æ]Å¡˜¤ ÇrƤ ÈZ}Ç[¤ Éfl-1f6d4c535-32¤ Êfl-1f6d4c535-33¤ ËÉʤ Ìb¨©Ë¤ ÍuÌmytmmmm}‹‘• ¤ Î]¥Í˜¤ Ï]°Í˜¤ Ðg%%-set-fields¤ ÑxÌmy¤ Ò]ÐÑœ¤ ÓÏÒ¤ ÔÓ¤ Õgt-1f6d4c535-22¤ ÖÕ¤ ×fl-1f6d4c535-37¤ Ø×¤ ÙbÖvؤ ÚuÙmytmmmm}‹‘• ¤ Û]^Ú˜¤ Ü¥Ùmytm’mmm™m Üߤ Ý]§Ü˜¤ Þݤ ßgif¤ à]ßܘ¤ á]aܘ¤ â]cܘ¤ ãâݤ äxÙmy¤ å]Q䜤 æáãå¤ çg struct-ref¤ è]çܘ¤ éÙmy¤ ê] 霤 ëèÝê¤ ì]mܘ¤ í]°Ü˜¤ î]p䜤 ïíî¤ ðìÝï¤ ñàæëð¤ òÛÞñ¤ óxmy¤ ô]qóœ¤ õgmemory-backend-open¤ ög%memory-backend-open-procedure¤ ÷gm-1f6d4c535-3e¤ ø÷`¤ ùø¤ úfl-1f6d4c535-40¤ ûú¤ üboùû¤ ýømütmmmm}‹‘• ¤ þ]sý˜¤ ÿrþ¤ ÿ[¤ ¥mütm’mmm™m Üߤ ]~˜¤ r¤ Z[¤ øø¤ fl-1f6d4c535-43¤ fl-1f6d4c535-44¤ ¤  b¨¤  ø mütmmmm}‹‘• ¤  ]¥ ˜¤  ]° ˜¤  x mü¤ ]Q œ¤  ¤ ¤ ]¶˜¤ r¤ Z[¤ fl-1f6d4c535-48¤ fl-1f6d4c535-49¤ ¤ b¨¤ ømütmmmm}‹‘• ¤ ]¥˜¤ ]°˜¤ mü¤ ] œ¤ ¤ ¤ ]ؤ  r¤ !Z [¤ "fl-1f6d4c535-4d¤ #fl-1f6d4c535-4e¤ $"#¤ %b¨$¤ &ø%mütmmmm}‹‘• ¤ ']¥&˜¤ (]°&˜¤ )x%mü¤ *]Ð)œ¤ +(*¤ ,+¤ -gt-1f6d4c535-3d¤ .-¤ /fl-1f6d4c535-52¤ 0/¤ 1b.ù0¤ 2ø1mütmmmm}‹‘• ¤ 3]^2˜¤ 4¥1mütm’mmm™m Üߤ 5]§4˜¤ 65¤ 7]ß4˜¤ 8]a4˜¤ 9]c4˜¤ :95¤ ;x1mü¤ <]Q;œ¤ =8:<¤ >]ç4˜¤ ?1mü¤ @] ?œ¤ A>5@¤ B]m4˜¤ C]°4˜¤ D]õ;œ¤ ECD¤ FB5E¤ G7=AF¤ H36G¤ Ixmü¤ J]öIœ¤ Kgmemory-backend-type-name¤ Lg#%memory-backend-type-name-procedure¤ Mgm-1f6d4c535-59¤ NM`¤ ON¤ Pfl-1f6d4c535-5b¤ QP¤ RboOQ¤ SNmRtmmmm}‹‘• ¤ T]sS˜¤ UrT¤ VU[¤ W¥mRtm’mmm™m Üߤ X]~W˜¤ YrX¤ ZZVY[¤ [NN¤ \fl-1f6d4c535-5e¤ ]fl-1f6d4c535-5f¤ ^\]¤ _b¨[^¤ `N_mRtmmmm}‹‘• ¤ a]¥`˜¤ b]°`˜¤ cx_mR¤ d]Qcœ¤ ebd¤ fe¤ g]¶W˜¤ hrg¤ iZVh[¤ jfl-1f6d4c535-63¤ kfl-1f6d4c535-64¤ ljk¤ mb¨[l¤ nNmmRtmmmm}‹‘• ¤ o]¥n˜¤ p]°n˜¤ qmmR¤ r] qœ¤ spr¤ ts¤ u]ÅW˜¤ vru¤ wZVv[¤ xfl-1f6d4c535-68¤ yfl-1f6d4c535-69¤ zxy¤ {b¨[z¤ |N{mRtmmmm}‹‘• ¤ }]¥|˜¤ ~]°|˜¤ x{mR¤ €]М¤ ~€¤ ‚¤ ƒgt-1f6d4c535-58¤ „ƒ¤ …fl-1f6d4c535-6d¤ †…¤ ‡b„O†¤ ˆN‡mRtmmmm}‹‘• ¤ ‰]^ˆ˜¤ Š¥‡mRtm’mmm™m Üߤ ‹]§Š˜¤ Œ‹¤ ]ߊ˜¤ Ž]aŠ˜¤ ]cŠ˜¤ ‹¤ ‘x‡mR¤ ’]Q‘œ¤ “Ž’¤ ”]犘¤ •‡mR¤ –] •œ¤ —”‹–¤ ˜]mŠ˜¤ ™]°Š˜¤ š]K‘œ¤ ›™š¤ œ˜‹›¤ “—œ¤ ž‰Œ¤ ŸxmR¤  ]LŸœ¤ ¡geach¤ ¢[[¤ £¡¢¤ ¤[£Œ¤ ¥[¤Œ¤ ¦[¥Œ¤ §g %%set-fields¤ ¨gdummy¤ ©gcheck?¤ ªgexpr¤ «¨©§“ª¤ ¬gm-1f6d4c535-74¤ ­¬`¤ ®­¥¥¥¥¤ ¯fl-1f6d4c535-79¤ °fl-1f6d4c535-7a¤ ±fl-1f6d4c535-7b¤ ²fl-1f6d4c535-7c¤ ³fl-1f6d4c535-7d¤ ´¯°±²³¤ µb«®´¤ ¶­¤ ·fl-1f6d4c535-76¤ ¸·¤ ¹bo¶¸¤ ºgt-1e8ba8b5a-16a¤ »gt-1e8ba8b5a-16c¤ ¼gt-1e8ba8b5a-16b¤ ½º»¼¤ ¾gm-1e8ba8b5a-16d¤ ¿¾`¤ À¿¿¿¤ Áfl-1e8ba8b5a-171¤ Âfl-1e8ba8b5a-172¤ Ãfl-1e8ba8b5a-173¤ ÄÁÂä Åb½ÀĤ Æfl-1e8ba8b5a-167¤ Çfl-1e8ba8b5a-168¤ Èfl-1e8ba8b5a-169¤ ÉÆÇȤ Êbš›É¤ Ë¥µm¹tmÅmmmÊÜß ¤ Ì]§Ë˜¤ Íxµm¹¤ Î]QÍœ¤ Ï]pÍœ¤ Ð]õÍœ¤ Ñ]KÍœ¤ ÒÏÐѤ Ógmap¤ ÔÓ¤ ÕÓ¤ Öglist¤ ×g make-pointer¤ Øgpointer->bytevector¤ Ùgbytevector-uint-ref¤ Úgnative-endianness¤ Ûgopen-bytevector-input-port¤ Ügmake-custom-binary-input-port¤ Ýf ffi-memory¤ Þgbytevector-copy!¤ ßgsetvbuf¤ àg_IONBF¤ ág% dereference-word-procedure¤ âZ[[¤ ãgsyntax-parameterize¤ ägm-1f6d4c535-c6¤ åä`¤ ægt-1f6d4c535-c4¤ çgt-1f6d4c535-c5¤ èæç¤ éåå¤ êfl-1f6d4c535-cb¤ ëfl-1f6d4c535-cc¤ ìêë¤ íbèéì¤ îå¤ ïfl-1f6d4c535-c8¤ ðï¤ ñboîð¤ òfl-bde397a-1eaf¤ ófl-bde397a-1eb0¤ ôòó¤ õbwyô¤ ö€‚¤ ÷fl-bde397a-1ea6¤ øfl-bde397a-1ea7¤ ùfl-bde397a-1ea8¤ ú÷øù¤ ûbö›ú¤ ügprefix¤ ýŒü¤ þxx¤ ÿfl-bde397a-1e9a¤ fl-bde397a-1e98¤ ÿ¤ býþ¤ fl-bde397a-1e97¤ ¤ bo’¤ åímñtmmmmõû ¤ —¤ ]㤠 xímñ¤  ]> œ¤  gidentifier-syntax¤  ] ¤  ]á œ¤   ¤  ¤ ¤ ]^¤ gbackend¤ ] œ¤ gaddress¤ ] œ¤ ¤ f*Return the word at ADDRESS, using BACKEND.¤ ] œ¤ glet¤ ] œ¤ ]š œ¤ ]p œ¤ ¤ ¤ ¤  ¤ ! ¤ "!¤ #"¤ $ì¤ %ì¤ &xmñ¤ ']á&œ¤ ([[[¤ )¨¤ *gm-1f6d4c535-e9¤ +*`¤ ,+xx¤ -fl-1f6d4c535-ee¤ .fl-1f6d4c535-ef¤ /fl-1f6d4c535-f0¤ 0-./¤ 1b),0¤ 2+¤ 3fl-1f6d4c535-eb¤ 43¤ 5bo24¤ 6x1m5¤ 7]6œ¤ 8]ž6œ¤ 9]õ6œ¤ :]6œ¤ ;:¤ <[[[[¤ =gsize¤ >¨=¤ ?+xxx¤ @fl-1f6d4c535-f5¤ Afl-1f6d4c535-f6¤ Bfl-1f6d4c535-f7¤ Cfl-1f6d4c535-f8¤ D@ABC¤ Eb>?D¤ FxEm5¤ G]ßFœ¤ Hgzero?¤ I]HFœ¤ J]ÛFœ¤ K]°Fœ¤ Lgvu8 ÿj¤ M]LFœ¤ NKM¤ OJN¤ P]Fœ¤ Q]žFœ¤ R]õFœ¤ Sgget-bytevector-n¤ Tgget-word¤ Ug% type-number->name-procedure¤ Vgm-1f6d4c535-104¤ WV`¤ Xgt-1f6d4c535-101¤ Ygt-1f6d4c535-102¤ Zgt-1f6d4c535-103¤ [XYZ¤ \WWW¤ ]fl-1f6d4c535-109¤ ^fl-1f6d4c535-10a¤ _fl-1f6d4c535-10b¤ `]^_¤ ab[\`¤ bW¤ cfl-1f6d4c535-106¤ dc¤ ebobd¤ fWametmmmmõû ¤ g]ãf¤ hxame¤ i]@hœ¤ j] f¤ k]Uhœ¤ ljk¤ mil¤ nm¤ o]^f¤ p]hœ¤ qgkind¤ r]qhœ¤ sgnumber¤ t]shœ¤ uprt¤ vfyReturn the name of the type NUMBER of KIND, where KIND is one of 'smob or 'port, or #f if the information is unavailable.¤ w]vhœ¤ x]hœ¤ ygproc¤ z]yhœ¤ {]Khœ¤ |{p¤ }z|¤ ~}¤ ]\hœ¤ €zrt¤ z€¤ ‚x~¤ ƒouw‚¤ „gnƒ¤ …xme¤ †]U…œ¤ ‡gmatch-cell-words¤ ˆg bytevector¤ ‰gm-1f6d4c535-12d¤ Љ`¤ ‹Š¤ Œfl-1f6d4c535-12f¤ Œ¤ Žbo‹¤ xmޤ ]ˆœ¤ ‘r¤ ’‘[[¤ “’挤 ”[[“[¤ •gport¤ –glen¤ —grest¤ ˜¨•€–—‚¤ ™Šxxxxx¤ šfl-1f6d4c535-132¤ ›fl-1f6d4c535-133¤ œfl-1f6d4c535-134¤ fl-1f6d4c535-135¤ žfl-1f6d4c535-136¤ Ÿfl-1f6d4c535-137¤  š›œžŸ¤ ¡b˜™ ¤ ¢x¡mޤ £]¢œ¤ ¤]S¢œ¤ ¥g remainder¤ ¦]¥¢œ¤ §gmodulo¤ ¨]§¢œ¤ ©]:¢œ¤ ª©¤ «gunless¤ ¬]«¢œ¤ ­]H¢œ¤ ®­¦¤ ¯g-¤ °]¯¢œ¤ ±°©¦¤ ²±¤ ³]‡¢œ¤ ´[挤 µ[[´[¤ ¶¨•€—‚¤ ·Šxxxx¤ ¸fl-1f6d4c535-140¤ ¹fl-1f6d4c535-141¤ ºfl-1f6d4c535-142¤ »fl-1f6d4c535-143¤ ¼fl-1f6d4c535-144¤ ½¸¹º»¼¤ ¾b¶·½¤ ¿x¾mޤ À]¿œ¤ Á]T¿œ¤ Â]‡¿œ¤ Ã[[[¤ Ägmatch-bit-pattern¤ Åg||¤ Ægm-1f6d4c535-152¤ ÇÆ`¤ ÈǤ Éfl-1f6d4c535-154¤ Êɤ ËboÈʤ Ìxmˤ Í]ÅÌœ¤ Îrͤ Ï[Î[¤ Ðg&¤ Ñ]ÐÌœ¤ ÒrѤ Óg=¤ Ô]ÓÌœ¤ ÕrÔ¤ ÖÏÒ[Õ[¤ ×[[Ö[[¤ Øgbits¤ Ùga¤ Úgb¤ Ûgn¤ Ügc¤ Ýg consequent¤ Þg alternate¤ ߨØÙÚÛÜÝÞ¤ àÇxxxxxxx¤ áfl-1f6d4c535-157¤ âfl-1f6d4c535-158¤ ãfl-1f6d4c535-159¤ äfl-1f6d4c535-15a¤ åfl-1f6d4c535-15b¤ æfl-1f6d4c535-15c¤ çfl-1f6d4c535-15d¤ èfl-1f6d4c535-15e¤ éáâãäåæçè¤ êbßàé¤ ëxêmˤ ì]뜤 ígtag¤ î]í뜤 ïglogand¤ ð]ï뜤 ñ]ß뜤 ò]Ó뜤 óî¤ ôg bitwise-not¤ õ]ô뜤 ö[Ò[Õ[¤ ÷[[ö[[¤ ø¨ØnÛÜÝÞ¤ ùÇxxxxxx¤ úfl-1f6d4c535-168¤ ûfl-1f6d4c535-169¤ üfl-1f6d4c535-16a¤ ýfl-1f6d4c535-16b¤ þfl-1f6d4c535-16c¤ ÿfl-1f6d4c535-16d¤ fl-1f6d4c535-16e¤ úûüýþÿ¤ bøù¤ xmˤ ]œ¤ ]휤 ] ]ßœ¤ ]Óœ¤  ]ZÌœ¤  r ¤   Ò[Õ[¤  [[ [[¤  ¨ØÛÜÝÞ¤ Çxxxxx¤ fl-1f6d4c535-177¤ fl-1f6d4c535-178¤ fl-1f6d4c535-179¤ fl-1f6d4c535-17a¤ fl-1f6d4c535-17b¤ fl-1f6d4c535-17c¤ ¤ b ¤ xmˤ ]œ¤ ]휤 ] ]ßœ¤ ]Óœ¤ (Î[¤ [[[[¤ g<<¤  ¨ØÙÛÜÝÞ¤ !fl-1f6d4c535-184¤ "fl-1f6d4c535-185¤ #fl-1f6d4c535-186¤ $fl-1f6d4c535-187¤ %fl-1f6d4c535-188¤ &fl-1f6d4c535-189¤ 'fl-1f6d4c535-18a¤ (fl-1f6d4c535-18b¤ )!"#$%&'(¤ *b à)¤ +x*mˤ ,]+œ¤ -]í+œ¤ .g bitwise-and¤ /].+œ¤ 0]¯+œ¤ 1gexpt¤ 2]1+œ¤ 3] +œ¤ 4] +œ¤ 54¤ 6]ß+œ¤ 7]Ó+œ¤ 8garithmetic-shift¤ 9]8+œ¤ :gmatch-cell-clauses¤ ;´[¤ <;挤 =[[[<¤ >g tag-pattern¤ ?gthing¤ @¨•í>?‚—¤ Agm-1f6d4c535-194¤ BA`¤ CBxxxxxx¤ Dfl-1f6d4c535-199¤ Efl-1f6d4c535-19a¤ Ffl-1f6d4c535-19b¤ Gfl-1f6d4c535-19c¤ Hfl-1f6d4c535-19d¤ Ifl-1f6d4c535-19e¤ Jfl-1f6d4c535-19f¤ KDEFGHIJ¤ Lb@CK¤ MB¤ Nfl-1f6d4c535-196¤ ON¤ PboMO¤ QxLmP¤ R]ÄQœ¤ S]‡Qœ¤ T]:Qœ¤ U[[[¤ Vginferior-object¤ W¨•í¤ XBxx¤ Yfl-1f6d4c535-1aa¤ Zfl-1f6d4c535-1ab¤ [fl-1f6d4c535-1ac¤ \YZ[¤ ]bWX\¤ ^x]mP¤ _]V^œ¤ `]°^œ¤ ag unmatched-tag¤ b]a^œ¤ c`b¤ dg match-cell¤ e¡´¤ f[eŒ¤ g[fŒ¤ hgpattern¤ i¨•h‚¤ jgm-1f6d4c535-1b0¤ kj`¤ lkxxx¤ mfl-1f6d4c535-1b5¤ nfl-1f6d4c535-1b6¤ ofl-1f6d4c535-1b7¤ pfl-1f6d4c535-1b8¤ qmnop¤ rbilq¤ sk¤ tfl-1f6d4c535-1b2¤ ut¤ vbosu¤ wxrmv¤ x]wœ¤ ygport*¤ z]ywœ¤ {]íwœ¤ |]Twœ¤ }]:wœ¤ ~gbegin¤ ]~wœ¤ €gmatch-scm-clauses¤ ´挤 ‚[Œ¤ ƒ[‚Œ¤ „g bit-pattern¤ …¨Ø„‚—¤ †gm-1f6d4c535-1c0¤ ‡†`¤ ˆ‡xxxx¤ ‰fl-1f6d4c535-1c5¤ Šfl-1f6d4c535-1c6¤ ‹fl-1f6d4c535-1c7¤ Œfl-1f6d4c535-1c8¤ fl-1f6d4c535-1c9¤ މЋŒ¤ b…ˆŽ¤ ‡¤ ‘fl-1f6d4c535-1c2¤ ’‘¤ “bo’¤ ”xm“¤ •]Ä”œ¤ –]~”œ¤ —]€”œ¤ ˜¨Ø¤ ™‡x¤ šfl-1f6d4c535-1d2¤ ›fl-1f6d4c535-1d3¤ œš›¤ b˜™œ¤ žxm“¤ Ÿ]°žœ¤  g unmatched-scm¤ ¡] žœ¤ ¢Ÿ¡¤ £g match-scm¤ ¤[´Œ¤ ¥gclauses¤ ¦¨Ø¥¤ §gm-1f6d4c535-1d6¤ ¨§`¤ ©¨xx¤ ªfl-1f6d4c535-1db¤ «fl-1f6d4c535-1dc¤ ¬fl-1f6d4c535-1dd¤ ­ª«¬¤ ®b¦©­¤ ¯¨¤ °fl-1f6d4c535-1d8¤ ±°¤ ²bo¯±¤ ³x®m²¤ ´]³œ¤ µgbits*¤ ¶]µ³œ¤ ·]€³œ¤ ¸g%tc2-int¤ ¹g %tc3-imm24¤ ºg %tc3-cons¤ »g %tc3-int1¤ ¼g %tc3-int2¤ ½g %tc8-char¤ ¾g %tc8-flag¤ ¿g %tc3-struct¤ Àg %tc7-symbol¤ Ág %tc7-variable¤ Âg %tc7-vector¤ Ãg %tc7-wvect¤ Äg %tc7-string¤ Åg %tc7-number¤ Æg%tc7-hashtable¤ Çg %tc7-pointer¤ Èg %tc7-fluid¤ Ég%tc7-stringbuf¤ Êg%tc7-dynamic-state¤ Ëg %tc7-frame¤ Ìg %tc7-objcode¤ Íg%tc7-vm¤ Îg%tc7-vm-continuation¤ Ïg%tc7-bytevector¤ Ðg %tc7-program¤ Ñg %tc7-array¤ Òg%tc7-bitvector¤ Óg %tc7-port¤ Ôg %tc7-smob¤ Õg %tc16-bignum¤ Ög %tc16-real¤ ×g %tc16-complex¤ Øg%tc16-fraction¤ Ùg ¤ Úg%stringbuf-procedure¤ Ûg stringbuf¤ Ügm-1f6d4c535-1e6¤ ÝÜ`¤ Þgt-1f6d4c535-1e5¤ ßÞ¤ àݤ áfl-1f6d4c535-1eb¤ âᤠãbßà⤠äfl-1f6d4c535-1e8¤ åä¤ æboàå¤ çÝãmætmmmm}‹‘• ¤ è]^瘤 égstring¤ êxãmæ¤ ë]éꜤ ìë¤ ígm-1f6d4c535-1e3¤ îí`¤ ïîãmætm±mmm¶½mÈÜߤ ð]£ï˜¤ ñ]ÙꜤ ò]  óðñòë¤ ôèìó¤ õxmæ¤ ö]Úõœ¤ ÷gpw¤ øé¤ ùg%stringbuf?-procedure¤ úg stringbuf?¤ ûgm-1f6d4c535-1f3¤ üû`¤ ýgt-1f6d4c535-1f2¤ þý¤ ÿü¤ fl-1f6d4c535-1f8¤ ¤ bþÿ¤ fl-1f6d4c535-1f5¤ ¤ boÿ¤ ümtmmmm}‹‘• ¤ ]^˜¤ îmtm%mmmm*m/m3m8m=mBmGmLXÜߤ  ]˜¤   ¤  ]\˜¤  ]^˜¤    ¤ ]a˜¤ ]c˜¤  ¤ xm¤ ]Ùœ¤ ¤   ¤  ¤ xm¤ ]ùœ¤ gstringbuf-contents¤ g%stringbuf-contents-procedure¤ gm-1f6d4c535-1ff¤ `¤ ¤ fl-1f6d4c535-201¤ ¤ bo¤  mtmmmm}‹‘• ¤ !]s ˜¤ "r!¤ #"[¤ $îmtm’mmm™m Üߤ %]~$˜¤ &r%¤ 'Z#&[¤ (¤ )fl-1f6d4c535-204¤ *fl-1f6d4c535-205¤ +)*¤ ,b¨(+¤ -,mtmmmm}‹‘• ¤ .]¥-˜¤ /]°-˜¤ 0x,m¤ 1]Ù0œ¤ 2/1¤ 32¤ 4]¶$˜¤ 5r4¤ 6Z#5[¤ 7fl-1f6d4c535-209¤ 8fl-1f6d4c535-20a¤ 978¤ :b¨(9¤ ;:mtmmmm}‹‘• ¤ <]¥;˜¤ =]°;˜¤ >:m¤ ?] >œ¤ @=?¤ A@¤ B]Å$˜¤ CrB¤ DZ#C[¤ Efl-1f6d4c535-20e¤ Ffl-1f6d4c535-20f¤ GEF¤ Hb¨(G¤ IHmtmmmm}‹‘• ¤ J]¥I˜¤ K]°I˜¤ Lg%%-set-fields¤ MxHm¤ N]LMœ¤ OKN¤ PO¤ Qgt-1f6d4c535-1fe¤ RQ¤ Sfl-1f6d4c535-213¤ TS¤ UbRT¤ VUmtmmmm}‹‘• ¤ W]^V˜¤ XîUmtm’mmm™m Üߤ Y]§X˜¤ ZY¤ []ßX˜¤ \]aX˜¤ ]]cX˜¤ ^]Y¤ _xUm¤ `]Ù_œ¤ a\^`¤ b]çX˜¤ cUm¤ d] cœ¤ ebYd¤ f]mX˜¤ g]°X˜¤ h]_œ¤ igh¤ jfYi¤ k[aej¤ lWZk¤ mxm¤ n]mœ¤ ogm-1f6d4c535-21a¤ po`¤ qpîîîî¤ rfl-1f6d4c535-21f¤ sfl-1f6d4c535-220¤ tfl-1f6d4c535-221¤ ufl-1f6d4c535-222¤ vfl-1f6d4c535-223¤ wrstuv¤ xb«qw¤ yp¤ zfl-1f6d4c535-21c¤ {z¤ |boy{¤ }îxm|tmÅmmmÊÜß ¤ ~]§}˜¤ xxm|¤ €]Ùœ¤ ]œ¤ ‚¤ ƒgset-record-type-printer!¤ „gdisplay¤ …f #¤ ˆg¤ ‰g%inferior-struct-procedure¤ Šginferior-struct¤ ‹gm-1f6d4c535-242¤ Œ‹`¤ gt-1f6d4c535-240¤ Žgt-1f6d4c535-241¤ ޤ ŒŒ¤ ‘fl-1f6d4c535-247¤ ’fl-1f6d4c535-248¤ “‘’¤ ”b“¤ •Œ¤ –fl-1f6d4c535-244¤ —–¤ ˜bo•—¤ ™Œ”m˜tmmmm}‹‘• ¤ š]^™˜¤ ›x”m˜¤ œ]€›œ¤ gfields¤ ž]›œ¤ Ÿœž¤  gm-1f6d4c535-23e¤ ¡ `¤ ¢¡”m˜tm±mmm¶½mÈÜߤ £]£¢˜¤ ¤]ˆ›œ¤ ¥] ¢˜¤ ¦£¤¥œž¤ §šŸ¦¤ ¨xm˜¤ ©]‰¨œ¤ ªgpwpw¤ «€¤ ¬g%inferior-struct?-procedure¤ ­gm-1f6d4c535-251¤ ®­`¤ ¯gt-1f6d4c535-250¤ °¯¤ ±®¤ ²fl-1f6d4c535-256¤ ³²¤ ´b°±³¤ µfl-1f6d4c535-253¤ ¶µ¤ ·bo±¶¤ ¸®´m·tmmmm}‹‘• ¤ ¹]^¸˜¤ º¡´m·tm%mmmm*m/m3m8m=mBmGmLXÜߤ »]º˜¤ ¼»¤ ½]\º˜¤ ¾]^º˜¤ ¿¾»¤ À]aº˜¤ Á]cº˜¤ ÂÁ»¤ Ãx´m·¤ Ä]ˆÃœ¤ ÅÀÂĤ ƽ¿Å¤ ǹ¼Æ¤ Èxm·¤ É]¬Èœ¤ Êg%inferior-struct-name-procedure¤ Ëgm-1f6d4c535-25d¤ ÌË`¤ Í̤ Îfl-1f6d4c535-25f¤ ÏΤ ÐboÍϤ ÑÌmÐtmmmm}‹‘• ¤ Ò]sј¤ ÓrÒ¤ ÔÓ[¤ Õ¡mÐtm’mmm™m Üߤ Ö]~Õ˜¤ ×rÖ¤ ØZÔ×[¤ ÙÌ̤ Úfl-1f6d4c535-262¤ Ûfl-1f6d4c535-263¤ ÜÚÛ¤ Ýb¨Ùܤ ÞÌÝmÐtmmmm}‹‘• ¤ ß]¥Þ˜¤ à]°Þ˜¤ áxÝmФ â]ˆáœ¤ ãà⤠ä㤠å]¶Õ˜¤ ærå¤ çZÔæ[¤ èfl-1f6d4c535-267¤ éfl-1f6d4c535-268¤ êèé¤ ëb¨Ùê¤ ìÌëmÐtmmmm}‹‘• ¤ í]¥ì˜¤ î]°ì˜¤ ïëmФ ð]  ñîð¤ òñ¤ ó]ÅÕ˜¤ ôró¤ õZÔô[¤ öfl-1f6d4c535-26c¤ ÷fl-1f6d4c535-26d¤ øö÷¤ ùb¨Ùø¤ úÌùmÐtmmmm}‹‘• ¤ û]¥ú˜¤ ü]°ú˜¤ ýg%%-set-fields¤ þxùmФ ÿ]ýþœ¤ üÿ¤ ¤ gt-1f6d4c535-25c¤ ¤ fl-1f6d4c535-271¤ ¤ bͤ ÌmÐtmmmm}‹‘• ¤ ]^˜¤  ¡mÐtm’mmm™m Üߤ  ]§ ˜¤   ¤  ]ß ˜¤  ]a ˜¤ ]c ˜¤  ¤ xmФ ]ˆœ¤  ¤ ]ç ˜¤ mФ ] œ¤  ¤ ]m ˜¤ ]° ˜¤ ]Hœ¤ ¤  ¤  ¤  ¤ xmФ ]Êœ¤  g!%inferior-struct-fields-procedure¤ !gm-1f6d4c535-278¤ "!`¤ #"¤ $fl-1f6d4c535-27a¤ %$¤ &bo#%¤ '"m&tmmmm}‹‘• ¤ (]s'˜¤ )r(¤ *)[¤ +¡m&tm’mmm™m Üߤ ,]~+˜¤ -r,¤ .Z*-[¤ /""¤ 0fl-1f6d4c535-27d¤ 1fl-1f6d4c535-27e¤ 201¤ 3b¨/2¤ 4"3m&tmmmm}‹‘• ¤ 5]¥4˜¤ 6]°4˜¤ 7x3m&¤ 8]ˆ7œ¤ 968¤ :9¤ ;]¶+˜¤ <r;¤ =Z*<[¤ >fl-1f6d4c535-282¤ ?fl-1f6d4c535-283¤ @>?¤ Ab¨/@¤ B"Am&tmmmm}‹‘• ¤ C]¥B˜¤ D]°B˜¤ EAm&¤ F] Eœ¤ GDF¤ HG¤ I]Å+˜¤ JrI¤ KZ*J[¤ Lfl-1f6d4c535-287¤ Mfl-1f6d4c535-288¤ NLM¤ Ob¨/N¤ P"Om&tmmmm}‹‘• ¤ Q]¥P˜¤ R]°P˜¤ SxOm&¤ T]ýSœ¤ URT¤ VU¤ Wgt-1f6d4c535-277¤ XW¤ Yfl-1f6d4c535-28c¤ ZY¤ [bX#Z¤ \"[m&tmmmm}‹‘• ¤ ]]^\˜¤ ^¡[m&tm’mmm™m Üߤ _]§^˜¤ `_¤ a]ß^˜¤ b]a^˜¤ c]c^˜¤ dc_¤ ex[m&¤ f]ˆeœ¤ gbdf¤ h]ç^˜¤ i[m&¤ j] iœ¤ kh_j¤ l]m^˜¤ m]°^˜¤ n]Ieœ¤ omn¤ pl_o¤ qagkp¤ r]`q¤ sxm&¤ t] sœ¤ ugm-1f6d4c535-293¤ vu`¤ wv¡¡¡¡¤ xfl-1f6d4c535-298¤ yfl-1f6d4c535-299¤ zfl-1f6d4c535-29a¤ {fl-1f6d4c535-29b¤ |fl-1f6d4c535-29c¤ }xyz{|¤ ~b«w}¤ v¤ €fl-1f6d4c535-295¤ €¤ ‚bo¤ ƒ¡~m‚tmÅmmmÊÜß ¤ „]§ƒ˜¤ …x~m‚¤ †]ˆ…œ¤ ‡]H…œ¤ ˆ]I…œ¤ ‰‡ˆ¤ Šgset-inferior-struct-fields!¤ ‹g&%set-inferior-struct-fields!-procedure¤ Œgm-1f6d4c535-2a7¤ Œ`¤ Žgt-1f6d4c535-2a5¤ gt-1f6d4c535-2a6¤ ޤ ‘¤ ’fl-1f6d4c535-2ac¤ “fl-1f6d4c535-2ad¤ ”’“¤ •b‘”¤ –¤ —fl-1f6d4c535-2a9¤ ˜—¤ ™bo–˜¤ š•m™tmmmm}‹‘• ¤ ›]^š˜¤ œgt-1e8ba8b5a-18c¤ gt-1e8ba8b5a-18d¤ žœ¤ Ÿgm-1e8ba8b5a-18e¤  Ÿ`¤ ¡  ¤ ¢fl-1e8ba8b5a-192¤ £fl-1e8ba8b5a-193¤ ¤¢£¤ ¥bž¡¤¤ ¦gsetter¤ §€“¦¤ ¨fl-1e8ba8b5a-186¤ ©fl-1e8ba8b5a-187¤ ªfl-1e8ba8b5a-188¤ «¨©ª¤ ¬b§›«¤ ­N”¤ ®fl-1e8ba8b5a-17d¤ ¯fl-1e8ba8b5a-17e¤ °®¯¤ ±b­y°¤ ²g field-specs¤ ³ ²¤ ´fl-1e8ba8b5a-179¤ µfl-1e8ba8b5a-17a¤ ¶´µ¤ ·b³y¶¤ ¸¡•m™tm¥¬m±m·Üߤ ¹]§¸˜¤ ºgval¤ »]º¸˜¤ ¼¹»¤ ½]߸˜¤ ¾]a¸˜¤ ¿]c¸˜¤ À¿¹¤ Áx•m™¤ Â]ˆÁœ¤ þÀ¤ Äg struct-set!¤ Å]ĸ˜¤ Æ•m™¤ Ç] Æœ¤ ÈŹǻ¤ É]m¸˜¤ Ê]°¸˜¤ Ë]ŠÁœ¤ ÌÊˤ Íɹ̤ νÃÈͤ Ï›¼Î¤ Ðxm™¤ Ñ]‹Ðœ¤ Ògmake-parameter¤ Óg vlist-null¤ Ôg vhash-assq¤ Õf#-1#¤ Öf #¤ ãgobject-address¤ ägprint-inferior-struct¤ åg¤ æg%inferior-fluid-procedure¤ çginferior-fluid¤ ègm-1f6d4c535-2de¤ éè`¤ êgt-1f6d4c535-2dc¤ ëgt-1f6d4c535-2dd¤ ìêë¤ íéé¤ îfl-1f6d4c535-2e3¤ ïfl-1f6d4c535-2e4¤ ðîï¤ ñbìíð¤ òé¤ ófl-1f6d4c535-2e0¤ ôó¤ õboòô¤ öéñmõtmmmm}‹‘• ¤ ÷]^ö˜¤ øxñmõ¤ ù]søœ¤ ú]øœ¤ ûùú¤ ügm-1f6d4c535-2da¤ ýü`¤ þýñmõtm±mmm¶½mÈÜߤ ÿ]£þ˜¤ ]åøœ¤ ] þ˜¤ ÿùú¤ ÷û¤ xmõ¤ ]朤 s¤ g%inferior-fluid?-procedure¤ gm-1f6d4c535-2ed¤  `¤  gt-1f6d4c535-2ec¤   ¤   ¤  fl-1f6d4c535-2f2¤  ¤ b  ¤ fl-1f6d4c535-2ef¤ ¤ bo ¤  mtmmmm}‹‘• ¤ ]^˜¤ ýmtm%mmmm*m/m3m8m=mBmGmLXÜߤ ]˜¤ ¤ ]\˜¤ ]^˜¤ ¤ ]a˜¤ ]c˜¤ ¤ xm¤ ]圤  ¤ ! ¤ "!¤ #xm¤ $]#œ¤ %g %inferior-fluid-number-procedure¤ &gm-1f6d4c535-2f9¤ '&`¤ ('¤ )fl-1f6d4c535-2fb¤ *)¤ +bo(*¤ ,'m+tmmmm}‹‘• ¤ -]s,˜¤ .r-¤ /.[¤ 0ým+tm’mmm™m Üߤ 1]~0˜¤ 2r1¤ 3Z/2[¤ 4''¤ 5fl-1f6d4c535-2fe¤ 6fl-1f6d4c535-2ff¤ 756¤ 8b¨47¤ 9'8m+tmmmm}‹‘• ¤ :]¥9˜¤ ;]°9˜¤ <x8m+¤ =]å<œ¤ >;=¤ ?>¤ @]¶0˜¤ Ar@¤ BZ/A[¤ Cfl-1f6d4c535-303¤ Dfl-1f6d4c535-304¤ ECD¤ Fb¨4E¤ G'Fm+tmmmm}‹‘• ¤ H]¥G˜¤ I]°G˜¤ JFm+¤ K] Jœ¤ LIK¤ ML¤ N]Å0˜¤ OrN¤ PZ/O[¤ Qfl-1f6d4c535-308¤ Rfl-1f6d4c535-309¤ SQR¤ Tb¨4S¤ U'Tm+tmmmm}‹‘• ¤ V]¥U˜¤ W]°U˜¤ Xg%%-set-fields¤ YxTm+¤ Z]XYœ¤ [WZ¤ \[¤ ]gt-1f6d4c535-2f8¤ ^]¤ _fl-1f6d4c535-30d¤ `_¤ ab^(`¤ b'am+tmmmm}‹‘• ¤ c]^b˜¤ dýam+tm’mmm™m Üߤ e]§d˜¤ fe¤ g]ßd˜¤ h]ad˜¤ i]cd˜¤ jie¤ kxam+¤ l]åkœ¤ mhjl¤ n]çd˜¤ oam+¤ p] oœ¤ qnep¤ r]md˜¤ s]°d˜¤ t]Fkœ¤ ust¤ vreu¤ wgmqv¤ xcfw¤ yxm+¤ z]%yœ¤ {ginferior-fluid-value¤ |g%inferior-fluid-value-procedure¤ }gm-1f6d4c535-314¤ ~}`¤ ~¤ €fl-1f6d4c535-316¤ €¤ ‚bo¤ ƒ~m‚tmmmm}‹‘• ¤ „]sƒ˜¤ …r„¤ †…[¤ ‡ým‚tm’mmm™m Üߤ ˆ]~‡˜¤ ‰rˆ¤ ŠZ†‰[¤ ‹~~¤ Œfl-1f6d4c535-319¤ fl-1f6d4c535-31a¤ ŽŒ¤ b¨‹Ž¤ ~m‚tmmmm}‹‘• ¤ ‘]¥˜¤ ’]°˜¤ “xm‚¤ ”]哜¤ •’”¤ –•¤ —]¶‡˜¤ ˜r—¤ ™Z†˜[¤ šfl-1f6d4c535-31e¤ ›fl-1f6d4c535-31f¤ œš›¤ b¨‹œ¤ ž~m‚tmmmm}‹‘• ¤ Ÿ]¥ž˜¤  ]°ž˜¤ ¡m‚¤ ¢] ¡œ¤ £ ¢¤ ¤£¤ ¥]Ň˜¤ ¦r¥¤ §Z†¦[¤ ¨fl-1f6d4c535-323¤ ©fl-1f6d4c535-324¤ ª¨©¤ «b¨‹ª¤ ¬~«m‚tmmmm}‹‘• ¤ ­]¥¬˜¤ ®]°¬˜¤ ¯x«m‚¤ °]X¯œ¤ ±®°¤ ²±¤ ³gt-1f6d4c535-313¤ ´³¤ µfl-1f6d4c535-328¤ ¶µ¤ ·b´¶¤ ¸~·m‚tmmmm}‹‘• ¤ ¹]^¸˜¤ ºý·m‚tm’mmm™m Üߤ »]§º˜¤ ¼»¤ ½]ߺ˜¤ ¾]aº˜¤ ¿]cº˜¤ À¿»¤ Áx·m‚¤ Â]åÁœ¤ þÀ¤ Ä]纘¤ Å·m‚¤ Æ] Åœ¤ ÇĻƤ È]mº˜¤ É]°º˜¤ Ê]{Áœ¤ ËÉʤ ÌȻˤ ͽÃÇ̤ ι¼Í¤ Ïxm‚¤ Ð]|Ïœ¤ Ñgm-1f6d4c535-32f¤ ÒÑ`¤ ÓÒýýýý¤ Ôfl-1f6d4c535-334¤ Õfl-1f6d4c535-335¤ Öfl-1f6d4c535-336¤ ×fl-1f6d4c535-337¤ Øfl-1f6d4c535-338¤ ÙÔÕÖר¤ Úb«ÓÙ¤ ÛÒ¤ Üfl-1f6d4c535-331¤ Ýܤ ÞboÛݤ ßýÚmÞtmÅmmmÊÜß ¤ à]§ß˜¤ áxÚmÞ¤ â]åᜤ ã]Fᜤ ä]{ᜤ åãä¤ æf#¤ çgerror¤ è*ç¤ é*ç¤ êfno matching pattern¤ ëg¤ ìg%%inferior-object-procedure¤ íg%inferior-object¤ îgm-1f6d4c535-3a3¤ ïî`¤ ðgt-1f6d4c535-3a0¤ ñgt-1f6d4c535-3a1¤ ògt-1f6d4c535-3a2¤ óðñò¤ ôïïï¤ õfl-1f6d4c535-3a8¤ öfl-1f6d4c535-3a9¤ ÷fl-1f6d4c535-3aa¤ øõö÷¤ ùbóôø¤ úï¤ ûfl-1f6d4c535-3a5¤ üû¤ ýboúü¤ þïùmýtmmmm}‹‘• ¤ ÿ]^þ˜¤ xùmý¤ ]qœ¤ gsub-kind¤ ]œ¤ ]œ¤ ¤ gm-1f6d4c535-39e¤ `¤ ùmýtm±mmm¶½mÈÜߤ  ]£˜¤  ]뜤  ] ˜¤     ¤  ÿ ¤ xmý¤ ]윤 q¤ g%inferior-object?-procedure¤ gm-1f6d4c535-3b4¤ `¤ gt-1f6d4c535-3b3¤ ¤ ¤ fl-1f6d4c535-3b9¤ ¤ b¤ fl-1f6d4c535-3b6¤ ¤ bo¤ mtmmmm}‹‘• ¤ ]^˜¤ mtm%mmmm*m/m3m8m=mBmGmLXÜߤ  ]˜¤ ! ¤ "]\˜¤ #]^˜¤ $# ¤ %]a˜¤ &]c˜¤ '& ¤ (xm¤ )]ë(œ¤ *%')¤ +"$*¤ ,!+¤ -xm¤ .]-œ¤ /g%inferior-object-kind-procedure¤ 0gm-1f6d4c535-3c0¤ 10`¤ 21¤ 3fl-1f6d4c535-3c2¤ 43¤ 5bo24¤ 61m5tmmmm}‹‘• ¤ 7]s6˜¤ 8r7¤ 98[¤ :m5tm’mmm™m Üߤ ;]~:˜¤ <r;¤ =Z9<[¤ >11¤ ?fl-1f6d4c535-3c5¤ @fl-1f6d4c535-3c6¤ A?@¤ Bb¨>A¤ C1Bm5tmmmm}‹‘• ¤ D]¥C˜¤ E]°C˜¤ FxBm5¤ G]ëFœ¤ HEG¤ IH¤ J]¶:˜¤ KrJ¤ LZ9K[¤ Mfl-1f6d4c535-3ca¤ Nfl-1f6d4c535-3cb¤ OMN¤ Pb¨>O¤ Q1Pm5tmmmm}‹‘• ¤ R]¥Q˜¤ S]°Q˜¤ TPm5¤ U] Tœ¤ VSU¤ WV¤ X]Å:˜¤ YrX¤ ZZ9Y[¤ [fl-1f6d4c535-3cf¤ \fl-1f6d4c535-3d0¤ ][\¤ ^b¨>]¤ _1^m5tmmmm}‹‘• ¤ `]¥_˜¤ a]°_˜¤ bg%%-set-fields¤ cx^m5¤ d]bcœ¤ ead¤ fe¤ ggt-1f6d4c535-3bf¤ hg¤ ifl-1f6d4c535-3d4¤ ji¤ kbh2j¤ l1km5tmmmm}‹‘• ¤ m]^l˜¤ nkm5tm’mmm™m Üߤ o]§n˜¤ po¤ q]ßn˜¤ r]an˜¤ s]cn˜¤ tso¤ uxkm5¤ v]ëuœ¤ wrtv¤ x]çn˜¤ ykm5¤ z] yœ¤ {xoz¤ |]mn˜¤ }]°n˜¤ ~]Buœ¤ }~¤ €|o¤ qw{€¤ ‚mp¤ ƒxm5¤ „]/ƒœ¤ …g#%inferior-object-sub-kind-procedure¤ †gm-1f6d4c535-3db¤ ‡†`¤ ˆ‡¤ ‰fl-1f6d4c535-3dd¤ Љ¤ ‹boˆŠ¤ Œ‡m‹tmmmm}‹‘• ¤ ]sŒ˜¤ Žr¤ Ž[¤ m‹tm’mmm™m Üߤ ‘]~˜¤ ’r‘¤ “Z’[¤ ”‡‡¤ •fl-1f6d4c535-3e0¤ –fl-1f6d4c535-3e1¤ —•–¤ ˜b¨”—¤ ™‡˜m‹tmmmm}‹‘• ¤ š]¥™˜¤ ›]°™˜¤ œx˜m‹¤ ]뜜¤ ž›¤ Ÿž¤  ]¶˜¤ ¡r ¤ ¢Z¡[¤ £fl-1f6d4c535-3e5¤ ¤fl-1f6d4c535-3e6¤ ¥£¤¤ ¦b¨”¥¤ §‡¦m‹tmmmm}‹‘• ¤ ¨]¥§˜¤ ©]°§˜¤ ª¦m‹¤ «] ªœ¤ ¬©«¤ ­¬¤ ®]ؤ ¯r®¤ °Z¯[¤ ±fl-1f6d4c535-3ea¤ ²fl-1f6d4c535-3eb¤ ³±²¤ ´b¨”³¤ µ‡´m‹tmmmm}‹‘• ¤ ¶]¥µ˜¤ ·]°µ˜¤ ¸x´m‹¤ ¹]b¸œ¤ º·¹¤ »º¤ ¼gt-1f6d4c535-3da¤ ½¼¤ ¾fl-1f6d4c535-3ef¤ ¿¾¤ Àb½ˆ¿¤ Á‡Àm‹tmmmm}‹‘• ¤ Â]^Á˜¤ ÃÀm‹tm’mmm™m Üߤ Ä]§Ã˜¤ ÅĤ Æ]ߨ¤ Ç]aؤ È]cؤ ÉÈĤ ÊxÀm‹¤ Ë]ëÊœ¤ ÌÇÉˤ Í]çØ¤ ÎÀm‹¤ Ï] Μ¤ ÐÍÄϤ Ñ]mؤ Ò]°Ã˜¤ Ó]CÊœ¤ ÔÒÓ¤ ÕÑÄÔ¤ ÖÆÌÐÕ¤ ×ÂÅÖ¤ Øxm‹¤ Ù]…Øœ¤ Úg"%inferior-object-address-procedure¤ Ûgm-1f6d4c535-3f6¤ ÜÛ`¤ Ýܤ Þfl-1f6d4c535-3f8¤ ßÞ¤ àboÝߤ áÜmàtmmmm}‹‘• ¤ â]sᘤ ãr⤠äã[¤ åmàtm’mmm™m Üߤ æ]~嘤 çræ¤ èZäç[¤ éÜܤ êfl-1f6d4c535-3fb¤ ëfl-1f6d4c535-3fc¤ ìêë¤ íb¨éì¤ îÜímàtmmmm}‹‘• ¤ ï]¥î˜¤ ð]°î˜¤ ñxímठò]ëñœ¤ óðò¤ ôó¤ õ]¶å˜¤ örõ¤ ÷Zäö[¤ øfl-1f6d4c535-400¤ ùfl-1f6d4c535-401¤ úøù¤ ûb¨éú¤ üÜûmàtmmmm}‹‘• ¤ ý]¥ü˜¤ þ]°ü˜¤ ÿûmठ] ÿœ¤ þ ¤  ¤ ]Å嘤 r ¤ Zä [¤ fl-1f6d4c535-405¤ fl-1f6d4c535-406¤   ¤ b¨é ¤ Ü màtmmmm}‹‘• ¤ ]¥ ˜¤ ]° ˜¤ x mठ]b œ¤   ¤  ¤ gt-1f6d4c535-3f5¤  ¤ fl-1f6d4c535-40a¤  ¤ b Ý ¤ Ü màtmmmm}‹‘• ¤ ]^ ˜¤  màtm’mmm™m Üߤ ]§ ˜¤  ¤ ]ß ˜¤ ]a ˜¤ ]c ˜¤   ¤ x mठ]ë œ¤ !   ¤ "]ç ˜¤ # mठ$]  #œ¤ % "  $¤ &]m ˜¤ ']° ˜¤ (]D œ¤ ) ' (¤ * &  )¤ +  ! % *¤ ,   +¤ -xmठ.]Ú -œ¤ /gm-1f6d4c535-411¤ 0 /`¤ 1 0¤ 2fl-1f6d4c535-416¤ 3fl-1f6d4c535-417¤ 4fl-1f6d4c535-418¤ 5fl-1f6d4c535-419¤ 6fl-1f6d4c535-41a¤ 7 2 3 4 5 6¤ 8b« 1 7¤ 9 0¤ :fl-1f6d4c535-413¤ ; :¤ <bo 9 ;¤ = 8m <tmÅmmmÊÜß ¤ >]§ =˜¤ ?x 8m <¤ @]ë ?œ¤ A]B ?œ¤ B]C ?œ¤ C]D ?œ¤ D A B C¤ Ef#<~a ~:[~*~;~a ~]~x>¤ Fgsmob¤ Gg inferior-smob¤ Hg inferior-port¤ Ig%visited-cells¤ Jgvisited¤ Kg->¤ Lgm-1f6d4c535-525¤ M L`¤ N M¤ Ofl-1f6d4c535-527¤ P O¤ Qbo N P¤ Rxm Q¤ S] K Rœ¤ Tr S¤ U[ T[¤ V U挤 W[ VŒ¤ Xg parameterize¤ Ygobject¤ Z¨ Y‚¤ [ Mxxx¤ \fl-1f6d4c535-52a¤ ]fl-1f6d4c535-52b¤ ^fl-1f6d4c535-52c¤ _fl-1f6d4c535-52d¤ ` \ ] ^ _¤ ab Z [ `¤ bx am Q¤ c] X bœ¤ d] I bœ¤ eg vhash-consv¤ f] e bœ¤ g d¤ h g¤ igsymbol->string¤ jg string-length¤ kgbytevector->uint-list¤ lginvalid-struct¤ mgaddress->inferior-struct¤ ngand=>¤ og vhash-assv¤ pgcdr¤ qg cell->object¤ rgstring->symbol¤ sgvariable¤ tg substring¤ ugbytevector->string¤ vf ISO-8859-1¤ wg bitwise-ior¤ xglittle¤ yfUTF-32LE¤ zgbig¤ {fUTF-32BE¤ |g make-vector¤ }gfold¤ ~g weak-vector¤ g dynamic-state¤ €gprogram¤ gbignum¤ ‚gdouble¤ ƒg hash-table¤ „gobjcode¤ …gvm¤ †gvm-continuation¤ ‡garray¤ ˆg bitvector¤ ‰gbit-set?¤ Šg integer->char¤ ‹g undefined¤ Œg eof-object¤ gunbound¤C5hð»£]4    89K54N>"G4OiP5:RQh©]¨C¡gpeek  gopen  g type-name   gfilenamefsystem/base/types.scmŒ D ŒŒ   gnameg%memory-backend-procedureŒCRR4U;VY\åhk]Ccg t-1f6d4c535-3  g t-1f6d4c535-4  g t-1f6d4c535-5      Cçê;ëhX]L6Pga  gfilenamefsystem/base/types.scmŒ  D ŒŒ  CZîhH]L6@gfilenamefsystem/base/types.scmŒ  D ŒŒ   Cðh]C   Còó hp‰]45$@45$ O@45$4O?$@  6  6gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/base/types.scmŒ D ŒŒ  n C5;Rö÷úQû¨4þQ>"G –RiªQRQh€]¦$§‚CCxgobj  gfilenamefsystem/base/types.scmŒ D ŒŒ   gnameg%memory-backend?-procedureŒCR4U<VYjh6]C.gt-1f6d4c535-16    Cçê<ëhX]L6Pga  gfilenamefsystem/base/types.scmŒ  D ŒŒ  CZîhH]L6@gfilenamefsystem/base/types.scmŒ  D ŒŒ   Clh]C   Còó hp‰]45$@45$ O@45$4O?$@  6  6gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/base/types.scmŒ D ŒŒ  n C5"GM–NCêgbv  9gindex  9gcount   9gptr  9gmem   9gfilenamefsystem/base/types.scmŒ W ŒŒ  X ŒŒ X ŒŒ Y ŒŒ  X ŒŒ  Z ŒŒ 4 [ ŒŒ 6 [ ŒŒ  9 gnameg read-memory!ŒCßà hX)]HK$454564O54>"GC!gaddress  Sgsize  Sgcurrent-address   Sgptr   )gbv  ! )gport  : Sgfilenamefsystem/base/types.scmŒ T ŒŒ  ^ ŒŒ  _ ŒŒ  _ ŒŒ  ` ŒŒ ! _ ŒŒ ) a ŒŒ * b ŒŒ . b 5ŒŒ : b ŒŒ : b ŒŒ = e ŒŒ  S gnamegopenŒC¨=RQoph(Å] §& ©" 456½gbackend  $gaddress  $gpeek   $gfilenamefsystem/base/types.scmŒ j ŒŒ  l ŒŒ  l ŒŒ $ m ŒŒ  $ gnameg% dereference-word-procedureŒCáR4U>VYâ#hR]CJgt-1f6d4c535-c4  gt-1f6d4c535-c5    Cçò>ëhX]L6Pga  gfilenamefsystem/base/types.scmŒ  j ŒŒ  CZ%hH]L6@gfilenamefsystem/base/types.scmŒ  j ŒŒ   C'h]C   Còó hp‰]45$@45$ O@45$4O?$@  6  6gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/base/types.scmŒ j ŒŒ  n C5>R4U?VY(789;h W]ŒŒCOgdummy  gbackend  gaddress      C<GIOPQRh0i]Cagdummy  .gbackend  .gaddress   .gsize   .  . Còóh@‚]45$@45$@6zgx  9gtmp 9gtmp  " 9gfilenamefsystem/base/types.scmŒ p ŒŒ  9 g documentationf‹Return an input port to the SIZE bytes at ADDRESS, using BACKEND. When SIZE is omitted, return an unbounded port to the memory at ADDRESS.Œg macro-typeg syntax-rulesŒgpatternsgbackendgaddressgbackendgaddressgsizeC5?RS:ÙÚh ê] 45 456âgport  gbv gfilenamefsystem/base/types.scmŒ ~ ŒŒ  € ŒŒ € ŒŒ  ŒŒ  ŒŒ   gnamegget-wordŒg documentationf2Read a word from PORT and return it as an integer.ŒCTRQoKh0ä] §&  ©" 45$6CÜgbackend  /gkind  /gnumber   /gproc   /gfilenamefsystem/base/types.scmŒ ƒ ŒŒ  † ŒŒ  † ŒŒ % ‡ ŒŒ - ‡ ŒŒ  / gnameg% type-number->name-procedureŒCUR4U@VY\„hq]Cigt-1f6d4c535-101  gt-1f6d4c535-102  gt-1f6d4c535-103      Cçò@ëhY]L6Qga  gfilenamefsystem/base/types.scmŒ  ƒ ŒŒ  CZ%hI]L6Agfilenamefsystem/base/types.scmŒ  ƒ ŒŒ   C†h]C   Còó hpŠ]45$@45$ O@45$4O?$@  6  6‚gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/base/types.scmŒ ƒ ŒŒ  n C5@R4U‡VY”£¤¦¨ª¬®²³ h@†]ŒŒŒŒ C~gdummy  @gport  @gname   @glen   @grest   @gbody   @  @ CµÀÁÂh(u]Cmgdummy  "gport  "gname   "grest   "gbody   "  " CÃhQ]CIgdummy  gport  gbody      Còó hP?]45$@45$@45$@ 67gx  Pgtmp Pgtmp  " Pgtmp  9 Pgfilenamefsystem/base/types.scmŒ ŒŒ  P g macro-typeg syntax-rulesŒgpatternsgportg bytevectorgnameglengrestg...gbodygportgnamegrestg...gbodygportgbodyC5‡R4UÄVY×ìîðñòóõhPª,3ŒC¢gdummy  Ogbits  Oga   Ogb   Ogn   Ogc   Og consequent   Og alternate   O  O C÷h@›]C“gdummy  :gbits  :gx   :gn   :gc   :g consequent   :g alternate   :  : C h0Œ]C„gdummy  +gbits  +gn   +gc   +g consequent   +g alternate   +  + C,-/0235679 hX«,3ŒŒ  C£gdummy  Wgbits  Wga   Wg<<   Wgn   Wgc   Wg consequent   Wg alternate   W  W Còó hhå]!45$@45$@45$@45$ @  6Ýgx  ggtmp ggtmp  " ggtmp  9 ggtmp  P ggfilenamefsystem/base/types.scmŒ ŒŒ  g g macro-typeg syntax-rulesŒgpatternsgbitsgag||gbg&gng=gcg consequentg alternategbitsgxg&gng=gcg consequentg alternategbitsg_g&gng=gcg consequentg alternategbitsgag< ngfilenamefsystem/base/types.scmŒ  ŒŒ  n C5ÛRö÷úÙø¨4þÙ>"G –ÚiªÙRÙh|]¦$§‚CCtgobj  gfilenamefsystem/base/types.scmŒ  ŒŒ   gnameg%stringbuf?-procedureŒCùR4UúVYh7]C/gt-1f6d4c535-1f2    CçêúëhY]L6Qga  gfilenamefsystem/base/types.scmŒ   ŒŒ  CZîhI]L6Agfilenamefsystem/base/types.scmŒ   ŒŒ   Ch]C   Còó hpŠ]45$@45$ O@45$4O?$@  6  6‚gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/base/types.scmŒ  ŒŒ  n C5úRÙoh‚]§& ©C6zgs  gfilenamefsystem/base/types.scmŒ  ŒŒ   gnameg%stringbuf-contents-procedureŒCR4UVY'.3h:]ŒŒC2gerr  gs    C6<Ah:]ŒŒC2gerr  gs    CDJPh:]ŒŒC2gerr  gs    Clh7]C/gt-1f6d4c535-1fe    CçêëhY]L6Qga  gfilenamefsystem/base/types.scmŒ   ŒŒ  CZîhI]L6Agfilenamefsystem/base/types.scmŒ   ŒŒ   Cnh]C   Còóh¸Æ]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66¾gx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/base/types.scmŒ  ŒŒ  ³ C5R4ULVY¦~€‚ÕÖh v]45ŒŒŒŒŒCngdummy  gcheck?  gs   ggetter   gexpr      Còóh(Ä] 45$@6¼gx  "gtmp "gfilenamefsystem/base/types.scmŒ  ŒŒ  " g macro-typeg syntax-rulesŒgpatternsgcheck?gsggettergexprg...C5LR4ƒiÙi„…†Ùo‡hP»]4>"G4§& ©" 45>"G6³g stringbuf  Jgport  Jgfilenamefsystem/base/types.scmŒ  ŒŒ   ŒŒ   %ŒŒ   ŒŒ   ŒŒ   #ŒŒ :  ŒŒ F  %ŒŒ J  ŒŒ  J C>"Gˆh–]¨CŽgname  gfields  gfilenamefsystem/base/types.scmŒ  ŒŒ  gnameg%inferior-struct-procedureŒC‰R4UŠVYâ§hT]CLgt-1f6d4c535-240  gt-1f6d4c535-241    CçêŠëhY]L6Qga  gfilenamefsystem/base/types.scmŒ   ŒŒ  CZîhI]L6Agfilenamefsystem/base/types.scmŒ   ŒŒ   C©h]C   Còó hpŠ]45$@45$ O@45$4O?$@  6  6‚gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/base/types.scmŒ  ŒŒ  n C5ŠRöªúˆ«¨4þˆ>"G –‰iªˆRˆh‚]¦$§‚CCzgobj  gfilenamefsystem/base/types.scmŒ  ŒŒ   gnameg%inferior-struct?-procedureŒC¬R4UGVYÇh7]C/gt-1f6d4c535-250    CçêGëhY]L6Qga  gfilenamefsystem/base/types.scmŒ   ŒŒ  CZîhI]L6Agfilenamefsystem/base/types.scmŒ   ŒŒ   CÉh]C   Còó hpŠ]45$@45$ O@45$4O?$@  6  6‚gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/base/types.scmŒ  ŒŒ  n C5GRˆoHh„]§& ©C6|gs  gfilenamefsystem/base/types.scmŒ  ŒŒ   gnameg%inferior-struct-name-procedureŒCÊR4UHVYØßäh:]ŒŒC2gerr  gs    Cçíòh:]ŒŒC2gerr  gs    Cõûh:]ŒŒC2gerr  gs    Ch7]C/gt-1f6d4c535-25c    CçêHëhY]L6Qga  gfilenamefsystem/base/types.scmŒ   ŒŒ  CZîhI]L6Agfilenamefsystem/base/types.scmŒ   ŒŒ   Ch]C   Còóh¸Æ]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66¾gx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/base/types.scmŒ  ŒŒ  ³ C5HRˆoIh†]§& ©C6~gs  gfilenamefsystem/base/types.scmŒ  ŒŒ   gnameg!%inferior-struct-fields-procedureŒC R4UIVY.5:h:]ŒŒC2gerr  gs    C=CHh:]ŒŒC2gerr  gs    CKQVh:]ŒŒC2gerr  gs    Crh7]C/gt-1f6d4c535-277    CçêIëhY]L6Qga  gfilenamefsystem/base/types.scmŒ   ŒŒ  CZîhI]L6Agfilenamefsystem/base/types.scmŒ   ŒŒ   Cth]C   Còóh¸Æ]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66¾gx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/base/types.scmŒ  ŒŒ  ³ C5IR4UýVY¦„†‰ÕÖh v]45ŒŒŒŒŒCngdummy  gcheck?  gs   ggetter   gexpr      Còóh(Ä] 45$@6¼gx  "gtmp "gfilenamefsystem/base/types.scmŒ  ŒŒ  " g macro-typeg syntax-rulesŒgpatternsgcheck?gsggettergexprg...C5ýRˆoŠh œ]§& ªC6”gs  gval  gfilenamefsystem/base/types.scmŒ  ŒŒ   gnameg&%set-inferior-struct-fields!-procedureŒC‹R4UŠVYâÏhT]CLgt-1f6d4c535-2a5  gt-1f6d4c535-2a6    CçêŠëhY]L6Qga  gfilenamefsystem/base/types.scmŒ   ŒŒ  CZîhI]L6Agfilenamefsystem/base/types.scmŒ   ŒŒ   CÑh]C   Còó hpŠ]45$@45$ O@45$4O?$@  6  6‚gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/base/types.scmŒ  ŒŒ  n C5ŠR4ÒiÓi5Ô/ÕÖˆoHÙÚÛÜÝÞß„à/áh Š]L&L6L6‚gfield  gfilenamefsystem/base/types.scmŒ / ŒŒ 0 ŒŒ  1 'ŒŒ  1 ŒŒ  2 +ŒŒ  2 ŒŒ   CIâãhØ9]44L55$64§& ©" 45>"G4L5$"4    L>"GL ©4L ©4 4L555Y4O§& ©" 45>"GZ4561gstruct  Ñgport  Ñgfilenamefsystem/base/types.scmŒ ' ŒŒ  ( ŒŒ  ( ŒŒ  ( ŒŒ  ( ŒŒ  ) ŒŒ  ) ŒŒ  + ŒŒ ! + ŒŒ $ , ŒŒ @ + ŒŒ I - ŒŒ ~ . ŒŒ „ . 3ŒŒ Š . ŒŒ Œ - ŒŒ / ŒŒ 3 ŒŒ ¹ / ŒŒ È 4 ŒŒ É 4 ŒŒ Ñ 4 ŒŒ  Ñ COäR4ƒiˆiäi>"Gåh–]¨CŽgnumber  gvalue  gfilenamefsystem/base/types.scmŒ 9 ŒŒ  gnameg%inferior-fluid-procedureŒCæR4UçVYâhT]CLgt-1f6d4c535-2dc  gt-1f6d4c535-2dd    CçêçëhY]L6Qga  gfilenamefsystem/base/types.scmŒ  9 ŒŒ  CZîhI]L6Agfilenamefsystem/base/types.scmŒ  9 ŒŒ   Ch]C   Còó hpŠ]45$@45$ O@45$4O?$@  6  6‚gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/base/types.scmŒ 9 ŒŒ  n C5çRöªúå¨4þå>"G –æiªåRåh]¦$§‚CCygobj  gfilenamefsystem/base/types.scmŒ 9 ŒŒ   gnameg%inferior-fluid?-procedureŒCR4UEVY"h7]C/gt-1f6d4c535-2ec    CçêEëhY]L6Qga  gfilenamefsystem/base/types.scmŒ  9 ŒŒ  CZîhI]L6Agfilenamefsystem/base/types.scmŒ  9 ŒŒ   C$h]C   Còó hpŠ]45$@45$ O@45$4O?$@  6  6‚gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/base/types.scmŒ 9 ŒŒ  n C5ERåoFh…]§& ©C6}gs  gfilenamefsystem/base/types.scmŒ 9 ŒŒ   gnameg %inferior-fluid-number-procedureŒC%R4UFVY3:?h:]ŒŒC2gerr  gs    CBHMh:]ŒŒC2gerr  gs    CPV\h:]ŒŒC2gerr  gs    Cxh7]C/gt-1f6d4c535-2f8    CçêFëhY]L6Qga  gfilenamefsystem/base/types.scmŒ  9 ŒŒ  CZîhI]L6Agfilenamefsystem/base/types.scmŒ  9 ŒŒ   Czh]C   Còóh¸Æ]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66¾gx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/base/types.scmŒ 9 ŒŒ  ³ C5FRåo{h„]§& ©C6|gs  gfilenamefsystem/base/types.scmŒ 9 ŒŒ   gnameg%inferior-fluid-value-procedureŒC|R4U{VYŠ‘–h:]ŒŒC2gerr  gs    C™Ÿ¤h:]ŒŒC2gerr  gs    C§­²h:]ŒŒC2gerr  gs    CÎh7]C/gt-1f6d4c535-313    Cçê{ëhY]L6Qga  gfilenamefsystem/base/types.scmŒ  9 ŒŒ  CZîhI]L6Agfilenamefsystem/base/types.scmŒ  9 ŒŒ   CÐh]C   Còóh¸Æ]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66¾gx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/base/types.scmŒ 9 ŒŒ  ³ C5{R4UXVY¦àâåÕÖh v]45ŒŒŒŒŒCngdummy  gcheck?  gs   ggetter   gexpr      Còóh(Ä] 45$@6¼gx  "gtmp "gfilenamefsystem/base/types.scmŒ 9 ŒŒ  " g macro-typeg syntax-rulesŒgpatternsgcheck?gsggettergexprg...C5XR4ƒiåiå/æãé)êhH«] ¦$-§& ©456456456£gfluid  Cgport  Cgw   )gfilenamefsystem/base/types.scmŒ @ ŒŒ  A ŒŒ  C ,ŒŒ ! E 'ŒŒ ) C ŒŒ * A ŒŒ  C C>"Gëh®]¨C¦gkind  gsub-kind  gaddress   gfilenamefsystem/base/types.scmŒ J ŒŒ   gnameg%%inferior-object-procedureŒCìR4UíVY\ hq]Cigt-1f6d4c535-3a0  gt-1f6d4c535-3a1  gt-1f6d4c535-3a2      CçêíëhY]L6Qga  gfilenamefsystem/base/types.scmŒ  J ŒŒ  CZîhI]L6Agfilenamefsystem/base/types.scmŒ  J ŒŒ   Ch]C   Còó hpŠ]45$@45$ O@45$4O?$@  6  6‚gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/base/types.scmŒ J ŒŒ  n C5íRö÷úë¨4þë>"G –ìiªëRëh‚]¦$§‚CCzgobj  gfilenamefsystem/base/types.scmŒ J ŒŒ   gnameg%inferior-object?-procedureŒCR4UAVY,h7]C/gt-1f6d4c535-3b3    CçêAëhY]L6Qga  gfilenamefsystem/base/types.scmŒ  J ŒŒ  CZîhI]L6Agfilenamefsystem/base/types.scmŒ  J ŒŒ   C.h]C   Còó hpŠ]45$@45$ O@45$4O?$@  6  6‚gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/base/types.scmŒ J ŒŒ  n C5ARëoBh„]§& ©C6|gs  gfilenamefsystem/base/types.scmŒ J ŒŒ   gnameg%inferior-object-kind-procedureŒC/R4UBVY=DIh:]ŒŒC2gerr  gs    CLRWh:]ŒŒC2gerr  gs    CZ`fh:]ŒŒC2gerr  gs    C‚h7]C/gt-1f6d4c535-3bf    CçêBëhY]L6Qga  gfilenamefsystem/base/types.scmŒ  J ŒŒ  CZîhI]L6Agfilenamefsystem/base/types.scmŒ  J ŒŒ   C„h]C   Còóh¸Æ]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66¾gx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/base/types.scmŒ J ŒŒ  ³ C5BRëoChˆ]§& ©C6€gs  gfilenamefsystem/base/types.scmŒ J ŒŒ   gnameg#%inferior-object-sub-kind-procedureŒC…R4UCVY“šŸh:]ŒŒC2gerr  gs    C¢¨­h:]ŒŒC2gerr  gs    C°¶»h:]ŒŒC2gerr  gs    C×h7]C/gt-1f6d4c535-3da    CçêCëhY]L6Qga  gfilenamefsystem/base/types.scmŒ  J ŒŒ  CZîhI]L6Agfilenamefsystem/base/types.scmŒ  J ŒŒ   CÙh]C   Còóh¸Æ]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66¾gx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/base/types.scmŒ J ŒŒ  ³ C5CRëoDh ‡]§& ©C6gs  gfilenamefsystem/base/types.scmŒ J ŒŒ   gnameg"%inferior-object-address-procedureŒCÚR4UDVYèïôh:]ŒŒC2gerr  gs    C÷ý h:]ŒŒC2gerr  gs    C   h:]ŒŒC2gerr  gs    C ,h7]C/gt-1f6d4c535-3f5    CçêDëhY]L6Qga  gfilenamefsystem/base/types.scmŒ  J ŒŒ  CZîhI]L6Agfilenamefsystem/base/types.scmŒ  J ŒŒ   C .h]C   Còóh¸Æ]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66¾gx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/base/types.scmŒ J ŒŒ  ³ C5DR4UbVY¦ > @ DÕÖh v]45ŒŒŒŒŒCngdummy  gcheck?  gs   ggetter   gexpr      Còóh(Ä] 45$@6¼gx  "gtmp "gfilenamefsystem/base/types.scmŒ J ŒŒ  " g macro-typeg syntax-rulesŒgpatternsgcheck?gsggettergexprg...C5bRëh(U)3¨C]¨CMgkind gaddress gkind  "gsub-kind  "gaddress   "gfilenamefsystem/base/types.scmŒ R ŒŒ  V ŒŒ  R ŒŒ ! X ŒŒ    " gnameginferior-objectŒg documentationfSReturn an object representing an inferior object at ADDRESS, of type KIND/SUB-KIND.ŒCVR4ƒiëië/ Eé)êhP½]¦$9§&# © © ©6456456µgio  Ogport  Ogw   5gw   5gw  # 5gfilenamefsystem/base/types.scmŒ [ ŒŒ  \ ŒŒ + ^ ,ŒŒ 5 ^ ŒŒ 6 \ ŒŒ  O C>"GV FQoKhX_] §&  ©" 45$ 45"$"6Wgbackend  Qg type-number  Qgaddress   Qgproc  ! :gt  : Mgfilenamefsystem/base/types.scmŒ b ŒŒ  e ŒŒ f ŒŒ . f 2ŒŒ 2 f ŒŒ : f ŒŒ Q e ŒŒ  Q gnameg inferior-smobŒg documentationfLReturn an object representing the SMOB at ADDRESS whose type is TYPE-NUMBER.ŒC GRV•QoKhX_] §&  ©" 45$ 45"$"6Wgbackend  Qg type-number  Qgaddress   Qgproc  ! :gt  : Mgfilenamefsystem/base/types.scmŒ j ŒŒ  m ŒŒ n ŒŒ . n 2ŒŒ 2 n ŒŒ : n ŒŒ Q m ŒŒ  Q gnameg inferior-portŒg documentationfLReturn an object representing the port at ADDRESS whose type is TYPE-NUMBER.ŒC HR4ÒiÓi5 IR4U JVY W c d f hh h]ŒŒŒŒŒC`gdummy  gaddress  gobject   gbody      Còóh(Ç] 45$@6¿gx  "gtmp "gfilenamefsystem/base/types.scmŒ y ŒŒ  " g macro-typeg syntax-rulesŒgpatternsgaddressg->gobjectgbodyg...C5 JR:QopJ i jÛLõSˆ IÙÚÛÜÝ eÓJhg]L6_gt-1f6d4c535-5af  gfilenamefsystem/base/types.scmŒ ˜ ŒŒ  C kÚŠV lhÈŒ]s š–§& ©" 454545 š–§& ©" 454545Š$745 4 5 › – §& ©" 45 4  5    š ‘$ 4 5"+§& ©" 4 5 4   š5  4   š5  ¨ 45$"4>"G ©4 ©44 555Y4O4 4555§ &  ª"4>"GZCZF6„gaddress  Ágvtable-data-address  Ágbackend   Áglayout-address  Ágpeek  % 1g layout-bits  1 Áglayout  < Ág name-address  F Ágpeek  b ng name-bits  n Ágname  y Áglayout ‰ ¹glen • ¹gaddress œ Çgpeek ¸ Ägslots Ç ¹gopen ù  gport  ¹gfields  ¹gresult  " ¹gt-1f6d4c535-5a8  & ¹gvalues  ‰ µgfilenamefsystem/base/types.scmŒ  ŒŒ  † ŒŒ … ŒŒ … ŒŒ  ‡ ŒŒ 1 … ŒŒ 4 ˆ ŒŒ < … ŒŒ E Š ŒŒ F ‰ ŒŒ F … ŒŒ K ‹ ŒŒ n … ŒŒ q Œ ŒŒ y … ŒŒ ~  ŒŒ ‚  ŒŒ ƒ Ž ŒŒ ‰ Ž ŒŒ Œ  ŒŒ •  ŒŒ • Ž ŒŒ œ  1ŒŒ œ  ŒŒ Ç Ž ŒŒ Î ‘ 2ŒŒ Ï ‘ ŒŒ  ‘ 2ŒŒ  ‘ ŒŒ  Ž ŒŒ  ’ ŒŒ  ’ .ŒŒ  ’ ŒŒ  Ž ŒŒ " “ ŒŒ " Ž ŒŒ & — ŒŒ p ˜ ŒŒ z ™ ŒŒ  š 6ŒŒ ‡ ™ ŒŒ ‰ ˜ ŒŒ ‰ ˜ ŒŒ Ž œ ŒŒ ½ ž ŒŒ Á ž ŒŒ/  Á gnamegaddress->inferior-structŒg documentationf^Read the struct at ADDRESS using BACKEND. Return an 'inferior-struct' object representing it.ŒC mR= n o I pQoõT¿ mÀ qÙ ré)êÁV sÄ tÉS: u v wÚ x y z {ÏÛL.1Â8 |ÙÚÛÜÝ e }h„]L¤—C|gelement  gindex  gfilenamefsystem/base/types.scmŒ à ŒŒ Ä ŒŒ Å ŒŒ  CÓJhg]L6_gt-1f6d4c535-732  gfilenamefsystem/base/types.scmŒ Ç ŒŒ  C kà ~ÈåÊ Ó HÐ €Õ ÖO ‚ÅsÆ ƒÇ×Ì „Í …Î †Ñ ‡Ò ˆÔ GaXhˆ… -.,3#444555$C§& ©" 45454 5   ‘$   ˜6   ‘$n4 54 >"G4 >"G4 5¦$"§&  ©6456456‘$4 >"G6‘$c4 54 5 4 5 4 5  ¦$) §& ©     –64 564 56  ‘$Q4 5 4 5 ž   ‘$"4 ˜>"G4 5  ¨C  4 5‘$‰4 5 4  š5  šž   ‘$"4 ˜>"G4 45  & "! &""44 55 5  ¨C    #‘$W4 5 4 5  ‘$ 4$%5"(§& ©" 45 4   5    64&4'  5™5  (‘$Â4) ù5 4 >"G4) ÿ5 4 š54* 54+5$"4,-./>"G ©4 ©404555Y412O 434O454555>"GZCZF    6‘$764&4'  5™5  8‘$&4) ø54 >"G9¨C  :‘$;64&4'  5™5<‘$4) ø5= ÿ 6  >‘$?6ÿÿ @‘$A6B‘$}4 >"G š–4CD5 ‘$ 4$%5"-§& ©" 4544CD5544CD55 45µCE‘$4 >"GF6G‘$>4 >"G4 >"G4 >"GH6I‘$4 5J6K‘$L6M‘$N6O‘$P6Q‘$R6S‘$T64&4'  5™5U‘$'4) ø54 >"GV6W6} gaddress ‡gbackend ‡gt  ) ‡gopen  N [gport  [ ‡gtag  d ‡gtag  k ‡gtag  ˆ ‡gbuf  š gv  É gw  ß çgtag   ‡gtag  * ‡gbuf  < ˜gstart E ˜glen N ˜gv Y ˜gw o ~gtag  ž ‡glen ° úgbuf À úg remainder À úgstring ð úgtag ü ‡glen  ˜gbuf , ˜g remainder , ˜gv ] Œgstring Ž ˜gtag  ‡glen ¯ ÿgaddress ¸ ÿgopen ç õgbv-port õ ÿgtag  ‡glen $ Ýglen A Ýgwords  O Ýgvector  X Ýgt-1f6d4c535-729  \ Ýgtag â ‡gtag  ‡gn   7gtag  < ‡gtag  ` ‡g flags+type  t „gtag  ‰ ‡gtag  ¨ ‡gtag  ½ ‡gaddress  â Egopen   )gport  ) Egwords  9 Egtag  G ‡gtag  n ‡gtag  ¹ ‡gaddress  Ë Ógtag  Õ ‡gtag  ê ‡gtag  ÿ ‡gtag   ‡gtag  ) ‡gtag  M ‡g smob-type  a @gfilenamefsystem/base/types.scmŒ   ŒŒ  £ ŒŒ  £ ŒŒ  £ !ŒŒ % £ ŒŒ ) £ ŒŒ ) £ ŒŒ 7 ¤ ŒŒ [ ¤ ŒŒ ^ ¥ ŒŒ  ¨ %ŒŒ ƒ § ŒŒ ˆ ¥ ŒŒ Á « ŒŒ ç ­ ŒŒ è « ŒŒ  ¥ ŒŒ $ ¯ ŒŒ ( ¯ ŒŒ * ¥ ŒŒ Q ± ŒŒ | ³ &ŒŒ ~ ³ ŒŒ  ± ŒŒ ž ¥ ŒŒ è µ ŒŒ î µ .ŒŒ ð µ ŒŒ ð µ ŒŒ ü ¥ ŒŒ  ¶ ŒŒ  ¥ ŒŒ " · ŒŒ $ ¥ ŒŒ ) · ŒŒ , ¥ ŒŒ T ¸ ŒŒ Y ¸ .ŒŒ i ¹ 9ŒŒ o ¸ .ŒŒ w º 6ŒŒ | ¸ .ŒŒ Ž ¸ ŒŒ Ž ¸ ŒŒ  ¥ ŒŒ ½ ¼ ŒŒ õ ¼ ŒŒ ÿ ½ ŒŒ  ¥ ŒŒ 9 ¿ ŒŒ A ¿ ŒŒ D À ŒŒ M À 1ŒŒ O À ŒŒ O ¿ ŒŒ R Á ŒŒ X ¿ ŒŒ \  ŒŒ ¦ à ŒŒ ± Ç ŒŒ » È ŒŒ À È 7ŒŒ È È ŒŒ Ê Ç ŒŒ Ï à ŒŒ â ¥ ŒŒ ñ Ì ŒŒ õ Ì ŒŒ ö ¥ ŒŒ 6 Î ŒŒ < ¥ ŒŒ K Ð ŒŒ O Ð ŒŒ P ¥ ŒŒ € Ò "ŒŒ „ Ò ŒŒ ‰ ¥ ŒŒ ˜ Ô ŒŒ œ Ô ŒŒ ¨ ¥ ŒŒ · Ö ŒŒ » Ö ŒŒ ½ ¥ ŒŒ á Ø &ŒŒ â Ø ŒŒ â Ø ŒŒ å Ù 8ŒŒ ì Ù ŒŒ  Ù 8ŒŒ & Ù ŒŒ ) Ø ŒŒ , Ú ŒŒ 1 Ú 2ŒŒ 9 Ú ŒŒ 9 Ø ŒŒ ? Û 1ŒŒ D Û ŒŒ G ¥ ŒŒ h Ý ŒŒ l Ý ŒŒ n ¥ ŒŒ ³ ß ŒŒ · ß ŒŒ ¹ ¥ ŒŒ Ó á ŒŒ Õ ¥ ŒŒ ä ã ŒŒ è ã ŒŒ ê ¥ ŒŒ ù å ŒŒ ý å ŒŒ ÿ ¥ ŒŒ  ç ŒŒ  ç ŒŒ  ¥ ŒŒ # é ŒŒ ' é ŒŒ ) ¥ ŒŒ 8 ë ŒŒ < ë ŒŒ = ¥ ŒŒ  í ŒŒ ƒ ¥ ŒŒ| ‡ gnameg cell->objectŒg documentationfWReturn an object representing the object at ADDRESS, reading from memory using BACKEND.ŒC qR=.1¸8ºQop ‰ n o I p:ÙÚÛÜÝ eJ q½ оV ‹ Œ   h|-.,3 #44  5™5‘$ þ6  ‘$ø§& ©" 4 5454 5€$·4 4 4 555$C–Œ 45$"4>"G ©4 ©44 555Y454§& ©" 4 5 4 5 5ZCZF644  5™5‘$4 ø5644  5™5‘$q4 ø5 †$C †$C †$C †$C †$C †$6 †$6 †$6CCtgbits ÿgbackend ÿgtag  ' ÿgtag  ? ÿgpeek  d pgtype  p Bgpair?  { Bgt  – :gcdrloc  © :gpair  © :gt-1f6d4c535-80f  ¯ :gpeek # /gtag  S ÿgchar  g ogtag  € ÿgflag  ” ügfilenamefsystem/base/types.scmŒ 𠌌  ó ŒŒ M ÷ ŒŒ p ÷ ŒŒ s ø ŒŒ { ø ŒŒ { ÷ ŒŒ ƒ ù ŒŒ „ ú ŒŒ ‡ ú ŒŒ Œ ú *ŒŒ ’ ú ŒŒ – ú ŒŒ – ú ŒŒ ¦ ü ŒŒ © ý ŒŒ © û ŒŒ ¯ þ ŒŒ û ÿ "ŒŒ  ÿ ŒŒ   ŒŒ   *ŒŒ 3  ŒŒ 4  ŒŒ B  ŒŒ C ó ŒŒ o  ŒŒ p ó ŒŒ ž  ŒŒ ´  ŒŒ ¾  ŒŒ Ø  ŒŒ Ü  ŒŒ å  ŒŒ é  ŒŒ ò  ŒŒ ö  ŒŒ ú  ŒŒ þ ó ŒŒ( ÿ gnameg scm->objectŒg documentationfLReturn the Scheme object corresponding to BITS, the bits of an 'SCM' object.ŒCJRC›gm  ,grtd Ó ügrtd Aè Bgrtd Pð Qg%printed-struct cÕ fñgrtd j  jËgrtd ~× gfilenamefsystem/base/types.scmŒ   ŒŒ - B ŒŒ 3 B ŒŒ 5 B ŒŒ 8 @ ŒŒ  D ŒŒ ý h ŒŒ  K ŒŒ  j ŒŒ $ ~ ŒŒ %P ƒ ŒŒ =¨ ê ŒŒ =® ë ŒŒ =³ í ŒŒ =¼ î ŒŒ =Ä ï ŒŒ =È ï ŒŒ =Ð ñ ŒŒ =Ô ñ ŒŒ =Û ò ŒŒ =ß ò ŒŒ =ä õ ŒŒ =ê ö ŒŒ =ð ÷ ŒŒ =ö ø ŒŒ =ü ù ŒŒ > ú ŒŒ > û ŒŒ > ü ŒŒ > ý ŒŒ > þ ŒŒ > ÿ ŒŒ >&  ŒŒ >,  ŒŒ >2  ŒŒ >8  ŒŒ >>  ŒŒ >D  ŒŒ >J  ŒŒ >P  ŒŒ >V  ŒŒ >\  ŒŒ >b  ŒŒ >j  $ŒŒ >k  ŒŒ >o  ŒŒ >w  "ŒŒ >x  ŒŒ >|  ŒŒ >„  %ŒŒ >…  ŒŒ >‰  ŒŒ >‘  &ŒŒ >’  ŒŒ >–  ŒŒ ?:  ŒŒ L#  ŒŒ N"  ŒŒ cÉ & ŒŒ cÕ & ŒŒ fõ % ŒŒ fö 6 ŒŒ gÒ 9 ŒŒ yó ? ŒŒ {ò J ŒŒ”¹ Q ŒŒ”º Z ŒŒ—Û b ŒŒ™³ j ŒŒ™´ v ŒŒ™Ä r ŒŒ¢¸  ŒŒ¶   ŒŒ»ç 𠌌K »é C6PK!ˆA5Müübase/target.gonu„[µü¤GOOF----LE-8-2.0ä]i4hÝ] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gbase¤ gtarget¤ ¤ gfilenameS¤ fsystem/base/target.scm¤ gimportsS¤ grnrs¤ g bytevectors¤  ¤ ¤ gice-9¤ gregex¤ ¤ ¤ ¤ gexportsS¤ g target-type¤ g with-target¤ g target-cpu¤ g target-vendor¤ g target-os¤ gtarget-endianness¤ gtarget-word-size¤ ¤ gset-current-module¤ ¤ !¤ "gforeign¤ #"¤ $gsizeof¤ %#$¤ &#$¤ 'g*¤ (g%native-word-size¤ )g make-fluid¤ *g %host-type¤ +g %target-type¤ ,gnative-endianness¤ -g%target-endianness¤ .g%target-word-size¤ /gstring?¤ 0g string-split¤ 1glength¤ 2gor-map¤ 3g string-null?¤ 4gerror¤ 5finvalid target¤ 6gvalidate-target¤ 7g triplet-cpu¤ 8gcpu-endianness¤ 9gtriplet-pointer-size¤ :gstring=?¤ ;g string-match¤ gmember¤ ?fx86_64¤ @fia64¤ Af powerpcle¤ Bf powerpc64le¤ Cfmipsel¤ Dfmips64el¤ Efnios2¤ Ffsh3¤ Gfsh4¤ Hfalpha¤ I?@ABCDEFGH ¤ Jfsparc¤ Kfsparc64¤ Lfpowerpc¤ Mf powerpc64¤ Nfspu¤ Ofmips¤ Pfmips64¤ Qfm68k¤ Rfs390x¤ SJKLMNOPQR ¤ Tgbig¤ Uf^arm.*el¤ Vf^arm.*eb¤ Wgstring-prefix?¤ Xfarm¤ Yf ^aarch64.*be¤ Zfaarch64¤ [funknown CPU endianness¤ \f^mips64.*-gnuabi64¤ ]f^mips64¤ ^f^x86_64-.*-gnux32¤ _f64$¤ `f64_?[lbe][lbe]$¤ aJLOCEQFG¤ bRH¤ cf^arm.*¤ dfunknown CPU word size¤ eg triplet-os¤ fg substring¤ gg string-index¤ hgtriplet-vendor¤C5hH*]4    54!>"G4&'5(R4)i*i5+R4)i4,i55-R4)i(i5.R/012345hXú]45$54-545 ’$" 45"$6Cògtarget  Qgparts  >gt  " ;gfilenamefsystem/base/target.scmŒ - ŒŒ  . ŒŒ . ŒŒ  / ŒŒ  / ŒŒ  0 ŒŒ " 0 ŒŒ " 0 ŒŒ 0 1 ŒŒ C . ŒŒ G . ŒŒ K 2 ŒŒ O 2 ŒŒ  Q gnamegvalidate-targetŒC6R67+-.89hHÉ] 4>"G454545Y4>ZCZFÁgtarget  Agthunk  Agcpu   Agfilenamefsystem/base/target.scmŒ 4 ŒŒ  5 ŒŒ  6 ŒŒ  6 ŒŒ & 8 &ŒŒ - 9 %ŒŒ 6 : ŒŒ  A gnameg with-targetŒCR:7*,;<=>ISTUVWXYZ4[h -]4455$645$C4 5$C4 5$ C4 5$C4 5$ C45$C45$ C45$C6%gcpu   gfilenamefsystem/base/target.scmŒ < ŒŒ  > ŒŒ  > ŒŒ  > ŒŒ  > ŒŒ  ? ŒŒ  @ ŒŒ  @ ŒŒ ! @ ŒŒ % @ ŒŒ ' A ŒŒ ) B ŒŒ / B ŒŒ 1 B ŒŒ 5 @ ŒŒ 7 D ŒŒ 9 E ŒŒ ? E ŒŒ A E ŒŒ E @ ŒŒ G G ŒŒ I H ŒŒ M H ŒŒ Q H ŒŒ U @ ŒŒ W I ŒŒ Y J ŒŒ ] J ŒŒ a J ŒŒ e @ ŒŒ g K ŒŒ i L ŒŒ m L ŒŒ q L ŒŒ u @ ŒŒ w M ŒŒ y N ŒŒ } N ŒŒ N ŒŒ … @ ŒŒ ‡ O ŒŒ ‰ P ŒŒ P ŒŒ ‘ P ŒŒ • @ ŒŒ — Q ŒŒ œ S ŒŒ   S ŒŒ1    gnamegcpu-endiannessŒg documentationfReturn the endianness for CPU.ŒC8R7;<\]^_`>abc4d:*e(hà}] 45"˜45$ C45$ C45$ C45$ C45$ C45$ C4  5$ C4  5$ C4 5$ C 64455$445455$C"ÿÿ8"ÿÿ4ugtriplet  Ûgcpu Ûgfilenamefsystem/base/target.scmŒ U ŒŒ  W ŒŒ W ŒŒ  \ ŒŒ  \ ŒŒ  \ ŒŒ  X ŒŒ c ŒŒ $ c ŒŒ ( c ŒŒ , X ŒŒ 0 d ŒŒ 4 d ŒŒ 8 d ŒŒ < X ŒŒ @ f ŒŒ D f ŒŒ H f ŒŒ L X ŒŒ P h ŒŒ T h ŒŒ X h ŒŒ \ X ŒŒ ` i ŒŒ d i ŒŒ h i ŒŒ l X ŒŒ p j ŒŒ v j ŒŒ x j ŒŒ | X ŒŒ € k ŒŒ † k ŒŒ ˆ k ŒŒ Œ X ŒŒ l ŒŒ ” l ŒŒ ˜ l ŒŒ œ X ŒŒ £ m ŒŒ § m ŒŒ § X ŒŒ ¨ X ŒŒ ­ X ŒŒ µ X ŒŒ ¹ X ŒŒ º Y ŒŒ ½ Y ŒŒ Ä Y /ŒŒ Ì Y ŒŒ Ð X ŒŒ4  Û gnamegtriplet-pointer-sizeŒg documentationf1Return the size of pointers in bytes for TRIPLET.ŒC9Rfgh€] 4-56xgt  gfilenamefsystem/base/target.scmŒ o ŒŒ  p ŒŒ  p ŒŒ   gnameg triplet-cpuŒC7Rgfh(­] 4-5—4-56¥gt  !gstart !gfilenamefsystem/base/target.scmŒ r ŒŒ  s ŒŒ s ŒŒ s ŒŒ  t ŒŒ ! t ŒŒ  ! gnamegtriplet-vendorŒChRgfh ¹] 4-4-5—5—6±gt  gstart  gfilenamefsystem/base/target.scmŒ v ŒŒ  w ŒŒ w +ŒŒ  w 'ŒŒ  w ŒŒ  w ŒŒ  w ŒŒ x ŒŒ  gnameg triplet-osŒCeR+h²][Cªgfilenamefsystem/base/target.scmŒ { ŒŒ   gnameg target-typeŒg documentationf<¤ ?f-source expression failed to match any pattern¤ @¤ Agif¤ B!8¤ Cgm-3c4e5dc25-92¤ DC¤ ED¤ Ffl-3c4e5dc25-97¤ Gfl-3c4e5dc25-98¤ HFG¤ I BEH¤ JD¤ Kfl-3c4e5dc25-94¤ LK¤ M /JL¤ NI-M¤ OAN6¤ PN6¤ QOPP¤ Rgfree-id¤ Sgelse¤ T-M¤ UST6¤ VRU¤ WVŒ¤ XW¤ Yge0¤ Z!8Y"¤ [D¤ \fl-3c4e5dc25-9c¤ ]fl-3c4e5dc25-9d¤ ^fl-3c4e5dc25-9e¤ _fl-3c4e5dc25-9f¤ `\]^_¤ a Z[`¤ ba-M¤ cb6¤ dgguard¤ edT6¤ fRe¤ gfŒ¤ hgŒ¤ ihŒ¤ jiŒ¤ kjŒ¤ lkŒ¤ mgpat¤ ngg¤ o!8mnY"#¤ pD¤ qfl-3c4e5dc25-a6¤ rfl-3c4e5dc25-a7¤ sfl-3c4e5dc25-a8¤ tfl-3c4e5dc25-a9¤ ufl-3c4e5dc25-aa¤ vfl-3c4e5dc25-ab¤ wfl-3c4e5dc25-ac¤ xqrstuvw¤ y opx¤ zy-M¤ {z6¤ |gfk¤ }|z6¤ ~glambda¤ ~z6¤ €:z6¤ gppat¤ ‚z6¤ ƒAz6¤ „gand¤ …„z6¤ †}¤ ‡†¤ ˆŒ¤ ‰ˆŒ¤ ЉŒ¤ ‹!8mY"#¤ ŒD¤ fl-3c4e5dc25-b8¤ Žfl-3c4e5dc25-b9¤ fl-3c4e5dc25-ba¤ fl-3c4e5dc25-bb¤ ‘fl-3c4e5dc25-bc¤ ’fl-3c4e5dc25-bd¤ “Ž‘’¤ ” ‹Œ“¤ •”-M¤ –•6¤ —|•6¤ ˜~•6¤ ™:•6¤ š•6¤ ›—¤ œ›¤ g_¤ žgm-3c4e5dc25-c6¤ Ÿž¤  Ÿ¤ ¡fl-3c4e5dc25-c8¤ ¢¡¤ £ / ¢¤ ¤-£¤ ¥¤6¤ ¦R¥¤ §¦¤ ¨¤ ©gkt¤ ªgkf¤ «!8©ª¤ ¬Ÿ¤ ­fl-3c4e5dc25-d4¤ ®fl-3c4e5dc25-d5¤ ¯fl-3c4e5dc25-d6¤ °fl-3c4e5dc25-d7¤ ±­®¯°¤ ² «¬±¤ ³²-£¤ ´A³6¤ µgnull?¤ ¶µ³6¤ ·gquote¤ ¸·¤6¤ ¹R¸¤ º¹¤ »º¤ ¼glit¤ ½!8¼©ª¤ ¾Ÿ¤ ¿fl-3c4e5dc25-dd¤ Àfl-3c4e5dc25-de¤ Áfl-3c4e5dc25-df¤ Âfl-3c4e5dc25-e0¤ Ãfl-3c4e5dc25-e1¤ Ä¿ÀÁÂä Å ½¾Ä¤ ÆÅ-£¤ ÇAÆ6¤ Ègequal?¤ ÉÈÆ6¤ Ê·Æ6¤ Ëgunquote¤ Ìˤ6¤ ÍR̤ Îͤ ÏΤ Ðgvar¤ Ñ!8Щª¤ Òfl-3c4e5dc25-e8¤ Ófl-3c4e5dc25-e9¤ Ôfl-3c4e5dc25-ea¤ Õfl-3c4e5dc25-eb¤ Öfl-3c4e5dc25-ec¤ ×ÒÓÔÕÖ¤ Ø Ñ¾×¤ ÙØ-£¤ ÚÙ6¤ ÛŒ¤ ÜÛ¤ Ýgy¤ Þ!8.Ý©ª¤ ߟ¤ àfl-3c4e5dc25-f3¤ áfl-3c4e5dc25-f4¤ âfl-3c4e5dc25-f5¤ ãfl-3c4e5dc25-f6¤ äfl-3c4e5dc25-f7¤ åfl-3c4e5dc25-f8¤ æàáâãäå¤ ç Þßæ¤ èç-£¤ éAè6¤ êgpair?¤ ëêè6¤ ìè6¤ ígvx¤ îíè6¤ ïgcar¤ ðïè6¤ ñgvy¤ òñè6¤ ógcdr¤ ôóè6¤ õè6¤ ö¤ ÷fl-3c4e5dc25-100¤ øfl-3c4e5dc25-101¤ ùfl-3c4e5dc25-102¤ úfl-3c4e5dc25-103¤ ûfl-3c4e5dc25-104¤ ü÷øùúû¤ ý ½¾ü¤ þý-£¤ ÿAþ6¤ geq?¤ þ6¤ ·þ6¤C5hx Z]4     54>"G479;h L]ŒŒCDgdummy  ge  gcs      C>?h(«] 45$@6£gx  "gtmp "gfilenamefsystem/base/pmatch.scmŒ ' ŒŒ  " g macro-typeg syntax-rulesŒgpatternsgegcsg...C5R4:@Qh<]C4gdummy  gv     CXch[]ŒŒŒCSgdummy  gv  ge0   ge     Cl{}€‚ƒ…‡ h@‹]ŒŒŒŒŒŒŒŒŒŒŒŒŒCƒgdummy  @gv  @gpat   @gg   @ge0   @ge   @gcs   @  @ CŠ–—˜™šœh8|]ŒŒŒŒŒŒŒŒŒCtgdummy  4gv  4gpat   4ge0   4ge   4gcs   4  4 C>? hhq]!45$@45$@45$@45$ @  6igx  ggtmp ggtmp  " ggtmp  9 ggtmp  P ggfilenamefsystem/base/pmatch.scmŒ + ŒŒ  g g macro-typeg syntax-rulesŒgpatternsgvgvgelsege0geg...gvgpatgguardggg...ge0geg...gcsg...gvgpatge0geg...gcsg...C5:R4§h\]CTgdummy  gv  gkt   gkf      C¨´¶h\]CTgdummy  gv  gkt   gkf      C»ÇÉÊh m]Cegdummy  gv  glit   gkt   gkf      CÏÚhm]Cegdummy  gv  gvar   gkt   gkf      CÜéëìîðòôõ hPz]Crgdummy  Igv  Igx   Igy   Igkt   Igkf   I  I Cöÿh m]Cegdummy  gv  glit   gkt   gkf      C>?h˜¬]145$@45$@45$@45$ @4 5$ @4 5$ @6¤gx  •gtmp •gtmp  " •gtmp  9 •gtmp  P •gtmp  g •gtmp  ~ •gfilenamefsystem/base/pmatch.scmŒ 8 ŒŒ  • g macro-typeg syntax-rulesŒgpatternsgvg_gktgkfgvgktgkfgvgquoteglitgktgkfgvgunquotegvargktgkfgvgxgyŒgktgkfgvglitgktgkfC5RCRgm  (gfilenamefsystem/base/pmatch.scmŒ  $ ŒŒ  s C6PK!–vÕfÀsÀsbase/message.gonu„[µü¤GOOF----LE-8-2.0¨s]ð4hñ;] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gbase¤ gmessage¤ ¤ gfilenameS¤ fsystem/base/message.scm¤ gimportsS¤ gsrfi¤ gsrfi-1¤  ¤ ¤ gsrfi-9¤  ¤ ¤ gice-9¤ gmatch¤ ¤ ¤ ¤ gexportsS¤ g*current-warning-port*¤ g*current-warning-prefix*¤ gwarning¤ g warning-type?¤ gwarning-type-name¤ gwarning-type-description¤ gwarning-type-printer¤ !glookup-warning-type¤ "g%warning-types¤ # !" ¤ $gset-current-module¤ %$¤ &$¤ 'gformat¤ (f~a:~a:~a¤ )g assoc-ref¤ *gfilename¤ +f¤ ,gline¤ -gcolumn¤ .f¤ /glocation-string¤ 0gparameter-fluid¤ 1gcurrent-warning-port¤ 2g make-fluid¤ 3f;;; ¤ 4g¤ 5g%make-warning-type-procedure¤ 6gmake-syntax-transformer¤ 76¤ 86¤ 9gmake-warning-type¤ :gmacro¤ ;g $sc-dispatch¤ <;¤ =;¤ >g_¤ ?gany¤ @>???¤ Ag syntax-object¤ Bglambda¤ Cgm-44b57084b9-69a¤ Dgtop¤ ECD¤ Fgribcage¤ Ggt-44b57084b9-697¤ Hgt-44b57084b9-698¤ Igt-44b57084b9-699¤ JGHI¤ KEEE¤ Lfl-44b57084b9-69f¤ Mfl-44b57084b9-6a0¤ Nfl-44b57084b9-6a1¤ OLMN¤ PFJKO¤ QF¤ Rgx¤ SR¤ TE¤ Ufl-44b57084b9-69c¤ VU¤ WFSTV¤ Xgshift¤ Yg proc-name¤ Zgargs¤ [YZ¤ \D¤ ]\\¤ ^fl-1e8ba8b5a-60¤ _fl-1e8ba8b5a-61¤ `^_¤ aF[]`¤ bgkey¤ cgvalue¤ dgname¤ egformals¤ fgbody¤ gbcdef¤ h\\\\\¤ ifl-1e8ba8b5a-53¤ jfl-1e8ba8b5a-54¤ kfl-1e8ba8b5a-55¤ lfl-1e8ba8b5a-56¤ mfl-1e8ba8b5a-57¤ nijklm¤ oFghn¤ pgmake-procedure-name¤ qp¤ r\¤ sfl-1e8ba8b5a-43¤ ts¤ uFqrt¤ v\¤ wfl-1e8ba8b5a-42¤ xw¤ yFSvx¤ zEPQWXQQQQaouy ¤ {ghygiene¤ |{ ¤ }ABz|¤ ~\PQW¤ {¤ €Ad~¤ g description¤ ‚A~¤ ƒgprinter¤ „Aƒ~¤ …€‚„¤ †g make-struct¤ ‡gm-44b57084b9-695¤ ˆ‡D¤ ‰gt-1e8ba8b5a-133¤ Šgt-1e8ba8b5a-132¤ ‹gt-1e8ba8b5a-131¤ Œ‰Š‹¤ gm-1e8ba8b5a-134¤ ŽD¤ ŽŽŽ¤ fl-1e8ba8b5a-138¤ ‘fl-1e8ba8b5a-139¤ ’fl-1e8ba8b5a-13a¤ “‘’¤ ”FŒ“¤ •g ctor-args¤ –•¤ —fl-1e8ba8b5a-120¤ ˜—¤ ™F–v˜¤ šgctor¤ ›gfield¤ œš›¤ fl-1e8ba8b5a-11c¤ žfl-1e8ba8b5a-11d¤ Ÿž¤  Fœ]Ÿ¤ ¡gform¤ ¢g type-name¤ £gconstructor-spec¤ ¤g field-names¤ ¥¡¢£¤¤ ¦\\\\¤ §fl-1e8ba8b5a-111¤ ¨fl-1e8ba8b5a-112¤ ©fl-1e8ba8b5a-113¤ ªfl-1e8ba8b5a-114¤ «§¨©ª¤ ¬F¥¦«¤ ­g record-layout¤ ®gfunctional-setters¤ ¯gsetters¤ °gcopier¤ ±ggetters¤ ²g constructor¤ ³ggetter-identifiers¤ ´gfield-identifiers¤ µ­®¯°±²³´¤ ¶\\\\\\\\¤ ·fl-1e8ba8b5a-e9¤ ¸fl-1e8ba8b5a-e7¤ ¹fl-1e8ba8b5a-e5¤ ºfl-1e8ba8b5a-e3¤ »fl-1e8ba8b5a-e1¤ ¼fl-1e8ba8b5a-df¤ ½fl-1e8ba8b5a-dd¤ ¾fl-1e8ba8b5a-db¤ ¿·¸¹º»¼½¾¤ ÀFµ¶¿¤ Áfl-1e8ba8b5a-da¤ ÂÁ¤ ÃFSv¤ ĈPQWXQ”QQQ™ Q¬Àä ÅA†Ä|¤ ÆA4~¤ ÇA Ä|¤ ÈÅÆÇ€‚„¤ É}…Ȥ Êgeach-any¤ Ë>ÊŒ¤ Ìgsyntax-violation¤ Í̤ Î̤ ÏfWrong number of arguments¤ Ðg identifier?¤ ÑФ ÒФ Ó\QW¤ ÔA5Ó¤ Õ̤ Ö̤ ×f-source expression failed to match any pattern¤ Øgrecord-type-vtable¤ ÙØ¤ ÚØ¤ Ûgpwpwpw¤ Ügdefault-record-printer¤ Ýܤ Þܤ ßdƒ¤ àgset-struct-vtable-name!¤ áठâठãgvtable-offset-user¤ ä㤠å㤠æg%warning-type?-procedure¤ ç>?¤ ègm-44b57084b9-6ab¤ éèD¤ êgt-44b57084b9-6aa¤ ëê¤ ìé¤ ífl-44b57084b9-6b0¤ îí¤ ïFëìî¤ ðfl-44b57084b9-6ad¤ ñð¤ òFSìñ¤ óéïQòXQQQQaouy ¤ ôABó|¤ õgobj¤ ögt-1e8ba8b5a-224¤ ÷gt-1e8ba8b5a-21e¤ øgt-1e8ba8b5a-21f¤ ùgt-1e8ba8b5a-220¤ úgt-1e8ba8b5a-223¤ ûgt-1e8ba8b5a-222¤ ügt-1e8ba8b5a-221¤ ýö÷øùúûü¤ þgm-1e8ba8b5a-225¤ ÿþD¤ ÿÿÿÿÿÿÿ¤ fl-1e8ba8b5a-229¤ fl-1e8ba8b5a-22a¤ fl-1e8ba8b5a-22b¤ fl-1e8ba8b5a-22c¤ fl-1e8ba8b5a-22d¤ fl-1e8ba8b5a-22e¤ fl-1e8ba8b5a-22f¤ ¤  Fý¤  g copier-id¤   ¤  fl-1e8ba8b5a-21c¤   ¤ F v ¤ g ctor-name¤ ¤ fl-1e8ba8b5a-214¤ ¤ Fv¤ ¤¤ fl-1e8ba8b5a-212¤ ¤ Fv¤ glayout¤ ¤ fl-1e8ba8b5a-210¤ ¤ Fv¤ g immutable?¤ ¤ fl-1e8ba8b5a-20e¤  ¤ !Fv ¤ "g field-count¤ #"¤ $fl-1e8ba8b5a-20c¤ %$¤ &F#v%¤ 'g getter-ids¤ ('¤ )fl-1e8ba8b5a-209¤ *)¤ +F(v*¤ ,g field-ids¤ -,¤ .fl-1e8ba8b5a-206¤ /.¤ 0F-v/¤ 1gpredicate-name¤ 2g field-spec¤ 3¡¢£12¤ 4\\\\\\¤ 5fl-1e8ba8b5a-1f9¤ 6fl-1e8ba8b5a-1fa¤ 7fl-1e8ba8b5a-1fb¤ 8fl-1e8ba8b5a-1fc¤ 9fl-1e8ba8b5a-1fd¤ :fl-1e8ba8b5a-1fe¤ ;56789:¤ <F34;¤ =ˆïQòXQ QQQQQQQQ!Q&Q+Q0<Àä >Aõ=|¤ ?>¤ @gand¤ AA@=|¤ Bgstruct?¤ CAB=|¤ DC>¤ Egeq?¤ FAE=|¤ Gg struct-vtable¤ HAG=|¤ IH>¤ J\ïQò¤ KA4J¤ LFIK¤ MADL¤ Nô?M¤ O\Qò¤ PAæO¤ Qgthrow-bad-struct¤ RQ¤ SQ¤ Tg%warning-type-name-procedure¤ Ugfree-id¤ Vg %%on-error¤ Wgm-44b57084b9-6b7¤ XWD¤ YX¤ Zfl-44b57084b9-6b9¤ [Z¤ \FSY[¤ ]XQ\XQQQQaouy ¤ ^AV]|¤ _U^¤ `_?¤ ag%%type¤ bgt-1e8ba8b5a-14b¤ cgt-1e8ba8b5a-14c¤ dgt-1e8ba8b5a-14d¤ egt-1e8ba8b5a-14e¤ fgt-1e8ba8b5a-14f¤ ggt-1e8ba8b5a-150¤ hgt-1e8ba8b5a-151¤ ibcdefgh¤ jgm-1e8ba8b5a-152¤ kjD¤ lkkkkkkk¤ mfl-1e8ba8b5a-156¤ nfl-1e8ba8b5a-157¤ ofl-1e8ba8b5a-158¤ pfl-1e8ba8b5a-159¤ qfl-1e8ba8b5a-15a¤ rfl-1e8ba8b5a-15b¤ sfl-1e8ba8b5a-15c¤ tmnopqrs¤ uFilt¤ vggetter¤ wgindex¤ xvw¤ yfl-1e8ba8b5a-149¤ zfl-1e8ba8b5a-14a¤ {yz¤ |Fx]{¤ }¢' ¤ ~\\\¤ fl-1e8ba8b5a-144¤ €fl-1e8ba8b5a-145¤ fl-1e8ba8b5a-146¤ ‚€¤ ƒF}~‚¤ „ˆQ\XQuQQQ|QƒÀä …Aa„|¤ †U…¤ ‡>`†?¤ ˆgck¤ ‰gerr¤ Šgs¤ ‹‰Š¤ ŒXX¤ fl-44b57084b9-6bc¤ Žfl-44b57084b9-6bd¤ ޤ F‹Œ¤ ‘XQ\XQQQQaouy ¤ ’Aˆ‘|¤ “gquote¤ ”A“‘|¤ •\Q\¤ –A4•¤ —”–¤ ˜—¤ ™g%%index¤ šA™„|¤ ›Uš¤ œ>`›?¤ fl-44b57084b9-6c1¤ žfl-44b57084b9-6c2¤ Ÿž¤  F‹ŒŸ¤ ¡X Q\XQQQQaouy ¤ ¢Aˆ¡|¤ £A“¡|¤ ¤ Q\¤ ¥A ¤¤ ¦£¥¤ §¦¤ ¨g%%copier¤ ©A¨„|¤ ªU©¤ «>`ª?¤ ¬fl-44b57084b9-6c6¤ ­fl-44b57084b9-6c7¤ ®¬­¤ ¯F‹Œ®¤ °X¯Q\XQQQQaouy ¤ ±Aˆ°|¤ ²A“°|¤ ³g%%-set-fields¤ ´\¯Q\¤ µA³´¤ ¶²µ¤ ·¶¤ ¸gt-44b57084b9-6b6¤ ¹¸¤ ºfl-44b57084b9-6cb¤ »º¤ ¼F¹Y»¤ ½X¼Q\XQQQQaouy ¤ ¾AB½|¤ ¿ˆ¼Q\XQuQQQ|QƒÀä ÀAŠ¿|¤ ÁÀ¤ Âgif¤ ÃA¿|¤ ÄAE¿|¤ ÅAG¿|¤ ÆÅÀ¤ Ç\¼Q\¤ ÈA4Ǥ ÉÄÆÈ¤ Êg struct-ref¤ ËAÊ¿|¤ ̼Q\¤ ÍA ̤ ÎËÀͤ ÏAQ¿|¤ ÐA“¿|¤ ÑAǤ ÒÐѤ ÓÏÀÒ¤ ÔÃÉÎÓ¤ Õ¾ÁÔ¤ Ö\Q\¤ ×ATÖ¤ Øg#%warning-type-description-procedure¤ Ùgm-44b57084b9-6d2¤ ÚÙD¤ ÛÚ¤ Üfl-44b57084b9-6d4¤ Ýܤ ÞFSÛݤ ßÚQÞXQQQQaouy ¤ àAVß|¤ áUठâá?¤ ãˆQÞXQuQQQ|QƒÀä äAaã|¤ åUä¤ æ>âå?¤ çÚÚ¤ èfl-44b57084b9-6d7¤ éfl-44b57084b9-6d8¤ êèé¤ ëF‹çê¤ ìÚëQÞXQQQQaouy ¤ íAˆì|¤ îA“ì|¤ ï\ëQÞ¤ ðA4ï¤ ñîð¤ òñ¤ óA™ã|¤ ôUó¤ õ>âô?¤ öfl-44b57084b9-6dc¤ ÷fl-44b57084b9-6dd¤ øö÷¤ ùF‹çø¤ úÚùQÞXQQQQaouy ¤ ûAˆú|¤ üA“ú|¤ ýùQÞ¤ þA ý¤ ÿüþ¤ ÿ¤ A¨ã|¤ U¤ >â?¤ fl-44b57084b9-6e1¤ fl-44b57084b9-6e2¤ ¤ F‹ç¤ ÚQÞXQQQQaouy ¤  Aˆ|¤  A“|¤  \QÞ¤  A³ ¤    ¤  ¤ gt-44b57084b9-6d1¤ ¤ fl-44b57084b9-6e6¤ ¤ FÛ¤ ÚQÞXQQQQaouy ¤ AB|¤ ˆQÞXQuQQQ|QƒÀä AŠ|¤ ¤ AÂ|¤ AE|¤ AG|¤ ¤ \QÞ¤ A4¤ ¤  AÊ|¤ !QÞ¤ "A !¤ # "¤ $AQ|¤ %A“|¤ &A¤ '%&¤ ($'¤ )#(¤ *)¤ +\QÞ¤ ,AØ+¤ -g%warning-type-printer-procedure¤ .gm-44b57084b9-6ed¤ /.D¤ 0/¤ 1fl-44b57084b9-6ef¤ 21¤ 3FS02¤ 4/Q3XQQQQaouy ¤ 5AV4|¤ 6U5¤ 76?¤ 8ˆQ3XQuQQQ|QƒÀä 9Aa8|¤ :U9¤ ;>7:?¤ <//¤ =fl-44b57084b9-6f2¤ >fl-44b57084b9-6f3¤ ?=>¤ @F‹<?¤ A/@Q3XQQQQaouy ¤ BAˆA|¤ CA“A|¤ D\@Q3¤ EA4D¤ FCE¤ GF¤ HA™8|¤ IUH¤ J>7I?¤ Kfl-44b57084b9-6f7¤ Lfl-44b57084b9-6f8¤ MKL¤ NF‹<M¤ O/NQ3XQQQQaouy ¤ PAˆO|¤ QA“O|¤ RNQ3¤ SA R¤ TQS¤ UT¤ VA¨8|¤ WUV¤ X>7W?¤ Yfl-44b57084b9-6fc¤ Zfl-44b57084b9-6fd¤ [YZ¤ \F‹<[¤ ]/\Q3XQQQQaouy ¤ ^Aˆ]|¤ _A“]|¤ `\\Q3¤ aA³`¤ b_a¤ cb¤ dgt-44b57084b9-6ec¤ ed¤ ffl-44b57084b9-701¤ gf¤ hFe0g¤ i/hQ3XQQQQaouy ¤ jABi|¤ kˆhQ3XQuQQQ|QƒÀä lAŠk|¤ ml¤ nAÂk|¤ oAEk|¤ pAGk|¤ qpl¤ r\hQ3¤ sA4r¤ toqs¤ uAÊk|¤ vhQ3¤ wA v¤ xulw¤ yAQk|¤ zA“k|¤ {A r¤ |z{¤ }yl|¤ ~ntx}¤ jm~¤ €\Q3¤ A-€¤ ‚geach¤ ƒ??¤ „‚ƒ¤ …?„Œ¤ †?…Œ¤ ‡?†Œ¤ ˆg %%set-fields¤ ‰gdummy¤ Šgcheck?¤ ‹gexpr¤ Œ‰ŠŠv‹¤ gm-44b57084b9-708¤ ŽD¤ Žˆˆˆˆ¤ fl-44b57084b9-70d¤ ‘fl-44b57084b9-70e¤ ’fl-44b57084b9-70f¤ “fl-44b57084b9-710¤ ”fl-44b57084b9-711¤ •‘’“”¤ –FŒ•¤ —ޤ ˜fl-44b57084b9-70a¤ ™˜¤ šFS—™¤ ›gt-1e8ba8b5a-16a¤ œgt-1e8ba8b5a-16c¤ gt-1e8ba8b5a-16b¤ ž›œ¤ Ÿgm-1e8ba8b5a-16d¤  ŸD¤ ¡   ¤ ¢fl-1e8ba8b5a-171¤ £fl-1e8ba8b5a-172¤ ¤fl-1e8ba8b5a-173¤ ¥¢£¤¤ ¦Fž¡¥¤ §fl-1e8ba8b5a-167¤ ¨fl-1e8ba8b5a-168¤ ©fl-1e8ba8b5a-169¤ ª§¨©¤ «F}~ª¤ ¬ˆ–QšXQ¦QQQ«Àà ¤ ­Aˆ¬|¤ ®\–Q𤠝A4®¤ °A®¤ ±A®¤ ²A ®¤ ³°±²¤ ´gmap¤ µ´¤ ¶´¤ ·glist¤ ¸gunsupported-warning¤ ¹f warn about unknown warning types¤ ºf&~awarning: unknown warning type `~A'~%¤ »gunused-variable¤ ¼freport unused variables¤ ½f%~a~A: warning: unused variable `~A'~%¤ ¾gunused-toplevel¤ ¿f'report unused local top-level variables¤ Àf>~a~A: warning: possibly unused local top-level variable `~A'~%¤ Águnbound-variable¤ Âf!report possibly unbound variables¤ Ãf/~a~A: warning: possibly unbound variable `~A'~%¤ Ägarity-mismatch¤ Åf=report procedure arity mismatches (wrong number of arguments)¤ Æf2~a~A: warning: wrong number of arguments to `~A'~%¤ Çf;~a~A: warning: possibly wrong number of arguments to `~A'~%¤ Ègduplicate-case-datum¤ Éf-report a duplicate datum in a case expression¤ ÊfF~a~A: warning: duplicate datum ~S in clause ~S of case expression ~S~%¤ Ëgbad-case-datum¤ ÌfEreport a case datum that cannot be meaningfully compared using `eqv?'¤ Ífi~a~A: warning: datum ~S cannot be meaningfully compared using `eqv?' in clause ~S of case expression ~S~%¤ Îf,report wrong number of arguments to `format'¤ Ïgwrong-num-args¤ Ðf~a~A: `format' warning~%¤ Ñf6~a~A: warning: wrong number of arguments to `format'~%¤ Ògnon-literal-format-string¤ Óf*~a~A: warning: non-literal format string~%¤ Ôgwrong-format-string¤ Õf(~a~A: warning: ~S: wrong format string~%¤ Ög wrong-port¤ ×f(~a~A: warning: ~S: wrong port argument~%¤ Øg syntax-error¤ Ùg"unexpected-conditional-termination¤ Úf%~a~A: warning: ~S: unexpected `~~]'~%¤ Ûg list->string¤ Ügstring-fold-right¤ Ýgappend¤ Þ\n¤ ßgunexpected-semicolon¤ àf%~a~A: warning: ~S: unexpected `~~;'~%¤ águnterminated-conditional¤ âf-~a~A: warning: ~S: unterminated conditional~%¤ ãgunterminated-iteration¤ äf+~a~A: warning: ~S: unterminated iteration~%¤ ågwrong-format-arg-count¤ æfL~a~A: warning: ~S: wrong number of `format' arguments: expected ~A, got ~A~%¤ çf any number¤ èf ~aup to ~a¤ éf ~aat least ~a¤ êgnumber->string¤ ëf ~a~a to ~a¤ ìg simple-format¤ ífO~a~A: warning: ~S: unsupported format option ~~~A, use (ice-9 format) instead~%¤ îgfind¤ ïf#~A: unknown warning type `~A': ~A~%¤C5h¸3æ]4    #54&>"G'()*+,-. hH ] ˆ$645$"45—456Cgloc  Bgt  *gfilenamefsystem/base/message.scmŒ + ŒŒ  , ŒŒ , ŒŒ  - ŒŒ  . ŒŒ  . !ŒŒ  . ŒŒ  . ŒŒ ' . ,ŒŒ + / ŒŒ 1 / !ŒŒ 3 / ŒŒ 4 / ŒŒ 5 0 ŒŒ ; 0 ŒŒ = 0 ŒŒ ? - ŒŒ A 1 ŒŒ  B gnameglocation-stringŒC/R40i1i5R42i35R4h³]¨C«gname  g description  gprinter   gfilenamefsystem/base/message.scmŒ E ŒŒ   gnameg%make-warning-type-procedureŒC5R489:=@Éht]Clgt-44b57084b9-697  gt-44b57084b9-698  gt-44b57084b9-699      CËÎ9ÏhZ]L6Rga  gfilenamefsystem/base/message.scmŒ  E ŒŒ  C>ÒhJ]L6Bgfilenamefsystem/base/message.scmŒ  E ŒŒ   CÔh]C   CÖ× hp‹]45$@45$ O@45$4O?$@  6  6ƒgx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/base/message.scmŒ E ŒŒ  n C59RÚÛÞ4ߨ4â4>"G å–5iª4R4h€]¦$§‚CCxgobj  gfilenamefsystem/base/message.scmŒ E ŒŒ   gnameg%warning-type?-procedureŒCæR48:=çNh8]C0gt-44b57084b9-6aa    CËÎÏhZ]L6Rga  gfilenamefsystem/base/message.scmŒ  E ŒŒ  C>ÒhJ]L6Bgfilenamefsystem/base/message.scmŒ  E ŒŒ   CPh]C   CÖ× hp‹]45$@45$ O@45$4O?$@  6  6ƒgx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/base/message.scmŒ E ŒŒ  n C5R4Sh‚]§& ©C6zgs  gfilenamefsystem/base/message.scmŒ E ŒŒ   gnameg%warning-type-name-procedureŒCTR48:=‡’˜h:]ŒŒC2gerr  gs    Cœ¢§h:]ŒŒC2gerr  gs    C«±·h:]ŒŒC2gerr  gs    CçÕh8]C0gt-44b57084b9-6b6    CËÎÏhZ]L6Rga  gfilenamefsystem/base/message.scmŒ  E ŒŒ  C>ÒhJ]L6Bgfilenamefsystem/base/message.scmŒ  E ŒŒ   C×h]C   CÖ×h¸Ç]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66¿gx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/base/message.scmŒ E ŒŒ  ³ C5R4Sh‰]§& ©C6gs  gfilenamefsystem/base/message.scmŒ E ŒŒ   gnameg#%warning-type-description-procedureŒCØR48:=æíòh:]ŒŒC2gerr  gs    Cõûh:]ŒŒC2gerr  gs    C h:]ŒŒC2gerr  gs    Cç*h8]C0gt-44b57084b9-6d1    CËÎÏhZ]L6Rga  gfilenamefsystem/base/message.scmŒ  E ŒŒ  C>ÒhJ]L6Bgfilenamefsystem/base/message.scmŒ  E ŒŒ   C,h]C   CÖ×h¸Ç]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66¿gx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/base/message.scmŒ E ŒŒ  ³ C5R4S h …]§& ©C6}gs  gfilenamefsystem/base/message.scmŒ E ŒŒ   gnameg%warning-type-printer-procedureŒC-R48 :=;BGh:]ŒŒC2gerr  gs    CJPUh:]ŒŒC2gerr  gs    CX^ch:]ŒŒC2gerr  gs    Cçh8]C0gt-44b57084b9-6ec    CËÎ ÏhZ]L6Rga  gfilenamefsystem/base/message.scmŒ  E ŒŒ  C>ÒhJ]L6Bgfilenamefsystem/base/message.scmŒ  E ŒŒ   Ch]C   CÖ×h¸Ç]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66¿gx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/base/message.scmŒ E ŒŒ  ³ C5 R48³:=‡­¯³¶·h v]45ŒŒŒŒŒCngdummy  gcheck?  gs   ggetter   gexpr      CÖ×h(Å] 45$@6½gx  "gtmp "gfilenamefsystem/base/message.scmŒ E ŒŒ  " g macro-typeg syntax-rulesŒgpatternsgcheck?gsggettergexprg...C5³R4´i5he]@]gargs  gfilenamefsystem/base/message.scmŒ N ŒŒ  O ŒŒ   C¸¹'ºh‹][6ƒgport  gunused  gname   gfilenamefsystem/base/message.scmŒ _ ŒŒ  ` ŒŒ   C»¼'½hˆ][6€gport  gloc  gname   gfilenamefsystem/base/message.scmŒ e ŒŒ  f ŒŒ   C¾¿'Àhˆ][6€gport  gloc  gname   gfilenamefsystem/base/message.scmŒ k ŒŒ  l ŒŒ   CÁÂ'Ãhˆ][6€gport  gloc  gname   gfilenamefsystem/base/message.scmŒ q ŒŒ  r ŒŒ   CÄÅ'ÆÇh(®]$[6[6¦gport  &gloc  &gname   &gcertain?   &gfilenamefsystem/base/message.scmŒ w ŒŒ  x ŒŒ  y ŒŒ  | ŒŒ  & CÈÉ'Êh¶][6®gport  gloc  gdatum   gclause   g case-expr   gfilenamefsystem/base/message.scmŒ ‚ ŒŒ  ƒ ŒŒ   CËÌ'Íh¶][6®gport  gloc  gdatum   gclause   g case-expr   gfilenamefsystem/base/message.scmŒ ‰ ŒŒ  Š ŒŒ   C'ÎÏ'ÐÑÒÓÔÕÖרÙÚÛÜÝÞhŽ] &6ŒC†gc  gr  gfilenamefsystem/base/message.scmŒ “ %ŒŒ ” 'ŒŒ  • 3ŒŒ  • +ŒŒ  – +ŒŒ   CßàÝÞhŽ] &6ŒC†gc  gr  gfilenamefsystem/base/message.scmŒ “ %ŒŒ ” 'ŒŒ  • 3ŒŒ  • +ŒŒ  – +ŒŒ   CáâÝÞhŽ] &6ŒC†gc  gr  gfilenamefsystem/base/message.scmŒ “ %ŒŒ ” 'ŒŒ  • 3ŒŒ  • +ŒŒ  – +ŒŒ   CãäÝÞhŽ] &6ŒC†gc  gr  gfilenamefsystem/base/message.scmŒ “ %ŒŒ ” 'ŒŒ  • 3ŒŒ  • +ŒŒ  – +ŒŒ   CåæÝÞhŽ] &6ŒC†gc  gr  gfilenamefsystem/base/message.scmŒ “ %ŒŒ ” 'ŒŒ  • 3ŒŒ  • +ŒŒ  – +ŒŒ   C?çèéêëìíÝÞhŽ] &6ŒC†gc  gr  gfilenamefsystem/base/message.scmŒ “ %ŒŒ ” 'ŒŒ  • 3ŒŒ  • +ŒŒ  – +ŒŒ   C'h¸7-13 "5"5"¸";"¾"A"ò"£"kˆ$WŽ&8" [6ˆ$Ž([6"ÿÿÐ"ÿÿÌ[6[6ˆ$)Ž(& [6"ÿÿi"ÿÿe"ÿÿaˆ$@Ž&*ˆ$Ž( [6"ÿÿ"ÿÿ"ÿÿ"ÿÿˆ$@Ž &*ˆ$Ž( [6"ÿþÏ"ÿþË"ÿþÇ"ÿþÈ$nŽ &Xˆ$MŽ &7ˆ$,Ž(![44556"ÿþZ"ÿþV"ÿþR"ÿþN"ÿþJ"ÿþFˆ$nŽ &Xˆ$MŽ&7ˆ$,Ž(![44556"ÿýÝ"ÿýÙ"ÿýÕ"ÿýÑ"ÿýÍ"ÿýɈ$nŽ &Xˆ$MŽ&7ˆ$,Ž(![44556"ÿý`"ÿý\"ÿýX"ÿýT"ÿýP"ÿýLˆ$nŽ &Xˆ$MŽ&7ˆ$,Ž(![44556"ÿüã"ÿüß"ÿüÛ"ÿü×"ÿüÓ"ÿüψ$ñŽ&Ûˆ$ÐŽˆ$»Žˆ$¦Ž   ˆ$‘ Ž(†  [4455& &" 4 [ 5"< &4![5"# ‘$ 4"5"4#[ 5 6"ÿûç"ÿûã"ÿûß"ÿûÛ"ÿû×"ÿûÓ"ÿûψ$dŽ$&Nˆ$CŽˆ$.Ž(#%[44&556"ÿûl"ÿûh"ÿûd"ÿû`"ÿû\/gport ±gloc ±grest  ±gw  : ‹gx  : ‹gw  © Ägw  Ù gx  Ù gw  ö gw  $ ^gx  $ ^gw  A Rgw  o ×gx  o ×gw  ˆ Ïgx  ˆ Ïgw  ¥ Ãgw  è Pgx  è Pgw   Hgx   Hgw   <gw  a Égx  a Égw  z Ágx  z Ágw  — µgw  Ú Bgx  Ú Bgw  ó :gx  ó :gw   .gw  S >gx  S >gw  l 6gx  l 6gw  } 2gx  } 2gw Ž .gx Ž .gw £ &gw  O ­gx  O ­gw  h ¥gx  h ¥gw  } .gfilenamefsystem/base/message.scmŒ ŒŒ ¥ ŒŒ P Ì ŒŒ W ¥ ŒŒ o È ŒŒ „ Ì ŒŒ ˜ ¥ ŒŒ ¹ Ä ŒŒ Ä ¥ ŒŒ þ À ŒŒ  ¥ ŒŒ I ¼ ŒŒ V ¥ ŒŒ ­ ¹ ŒŒ ³ ’ ŒŒ ¶ “ ŒŒ » — %ŒŒ ¿ “ ŒŒ Á ’ ŒŒ à ¹ ŒŒ Ç ¥ ŒŒ & ¶ ŒŒ , ’ ŒŒ / “ ŒŒ 4 — %ŒŒ 8 “ ŒŒ : ’ ŒŒ < ¶ ŒŒ @ ¥ ŒŒ Ÿ ³ ŒŒ ¥ ’ ŒŒ ¨ “ ŒŒ ­ — %ŒŒ ± “ ŒŒ ³ ’ ŒŒ µ ³ ŒŒ ¹ ¥ ŒŒ  ° ŒŒ  ’ ŒŒ ! “ ŒŒ & — %ŒŒ * “ ŒŒ , ’ ŒŒ . ° ŒŒ 2 ¥ ŒŒ « « ŒŒ ± ’ ŒŒ ´ “ ŒŒ ¹ — %ŒŒ ½ “ ŒŒ ¿ ’ ŒŒ à › !ŒŒ Ç › ŒŒ Ë œ %ŒŒ Ï œ ŒŒ Ñ ŒŒ Ö ž ŒŒ ê Ÿ !ŒŒ î › ŒŒ ï   ŒŒ  ¡ ŒŒ  › ŒŒ  ¡ $ŒŒ  £ ŒŒ & « ŒŒ * ¥ ŒŒ … § ŒŒ ‹ ’ ŒŒ Ž “ ŒŒ “ — %ŒŒ — “ ŒŒ ™ ’ ŒŒ  § ŒŒ ¡ ¥ ŒŒK ±  C5"Rî4Sh n]L§& ©" 45‚Cfgwt  gfilenamefsystem/base/message.scmŒ Ð ŒŒ  Ñ ŒŒ  Ñ ŒŒ  C"hÎ]O6Ægname  gfilenamefsystem/base/message.scmŒ Î ŒŒ  Ð ŒŒ   gnameglookup-warning-typeŒg documentationf2Return the warning type NAME or `#f' if not found.ŒC!R!1'ï/4h`³-134545"456¦$§& ©45@"ÿÿÇ"ÿÿëgtype Zglocation Zgargs  Zgwt   Zgport   Zgfilenamefsystem/base/message.scmŒ Ô ŒŒ × ŒŒ  Ø ŒŒ  × ŒŒ # Ý ŒŒ $ Þ ŒŒ 0 Ý ŒŒ 0 Ù ŒŒ 3 Ù ŒŒ 7 Ù ŒŒ : Ù ŒŒ E Ú ŒŒ H Û ŒŒ R Ú ŒŒ Z  gnamegwarningŒg documentationfjEmit a warning of type TYPE for source location LOCATION (a source property alist) using the data in ARGS.ŒCRCÞgm  ,grtd  µgfilenamefsystem/base/message.scmŒ   ŒŒ ¨ + ŒŒ © > ŒŒ ¶ : ŒŒ · B ŒŒ ½ B ŒŒ ¿ B ŒŒ  @ ŒŒ ž E ŒŒ Ì N ŒŒ P ] ŒŒ /ß N ŒŒ /â L ŒŒ 1 Î ŒŒ 3¶ Ô ŒŒ  3¸ C6PK!;ñm¤¤base/language.gonu„[µü¤GOOF----LE-8-2.0Œ]l4h$] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gbase¤ glanguage¤ ¤ gfilenameS¤ fsystem/base/language.scm¤ gimportsS¤ gsyntax¤  ¤ ¤ ¤ gexportsS¤ gdefine-language¤ g language?¤ glookup-language¤ g make-language¤ g language-name¤ glanguage-title¤ glanguage-reader¤ glanguage-printer¤ glanguage-parser¤ glanguage-compilers¤ glanguage-decompilers¤ glanguage-evaluator¤ glanguage-joiner¤ glanguage-for-humans?¤ g!language-make-default-environment¤ !glookup-compilation-order¤ "glookup-decompilation-order¤ #ginvalidate-compilation-cache!¤ $gdefault-environment¤ %g*current-language*¤ & !"#$%¤ 'g re-exportsS¤ (gcurrent-language¤ )(¤ *gset-current-module¤ +*¤ ,*¤ -gmake-record-type¤ .f ¤ /gname¤ 0gtitle¤ 1greader¤ 2gprinter¤ 3gparser¤ 4g compilers¤ 5g decompilers¤ 6g evaluator¤ 7gjoiner¤ 8g for-humans?¤ 9gmake-default-environment¤ :/0123456789 ¤ ;g ¤ g%compute-initargs¤ ?grecord-predicate¤ @gmake-procedure-with-setter¤ Agrecord-accessor¤ Bgrecord-modifier¤ Cgmake-syntax-transformer¤ DC¤ EC¤ Fgmacro¤ Gg $sc-dispatch¤ HG¤ IG¤ Jg_¤ Kgany¤ LJKŒ¤ Mg syntax->datum¤ NM¤ OM¤ Pg datum->syntax¤ QP¤ RP¤ Sgbegin¤ T#¤ Ugdefine¤ VgnameS¤ Wgquote¤ Xgsyntax-violation¤ YX¤ ZX¤ [f-source expression failed to match any pattern¤ \gresolve-module¤ ]gspec¤ ^]¤ _g module-bound?¤ `g module-ref¤ agerror¤ bfno such language¤ cg*compilation-cache*¤ dg*decompilation-cache*¤ egreverse!¤ fgmemq¤ ggor-map¤ hgcompute-translation-order¤ ig assoc-ref¤ jgand=>¤ kgparameter-fluid¤C5hÈ ]4    &')5 4,>"G4-i.:5;R/0123Œ456Œ7Œ8Œ9h.-13L4L5@&gargs   COR4?i;i5R4@i4Ai;i/54Bi;i/55R4@i4Ai;i054Bi;i055R4@i4Ai;i154Bi;i155R4@i4Ai;i254Bi;i255R4@i4Ai;i354Bi;i355R4@i4Ai;i454Bi;i455R4@i4Ai;i554Bi;i555R4@i4Ai;i654Bi;i655R4@i4Ai;i754Bi;i755R4@i4Ai;i854Bi;i855R4@i4Ai;i954Bi;i955 R4EFILORSTUVWh(x-13ŒŒŒCpgname (gspec (gfilenamefsystem/base/language.scmŒ 7 ŒŒ 8 ŒŒ ( Chl] 45L4?6dgargs  gv gfilenamefsystem/base/language.scmŒ  7 ŒŒ   CZ[h(j] 45$ O@6bgy  'gtmp 'gfilenamefsystem/base/language.scmŒ 7 ŒŒ  ' C5R\^_`abh0Ï] 4ŒŒ545$66Çgname  .gm  .gfilenamefsystem/base/language.scmŒ < ŒŒ  = ŒŒ  = ŒŒ  = ŒŒ  = ŒŒ  > ŒŒ  > ŒŒ & ? ŒŒ * @ ŒŒ . @ ŒŒ  . gnameglookup-languageŒCRcRdRdch”]  CŒgfilenamefsystem/base/language.scmŒ E ŒŒ  F ŒŒ  F ŒŒ  G ŒŒ  G ŒŒ  gnameginvalidate-compilation-cache!ŒC#Refgh~]LLŽŒLŒ6vgpair  gfilenamefsystem/base/language.scmŒ T ŒŒ  U ŒŒ U 2ŒŒ U &ŒŒ  U ŒŒ   ChXÇ]45$3L&645$CLO4L5645"ÿÿ±¿gfrom  Qgseen  Qgfilenamefsystem/base/language.scmŒ N ŒŒ  P ŒŒ O ŒŒ  R ŒŒ  S ŒŒ ( O ŒŒ 8 V ŒŒ @ T ŒŒ A Q ŒŒ Q Q ŒŒ  Q gnameglpŒChh8ý] 45$OQ6456õgfrom  6gto  6glanguage-translators   6glp   'gfilenamefsystem/base/language.scmŒ I ŒŒ  K ŒŒ J ŒŒ  N ŒŒ % N ŒŒ ' N ŒŒ , L $ŒŒ 6 L ŒŒ  6 gnamegcompute-translation-orderŒChRichh8]Œ45$C45ŒŒ Cýgfrom  7gto  7gkey   7gt   7gorder  ( 7gfilenamefsystem/base/language.scmŒ X ŒŒ  Y ŒŒ  Y ŒŒ Z ŒŒ  Z ŒŒ  [ ŒŒ ( [ ŒŒ / ] ŒŒ 4 \ ŒŒ  7 gnameglookup-compilation-orderŒC!Ridjheh@]Œ45$C4455ŒŒ Cgfrom  >gto  >gkey   >gt   >gorder  / >gfilenamefsystem/base/language.scmŒ ` ŒŒ  a ŒŒ  a ŒŒ b ŒŒ  b ŒŒ  d ŒŒ ! e ŒŒ / d ŒŒ / d ŒŒ 6 g &ŒŒ ; g ŒŒ  > gnameglookup-decompilation-orderŒC"R h(]445$"4556ÿglang  !gfilenamefsystem/base/language.scmŒ j ŒŒ  l ŒŒ  m ŒŒ  m ŒŒ  m ŒŒ  l ŒŒ ! l ŒŒ  ! gnamegdefault-environmentŒg documentationfDReturn the default compilation environment for source language LANG.ŒC$R4ki(i5%RCgm  0gslots u Ûg constructor u Ûgfilenamefsystem/base/language.scmŒ   ŒŒ > * ŒŒ O 0 ŒŒ T 1 ŒŒ Þ * ŒŒ ª < ŒŒ « B ŒŒ ® B ŒŒ ¯ C ŒŒ ² C ŒŒ o E ŒŒ ˜ I ŒŒ ð X ŒŒ j ` ŒŒ ² j ŒŒ ³ v ŒŒ À v ŒŒ   C6PK!‹»3œLœLbase/syntax.gonu„[µü¤GOOF----LE-8-2.0„L] 4hì] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gbase¤ gsyntax¤ ¤ gfilenameS¤ fsystem/base/syntax.scm¤ gexportsS¤ g%compute-initargs¤ g define-type¤ g define-record¤ gdefine-record/keywords¤ g record-case¤ gtransform-record¤  ¤ gset-current-module¤ ¤ ¤ gstring->symbol¤ gstring-trim-both¤ gsymbol->string¤ gsymbol-trim-both¤ glist->char-set¤ <>¤ g trim-brackets¤ gmake-syntax-transformer¤ ¤ ¤ !gmacro¤ "g $sc-dispatch¤ #"¤ $"¤ %g_¤ &gany¤ '%&Œ¤ (g syntax->datum¤ )(¤ *(¤ +g datum->syntax¤ ,+¤ -+¤ .g kw-arg-ref¤ /gprinterS¤ 0g common-slotsS¤ 1gbegin¤ 2gappend¤ 32¤ 42¤ 5gmap¤ 6gdefine¤ 7g symbol-append¤ 8g-¤ 9gmake-procedure-with-setter¤ :glambda¤ ;gx¤ <;¤ =g struct-ref¤ >gv¤ ?;>¤ @g struct-set!¤ A>¤ Bgiota¤ Cglength¤ Dgsyntax-violation¤ ED¤ FD¤ Gf-source expression failed to match any pattern¤ Hgmake-record-type¤ Igquote¤ Jg list-tail¤ Kg module-gensym¤ Lfdefrec¤ Mgmake-¤ Nglet¤ Ogcond¤ Pgnull?¤ Qgelse¤ Rg_x¤ Sgcar¤ Tgset!¤ Ugcdr¤ VR¤ Wg make-struct¤ Xg?¤ Ygrecord-predicate¤ Zgrecord-accessor¤ [grecord-modifier¤ \gslots¤ ]glist¤ ^gcons¤ _g constructor¤ `grecord-constructor¤ agargs¤ bgapply¤ c a\¤ db_c¤ e:ad¤ fe¤ ggassq¤ hgerror¤ if unbound slot¤ jgkeyword?¤ kgkeyword->symbol¤ lgmemq¤ mgfilter¤ ngpair?¤ of unknown slot¤ pfslot already set¤ qftoo many initargs¤ rgeach-any¤ s&rŒ¤ t%sŒ¤ ug syntax-object¤ vgr¤ wgtop¤ xw¤ ygribcage¤ zgrecord¤ {gclause¤ |z{¤ }xx¤ ~fl-3d2ad63ef-21d¤ fl-3d2ad63ef-21e¤ €~¤ y|}€¤ ‚y¤ ƒ;¤ „x¤ …fl-3d2ad63ef-21a¤ †…¤ ‡yƒ„†¤ ˆx‚‡¤ ‰ghygiene¤ Љ¤ ‹uvˆŠ¤ Œgrtd¤ uŒˆŠ¤ Žgreverse!¤ glp¤ gclauses¤ ‘gout¤ ’‘¤ “xxx¤ ”fl-3d2ad63ef-265¤ •fl-3d2ad63ef-266¤ –fl-3d2ad63ef-267¤ —”•–¤ ˜y’“—¤ ™gprocess-clause¤ 𙤠›x¤ œfl-3d2ad63ef-225¤ œ¤ žy𛤠ŸvŒ¤  fl-3d2ad63ef-221¤ ¡fl-3d2ad63ef-222¤ ¢ ¡¤ £yŸ}¢¤ ¤x‚˜žž£‚‡ ¤ ¥uQ¤Š¤ ¦uh¤Š¤ §funhandled record¤ ¨u§¤Š¤ ©uv¤Š¤ ª¦¨©¤ «¥ª¤ ¬gfree-id¤ ­¬¥¤ ®­sŒ¤ ¯®¤ °ge0¤ ±ge1¤ ²°±¤ ³fl-3d2ad63ef-26f¤ ´fl-3d2ad63ef-270¤ µ³´¤ ¶y²}µ¤ ·x¶‚˜žž£‚‡ ¤ ¸uQ·Š¤ ¹®&Œ¤ ºfbad else clause placement¤ »grest¤ ¼°±»¤ ½fl-3d2ad63ef-275¤ ¾fl-3d2ad63ef-276¤ ¿fl-3d2ad63ef-277¤ À½¾¿¤ Áy¼“À¤ ÂxÁ‚˜žž£‚‡ ¤ Ãu;Ф ÄuQФ ÅsrŒ¤ ÆÅ&Œ¤ Ç&&¤ ÈÇrŒ¤ Éginfix¤ Êɤ Ëfl-3d2ad63ef-22e¤ Ìˤ Íyʄ̤ Îgtag¤ Ïgfields¤ Ðgexprs¤ ÑÎÏФ Òfl-3d2ad63ef-22b¤ Ófl-3d2ad63ef-22c¤ Ôfl-3d2ad63ef-22d¤ ÕÒÓÔ¤ Öyѓդ ×x‚‚͂֞£‚‡ ¤ Øu׊¤ ÙØ¤ Úgeach¤ Û&&Œ¤ ÜÚÛ¤ Ý&Üs¤ Þgeq?¤ ßgf¤ àgaccessor¤ áÎßà°±¤ âxxxxx¤ ãfl-3d2ad63ef-233¤ äfl-3d2ad63ef-234¤ åfl-3d2ad63ef-235¤ æfl-3d2ad63ef-236¤ çfl-3d2ad63ef-237¤ èãäåæç¤ éyáâè¤ êx‚邂͂֞£‚‡ ¤ ëuÞꊤ ìuŒêФ íuNꊤ î5¤ ï5¤ ðuvꊤ ñð¤ ò&&r¤ óglet*¤ ôg processed¤ õvŒô¤ öfl-3d2ad63ef-25e¤ ÷fl-3d2ad63ef-25f¤ øfl-3d2ad63ef-260¤ ùö÷ø¤ úyõ“ù¤ ûx‚úžž£‚‡ ¤ üuóûФ ýg struct-vtable¤ þuýûФ ÿuOûФ frec¤ frtd¤ g->¤ gunquote¤ f bad -> form¤ g<¤ g>¤ gand¤ greverse¤  gif¤   ¤   ¤C5hð9r]4    54>"Gh©]44556¡gsym  gpred  gfilenamefsystem/base/syntax.scmŒ  ŒŒ   ŒŒ   $ŒŒ   ŒŒ   ŒŒ   gnamegsymbol-trim-bothŒCRh”]456Œgsym  gfilenamefsystem/base/syntax.scmŒ  ŒŒ   ŒŒ  (ŒŒ  ŒŒ   ŒŒ   gnameg trim-bracketsŒCR4 !$'*-./01454h(›]L$ L"4LŽ5ŒŒC“gdef  &gfilenamefsystem/base/syntax.scmŒ ( ŒŒ  ) ŒŒ ) (ŒŒ * /ŒŒ  * ,ŒŒ  + ,ŒŒ  ) ŒŒ ! - ŒŒ # ) ŒŒ  & C6789:<=;?@A h@¢]44L55     ŒŒŒCšg common-slot  ?gi  ?gfilenamefsystem/base/syntax.scmŒ / ŒŒ  0 ŒŒ  0 !ŒŒ  0 0ŒŒ  1 0ŒŒ  0 !ŒŒ  0 ŒŒ  ? CBC hˆ‚-13ˆ$"ˆ$Ž"4545$"44O54O4 4 5555ŒCzgname ‡grest ‡gname  ( ‡gopts  ( ‡gt  > Pgprinter  P ‡g common-slots  P ‡gfilenamefsystem/base/syntax.scmŒ # ŒŒ $ ŒŒ  $ ŒŒ  $ ŒŒ  % ŒŒ % ŒŒ # % ŒŒ ( % *ŒŒ ( $ ŒŒ - & ŒŒ 6 ' ŒŒ > ' ŒŒ M ' =ŒŒ P & ŒŒ V ( ŒŒ Z ( ŒŒ j / ŒŒ v 5 "ŒŒ y 5 (ŒŒ 5 "ŒŒ ƒ / ŒŒ … ( ŒŒ ‡ Chj] 45L4?6bgargs  gv gfilenamefsystem/base/syntax.scmŒ  # ŒŒ   CFGh(h] 45$ O@6`gy  'gtmp 'gfilenamefsystem/base/syntax.scmŒ # ŒŒ  ' C5R4 !$'*-5ht]ˆ$CClgslot  gfilenamefsystem/base/syntax.scmŒ ? ŒŒ  ? -ŒŒ ? )ŒŒ ? :ŒŒ   C16HIh(Ì]("Š€$C4LŽ5ŒCÄgslots  %gfilenamefsystem/base/syntax.scmŒ E ŒŒ  F ŒŒ F ŒŒ  F ;ŒŒ  F 2ŒŒ  F -ŒŒ  F ŒŒ  G ŒŒ  H !ŒŒ  H -ŒŒ ! H 1ŒŒ # H -ŒŒ $ H ŒŒ  % gnameglpŒCJCKL7M4NOPQNRSTUV hHy]LŽLLL ŒŒŒCqgo  Egfilenamefsystem/base/syntax.scmŒ L ŒŒ  M ŒŒ  M ŒŒ  M ;ŒŒ  M ŒŒ  E CWXY6789ZI[h8…]4L5LLC}gsname  4gfilenamefsystem/base/syntax.scmŒ T ŒŒ  U ŒŒ  U ŒŒ U .ŒŒ  U ŒŒ  U ŒŒ  4 Chˆ-13 ˆ$"ˆ$Ž"454545$ "ŒŒŒ OQ454 4 554  54545Œ4O5 ŒŒŒ454O5ŒŒŒŒC€g name-form gslots gname   gprinter  + g slot-names  6 gstem  ? glp  u „greqs  „ Ýgopts  ” Úgtail  × gfilenamefsystem/base/syntax.scmŒ < ŒŒ = ŒŒ  = ŒŒ  = %ŒŒ  = ŒŒ  > ŒŒ " > ŒŒ % > )ŒŒ + = ŒŒ . ? ŒŒ 6 = ŒŒ 9 A ŒŒ ? = ŒŒ C B ŒŒ J C (ŒŒ R B ŒŒ ] D )ŒŒ b D 5ŒŒ g D DŒŒ h B ŒŒ u E ŒŒ „ E ŒŒ ‡ I ŒŒ Œ I &ŒŒ ” I ŒŒ ” E ŒŒ — J ŒŒ › J $ŒŒ J ŒŒ E ŒŒ ¡ K ŒŒ ¢ K ŒŒ ¦ K $ŒŒ ª K ŒŒ « K ŒŒ · L ŒŒ Æ K ŒŒ ß B ŒŒ à S ŒŒ æ S $ŒŒ è S ŒŒ ê B ŒŒ ó T ŒŒ  B ŒŒ-  Chj] 45L4?6bgargs  gv gfilenamefsystem/base/syntax.scmŒ  < ŒŒ   CFGh(h] 45$ O@6`gy  'gtmp 'gfilenamefsystem/base/syntax.scmŒ < ŒŒ  ' C5R4 !$'*-5ht]ˆ$CClgslot  gfilenamefsystem/base/syntax.scmŒ ` ŒŒ  ` -ŒŒ ` )ŒŒ ` :ŒŒ   C16HI7MN\]^Ih(œ]ˆ$ŽCC”gslot  #gfilenamefsystem/base/syntax.scmŒ g #ŒŒ  h )ŒŒ h %ŒŒ i )ŒŒ  i 2ŒŒ  i )ŒŒ  i >ŒŒ  i )ŒŒ  j )ŒŒ  # C_`fXY6789ZI[h8…]4L5LLC}gsname  4gfilenamefsystem/base/syntax.scmŒ p ŒŒ  q ŒŒ  q ŒŒ q .ŒŒ  q ŒŒ  q ŒŒ  4 ChÐË-13ˆ$"ˆ$Ž"454545$ "ŒŒŒ4  5   45ŒŒŒ4 54O5ŒŒŒŒCÃg name-form Ëgslots Ëgname   Ëgprinter  + Ëg slot-names  6 Ëgstem  ? Ëgfilenamefsystem/base/syntax.scmŒ ] ŒŒ ^ ŒŒ  ^ ŒŒ  ^ %ŒŒ  ^ ŒŒ  _ ŒŒ " _ ŒŒ % _ )ŒŒ + ^ ŒŒ . ` ŒŒ 6 ^ ŒŒ 9 b ŒŒ ? ^ ŒŒ C c ŒŒ J d (ŒŒ R c ŒŒ ] e )ŒŒ b e 5ŒŒ g e DŒŒ h c ŒŒ p f ŒŒ t f ŒŒ x f ŒŒ z c ŒŒ  g ŒŒ ˆ c ŒŒ ¤ o ŒŒ ª o $ŒŒ ¬ o ŒŒ ® c ŒŒ · p ŒŒ Ç c ŒŒ! Ë Chj] 45L4?6bgargs  gv gfilenamefsystem/base/syntax.scmŒ  ] ŒŒ   CFGh(h] 45$ O@6`gy  'gtmp 'gfilenamefsystem/base/syntax.scmŒ ] ŒŒ  ' C5R5ghih@Ô]ˆ$"4L5$ŽCˆ$ŽCLL6Ìgslot  @gname  @gt   @gfilenamefsystem/base/syntax.scmŒ y ŒŒ  z ŒŒ z ŒŒ z (ŒŒ  z ŒŒ  { ŒŒ  { ŒŒ , | ŒŒ 0 { ŒŒ 3 | !ŒŒ 8 } ŒŒ @ } ŒŒ  @ Cjklgmnhopq hà”]""Ë(O645$i4545$"4455€$  645$   6ŽŽŽŒŒ"ÿÿt(   6ŽŽˆ$"ŒŒ"ÿÿ5"ÿÿ&Œgargs  àgslots  àgin   Ñg positional   Ñgout   Ñgsym  1 ’gslot  « Çgfilenamefsystem/base/syntax.scmŒ w ŒŒ   ŒŒ € ŒŒ  y ŒŒ  ƒ ŒŒ # ƒ ŒŒ % ƒ ŒŒ ) € ŒŒ * „ ŒŒ / „ "ŒŒ 1 „ ŒŒ 1 „ ŒŒ 4 † ŒŒ @ † ŒŒ F ‡ ŒŒ K ‡ ŒŒ U ‡ ŒŒ V ‡ ŒŒ Z … ŒŒ ^ ˆ ŒŒ b ˆ ŒŒ c ‰ ŒŒ o … ŒŒ s ‰ ŒŒ y ‰ ŒŒ | Š ŒŒ ~ Š ŒŒ ƒ Š ,ŒŒ … Š !ŒŒ ’ Š ŒŒ ˜ € ŒŒ œ Œ ŒŒ ¢ Œ ŒŒ ¥ Ž ŒŒ ¨ Ž ŒŒ « ŒŒ « ŒŒ ° ŒŒ ´ ŒŒ · $ŒŒ À ‘ ŒŒ Á ŒŒ Ñ Ž ŒŒ Ñ  ŒŒ Ö  -ŒŒ à  ŒŒ/  à gnameg%compute-initargsŒC R4 !$t‹$Ž«hT]LŒ6Lgfilenamefsystem/base/syntax.scmŒ Û ŒŒ Û ŒŒ  C¯Ž¸hu]ŒŒLŒ6mge0  ge1  gfilenamefsystem/base/syntax.scmŒ  ß ŒŒ  ß ŒŒ   C¹DºÃÄh]ŒŒ6ˆge0  ge1  grest   gfilenamefsystem/base/syntax.scmŒ  á &ŒŒ  â &ŒŒ  á ŒŒ   CÆ($h]C   CÈ+78(h(Ä]4L4L4555Œ4L5ŒC¼gv0  %gf0  %gf1   %gfilenamefsystem/base/syntax.scmŒ  À (ŒŒ Á 7ŒŒ  Á LŒŒ  Á OŒŒ  Á 7ŒŒ  À (ŒŒ  ¿ !ŒŒ  à (ŒŒ $ ¿ !ŒŒ  % Cs+78(h(´]4L4L4555Œ4L5ŒC¬gf0  %gf1  %gfilenamefsystem/base/syntax.scmŒ  Æ (ŒŒ Ç 7ŒŒ  Ç LŒŒ  Ç OŒŒ  Ç 7ŒŒ  Æ (ŒŒ  Å !ŒŒ  É (ŒŒ $ Å !ŒŒ  % CFG hh ]45$@45$LLLO@45$LLLO@6˜gfields  agtmp agtmp  ! agtmp  A agfilenamefsystem/base/syntax.scmŒ » ŒŒ  a gnameglpŒC$Ùh]C   Csh:]ŒC2ge0  ge1     CFGÝëìíïñhX]ŒCPgtmp-3d2ad63ef-23e  gtmp-3d2ad63ef-23d    Ch(p]45ŒŒŒChgtag  #gf  #gaccessor   #ge0   #ge1   #  # C h¸B]L4455OLQ4545$ 4?")45$ 4?" 4 54 5$ 4 ?" 4 5LŒ6:g  ³gf0  ³ge0   ³grest   ³ginfix   ®glp  3gtmp  ; zgtmp  W wgtmp  } «gtmp  ˆ ¨ gfilenamefsystem/base/syntax.scmŒ  ¸ ŒŒ ¸ 'ŒŒ  ¸ ŒŒ  ¸ ŒŒ » ŒŒ } ¹ ŒŒ ± ç ŒŒ ³ æ ŒŒ  ³ CFG h€Ä]"45$ O@45$ O@45$@45$LLO@  6¼gclauses  ygout  ygtmp  ygtmp  & ygtmp  B ygtmp  Y ygfilenamefsystem/base/syntax.scmŒ × ŒŒ  y gnameglpŒC$òüþÿh(Q]LŒCIgr  #grtd  #g processed   #  # CFG hPÁ]OLQ4545$ O@6¹grecord  Kgclause  Kglp   !gtmp  $ Kgtmp  / Kgfilenamefsystem/base/syntax.scmŒ  × ŒŒ  Ø ŒŒ  × ŒŒ $ Ó ŒŒ  K CFGh(j] 45$ O@6bgx  'gtmp 'gfilenamefsystem/base/syntax.scmŒ ² ŒŒ  ' C5R4 !$'*-K278ÞIhÀœ]#"¯(Cˆ$‘ŽŠ$ Ž"ÿÿΈ$6Ž44L44L55Ž55"ÿÿ‘Ž44L55Œ"ÿÿ^Ž"ÿÿQ"ÿÿF”gx  Àg record-stem  Àgslots   Àgin   µgout   µgslot  ¨garg  ¨gfilenamefsystem/base/syntax.scmŒ ú ŒŒ  ý ŒŒ þ ŒŒ  ÿ ŒŒ  ÿ ŒŒ  þ ŒŒ   ŒŒ   ŒŒ  ŒŒ '  ŒŒ +  ŒŒ .  ŒŒ 8  ŒŒ ;  ŒŒ ?  ŒŒ B  ŒŒ C  ŒŒ F  $ŒŒ I ü ŒŒ L ù ŒŒ R ù ŒŒ V ù ŒŒ X ü 2ŒŒ \ ü ŒŒ a ü ŒŒ d  8ŒŒ g  8ŒŒ i  $ŒŒ m  ŒŒ u  ŒŒ x  !ŒŒ z  0ŒŒ { ü ŒŒ ~ ù ŒŒ „ ù ŒŒ ˆ ù ŒŒ Š ü 2ŒŒ Ž ü ŒŒ “ ü ŒŒ •  0ŒŒ    *ŒŒ ¨  ŒŒ «  ŒŒ µ  ŒŒ µ ý ŒŒ ¸ ý ŒŒ À ý ŒŒ0  À gnamegfurther-predicatesŒC782hè]#"Ð(Cˆ$ŠŽŠ$,Ž44L55Œ"ÿÿ¯ˆ$6Ž44L44L55Ž55"ÿÿrŽ"ÿÿeŽ44L55Œ"ÿÿ0"ÿÿ%gx  ág record-stem  ágslots   ágin   Ögout   Ögslot  ¡garg  ¡gslot  ª Ègfilenamefsystem/base/syntax.scmŒ  ŒŒ   ŒŒ  ŒŒ   ŒŒ   ŒŒ   ŒŒ   ŒŒ   ŒŒ  ŒŒ '  ŒŒ +  ŒŒ .  ŒŒ 1  ŒŒ 4 ù ŒŒ : ù ŒŒ > ù ŒŒ @  2ŒŒ D  ŒŒ I  ŒŒ L  "ŒŒ O  ŒŒ W  ŒŒ Z  ŒŒ ^  ŒŒ a  ŒŒ b  ŒŒ e  $ŒŒ h  ŒŒ k ù ŒŒ q ù ŒŒ u ù ŒŒ w  2ŒŒ {  ŒŒ €  ŒŒ ƒ  1ŒŒ †  1ŒŒ ˆ  $ŒŒ Œ  ŒŒ ”  ŒŒ —  ŒŒ ¡  ŒŒ ¤ ! ŒŒ § " ŒŒ ª " .ŒŒ ª " &ŒŒ ­  ŒŒ ° ù ŒŒ ¶ ù ŒŒ º ù ŒŒ ¼  2ŒŒ À  ŒŒ Å  ŒŒ Ë " ŒŒ Î " ŒŒ Ö ! ŒŒ Ö  ŒŒ Ù  ŒŒ á  ŒŒ;  á gnameg let-clausesŒCC7M845h ™]ˆ$&LŽ6CC‘gy  gfilenamefsystem/base/syntax.scmŒ * ŒŒ  + 'ŒŒ + ŒŒ + 6ŒŒ  + >ŒŒ  + "ŒŒ  , 2ŒŒ  , "ŒŒ  Ch hx¬]ˆ$g&O45 ‘$9Ž44L554LŽ4LOŽ55ŒC  64LŽ5ŒCC¤gx  sgform $ Ygs  . >gfilenamefsystem/base/syntax.scmŒ # ŒŒ  $ ŒŒ $ ŒŒ % ŒŒ  % ŒŒ  $ ŒŒ  & ŒŒ  & ŒŒ & ŒŒ # ' ŒŒ $ ' ŒŒ ' ( ŒŒ + ( %ŒŒ . ( 7ŒŒ . ( ,ŒŒ 1 ù ŒŒ 7 ù ŒŒ ; ù ŒŒ @ ( ŒŒ A ( ŒŒ F ) ŒŒ G * ŒŒ S . ŒŒ U * ŒŒ W ( ŒŒ ] / ŒŒ a / ŒŒ d 0 ŒŒ e 0 ŒŒ l 0 4ŒŒ n 0 ŒŒ o 0 ŒŒ!  s gnamegtransform-exprŒCQ78ÞN5  h€Ë]!&CŽŽ44L55L44LL55ŒŒ 44LL55ˆ$ 4 L5" ŒŒCÃgclause  €gstem  €gslots   €gbody   €g record-type  3 €gfilenamefsystem/base/syntax.scmŒ 1 ŒŒ  2 ŒŒ  2 ŒŒ 2 ŒŒ  4 ŒŒ  5 ŒŒ  6 ŒŒ  4 ŒŒ 7 ŒŒ $ 7 .ŒŒ % ù ŒŒ + ù ŒŒ / ù ŒŒ 1 7 BŒŒ 3 7 ŒŒ 3 7 ŒŒ 7 8 ŒŒ A 9 ŒŒ D 9 ŒŒ P 9 ŒŒ Q 8 ŒŒ U : ŒŒ X : ŒŒ d : ŒŒ g ; ŒŒ k ; ŒŒ l < ŒŒ z = ŒŒ { 8 ŒŒ  € gnamegprocess-clauseŒCóý578h]4L5LCygslot  gfilenamefsystem/base/syntax.scmŒ @ ŒŒ  ù ŒŒ ù ŒŒ  ù ŒŒ  A ŒŒ   COgQ2h§hàL-13 454545OOOO QQQQ   4  OŽ5ŒŒ 4  5 4 5$ "4 5 ŒCDgtype-and-common Ügrecord Ügclauses  Ügr   Ügrtd   Üg type-stem   Ügfurther-predicates  N Üg let-clauses  N Ügtransform-expr  N Ügprocess-clause N Ügclauses § × gfilenamefsystem/base/syntax.scmŒ ô ŒŒ õ ŒŒ  õ ŒŒ  õ ŒŒ  ö ŒŒ  ö ŒŒ  ö ŒŒ  ÷ ŒŒ  ÷ "ŒŒ  ÷ ŒŒ  õ ŒŒ v > ŒŒ Š @ ŒŒ ˜ B ŒŒ š @ ŒŒ › > ŒŒ Ÿ C ŒŒ § C ŒŒ ª D ŒŒ ® D ŒŒ ² D ŒŒ ¶ D ŒŒ ½ F ŒŒ à F %ŒŒ Ô F ŒŒ Ø > ŒŒ Ü  Chk] 45L4?6cgargs  gv gfilenamefsystem/base/syntax.scmŒ  ô ŒŒ   CFGh(i] 45$ O@6agy  'gtmp 'gfilenamefsystem/base/syntax.scmŒ ô ŒŒ  ' C5RCjgm  (gfilenamefsystem/base/syntax.scmŒ   ŒŒ   ŒŒ ¿  ŒŒ · w ŒŒ  9ð C6PK!ôyýˆ»ˆ» base/lalr.gonu„[µü¤GOOF----LE-8-2.0p»]b4h•g] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gbase¤ glalr¤ ¤ gfilenameS¤ fsystem/base/lalr.scm¤ gimportsS¤ gsrfi¤ gsrfi-9¤  ¤ ¤ ¤ gexportsS¤ g lalr-parser¤ g print-states¤ gmake-lexical-token¤ glexical-token?¤ glexical-token-category¤ glexical-token-source¤ glexical-token-value¤ gmake-source-location¤ gsource-location?¤ gsource-location-input¤ gsource-location-line¤ gsource-location-column¤ gsource-location-offset¤ gsource-location-length¤ !g"source-location->source-properties¤ "g lr-driver¤ #g glr-driver¤ $ !"#¤ %gset-current-module¤ &%¤ '%¤ (f2.5.0¤ )g*lalr-scm-version*¤ *gprocess-use-modules¤ +*¤ ,*¤ -gice-9¤ .g pretty-print¤ /-.¤ 0/¤ 1gpprint¤ 2gsymbol?¤ 3g lalr-keyword?¤ 4gmake-syntax-transformer¤ 54¤ 64¤ 7g BITS-PER-WORD¤ 8gmacro¤ 9g $sc-dispatch¤ :9¤ ;9¤ <=Œ¤ ?g syntax->datum¤ @?¤ A?¤ Bg datum->syntax¤ CB¤ DB¤ Egsyntax-violation¤ FE¤ GE¤ Hf-source expression failed to match any pattern¤ Ig logical-or¤ Jglogior¤ Kg lalr-error¤ Lgerror¤ Mgsupports-source-properties?¤ Ngsource-property¤ Ogloc¤ Pg lexical-token¤ Qgset-source-property!¤ Rgthrow-bad-struct¤ SR¤ TR¤ Ugnote-source-location¤ Vg%make-lexical-token-procedure¤ W<===¤ Xg syntax-object¤ Yglambda¤ Zgm-1e9d51c93-35¤ [gtop¤ \Z[¤ ]gribcage¤ ^gt-1e9d51c93-32¤ _gt-1e9d51c93-33¤ `gt-1e9d51c93-34¤ a^_`¤ b\\\¤ cfl-1e9d51c93-3a¤ dfl-1e9d51c93-3b¤ efl-1e9d51c93-3c¤ fcde¤ g]abf¤ h]¤ igx¤ ji¤ k\¤ lfl-1e9d51c93-37¤ ml¤ n]jkm¤ ogshift¤ pg proc-name¤ qgargs¤ rpq¤ s[¤ tss¤ ufl-1e8ba8b5a-60¤ vfl-1e8ba8b5a-61¤ wuv¤ x]rtw¤ ygkey¤ zgvalue¤ {gname¤ |gformals¤ }gbody¤ ~yz{|}¤ sssss¤ €fl-1e8ba8b5a-53¤ fl-1e8ba8b5a-54¤ ‚fl-1e8ba8b5a-55¤ ƒfl-1e8ba8b5a-56¤ „fl-1e8ba8b5a-57¤ …€‚ƒ„¤ †]~…¤ ‡gmake-procedure-name¤ ˆ‡¤ ‰s¤ Šfl-1e8ba8b5a-43¤ ‹Š¤ Œ]ˆ‰‹¤ s¤ Žfl-1e8ba8b5a-42¤ ޤ ]j¤ ‘\ghnohhhhx†Œ ¤ ’ghygiene¤ “’ ¤ ”XY‘“¤ •gcategory¤ –sghn¤ —’¤ ˜X•–—¤ ™gsource¤ šX™–—¤ ›Xz–—¤ œ˜š›¤ g make-struct¤ žgm-1e9d51c93-30¤ Ÿž[¤  gt-1e8ba8b5a-133¤ ¡gt-1e8ba8b5a-132¤ ¢gt-1e8ba8b5a-131¤ £ ¡¢¤ ¤gm-1e8ba8b5a-134¤ ¥¤[¤ ¦¥¥¥¤ §fl-1e8ba8b5a-138¤ ¨fl-1e8ba8b5a-139¤ ©fl-1e8ba8b5a-13a¤ ª§¨©¤ «]£¦ª¤ ¬g ctor-args¤ ­¬¤ ®fl-1e8ba8b5a-120¤ ¯®¤ °]­¯¤ ±gctor¤ ²gfield¤ ³±²¤ ´fl-1e8ba8b5a-11c¤ µfl-1e8ba8b5a-11d¤ ¶´µ¤ ·]³t¶¤ ¸gform¤ ¹g type-name¤ ºgconstructor-spec¤ »g field-names¤ ¼¸¹º»¤ ½ssss¤ ¾fl-1e8ba8b5a-111¤ ¿fl-1e8ba8b5a-112¤ Àfl-1e8ba8b5a-113¤ Áfl-1e8ba8b5a-114¤ ¾¿ÀÁ¤ Ã]¼½Â¤ Äg record-layout¤ Ågfunctional-setters¤ Ægsetters¤ Çgcopier¤ Èggetters¤ Ég constructor¤ Êggetter-identifiers¤ Ëgfield-identifiers¤ ÌÄÅÆÇÈÉÊˤ Íssssssss¤ Îfl-1e8ba8b5a-e9¤ Ïfl-1e8ba8b5a-e7¤ Ðfl-1e8ba8b5a-e5¤ Ñfl-1e8ba8b5a-e3¤ Òfl-1e8ba8b5a-e1¤ Ófl-1e8ba8b5a-df¤ Ôfl-1e8ba8b5a-dd¤ Õfl-1e8ba8b5a-db¤ ÖÎÏÐÑÒÓÔÕ¤ ×]ÌÍÖ¤ Øfl-1e8ba8b5a-da¤ ÙØ¤ Ú]jÙ¤ ÛŸghnoh«hhh°·hÃ×Ú¤ ÜXÛ“¤ ÝXP–—¤ ÞX Û“¤ ßÜÝÞ˜š›¤ à”œß¤ ágeach-any¤ â<ጤ ãE¤ äE¤ åfWrong number of arguments¤ æg identifier?¤ çæ¤ èæ¤ éshn¤ êXVé—¤ ëgrecord-type-vtable¤ ìë¤ íë¤ îgpwpwpw¤ ïgdefault-record-printer¤ ðï¤ ñï¤ ò•™z¤ ógset-struct-vtable-name!¤ ôó¤ õó¤ ögvtable-offset-user¤ ÷ö¤ øö¤ ùg%lexical-token?-procedure¤ ú<=¤ ûgm-1e9d51c93-46¤ üû[¤ ýgt-1e9d51c93-45¤ þý¤ ÿü¤ fl-1e9d51c93-4b¤ ¤ ]þÿ¤ fl-1e9d51c93-48¤ ¤ ]jÿ¤ ühohhhhx†Œ ¤ XY“¤ gobj¤  gt-1e8ba8b5a-224¤  gt-1e8ba8b5a-21e¤  gt-1e8ba8b5a-21f¤  gt-1e8ba8b5a-220¤  gt-1e8ba8b5a-223¤ gt-1e8ba8b5a-222¤ gt-1e8ba8b5a-221¤      ¤ gm-1e8ba8b5a-225¤ [¤ ¤ fl-1e8ba8b5a-229¤ fl-1e8ba8b5a-22a¤ fl-1e8ba8b5a-22b¤ fl-1e8ba8b5a-22c¤ fl-1e8ba8b5a-22d¤ fl-1e8ba8b5a-22e¤ fl-1e8ba8b5a-22f¤ ¤ ]¤ g copier-id¤ ¤ fl-1e8ba8b5a-21c¤  ¤ !] ¤ "g ctor-name¤ #"¤ $fl-1e8ba8b5a-214¤ %$¤ &]#%¤ '»¤ (fl-1e8ba8b5a-212¤ )(¤ *]')¤ +glayout¤ ,+¤ -fl-1e8ba8b5a-210¤ .-¤ /],.¤ 0g immutable?¤ 10¤ 2fl-1e8ba8b5a-20e¤ 32¤ 4]13¤ 5g field-count¤ 65¤ 7fl-1e8ba8b5a-20c¤ 87¤ 9]68¤ :g getter-ids¤ ;:¤ ];=¤ ?g field-ids¤ @?¤ Afl-1e8ba8b5a-206¤ BA¤ C]@B¤ Dgpredicate-name¤ Eg field-spec¤ F0¸¹ºDE¤ Gssssss¤ Hfl-1e8ba8b5a-1f9¤ Ifl-1e8ba8b5a-1fa¤ Jfl-1e8ba8b5a-1fb¤ Kfl-1e8ba8b5a-1fc¤ Lfl-1e8ba8b5a-1fd¤ Mfl-1e8ba8b5a-1fe¤ NHIJKLM¤ O]FGN¤ PŸhohhhhh!h&h*h/h4h9h>hCO×Ú¤ QXP“¤ RQ¤ Sgand¤ TXSP“¤ Ugstruct?¤ VXUP“¤ WVQ¤ Xgeq?¤ YXXP“¤ Zg struct-vtable¤ [XZP“¤ \[Q¤ ]sh¤ ^XP]—¤ _Y\^¤ `TW_¤ aR`¤ bsh¤ cXùb—¤ dg!%lexical-token-category-procedure¤ egfree-id¤ fg %%on-error¤ ggm-1e9d51c93-52¤ hg[¤ ih¤ jfl-1e9d51c93-54¤ kj¤ l]jik¤ mhhlohhhhx†Œ ¤ nXfm“¤ oen¤ po=¤ qg%%type¤ rgt-1e8ba8b5a-14b¤ sgt-1e8ba8b5a-14c¤ tgt-1e8ba8b5a-14d¤ ugt-1e8ba8b5a-14e¤ vgt-1e8ba8b5a-14f¤ wgt-1e8ba8b5a-150¤ xgt-1e8ba8b5a-151¤ yrstuvwx¤ zgm-1e8ba8b5a-152¤ {z[¤ |{{{{{{{¤ }fl-1e8ba8b5a-156¤ ~fl-1e8ba8b5a-157¤ fl-1e8ba8b5a-158¤ €fl-1e8ba8b5a-159¤ fl-1e8ba8b5a-15a¤ ‚fl-1e8ba8b5a-15b¤ ƒfl-1e8ba8b5a-15c¤ „}~€‚ƒ¤ …]y|„¤ †ggetter¤ ‡gindex¤ ˆ†‡¤ ‰fl-1e8ba8b5a-149¤ Šfl-1e8ba8b5a-14a¤ ‹‰Š¤ Œ]ˆt‹¤ ¹:¤ Žsss¤ fl-1e8ba8b5a-144¤ fl-1e8ba8b5a-145¤ ‘fl-1e8ba8b5a-146¤ ’‘¤ “]Ž’¤ ”Ÿhloh…hhhŒh“×Ú¤ •Xq”“¤ –e•¤ —<p–=¤ ˜gck¤ ™gerr¤ šgs¤ ›™š¤ œhh¤ fl-1e9d51c93-57¤ žfl-1e9d51c93-58¤ Ÿž¤  ]›œŸ¤ ¡h hlohhhhx†Œ ¤ ¢X˜¡“¤ £gquote¤ ¤X£¡“¤ ¥s hl¤ ¦XP¥—¤ §¤¦¤ ¨§¤ ©g%%index¤ ªX©”“¤ «eª¤ ¬<p«=¤ ­fl-1e9d51c93-5c¤ ®fl-1e9d51c93-5d¤ ¯­®¤ °]›œ¯¤ ±h°hlohhhhx†Œ ¤ ²X˜±“¤ ³X£±“¤ ´°hl¤ µX ´—¤ ¶³µ¤ ·¶¤ ¸g%%copier¤ ¹X¸”“¤ ºe¹¤ »<pº=¤ ¼fl-1e9d51c93-61¤ ½fl-1e9d51c93-62¤ ¾¼½¤ ¿]›œ¾¤ Àh¿hlohhhhx†Œ ¤ ÁX˜À“¤ ÂX£À“¤ Ãg%%lexical-token-set-fields¤ Äs¿hl¤ ÅXÃÄ—¤ ÆÂŤ ÇÆ¤ Ègt-1e9d51c93-51¤ ÉȤ Êfl-1e9d51c93-66¤ Ëʤ Ì]Éiˤ ÍhÌhlohhhhx†Œ ¤ ÎXYÍ“¤ ÏŸÌhloh…hhhŒh“×Ú¤ ÐXšÏ“¤ ÑФ Ògif¤ ÓXÒÏ“¤ ÔXXÏ“¤ ÕXZÏ“¤ ÖÕФ ×sÌhl¤ ØXP×—¤ ÙÔÖØ¤ Úg struct-ref¤ ÛXÚÏ“¤ ÜÌhl¤ ÝX Ü—¤ ÞÛÐݤ ßXRÏ“¤ àX£Ï“¤ áX×—¤ âàᤠãßÐ⤠äÓÙÞ㤠åÎÑä¤ æshl¤ çXdæ—¤ èg%lexical-token-source-procedure¤ égm-1e9d51c93-6d¤ êé[¤ ëê¤ ìfl-1e9d51c93-6f¤ íì¤ î]jëí¤ ïêhîohhhhx†Œ ¤ ðXf ñeð¤ òñ=¤ óŸhîoh…hhhŒh“×Ú¤ ôXqó“¤ õeô¤ ö<òõ=¤ ÷êê¤ øfl-1e9d51c93-72¤ ùfl-1e9d51c93-73¤ úøù¤ û]›÷ú¤ üêûhîohhhhx†Œ ¤ ýX˜ü“¤ þX£ü“¤ ÿsûhî¤ XPÿ—¤ þ¤ ¤ X©ó“¤ e¤ <ò=¤ fl-1e9d51c93-77¤ fl-1e9d51c93-78¤ ¤  ]›÷¤  ê hîohhhhx†Œ ¤  X˜ “¤  X£ “¤   hî¤ X  —¤  ¤ ¤ X¸ó“¤ e¤ <ò=¤ fl-1e9d51c93-7c¤ fl-1e9d51c93-7d¤ ¤ ]›÷¤ êhîohhhhx†Œ ¤ X˜“¤ X£“¤ shî¤ Xפ ¤ ¤ gt-1e9d51c93-6c¤  ¤ !fl-1e9d51c93-81¤ "!¤ #] ë"¤ $ê#hîohhhhx†Œ ¤ %XY$“¤ &Ÿ#hîoh…hhhŒh“×Ú¤ 'Xš&“¤ ('¤ )XÒ&“¤ *XX&“¤ +XZ&“¤ ,+'¤ -s#hî¤ .XP-—¤ /*,.¤ 0XÚ&“¤ 1#hî¤ 2X 1—¤ 30'2¤ 4XR&“¤ 5X£&“¤ 6X-—¤ 756¤ 84'7¤ 9)/38¤ :%(9¤ ;shî¤ <Xè;—¤ =g%lexical-token-value-procedure¤ >gm-1e9d51c93-88¤ ?>[¤ @?¤ Afl-1e9d51c93-8a¤ BA¤ C]j@B¤ D?hCohhhhx†Œ ¤ EXfD“¤ FeE¤ GF=¤ HŸhCoh…hhhŒh“×Ú¤ IXqH“¤ JeI¤ K<GJ=¤ L??¤ Mfl-1e9d51c93-8d¤ Nfl-1e9d51c93-8e¤ OMN¤ P]›LO¤ Q?PhCohhhhx†Œ ¤ RX˜Q“¤ SX£Q“¤ TsPhC¤ UXPT—¤ VSU¤ WV¤ XX©H“¤ YeX¤ Z<GY=¤ [fl-1e9d51c93-92¤ \fl-1e9d51c93-93¤ ][\¤ ^]›L]¤ _?^hCohhhhx†Œ ¤ `X˜_“¤ aX£_“¤ b^hC¤ cX b—¤ dac¤ ed¤ fX¸H“¤ gef¤ h<Gg=¤ ifl-1e9d51c93-97¤ jfl-1e9d51c93-98¤ kij¤ l]›Lk¤ m?lhCohhhhx†Œ ¤ nX˜m“¤ oX£m“¤ pslhC¤ qXÃp—¤ roq¤ sr¤ tgt-1e9d51c93-87¤ ut¤ vfl-1e9d51c93-9c¤ wv¤ x]u@w¤ y?xhCohhhhx†Œ ¤ zXYy“¤ {ŸxhCoh…hhhŒh“×Ú¤ |Xš{“¤ }|¤ ~XÒ{“¤ XX{“¤ €XZ{“¤ €|¤ ‚sxhC¤ ƒXP‚—¤ „ƒ¤ …XÚ{“¤ †xhC¤ ‡X †—¤ ˆ…|‡¤ ‰XR{“¤ ŠX£{“¤ ‹X‚—¤ ŒŠ‹¤ ‰|Œ¤ Ž~„ˆ¤ z}ޤ shC¤ ‘X=—¤ ’geach¤ “==¤ ”’“¤ •=”Œ¤ –=•Œ¤ —=–Œ¤ ˜g %%set-fields¤ ™gdummy¤ šgcheck?¤ ›gexpr¤ œ™šš†›¤ gm-1e9d51c93-a3¤ ž[¤ ŸžŸŸŸŸ¤  fl-1e9d51c93-a8¤ ¡fl-1e9d51c93-a9¤ ¢fl-1e9d51c93-aa¤ £fl-1e9d51c93-ab¤ ¤fl-1e9d51c93-ac¤ ¥ ¡¢£¤¤ ¦]œŸ¥¤ §ž¤ ¨fl-1e9d51c93-a5¤ ©¨¤ ª]j§©¤ «gt-1e8ba8b5a-16a¤ ¬gt-1e8ba8b5a-16c¤ ­gt-1e8ba8b5a-16b¤ ®«¬­¤ ¯gm-1e8ba8b5a-16d¤ °¯[¤ ±°°°¤ ²fl-1e8ba8b5a-171¤ ³fl-1e8ba8b5a-172¤ ´fl-1e8ba8b5a-173¤ µ²³´¤ ¶]®±µ¤ ·fl-1e8ba8b5a-167¤ ¸fl-1e8ba8b5a-168¤ ¹fl-1e8ba8b5a-169¤ º·¸¹¤ »]Žº¤ ¼Ÿ¦hªoh¶hhh»×Ú ¤ ½X˜¼“¤ ¾s¦hª¤ ¿XP¾—¤ ÀX¾—¤ ÁX¾—¤ ÂX¾—¤ ÃÀÁ¤ Ägmap¤ ÅĤ ÆÄ¤ Çglist¤ Ègsource-location¤ Ég%make-source-location-procedure¤ Ê<=====¤ Ëgm-1e9d51c93-bc¤ ÌË[¤ Ígt-1e9d51c93-b7¤ Îgt-1e9d51c93-b8¤ Ïgt-1e9d51c93-b9¤ Ðgt-1e9d51c93-ba¤ Ñgt-1e9d51c93-bb¤ ÒÍÎÏÐѤ ÓÌÌÌÌ̤ Ôfl-1e9d51c93-c1¤ Õfl-1e9d51c93-c2¤ Öfl-1e9d51c93-c3¤ ×fl-1e9d51c93-c4¤ Øfl-1e9d51c93-c5¤ ÙÔÕÖר¤ Ú]ÒÓÙ¤ Ṳ̂ Üfl-1e9d51c93-be¤ Ýܤ Þ]jÛݤ ßÌÚhÞohhhhx†Œ ¤ àXYß“¤ áginput¤ âsÚhÞ¤ ãXáâ—¤ ägline¤ åXäâ—¤ ægcolumn¤ çXæâ—¤ ègoffset¤ éXèâ—¤ êglength¤ ëXêâ—¤ ìãåçéë¤ ígm-1e9d51c93-b5¤ îí[¤ ïîÚhÞoh«hhh°·hÃ×Ú¤ ðX ñXÈâ—¤ òX  óðñòãåçéë¤ ôàìó¤ õshÞ¤ öXÉõ—¤ ÷g pwpwpwpwpw¤ øáäæèê¤ ùg%source-location?-procedure¤ úgm-1e9d51c93-d1¤ ûú[¤ ügt-1e9d51c93-d0¤ ýü¤ þû¤ ÿfl-1e9d51c93-d6¤ ÿ¤ ]ýþ¤ fl-1e9d51c93-d3¤ ¤ ]jþ¤ ûhohhhhx†Œ ¤ XY“¤ îhohhhhh!h&h*h/h4h9h>hCO×Ú¤ X“¤  ¤  XS“¤  XU“¤   ¤  XX“¤ XZ“¤ ¤ sh¤ XÈ—¤  ¤   ¤  ¤ sh¤ Xù—¤ g %source-location-input-procedure¤ gm-1e9d51c93-dd¤ [¤ ¤ fl-1e9d51c93-df¤ ¤ ]j¤ hohhhhx†Œ ¤ Xf“¤  e¤ ! =¤ "îhoh…hhhŒh“×Ú¤ #Xq"“¤ $e#¤ %<!$=¤ &¤ 'fl-1e9d51c93-e2¤ (fl-1e9d51c93-e3¤ )'(¤ *]›&)¤ +*hohhhhx†Œ ¤ ,X˜+“¤ -X£+“¤ .s*h¤ /XÈ.—¤ 0-/¤ 10¤ 2X©"“¤ 3e2¤ 4<!3=¤ 5fl-1e9d51c93-e7¤ 6fl-1e9d51c93-e8¤ 756¤ 8]›&7¤ 98hohhhhx†Œ ¤ :X˜9“¤ ;X£9“¤ <8h¤ =X <—¤ >;=¤ ?>¤ @X¸"“¤ Ae@¤ B<!A=¤ Cfl-1e9d51c93-ec¤ Dfl-1e9d51c93-ed¤ ECD¤ F]›&E¤ GFhohhhhx†Œ ¤ HX˜G“¤ IX£G“¤ Jg%%source-location-set-fields¤ KsFh¤ LXJK—¤ MIL¤ NM¤ Ogt-1e9d51c93-dc¤ PO¤ Qfl-1e9d51c93-f1¤ RQ¤ S]PR¤ TShohhhhx†Œ ¤ UXYT“¤ VîShoh…hhhŒh“×Ú¤ WXšV“¤ XW¤ YXÒV“¤ ZXXV“¤ [XZV“¤ \[W¤ ]sSh¤ ^XÈ]—¤ _Z\^¤ `XÚV“¤ aSh¤ bX a—¤ c`Wb¤ dXRV“¤ eX£V“¤ fX]—¤ gef¤ hdWg¤ iY_ch¤ jUXi¤ ksh¤ lXk—¤ mg%source-location-line-procedure¤ ngm-1e9d51c93-f8¤ on[¤ po¤ qfl-1e9d51c93-fa¤ rq¤ s]jpr¤ tohsohhhhx†Œ ¤ uXft“¤ veu¤ wv=¤ xîhsoh…hhhŒh“×Ú¤ yXqx“¤ zey¤ {<wz=¤ |oo¤ }fl-1e9d51c93-fd¤ ~fl-1e9d51c93-fe¤ }~¤ €]›|¤ o€hsohhhhx†Œ ¤ ‚X˜“¤ ƒX£“¤ „s€hs¤ …XÈ„—¤ †ƒ…¤ ‡†¤ ˆX©x“¤ ‰eˆ¤ Š<w‰=¤ ‹fl-1e9d51c93-102¤ Œfl-1e9d51c93-103¤ ‹Œ¤ Ž]›|¤ oŽhsohhhhx†Œ ¤ X˜“¤ ‘X£“¤ ’Žhs¤ “X ’—¤ ”‘“¤ •”¤ –X¸x“¤ —e–¤ ˜<w—=¤ ™fl-1e9d51c93-107¤ šfl-1e9d51c93-108¤ ›™š¤ œ]›|›¤ oœhsohhhhx†Œ ¤ žX˜“¤ ŸX£“¤  sœhs¤ ¡XJ —¤ ¢Ÿ¡¤ £¢¤ ¤gt-1e9d51c93-f7¤ ¥¤¤ ¦fl-1e9d51c93-10c¤ §¦¤ ¨]¥p§¤ ©o¨hsohhhhx†Œ ¤ ªXY©“¤ «î¨hsoh…hhhŒh“×Ú¤ ¬X𫓤 ­¬¤ ®XÒ«“¤ ¯XX«“¤ °XZ«“¤ ±°¬¤ ²s¨hs¤ ³XȲ—¤ ´¯±³¤ µXÚ«“¤ ¶¨hs¤ ·X ¶—¤ ¸µ¬·¤ ¹XR«“¤ ºX£«“¤ »X²—¤ ¼º»¤ ½¹¬¼¤ ¾®´¸½¤ ¿ª­¾¤ Àshs¤ ÁXmÀ—¤ Âg!%source-location-column-procedure¤ Ãgm-1e9d51c93-113¤ ÄÃ[¤ ÅĤ Æfl-1e9d51c93-115¤ ÇÆ¤ È]jÅǤ ÉÄhÈohhhhx†Œ ¤ ÊXfÉ“¤ Ëeʤ ÌË=¤ ÍîhÈoh…hhhŒh“×Ú¤ ÎXqÍ“¤ ÏeΤ Ð<ÌÏ=¤ ÑÄĤ Òfl-1e9d51c93-118¤ Ófl-1e9d51c93-119¤ ÔÒÓ¤ Õ]›ÑÔ¤ ÖÄÕhÈohhhhx†Œ ¤ ×X˜Ö“¤ ØX£Ö“¤ ÙsÕhȤ ÚXÈÙ—¤ ÛØÚ¤ ÜÛ¤ ÝX©Í“¤ Þeݤ ß<ÌÞ=¤ àfl-1e9d51c93-11d¤ áfl-1e9d51c93-11e¤ âàᤠã]›Ñ⤠äÄãhÈohhhhx†Œ ¤ åX˜ä“¤ æX£ä“¤ çãhȤ èX ç—¤ éæè¤ êé¤ ëX¸Í“¤ ìeë¤ í<Ìì=¤ îfl-1e9d51c93-122¤ ïfl-1e9d51c93-123¤ ðîï¤ ñ]›Ñð¤ òÄñhÈohhhhx†Œ ¤ óX˜ò“¤ ôX£ò“¤ õsñhȤ öXJõ—¤ ÷ôö¤ ø÷¤ ùgt-1e9d51c93-112¤ úù¤ ûfl-1e9d51c93-127¤ üû¤ ý]úÅü¤ þÄýhÈohhhhx†Œ ¤ ÿXYþ“¤ îýhÈoh…hhhŒh“×Ú¤ X𓤠¤ XÒ“¤ XX“¤ XZ“¤ ¤ sýhȤ XÈ—¤  ¤  XÚ“¤  ýhȤ  X  —¤    ¤ XR“¤ X£“¤ X—¤ ¤ ¤   ¤ ÿ¤ shȤ X—¤ g!%source-location-offset-procedure¤ gm-1e9d51c93-12e¤ [¤ ¤ fl-1e9d51c93-130¤ ¤ ]j¤ hohhhhx†Œ ¤ Xf“¤  e¤ ! =¤ "îhoh…hhhŒh“×Ú¤ #Xq"“¤ $e#¤ %<!$=¤ &¤ 'fl-1e9d51c93-133¤ (fl-1e9d51c93-134¤ )'(¤ *]›&)¤ +*hohhhhx†Œ ¤ ,X˜+“¤ -X£+“¤ .s*h¤ /XÈ.—¤ 0-/¤ 10¤ 2X©"“¤ 3e2¤ 4<!3=¤ 5fl-1e9d51c93-138¤ 6fl-1e9d51c93-139¤ 756¤ 8]›&7¤ 98hohhhhx†Œ ¤ :X˜9“¤ ;X£9“¤ <8h¤ =X <—¤ >;=¤ ?>¤ @X¸"“¤ Ae@¤ B<!A=¤ Cfl-1e9d51c93-13d¤ Dfl-1e9d51c93-13e¤ ECD¤ F]›&E¤ GFhohhhhx†Œ ¤ HX˜G“¤ IX£G“¤ JsFh¤ KXJJ—¤ LIK¤ ML¤ Ngt-1e9d51c93-12d¤ ON¤ Pfl-1e9d51c93-142¤ QP¤ R]OQ¤ SRhohhhhx†Œ ¤ TXYS“¤ UîRhoh…hhhŒh“×Ú¤ VXšU“¤ WV¤ XXÒU“¤ YXXU“¤ ZXZU“¤ [ZV¤ \sRh¤ ]XÈ\—¤ ^Y[]¤ _XÚU“¤ `Rh¤ aX `—¤ b_Va¤ cXRU“¤ dX£U“¤ eX\—¤ fde¤ gcVf¤ hX^bg¤ iTWh¤ jsh¤ kXj—¤ lg!%source-location-length-procedure¤ mgm-1e9d51c93-149¤ nm[¤ on¤ pfl-1e9d51c93-14b¤ qp¤ r]joq¤ snhrohhhhx†Œ ¤ tXfs“¤ uet¤ vu=¤ wîhroh…hhhŒh“×Ú¤ xXqw“¤ yex¤ z<vy=¤ {nn¤ |fl-1e9d51c93-14e¤ }fl-1e9d51c93-14f¤ ~|}¤ ]›{~¤ €nhrohhhhx†Œ ¤ X˜€“¤ ‚X£€“¤ ƒshr¤ „Xȃ—¤ …‚„¤ †…¤ ‡X©w“¤ ˆe‡¤ ‰<vˆ=¤ Šfl-1e9d51c93-153¤ ‹fl-1e9d51c93-154¤ ŒŠ‹¤ ]›{Œ¤ Žnhrohhhhx†Œ ¤ X˜Ž“¤ X£Ž“¤ ‘hr¤ ’X ‘—¤ “’¤ ”“¤ •X¸w“¤ –e•¤ —<v–=¤ ˜fl-1e9d51c93-158¤ ™fl-1e9d51c93-159¤ š˜™¤ ›]›{š¤ œn›hrohhhhx†Œ ¤ X˜œ“¤ žX£œ“¤ Ÿs›hr¤  XJŸ—¤ ¡ž ¤ ¢¡¤ £gt-1e9d51c93-148¤ ¤£¤ ¥fl-1e9d51c93-15d¤ ¦¥¤ §]¤o¦¤ ¨n§hrohhhhx†Œ ¤ ©XY¨“¤ ªî§hroh…hhhŒh“×Ú¤ «Xšª“¤ ¬«¤ ­XÒª“¤ ®XXª“¤ ¯XZª“¤ °¯«¤ ±s§hr¤ ²Xȱ—¤ ³®°²¤ ´XÚª“¤ µ§hr¤ ¶X µ—¤ ·´«¶¤ ¸XRª“¤ ¹X£ª“¤ ºX ±—¤ »¹º¤ ¼¸«»¤ ½­³·¼¤ ¾©¬½¤ ¿shr¤ ÀXl¿—¤ Ágm-1e9d51c93-164¤ ÂÁ[¤ ÃÂîîîî¤ Äfl-1e9d51c93-169¤ Åfl-1e9d51c93-16a¤ Æfl-1e9d51c93-16b¤ Çfl-1e9d51c93-16c¤ Èfl-1e9d51c93-16d¤ ÉÄÅÆÇȤ Ê]œÃɤ ˤ Ìfl-1e9d51c93-166¤ Í̤ Î]jËͤ ÏîÊhÎoh¶hhh»×Ú ¤ ÐX˜Ï“¤ ÑsÊhΤ ÒXÈÑ—¤ ÓXÑ—¤ ÔXÑ—¤ ÕXÑ—¤ ÖXÑ—¤ ×X Ñ—¤ ØÓÔÕÖפ Ùg make-vector¤ Úg list->vector¤ Ûgreverse¤ Ü ¤ Ýgmax¤ Þgdisplay¤ ßfError in map-goto¤ àgnewline¤ ágexpt¤ âgbidon¤ ãfError in add-lookback-edge : ¤ ägassv¤ ågassq¤ ægreduce¤ çgleft¤ ègright¤ égnone¤ êf %% Shift/Reduce conflict (shift ¤ ëf , reduce ¤ ìf) on '¤ íf ' in state ¤ îf"%% Reduce/Reduce conflict (reduce ¤ ïgdefault¤ ðgaccept¤ ñgfor-each¤ ògnumber?¤ óglist-ref¤ ôg *default*¤ õg*error*¤ öôõ¤ ÷gleft:¤ øgright:¤ ùg nonassoc:¤ úf+invalid operator precedence specification: ¤ û÷猤 üø茤 ýgnonassoc¤ þùýŒ¤ ÿûüþ¤ gmember¤ f"duplicate definition of terminal: ¤ finvalid terminal: ¤ gassoc¤ fNonterminal previously defined:¤ fInvalid nonterminal:¤ f/Nonterminal definition must be a non-empty list¤ g*eoi*¤ geoi¤  é ¤  Lé ¤  g*start*¤  gcar¤  f-Grammar must contain at least one nonterminal¤ gcdar¤ gappend¤ g:¤ g$1¤ ¤ fstring¤ f Invalid terminal or nonterminal:¤ fTInvalid 'error' production. A single terminal symbol must follow the 'error' token.:¤ gvector¤ gstring->symbol¤ g string-append¤  f-¤ !gnumber->string¤ "f$¤ #f/At least one production needed for nonterminal:¤ $g vector->list¤ %£¤ &g___stack¤ 'g___sp¤ (g ___goto-table¤ )g___push¤ *g yypushback¤ +&'()*¤ ,'()¤ -glet*¤ .gtok¤ /g vector-ref¤ 0g-¤ 1.¤ 2.¤ 3Ò12.¤ 43¤ 5f@¤ 6.¤ 7Ò16.¤ 87¤ 9¤ :¤ ;'¤ gdefine¤ ?fMalformed lalr-parser form¤ @fInvalid option:¤ Agexpect:¤ Bgdriver:¤ Cgglr¤ Dg out-table:¤ Ef State table¤ Ff -----------¤ Gfstate ¤ Hf ¤ If --> ¤ Jf. ¤ Kf ¤ Lf (rule ¤ Mf)¤ Nfdefault action¤ Of : Error¤ Pf : Accept input¤ Qf : reduce using rule ¤ Rf : shift and goto state ¤ SfNo generated parser available!¤ Tgstring?¤ Uginteger?¤ Vgmemq¤ Wglr¤ XWC¤ Ygcombine-locations¤ Zg*max-stack-size*¤ [g vector-length¤ \f%Syntax error: unexpected end of input¤ ]f!Syntax error: unexpected token : ¤ ^fSyntax error: invalid token: ¤ _g take-right¤ `gdrop¤ agfilename¤C5hÈL†]4    $54'>"G()R4,0>"G4,>"G.i1R2i3R4678;>ADhP] CHgfilenamefsystem/base/lalr.upstream.scmŒ S ŒŒ   Chr] 45L4?6jgargs  gv gfilenamefsystem/base/lalr.upstream.scmŒ  S ŒŒ   CGHh(p] 45$ O@6hgy  'gtmp 'gfilenamefsystem/base/lalr.upstream.scmŒ S ŒŒ  ' C57R46I8;>ADJhx-13ŒŒCpgx gy gfilenamefsystem/base/lalr.upstream.scmŒ T ŒŒ T #ŒŒ  Chr] 45L4?6jgargs  gv gfilenamefsystem/base/lalr.upstream.scmŒ  T ŒŒ   CGHh(p] 45$ O@6hgy  'gtmp 'gfilenamefsystem/base/lalr.upstream.scmŒ T ŒŒ  ' C5IR46K8;>ADLh{]Csgmsg  gobj  gfilenamefsystem/base/lalr.upstream.scmŒ U ŒŒ  U %ŒŒ  Chr] 45L4?6jgargs  gv gfilenamefsystem/base/lalr.upstream.scmŒ  U ŒŒ   CGHh(p] 45$ O@6hgy  'gtmp 'gfilenamefsystem/base/lalr.upstream.scmŒ U ŒŒ  ' C5KRMNOPQThp÷]45$^45$"¦$ §‚"$24§& ©" 45>"G""Cïglvalue  ngtok  ngfilenamefsystem/base/lalr.upstream.scmŒ V ŒŒ  W ŒŒ W ŒŒ  X ŒŒ  X *ŒŒ  X ŒŒ  W ŒŒ " Y ŒŒ 5 W ŒŒ 6 Z ŒŒ < Z %ŒŒ ? Z *ŒŒ [ Z ŒŒ  n gnamegnote-source-locationŒCURPh·]¨C¯gcategory  gsource  gvalue   gfilenamefsystem/base/lalr.upstream.scmŒ x ŒŒ   gnameg%make-lexical-token-procedureŒCVR468;Wàhn]Cfgt-1e9d51c93-32  gt-1e9d51c93-33  gt-1e9d51c93-34      Câäåh`]L6Xga  gfilenamefsystem/base/lalr.upstream.scmŒ  x ŒŒ  C<èhP]L6Hgfilenamefsystem/base/lalr.upstream.scmŒ  x ŒŒ   Cêh]C   CGH hp‘]45$@45$ O@45$4O?$@  6  6‰gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/base/lalr.upstream.scmŒ x ŒŒ  n C5RíîñPò¨4õP>"G ø–ViªPRPh‡]¦$§‚CCgobj  gfilenamefsystem/base/lalr.upstream.scmŒ x ŒŒ   gnameg%lexical-token?-procedureŒCùR468;úah6]C.gt-1e9d51c93-45    Câäåh`]L6Xga  gfilenamefsystem/base/lalr.upstream.scmŒ  x ŒŒ  C<èhP]L6Hgfilenamefsystem/base/lalr.upstream.scmŒ  x ŒŒ   Cch]C   CGH hp‘]45$@45$ O@45$4O?$@  6  6‰gx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/base/lalr.upstream.scmŒ x ŒŒ  n C5RPTh]§& ©C6…gs  gfilenamefsystem/base/lalr.upstream.scmŒ x ŒŒ   gnameg!%lexical-token-category-procedureŒCdR468;—¢¨h:]ŒŒC2gerr  gs    C¬²·h:]ŒŒC2gerr  gs    C»ÁÇh:]ŒŒC2gerr  gs    Cúåh6]C.gt-1e9d51c93-51    Câäåh`]L6Xga  gfilenamefsystem/base/lalr.upstream.scmŒ  x ŒŒ  C<èhP]L6Hgfilenamefsystem/base/lalr.upstream.scmŒ  x ŒŒ   Cçh]C   CGHh¸Í]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66Ågx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/base/lalr.upstream.scmŒ x ŒŒ  ³ C5RPTh‹]§& ©C6ƒgs  gfilenamefsystem/base/lalr.upstream.scmŒ x ŒŒ   gnameg%lexical-token-source-procedureŒCèR468;öýh:]ŒŒC2gerr  gs    C h:]ŒŒC2gerr  gs    Ch:]ŒŒC2gerr  gs    Cú:h6]C.gt-1e9d51c93-6c    Câäåh`]L6Xga  gfilenamefsystem/base/lalr.upstream.scmŒ  x ŒŒ  C<èhP]L6Hgfilenamefsystem/base/lalr.upstream.scmŒ  x ŒŒ   C<h]C   CGHh¸Í]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66Ågx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/base/lalr.upstream.scmŒ x ŒŒ  ³ C5RPTh Š]§& ©C6‚gs  gfilenamefsystem/base/lalr.upstream.scmŒ x ŒŒ   gnameg%lexical-token-value-procedureŒC=R468;KRWh:]ŒŒC2gerr  gs    CZ`eh:]ŒŒC2gerr  gs    Chnsh:]ŒŒC2gerr  gs    Cúh6]C.gt-1e9d51c93-87    Câäåh`]L6Xga  gfilenamefsystem/base/lalr.upstream.scmŒ  x ŒŒ  C<èhP]L6Hgfilenamefsystem/base/lalr.upstream.scmŒ  x ŒŒ   C‘h]C   CGHh¸Í]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66Ågx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/base/lalr.upstream.scmŒ x ŒŒ  ³ C5R46Ã8;—½¿ÃÆÇh v]45ŒŒŒŒŒCngdummy  gcheck?  gs   ggetter   gexpr      CGHh(Ë] 45$@6Ãgx  "gtmp "gfilenamefsystem/base/lalr.upstream.scmŒ x ŒŒ  " g macro-typeg syntax-rulesŒgpatternsgcheck?gsggettergexprg...C5ÃRÈhÞ]¨CÖginput  gline  gcolumn   goffset   glength   gfilenamefsystem/base/lalr.upstream.scmŒ € ŒŒ   gnameg%make-source-location-procedureŒCÉR468;Êôh¦]Cžgt-1e9d51c93-b7  gt-1e9d51c93-b8  gt-1e9d51c93-b9   gt-1e9d51c93-ba   gt-1e9d51c93-bb      Câäåha]L6Yga  gfilenamefsystem/base/lalr.upstream.scmŒ  € ŒŒ  C<èhQ]L6Igfilenamefsystem/base/lalr.upstream.scmŒ  € ŒŒ   Cöh]C   CGH hp’]45$@45$ O@45$4O?$@  6  6Šgx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/base/lalr.upstream.scmŒ € ŒŒ  n C5Rí÷ñÈø¨4õÈ>"G ø–ÉiªÈRÈhŠ]¦$§‚CC‚gobj  gfilenamefsystem/base/lalr.upstream.scmŒ € ŒŒ   gnameg%source-location?-procedureŒCùR468;úh6]C.gt-1e9d51c93-d0    Câäåha]L6Yga  gfilenamefsystem/base/lalr.upstream.scmŒ  € ŒŒ  C<èhQ]L6Igfilenamefsystem/base/lalr.upstream.scmŒ  € ŒŒ   Ch]C   CGH hp’]45$@45$ O@45$4O?$@  6  6Šgx  ngtmp ngtmp  " ngtmp  > ngfilenamefsystem/base/lalr.upstream.scmŒ € ŒŒ  n C5RÈTh]§& ©C6…gs  gfilenamefsystem/base/lalr.upstream.scmŒ € ŒŒ   gnameg %source-location-input-procedureŒCR468;%,1h:]ŒŒC2gerr  gs    C4:?h:]ŒŒC2gerr  gs    CBHNh:]ŒŒC2gerr  gs    Cújh6]C.gt-1e9d51c93-dc    Câäåha]L6Yga  gfilenamefsystem/base/lalr.upstream.scmŒ  € ŒŒ  C<èhQ]L6Igfilenamefsystem/base/lalr.upstream.scmŒ  € ŒŒ   Clh]C   CGHh¸Î]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66Ægx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/base/lalr.upstream.scmŒ € ŒŒ  ³ C5RÈThŒ]§& ©C6„gs  gfilenamefsystem/base/lalr.upstream.scmŒ € ŒŒ   gnameg%source-location-line-procedureŒCmR468;{‚‡h:]ŒŒC2gerr  gs    CŠ•h:]ŒŒC2gerr  gs    C˜ž£h:]ŒŒC2gerr  gs    Cú¿h6]C.gt-1e9d51c93-f7    Câäåha]L6Yga  gfilenamefsystem/base/lalr.upstream.scmŒ  € ŒŒ  C<èhQ]L6Igfilenamefsystem/base/lalr.upstream.scmŒ  € ŒŒ   CÁh]C   CGHh¸Î]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66Ægx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/base/lalr.upstream.scmŒ € ŒŒ  ³ C5RÈTh Ž]§& ©C6†gs  gfilenamefsystem/base/lalr.upstream.scmŒ € ŒŒ   gnameg!%source-location-column-procedureŒCÂR468;Ð×Üh:]ŒŒC2gerr  gs    Cßåêh:]ŒŒC2gerr  gs    Cíóøh:]ŒŒC2gerr  gs    Cúh7]C/gt-1e9d51c93-112    Câäåha]L6Yga  gfilenamefsystem/base/lalr.upstream.scmŒ  € ŒŒ  C<èhQ]L6Igfilenamefsystem/base/lalr.upstream.scmŒ  € ŒŒ   Ch]C   CGHh¸Î]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66Ægx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/base/lalr.upstream.scmŒ € ŒŒ  ³ C5RÈTh Ž]§& ©C6†gs  gfilenamefsystem/base/lalr.upstream.scmŒ € ŒŒ   gnameg!%source-location-offset-procedureŒCR468;%,1h:]ŒŒC2gerr  gs    C4:?h:]ŒŒC2gerr  gs    CBHMh:]ŒŒC2gerr  gs    Cúih7]C/gt-1e9d51c93-12d    Câäåha]L6Yga  gfilenamefsystem/base/lalr.upstream.scmŒ  € ŒŒ  C<èhQ]L6Igfilenamefsystem/base/lalr.upstream.scmŒ  € ŒŒ   Ckh]C   CGHh¸Î]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66Ægx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/base/lalr.upstream.scmŒ € ŒŒ  ³ C5RÈT h Ž]§& ©C6†gs  gfilenamefsystem/base/lalr.upstream.scmŒ € ŒŒ   gnameg!%source-location-length-procedureŒClR46 8;z†h:]ŒŒC2gerr  gs    C‰”h:]ŒŒC2gerr  gs    C—¢h:]ŒŒC2gerr  gs    Cú¾h7]C/gt-1e9d51c93-148    Câä åha]L6Yga  gfilenamefsystem/base/lalr.upstream.scmŒ  € ŒŒ  C<èhQ]L6Igfilenamefsystem/base/lalr.upstream.scmŒ  € ŒŒ   CÀh]C   CGHh¸Î]145$@45$@45$@45$ @4 5$  O@4 5$4 O?$@66Ægx  ³gtmp ³gtmp  " ³gtmp  9 ³gtmp  P ³gtmp  g ³gtmp  ƒ ³gfilenamefsystem/base/lalr.upstream.scmŒ € ŒŒ  ³ C5 R46J8;—ÐÒØÆÇh v]45ŒŒŒŒŒCngdummy  gcheck?  gs   ggetter   gexpr      CGHh(Ì] 45$@6Ägx  "gtmp "gfilenamefsystem/base/lalr.upstream.scmŒ € ŒŒ  " g macro-typeg syntax-rulesŒgpatternsgcheck?gsggettergexprg...C5JR468;>ADh8÷] "$‘$C££¡¤—"ÿÿÜ "ÿÿÕïgv1  1gv2  1gn   1gi   *gfilenamefsystem/base/lalr.upstream.scmŒ “ ŒŒ  ” ŒŒ • ŒŒ  ” ŒŒ  – $ŒŒ  — $ŒŒ – ŒŒ ! – ŒŒ $ ” ŒŒ * ” ŒŒ  1 gnameg bit-unionŒCÙÚêÙhÐ ]"$¹L£ŽL£™L¤ ‘$tM£ •$IM£$4L>"G"#M¤L¤4L—>"G"4L>"G"4L>"G"LL—6gp  Êgs4  Êgx  ½gruleno   ºgy   ·gsymbol  0 ›gfilenamefsystem/base/lalr.upstream.scmŒ ¡ ŒŒ  ¢ ŒŒ £ $ŒŒ £ ŒŒ  ¤ )ŒŒ  £ ŒŒ  ¥ 'ŒŒ  ¥ $ŒŒ  £ ŒŒ # ¦ ŒŒ ' § ŒŒ + § ŒŒ 0 ¨ .ŒŒ 0 ¨ ŒŒ 6 © +ŒŒ : © "ŒŒ ? ª 0ŒŒ C © &ŒŒ D ¯ &ŒŒ I ¯ -ŒŒ P ¯ &ŒŒ b ¬ (ŒŒ i ­ (ŒŒ j ® (ŒŒ o ® /ŒŒ r ® 7ŒŒ w ® (ŒŒ „ ¯ &ŒŒ ‰ ¯ -ŒŒ ¯ &ŒŒ   ° ŒŒ ¥ ° 'ŒŒ ¬ ° ŒŒ Æ ± ŒŒ Ê ± ŒŒ$  Ê gnamegloop2ŒCh@Ì] ’$0OLLLLLLQLL££6CÄgs1  =gs3  =gloop2   ;gfilenamefsystem/base/lalr.upstream.scmŒ Ÿ ŒŒ    ŒŒ   ŒŒ  ¡ ŒŒ 6 ¡ 5ŒŒ 7 ¡ #ŒŒ ; ¡ ŒŒ  = gnamegloopŒChˆù]45N45N45N45N 45N M M –N 45"#(""Ž45–"ÿÿÝ "ÿÿÒ4L>"G4L>"G4M 5N4M 54M— 54M 54MM – –5  "RM £$  ’$DM ˜£ •$,M£$",M¤ ¤ — —    "ÿÿ®" "®M£ ”$—$"M •"ÿÿÕ$—     "ÿÿa ˜"PM£ ”$-£—¤  £Œ¤ ¤——"ÿÿÄ—    "ÿÿ   "ÿÿ¤ "ÿÿGO LL Q4  >"G"    "ÿþ¡  4L>"G4L>"G4L >"G4L >"GCñgterms  …g terms/prec  …gvars   …ggram   …g gram/actions   …gl  A dgcount  A dg no-of-rules  o …g no-of-items  o …gsqueue  É @grcount  É @grsets É @grelts É @gr Õ 'gs2 Õ 'gp Õ 'g*r  Ú 'gsymbol  ñ .gr1  2 àg any-tokens  2 àgsymbol  7 àgruleno  x Ýgr2  ~ Îgp2  ~ Îgsymbol  ƒ Îgloop  ù $gfilenamefsystem/base/lalr.upstream.scmŒ  ŒŒ   ŒŒ  ŒŒ  ŒŒ   ŒŒ   ŒŒ   ŒŒ   ŒŒ &  ŒŒ '  ŒŒ /  ŒŒ 4  ŒŒ 6  ŒŒ 7  ŒŒ A  ŒŒ G  ŒŒ P  &ŒŒ S  7ŒŒ X  ?ŒŒ [  7ŒŒ \  .ŒŒ d  ŒŒ d  ŒŒ o  ŒŒ t  ŒŒ Š  ŒŒ š | ŒŒ £ | ŒŒ ¤ } ŒŒ ¬ ~ ŒŒ ± ~ ŒŒ ´ ~ ŒŒ µ  ŒŒ ½ € ŒŒ Ä € ŒŒ É € ŒŒ É } ŒŒ Õ  ŒŒ Ú ‚ ŒŒ Ú ‚ ŒŒ â ƒ ŒŒ æ „ ŒŒ ê „ ŒŒ í … 1ŒŒ ñ … ŒŒ ñ … ŒŒ ÷ † ŒŒ û † ŒŒ  ‡ "ŒŒ  † ŒŒ  ‰ ŒŒ  Š ŒŒ  ‹ ŒŒ  ‹ (ŒŒ ' ‹ ŒŒ 2 Œ ŒŒ 7  #ŒŒ 7  ŒŒ = Ž ŒŒ A Ž ŒŒ D  !ŒŒ J  *ŒŒ U  9ŒŒ ]  ŒŒ c  ŒŒ f ž $ŒŒ t ž ŒŒ u ‘ ,ŒŒ x ‘ ŒŒ ~ ’ ŒŒ ƒ “ 0ŒŒ ƒ “ "ŒŒ ‰ ” (ŒŒ  ” $ŒŒ – — :ŒŒ — — 7ŒŒ ˜ – *ŒŒ ¡ ™ =ŒŒ ¤ ™ 7ŒŒ ¥ ˜ *ŒŒ ¬ › *ŒŒ ¯ œ 1ŒŒ ² œ :ŒŒ º œ *ŒŒ ½  .ŒŒ Ë  (ŒŒ Î ’ ŒŒ à Œ ŒŒ ù Ÿ ŒŒ '  ŒŒ A  ŒŒ Q  ŒŒ a  ŒŒ q  ŒŒ_  … Ch°]N4N3N2N1N0N/N.N-N,N+N*4 ñ5N)N(N'N&N%N$N#N"N!N NNNNNNNNNNNNNNNNNLLLL1LLL2L3LLLLL L L L L LO6gtokens  «ggram  «gfilenamefsystem/base/lalr.upstream.scmŒ ÿ ŒŒ   ŒŒ   ŒŒ  ŒŒ   ŒŒ   ŒŒ   ŒŒ  ! ŒŒ  " ŒŒ  # ŒŒ $ ŒŒ # % ŒŒ $ ' ŒŒ * ' 5ŒŒ , ' ŒŒ . ' ŒŒ 1 ( ŒŒ 4 ) ŒŒ 7 * ŒŒ : + ŒŒ = , ŒŒ @ - ŒŒ C . ŒŒ F / ŒŒ I 0 ŒŒ L 1 ŒŒ O 2 ŒŒ R 3 ŒŒ U 4 ŒŒ X 5 ŒŒ [ 6 ŒŒ ^ 7 ŒŒ a 8 ŒŒ d 9 ŒŒ g : ŒŒ j ; ŒŒ m < ŒŒ p = ŒŒ s > ŒŒ v @ ŒŒ y A ŒŒ z B ŒŒ | B ŒŒ «  ŒŒ-  « gnameg gen-tables!ŒCÙhÐä]K—NN4M5N4M5N4M—5N"’(C"n(Ž "ÿÿ×M ¤M ¤"8 (M  ˜¤Ž — — "ÿÿµM  ¤ Ž —  "ÿÿÈ  "ÿÿ»Ž "ÿÿ€ "ÿÿ`Üg no-of-rules  Îg no-of-items  Îggram   Îgp  . Àgitem-no  . Àgrule-no  . Àgnt  : Àgprods  @ ®git-no2  @ ®grl-no2 @ ®grhs i ¡git-no3 i ¡ gfilenamefsystem/base/lalr.upstream.scmŒ E ŒŒ  F ŒŒ  F ŒŒ G ŒŒ H ŒŒ  H ŒŒ  I ŒŒ  I ŒŒ J ŒŒ % J ŒŒ ( J ŒŒ * J ŒŒ . L ŒŒ 4 M ŒŒ 9 N ŒŒ : N ŒŒ @ O ŒŒ F P ŒŒ I Q ŒŒ W Q ŒŒ ^ S ŒŒ e T ŒŒ i U ŒŒ o V ŒŒ t X 6ŒŒ x X ŒŒ { Y #ŒŒ ~ Y /ŒŒ Y <ŒŒ ‹ Y ŒŒ ’ [ 6ŒŒ “ [ ŒŒ – \ #ŒŒ ™ \ -ŒŒ ¡ \ ŒŒ ¡ U ŒŒ ¤ U %ŒŒ ® U ŒŒ ® O ŒŒ ± O ŒŒ À O ŒŒ À L ŒŒ+  Î gnameg pack-grammarŒCÙhè·]0HH4M— 5K4M ÿ5K"NM’$AM£ •$"JJ£Œ¤J¤——"ÿÿÆ—"ÿÿ¹" "ÿÿ¨4M 5N"XM’$M") ’$")J£ŽŒ"ÿÿÚJ£"ÿÿÉM¤—"ÿÿªC "ÿÿ¡¯gdelts  çgdset  çgi  " pgj  " pglhs  0 lgi  ˆ àgj  • ¾gs  • ¾gx  ¨ ¾gq  Ì Þ gfilenamefsystem/base/lalr.upstream.scmŒ _ ŒŒ ` ŒŒ  ` ŒŒ  ` ŒŒ  a ŒŒ " c ŒŒ ' d ŒŒ + d ŒŒ 0 e ŒŒ 0 e ŒŒ 6 f ŒŒ : f ŒŒ E h /ŒŒ F h 'ŒŒ G h ŒŒ N i ŒŒ Q j ŒŒ T j ŒŒ \ j ŒŒ _ k ŒŒ i k ŒŒ p c ŒŒ { m ŒŒ „ m ŒŒ ˆ o ŒŒ p ŒŒ ‘ p ŒŒ • q ŒŒ ™ r ŒŒ r ŒŒ ¨ t "ŒŒ ¨ t ŒŒ ­ u "ŒŒ ° u 0ŒŒ ³ u *ŒŒ » u ŒŒ ¾ q ŒŒ à q "ŒŒ Ä q :ŒŒ Ì q ŒŒ Ì q ŒŒ Õ v ŒŒ Ø w ŒŒ Þ w ŒŒ à o ŒŒ.  ç gnameg set-derivesŒCÙhX–]04M5N"mM’$`"Q( —"ÿÿäMM££ ÿ’$"M’$M4LM£5¤""Ž"ÿÿ²M£"ÿÿ¤" "ÿÿŒ"•$‹"}M•$"ÿÿåM£"$("$Ž4LM£5"ÿÿÜ"ÿÿЇ$ —"ÿÿœM¤—"ÿÿ‰ "ÿÿy""ÿÿd"%M’$M4LM£5¤—"ÿÿÝC "ÿÿÔŽgi  }gsp  ngsym  5 ngcontinue ˆ gi ’ gcont  ’ gx  ¨ gl  ® Ògz  ® Ògy  Þ  gi ( M gfilenamefsystem/base/lalr.upstream.scmŒ µ ŒŒ  ¶ ŒŒ  ¶ $ŒŒ ¶ ŒŒ ¶ ŒŒ  ¹ ŒŒ  º ŒŒ  º ŒŒ  » ŒŒ # ¼ ŒŒ & ½ ŒŒ , ½ ŒŒ 3 ¾ >ŒŒ 4 ¾ -ŒŒ 5 ¾ ŒŒ 5 ¾ ŒŒ < ¿ ŒŒ @ ¿ ŒŒ E ¿ ŒŒ N À ,ŒŒ W À 9ŒŒ Y À ,ŒŒ Z À ŒŒ e Á ŒŒ k Á ŒŒ n » ŒŒ s » ŒŒ y » ŒŒ } ¹ ŒŒ ˆ Ä ŒŒ Ž Å ŒŒ ’ Æ ŒŒ — Ç ŒŒ › Ç ŒŒ £ È ŒŒ ¨ É ŒŒ ¨ É ŒŒ ® Ê ŒŒ ´ Ë ŒŒ ½ Í 'ŒŒ ¾ Î 'ŒŒ Å Î BŒŒ Æ Î /ŒŒ Ê Î 'ŒŒ Ò Í ŒŒ Ò Ê ŒŒ Þ É ŒŒ å Ï ŒŒ é Ï ŒŒ ì Ð ŒŒ ö Ð ŒŒ ý Ò ŒŒ  Ó ŒŒ  Ó ŒŒ  Æ ŒŒ  Ä ŒŒ ( Õ ŒŒ - Ö ŒŒ 1 Ö ŒŒ 6 Ø "ŒŒ ? Ø -ŒŒ A Ø "ŒŒ B Ø ŒŒ E Ù ŒŒ K Ù ŒŒ M Õ ŒŒC  T gnameg set-firstsŒCÙh€u]4M5N4L>"G"SM’$H"$("&Ž4LM£5"ÿÿÜM£"ÿÿÎM¤—"ÿÿ¯C "ÿÿ¦mgi sgl - Qgfd  - Qgx _ qgfilenamefsystem/base/lalr.upstream.scmŒ Þ ŒŒ  ß ŒŒ ß ŒŒ á ŒŒ ã ŒŒ % ä ŒŒ ) ä ŒŒ - å ŒŒ 3 æ ŒŒ < è ŒŒ = é ŒŒ D é <ŒŒ E é (ŒŒ I é ŒŒ Q è ŒŒ Q å ŒŒ V å "ŒŒ W å =ŒŒ _ å ŒŒ _ å ŒŒ h ê ŒŒ k ë ŒŒ q ë ŒŒ s ã ŒŒ  z gnameg set-fderivesŒCÙÛh@¦]9H4M5K"a("_M£ ÿ’$:M’$-"("J¤Ž"ÿÿæM£"ÿÿÛ""Ž"ÿÿ¢"ÿÿ—"²M’${J£$aM£"Jˆ$/’$ŽŒ"ÿÿÞ—Œ"ÿÿ­—Œ"ÿÿ™"ÿÿª—"ÿÿ|"ˆ$ŽŒ"ÿÿè6"ÿÿÖ "ÿÿ@žgcore  @gruleset  @gcsp   tgsym  # tgdsp  ; Ugruleno  € 2gcsp  € 2gitemsetv  € 2gitemno  — ógc  çg itemsetv2  çgc   &g itemsetv2   & gfilenamefsystem/base/lalr.upstream.scmŒ î ŒŒ  𠌌  ò ŒŒ  ó ŒŒ " ô 'ŒŒ # ô ŒŒ # ô ŒŒ * õ ŒŒ . õ ŒŒ 3 õ ŒŒ ; ö ŒŒ A ÷ ŒŒ J ù -ŒŒ L ù ŒŒ O ú ŒŒ U ú ŒŒ U ö ŒŒ Z ö !ŒŒ ` ö ŒŒ k û ŒŒ q û ŒŒ t ò ŒŒ € ý ŒŒ … þ ŒŒ ‰ þ ŒŒ Ž ÿ ŒŒ ’ ÿ ŒŒ —  ŒŒ —  ŒŒ  ŒŒ    ŒŒ ¤  ŒŒ §  ŒŒ ª  ŒŒ ®  ŒŒ ±  ŒŒ ´  +ŒŒ ·  %ŒŒ ¿  ŒŒ   ŒŒ É  +ŒŒ Ó  ŒŒ Ö  ŒŒ Ý  +ŒŒ ç  ŒŒ ç  ŒŒ ö  ŒŒ   ŒŒ   ŒŒ   ŒŒ   ŒŒ   ŒŒ   %ŒŒ   ŒŒ   ŒŒ &  ŒŒ &  ŒŒ 2 ý ŒŒ 6 ý /ŒŒ @ ý ŒŒ=  @ gnamegclosureŒCÙÜh8ô](4M 5N4M5N 4M — >"G4L >"G4  5 ¤ ¤  ¤ ¤NMN N "¾ˆ$µ4L £54L>"G4L>"G4L>"GM ”$]4  5 £ ¤M ¤M ¤M$MMŽN" NMN"Ž"ÿÿDCM"ÿÿ:ìgp B lg this-state p .gx z ,gis  † ,gp  Î gx  Ô ßgx  á ìgx  î úgfilenamefsystem/base/lalr.upstream.scmŒ ' ŒŒ   ŒŒ  ŒŒ  ŒŒ   ŒŒ   ŒŒ   ŒŒ "  ŒŒ + ) ŒŒ ; › "ŒŒ B  ŒŒ I œ "ŒŒ N "ŒŒ T ž "ŒŒ Z  ŒŒ [ Ÿ "ŒŒ ` ! ŒŒ b ! ŒŒ f " ŒŒ i # ŒŒ p + ŒŒ s , ŒŒ w , ŒŒ z - ŒŒ z - ŒŒ } . ŒŒ „ £ "ŒŒ † . ŒŒ † - ŒŒ ‰ / ŒŒ 0 ŒŒ ¯ 1 ŒŒ  2 ŒŒ Æ 2 ŒŒ Ç ¥ #ŒŒ Î Œ ŒŒ Ô   "ŒŒ Ô  ŒŒ Ü ¦ #ŒŒ á Ž ŒŒ é § #ŒŒ î  ŒŒ ÷ ¨ #ŒŒ   ŒŒ  ’ !ŒŒ  ’ ŒŒ  “ ŒŒ  “ ŒŒ  • ŒŒ  • ŒŒ  – ŒŒ & 4 ŒŒ , 4 ŒŒ . + ŒŒ7  6 gnameggenerate-statesŒCêhÀ<]!N"M’$M¤—"ÿÿè" "ÿÿÝ"wˆ$lM£ •$I4LM5NM£(M—Œ¤MM£¤"—Mޤ"Ž"ÿÿ“""ÿÿ4M5NC4gitemset  ºgi %gisp 0 §gi  : £gsym  A  gx  [ gfilenamefsystem/base/lalr.upstream.scmŒ 7 ŒŒ  9 ŒŒ  9 ŒŒ : ŒŒ  ; ŒŒ  ; ŒŒ  = &ŒŒ  = ŒŒ  > ŒŒ ! > ŒŒ % : ŒŒ 0 @ ŒŒ 3 A ŒŒ 7 A ŒŒ : B ŒŒ : B ŒŒ A C ŒŒ A B ŒŒ G D ŒŒ K D ŒŒ L F %ŒŒ V F ŒŒ [ G ŒŒ [ G ŒŒ c H ŒŒ j J =ŒŒ m J 7ŒŒ n J ŒŒ w K 6ŒŒ x K ŒŒ M ,ŒŒ „ M &ŒŒ … M ŒŒ Œ N 6ŒŒ N ŒŒ — O ŒŒ O ŒŒ § @ ŒŒ ° Q ŒŒ ¸ Q ŒŒ)  º gnameg new-itemsetsŒCêh0ñ]9M£45"!(  ñž"Ž–"ÿÿß "ÿÿÔM£(4L5M¤ £C"· £‘$}".ˆ$ ‘$ŽŽ"ÿÿà„"„" £"ÿÿ»$  £CŽ(4L5 £CŽ"ÿÿoŽ(4L5 £CŽ"ÿÿI"ÿÿAégsym  ,gisp  ,gn   ,gisp1   7gk   7gkey  B ,gsp  I ,gx  X igsp1  m $gc  r |gi1  … ³gt  … ³gc  ¸ Âgc  Ñ Øgx  æ õgx   gfilenamefsystem/base/lalr.upstream.scmŒ U ŒŒ  V ŒŒ  V ŒŒ W ŒŒ  V ŒŒ  X ŒŒ  Y ŒŒ " Z ŒŒ ) [ ŒŒ . [ -ŒŒ / [ (ŒŒ 7 [ ŒŒ 7 X ŒŒ B V ŒŒ I \ ŒŒ I V ŒŒ Q ] ŒŒ R ^ ŒŒ X ^ ŒŒ c _ )ŒŒ d _ ŒŒ h   "ŒŒ m a ŒŒ r b 'ŒŒ r b ŒŒ y ¢ "ŒŒ } b ŒŒ b ŒŒ … c ŒŒ ˆ d ŒŒ Œ d ŒŒ e #ŒŒ ’ f #ŒŒ “ e ŒŒ — d ŒŒ š g "ŒŒ g +ŒŒ ¥ g ŒŒ ¨ h ŒŒ ³ c ŒŒ ¸ c 9ŒŒ ¸ c -ŒŒ ¿ £ "ŒŒ Ê c ŒŒ Î b ŒŒ Ñ i ŒŒ Ñ i ŒŒ ×   "ŒŒ Û j ŒŒ ß j ŒŒ à k ŒŒ æ k ŒŒ ï l $ŒŒ ð l ŒŒ ô   "ŒŒ ø n ŒŒ þ n ŒŒ  j ŒŒ  j ŒŒ  k ŒŒ  k ŒŒ  l $ŒŒ  l ŒŒ    "ŒŒ  n ŒŒ $ n ŒŒ $ a ŒŒD  , gnameg get-stateŒCêÙhhj]!M£454  5M ¤ ¤M‘$MN" ¤ ¤MMŽNM—NCbgsym  cgisp  cgn   cgp   cgn   )gfilenamefsystem/base/lalr.upstream.scmŒ q ŒŒ  r ŒŒ  r ŒŒ s ŒŒ  r ŒŒ  › "ŒŒ  r ŒŒ  u ŒŒ & œ "ŒŒ / "ŒŒ 4 w ŒŒ 8 w ŒŒ < w ŒŒ G ž "ŒŒ N Ÿ "ŒŒ U z ŒŒ V z ŒŒ Y { ŒŒ [ { ŒŒ ^ | ŒŒ ` | ŒŒ  c gnameg new-stateŒCh Ã](C4L54LŽ5ŒC»gl  gfilenamefsystem/base/lalr.upstream.scmŒ „ ŒŒ  … ŒŒ † ŒŒ ‡ ŒŒ  ‡ !ŒŒ  ‡ ŒŒ  ‡ *ŒŒ  ‡ 0ŒŒ  ‡ *ŒŒ  ‡ ŒŒ   gnamegloopŒCÛh(¢]OLQ44M55NCšgloop !gfilenamefsystem/base/lalr.upstream.scmŒ ‚ ŒŒ „ ŒŒ  „ ŒŒ  „ ŒŒ # ƒ ŒŒ  % gnameg append-statesŒCh8] (CM£ ’$ ˜4LŽ5ŒCŽ"ÿÿÑùgl  1gitem  1gfilenamefsystem/base/lalr.upstream.scmŒ ™ ŒŒ  š ŒŒ › ŒŒ  œ 2ŒŒ  œ ŒŒ  œ ŒŒ   ŒŒ   ŒŒ  ž ŒŒ  ž )ŒŒ $ ž /ŒŒ & ž )ŒŒ ' ž ŒŒ + Ÿ ŒŒ 1 Ÿ ŒŒ  1 gnamegloopŒCÙêh€¡]OLQ45ˆ$T4  5 £ ¤45 ¤ ¤M$MMŽNCNMNCC™gcore  {gitemset  {gloop  grs   {gp  - ygx  3 >gx  E Pgfilenamefsystem/base/lalr.upstream.scmŒ ˜ ŒŒ ™ ŒŒ  ™ ŒŒ !   ŒŒ %   ŒŒ & ­ #ŒŒ - ¡ ŒŒ 3   "ŒŒ 3 ¢ ŒŒ ; ® #ŒŒ ? £ ŒŒ E £ ŒŒ M ¯ #ŒŒ W ° #ŒŒ ] ¥ ŒŒ d § +ŒŒ e § ŒŒ h ¨ 'ŒŒ j ¨ ŒŒ q ª (ŒŒ s ª ŒŒ w « ŒŒ  { gnamegsave-reductionsŒCh ã]M œ—N 4L >"G4L >"G4L>"G4L>"G4L>"G4L>"G4L>"G4L>"G4LM>"GL6Ûgfilenamefsystem/base/lalr.upstream.scmŒ ° ŒŒ  ± /ŒŒ  ± ŒŒ  ± ŒŒ ± ŒŒ ² ŒŒ  ³ ŒŒ + ´ ŒŒ ; µ ŒŒ K ¶ ŒŒ [ · ŒŒ k ¸ ŒŒ { ¹ ŒŒ ‹ º ŒŒ   » ŒŒ    gnameglalrŒCÙh@]4M5N""ˆ$M £ £¤Ž"ÿÿàCM"ÿÿÖýgl  2gx  0gfilenamefsystem/base/lalr.upstream.scmŒ ½ ŒŒ  ¾ ŒŒ ¾ ŒŒ  ¿ ŒŒ  À ŒŒ  À ŒŒ  Á ŒŒ  Á ŒŒ "   "ŒŒ & ¡ "ŒŒ '  ŒŒ * à ŒŒ 0 à ŒŒ 2 ¿ ŒŒ  : gnamegset-accessing-symbolŒCÙh8÷]4M5N" ˆ$M £¤Ž"ÿÿâCM"ÿÿØïgl  0gx  .gfilenamefsystem/base/lalr.upstream.scmŒ Å ŒŒ  Æ ŒŒ Æ ŒŒ  Ç ŒŒ  È ŒŒ  È ŒŒ  É ŒŒ  É ŒŒ " © #ŒŒ % Ê ŒŒ ( Ë ŒŒ . Ë ŒŒ 0 Ç ŒŒ  8 gnamegset-shift-tableŒCÙh8û]4M5N" ˆ$M £¤Ž"ÿÿâCM"ÿÿØógl  0gx  .gfilenamefsystem/base/lalr.upstream.scmŒ Í ŒŒ  Î ŒŒ Î ŒŒ  Ï ŒŒ  Ð ŒŒ  Ð ŒŒ  Ñ ŒŒ  Ñ ŒŒ " ± #ŒŒ % Ò ŒŒ ( Ó ŒŒ . Ó ŒŒ 0 Ï ŒŒ  8 gnamegset-reduction-tableŒCÝhX$] "@M£$1 •$——"ÿÿÙ—45 "ÿÿÂC "ÿÿ³gp  Fgcurmax  Fglength   Fgx  Fgfilenamefsystem/base/lalr.upstream.scmŒ Õ ŒŒ  Ö ŒŒ × ŒŒ × ŒŒ  Ø ŒŒ  Ù ŒŒ  Ù ŒŒ  Ú ŒŒ # Ú %ŒŒ - Ú ŒŒ 0 Û ŒŒ 1 Û ŒŒ D Û ŒŒ F Ö ŒŒ  S gnameg set-max-rhsŒChŸ]Ž(CŽ"ÿÿì—gl  gfilenamefsystem/base/lalr.upstream.scmŒ ß ŒŒ  à ŒŒ à ŒŒ á ŒŒ  â ŒŒ  â ŒŒ   gnameglastŒCÙÝh¸X]@OQ4M 5N 4M —5N"M ’$‰M¤M£M£$[ £ ”$"$M4 £5£M’€"$ £–—"ÿÿ”M ¤—"ÿÿM ¤—"ÿÿnMM ¤4 545N"*‘$"$MM4 5¤—"ÿÿÖ "ÿÿÏ4 ÿ5N45N"wM ’$lM £$ —"ÿÿáM£$<")( —"ÿÿ½M¤Ž—"ÿÿ× £"ÿÿÈ—"ÿÿ‹C "ÿÿ "ÿþwPglast ±gcount ( §gi  ( §grp  B ºgsp  B ºgt  R ~gc  É "gj  Ù gnelem  ì ùgi  & gnp  & grp  J ›gj  V gnp2  V gfilenamefsystem/base/lalr.upstream.scmŒ Þ ŒŒ  ä ŒŒ  ä ŒŒ  å ŒŒ  å "ŒŒ " å ŒŒ $ å ŒŒ ( ç ŒŒ - è ŒŒ 1 è ŒŒ 8 ê ŒŒ = ë ŒŒ B ì ŒŒ B ë ŒŒ L í ŒŒ P ² #ŒŒ R î ŒŒ R î ŒŒ e ï ŒŒ h ò 0ŒŒ o « #ŒŒ q ò 0ŒŒ r ñ $ŒŒ u ñ !ŒŒ v 𠌌 ‚ í ŒŒ ˆ ² #ŒŒ ‰ ô ŒŒ Œ ô 1ŒŒ ” ô ŒŒ š ö ŒŒ Ÿ ÷ ŒŒ § ÷ ŒŒ ­ ö ŒŒ ² ÷ ŒŒ º ÷ ŒŒ Á ú ŒŒ  û ŒŒ É û ŒŒ Ì ü ŒŒ Õ ü ŒŒ Ù ý ŒŒ Þ ý #ŒŒ â ý ŒŒ ì ý >ŒŒ ï · ŒŒ ú ý ,ŒŒ ý ý ŒŒ  ý ŒŒ  þ ŒŒ  þ ŒŒ  ÿ ŒŒ  ÿ ŒŒ &  ŒŒ +  ŒŒ /  ŒŒ 4  ŒŒ 8  ŒŒ ;  ŒŒ E  ŒŒ J  ŒŒ J  ŒŒ R  ŒŒ V  ŒŒ \  ŒŒ _  (ŒŒ i  "ŒŒ p  >ŒŒ q  $ŒŒ t  +ŒŒ w  3ŒŒ   $ŒŒ   ŒŒ „ ³ #ŒŒ Ž  ŒŒ ‘  "ŒŒ ›  ŒŒ   ŒŒ § ç ŒŒP  ± gnameg initialize-LAŒCÙÛh°È]`4M— 5N4M— 5"ƒˆ$k"Kˆ$7M£M’$MM£—¤Ž—"ÿÿÏŽ"ÿÿÂŽ"ÿÿª4 £5"ÿÿ™"M’$¤M£–—"ÿÿÝ" M•$"M£¤—"ÿÿà "ÿÿÙNMMM¤MM¤4M5N4M5N"ƒ(C £"R("S M £  M’$$ £   —¤M ¤M  ¤ "  Ž"ÿÿ® £"ÿÿ£Ž"ÿÿ}M"ÿÿu "ÿþó M"ÿþrÀgtemp-map  ªgng  Ÿgsp   Ÿgi  ' rgng2  ' rgsymbol  4 egs  x ‚gk  ’ •gi  ’ •gi  ¹ Ùgsp   gx   „gstate1   gi  ! sgstate2 . jgsymbol 5 ggk E `gfilenamefsystem/base/lalr.upstream.scmŒ  ŒŒ   ŒŒ   ŒŒ  ŒŒ  ŒŒ   ŒŒ   !ŒŒ   ŒŒ   ŒŒ   ŒŒ   ŒŒ #  ŒŒ '  ŒŒ *  ŒŒ .  ŒŒ 3  9ŒŒ 4  ŒŒ 4  ŒŒ ;  ŒŒ ?  ŒŒ H  ,ŒŒ I  'ŒŒ J  ŒŒ M  !ŒŒ P  )ŒŒ X  ŒŒ [  ŒŒ e  ŒŒ j  ŒŒ r  ŒŒ r  ŒŒ s  ŒŒ x  2ŒŒ x  $ŒŒ  « #ŒŒ „  ŒŒ Ž  ŒŒ ’  ŒŒ —  ŒŒ ›  ŒŒ ¢ " ŒŒ © # ŒŒ ª # ŒŒ ­ # 8ŒŒ µ # ŒŒ ¹ & ŒŒ ¾ ' ŒŒ  & ŒŒ Ï ( .ŒŒ Ð ( ŒŒ Ó & ŒŒ Ù & ŒŒ ä * ŒŒ ë + ŒŒ ò , ŒŒ ó - %ŒŒ ü - ŒŒ ý . #ŒŒ  . ŒŒ  0 ŒŒ  2 ŒŒ  2 ŒŒ  © #ŒŒ  2 ŒŒ ! 4 ŒŒ . 6 )ŒŒ . 6 ŒŒ 5 7 )ŒŒ 5 6 ŒŒ < 8 ŒŒ @ 8 ŒŒ E 9 )ŒŒ E 9 ŒŒ N : ?ŒŒ O : "ŒŒ V ; "ŒŒ ] < "ŒŒ m 4 1ŒŒ s 4 ŒŒ x « #ŒŒ ~ 4 ŒŒ ‡ 0 )ŒŒ  0 ŒŒ •  ŒŒ Ÿ  ŒŒV  ª gnameg set-goto-mapŒCÞßàhÎ]""t”$+4>"G4>"G C– œM£‘$C’$ —"ÿÿ™™"ÿÿŒM£M—£™"ÿÿxÆgstate  Žgsymbol  Žglow   zghigh   zgmiddle  B zgs  I zgfilenamefsystem/base/lalr.upstream.scmŒ ? ŒŒ  @ ŒŒ B ŒŒ  B ŒŒ  D ŒŒ  D ŒŒ  D ŒŒ D ŒŒ ) D >ŒŒ ? F #ŒŒ B F ŒŒ B F ŒŒ I G ŒŒ I F ŒŒ P I ŒŒ T H ŒŒ \ K ŒŒ ` H ŒŒ c L ŒŒ m L ŒŒ r N ŒŒ z N ŒŒ z @ ŒŒ  @ ŒŒ „ A -ŒŒ … A ŒŒ † A ŒŒ Ž @ ŒŒ  Ž gnamegmap-gotoŒCÙáÛhXÚ]`4M 5N"*M ‘$"$MM4 5¤—"ÿÿÖ "ÿÿÏ4M 5"÷M ’$êM£M£M£$¸"¢ˆ$€M£M’$-M£$Ž4L5Œ"ÿÿÈŽ"ÿÿ»M˜  œ4  5    £ ¡¤   Ž"ÿÿ|ˆ$45¤"" £"ÿÿP"——"ÿÿ" "ÿþÿL6Ògi  :gnelem # 0greads I Vgi O Fgrowp  O Fgrowf  ] Bgstateno  d ?gsp  k <gj  w gedges  w gsymbol  „ þgb Á îgx Ô ëgy Ô ëgfilenamefsystem/base/lalr.upstream.scmŒ Q ŒŒ  R ŒŒ R ŒŒ  S ŒŒ  S ŒŒ  S ŒŒ # S 8ŒŒ & · ŒŒ 1 S 'ŒŒ 4 S ŒŒ : S ŒŒ B U ŒŒ I U ŒŒ O W ŒŒ T X ŒŒ X X ŒŒ ] Y ŒŒ ] Y ŒŒ d Z ŒŒ d Y ŒŒ k [ ŒŒ k Y ŒŒ s \ ŒŒ w ] ŒŒ z ^ ŒŒ ~ ^ ŒŒ ƒ _ ?ŒŒ „ _ &ŒŒ „ _ ŒŒ ‹ ` ŒŒ ` ŒŒ ” a "ŒŒ ˜ a ŒŒ › b )ŒŒ œ b 7ŒŒ § b 1ŒŒ ¯ b "ŒŒ ² d )ŒŒ ¼ d "ŒŒ Á f .ŒŒ Á f ŒŒ Ç ŒŒ È ŒŒ É ŒŒ Ñ "ŒŒ Ò ŒŒ Ô ŒŒ Ô ŒŒ á ‘ #ŒŒ ä ‘ ŒŒ å ‘ ŒŒ ñ g 'ŒŒ û g ŒŒ  h ŒŒ  h ŒŒ  i 1ŒŒ  i ŒŒ  ] ŒŒ  « #ŒŒ  ] ;ŒŒ ' ] ŒŒ . j ŒŒ 1 j ŒŒ 9 j ŒŒ F W ŒŒ V k ŒŒC  V gnameg initialize-FŒCÙâhøã]:4545".‘$"(¤¤—"ÿÿÒ "ÿÿË"n‘$"h£ˆ$G"7ˆ$,£ŽŒޤŽ"ÿÿÓ""ÿÿÁ"—"ÿÿ’ "ÿÿ‹"!‘$"£Ž¤—"ÿÿß "ÿÿØCÛgr-arg  ÷gn  ÷gnew-end   ÷gnew-R   ÷gi   Hgx  , ?gi  S Ágsp  e ¸gsp2  r ©gx  | ¥gy  ƒ ¢gi  Ì í gfilenamefsystem/base/lalr.upstream.scmŒ | ŒŒ  } ŒŒ ~ ŒŒ  } ŒŒ   ŒŒ  € ŒŒ #  ŒŒ )  ŒŒ ,  ŒŒ ,  ŒŒ 5 ‚ ŒŒ < ƒ ŒŒ B  ŒŒ H  ŒŒ S „ ŒŒ X … ŒŒ \ „ ŒŒ e † ŒŒ e † ŒŒ j ‡ ŒŒ n ‡ ŒŒ r ˆ ŒŒ u ‰ ŒŒ y ‰ ŒŒ | Š ŒŒ | Š ŒŒ ƒ ‹ ŒŒ ƒ Š ŒŒ Œ Œ *ŒŒ Œ "ŒŒ Ž Œ ŒŒ •  -ŒŒ –  ŒŒ ™ Ž ŒŒ Ÿ Ž ŒŒ © ˆ ŒŒ » „ ŒŒ Á „ ŒŒ Ì  ŒŒ Ñ  ŒŒ Õ  ŒŒ â ‘ "ŒŒ ã ‘ ŒŒ ä ‘ ŒŒ ç  ŒŒ í  ŒŒ/  ÷ gnameg transposeŒChPP]"*(CM£‘$CŽ"ÿÿÖM£ £"ÿÿ½Hgstateno  Igsymbol  Igj   0gstno   0gst2   0gs  5 ?gfilenamefsystem/base/lalr.upstream.scmŒ ™ ŒŒ  š ŒŒ œ ŒŒ  ž ŒŒ  ž ŒŒ  Ÿ ŒŒ  Ÿ ŒŒ Ÿ ŒŒ & ¡ ŒŒ 0 ¡ ŒŒ 0 š ŒŒ 5 š "ŒŒ 5 š ŒŒ < « #ŒŒ I š ŒŒ  I gnameg get-stateŒCÙÞãàh(X]€OLLQ4M5N"òM‘$"ìM £MM ££"³ˆ$¡"M£  ”$"4 5 —   Œ "ÿÿÒ M£$"«M—£ "Ž $"  ’$$M £‘$    "ÿÿÕ  —  "ÿÿÈ $M M £Œ¤"M4>"G4>"G4>"G"M£  "ÿÿd "z $ Ž"ÿþðM £ ÿ’$AM ’$%M £€ Ž ™4L  5Œ   "ÿÿ¯     "ÿÿœ     "ÿÿ‰ Ž™   "ÿÿq M£ "ÿþkM¤"M£"ÿþ?—"ÿþ "ÿþ4LMM5NCPg get-state &gi gstate1  :  gsymbol1  :  grulep  B õgedges  B õg*rulep  L êgrp  R Ñgstateno  R Ñgstates R Ñg*rp W Ñgst j ƒgk – ;gfound œ *gi œ *gdone ? ¹gstp ? ¹grp2 ? ¹gedgp  ? ¹g*rp  W ¹gfilenamefsystem/base/lalr.upstream.scmŒ — ŒŒ  £ ŒŒ  £ ŒŒ ¤ ŒŒ % ¥ ŒŒ ) ¤ ŒŒ 2 ¦ ŒŒ 9 § .ŒŒ : § ŒŒ : ¦ ŒŒ B ¨ ŒŒ E ª ŒŒ I ª ŒŒ L « ŒŒ L « ŒŒ R ¬ ŒŒ W ¯ ŒŒ W ¯ ŒŒ ] ° ŒŒ a ° ŒŒ b ± "ŒŒ j ± ŒŒ o ² !ŒŒ v ² -ŒŒ € ² ŒŒ ˆ µ #ŒŒ Œ µ ŒŒ • n $ŒŒ – n ŒŒ – n ŒŒ œ o ŒŒ ¢ p ŒŒ ¬ p ŒŒ ° p ŒŒ µ q ŒŒ ¸ q ŒŒ ¼ q ŒŒ Ç r ŒŒ Ì s ŒŒ Ô s ŒŒ Ú u ŒŒ å y *ŒŒ æ y ŒŒ ç x ŒŒ ì v ŒŒ ð v ŒŒ õ v ŒŒ þ w ŒŒ  w ŒŒ  w ŒŒ  w >ŒŒ * o ŒŒ 0 o ŒŒ 8 o ŒŒ ? ¸ ŒŒ E ¼ ŒŒ H Å &ŒŒ R Å ŒŒ W ½ +ŒŒ W ½ ŒŒ ^ ¾ &ŒŒ b ¾ "ŒŒ g ¾ &ŒŒ p ¿ 2ŒŒ q ¿ -ŒŒ t À -ŒŒ w Á -ŒŒ x  3ŒŒ }  =ŒŒ   3ŒŒ „  -ŒŒ  ¿ &ŒŒ £ à &ŒŒ ¹ ¸ ŒŒ ½ ¹ +ŒŒ À º +ŒŒ Î ¸ ŒŒ Ñ ¬ ŒŒ Ö ¬ ŒŒ Ý ® $ŒŒ ç ¬ ŒŒ ñ Æ ŒŒ õ ¨ ŒŒ ú ¨ ŒŒ û © ŒŒ  ¨ ŒŒ  ¤ ŒŒ  ¤ ŒŒ  Ç ŒŒ $ Ç ŒŒ[  & gnamegbuild-relationsŒChp~](MM£"X’$M">ˆ$.M£M£4LM>"GŽ"ÿÿË—"ÿÿµM£"ÿÿ·C "ÿÿ¡vgn  lgi egsp   XgLA-i  , OgF-j  , Ogfilenamefsystem/base/lalr.upstream.scmŒ Ë ŒŒ  Ì ŒŒ  Ì ŒŒ Í ŒŒ  Î ŒŒ  Î ŒŒ  Ï ŒŒ  Ð ŒŒ ! Ð ŒŒ & Ñ ŒŒ + Ò ,ŒŒ , Ò ŒŒ , Ñ ŒŒ 1 Ó ŒŒ I Ô ŒŒ O Ô ŒŒ R Õ ŒŒ X Õ ŒŒ X Ï ŒŒ ] Ï ŒŒ c Ï ŒŒ e Í ŒŒ  l gnamegcompute-lookaheadsŒCh¹]1M—NMM¤MM¤L£ˆ$”"„ˆ$y M£‘$4L>"G"M£M£”$MM£¤"M£M£4LM>"GŽ"ÿÿƒ""ÿÿt"M£‘$F">MM£M™NMM¤‘$C4LM£M£M>"G"ÿÿÂ"ÿÿ¾C±gi  gheight  grp   grp2  + ¯gj  5 «gF-i   ŸgF-j   Ÿgj  Ð  gfilenamefsystem/base/lalr.upstream.scmŒ à ŒŒ  á ŒŒ  á ŒŒ  â ŒŒ  ã ŒŒ  ä ŒŒ  å ŒŒ  å ŒŒ # æ ŒŒ ' æ ŒŒ + ç ŒŒ . è ŒŒ 2 è ŒŒ 5 é ŒŒ 5 é ŒŒ = ê ŒŒ > ê ŒŒ B ê ŒŒ C ë ŒŒ ] ì ŒŒ b í ŒŒ c ì ŒŒ g ì ŒŒ p î /ŒŒ q î ŒŒ z ï !ŒŒ  ð !ŒŒ  ï ŒŒ „ ñ ŒŒ ¢ ò ŒŒ ¨ ò ŒŒ ¯ ç ŒŒ À ó ŒŒ à ó ŒŒ Ç ó ŒŒ Ë ô ŒŒ Ð õ ŒŒ Ð õ ŒŒ Õ ö ŒŒ × ö ŒŒ Þ ÷ ŒŒ ã ø ŒŒ ç ø ŒŒ ê ú ŒŒ ñ ú #ŒŒ ö û #ŒŒ ý ú ŒŒ  ý ŒŒ  ô ŒŒ2   gnamegtraverseŒCÙh¨¯]1HHHHO LLLQM –K4M— 5K4M— 5K K"CM’$8 J£‘$$£ˆ$4>"G""—"ÿÿ¿C "ÿÿ¶§grelation  ¡ginfinity  ¡gINDEX   ¡gVERTICES   ¡gtop   ¡gtraverse   ¡gi  W šgfilenamefsystem/base/lalr.upstream.scmŒ Ù ŒŒ 8 Ú ŒŒ ; Û ŒŒ @ Û ŒŒ C Û ŒŒ F Ü ŒŒ K Ü "ŒŒ N Ü ŒŒ W ÿ ŒŒ \  ŒŒ `  ŒŒ f  ŒŒ g  ŒŒ k  ŒŒ p  ŒŒ q  ŒŒ u  ŒŒ v  ŒŒ ’  ŒŒ ˜  ŒŒ š ÿ ŒŒ  ¡ gnamegdigraphŒCh±]ŒMŒNC©grule  gsym  gfilenamefsystem/base/lalr.upstream.scmŒ  ŒŒ   ŒŒ  ŒŒ  ŒŒ   gnamegadd-rule-precedence!ŒCäåoæçèé#êëìíîÝhHÀ]SM£45ˆ$Ž‘$C" ˜M£ŽŽM£Ž4M5$ŽM£ŽŽ"c"QM£  ’$ "J—  M•$  M˜ M £ŽŽ  "ÿÿÁ   "ÿÿµ  M£  "ÿÿ¡  ”$"- ’$"&"&" †$M& ŽŽŽŒCŽC†$C  ˜ M–M•$ MM˜£"M£ M ŒN M& ŽŽŽŒCŽC “$u “$i ˜ ˜ M–M•$ MM˜£"M£ M ŒN M& ŽŽŽŒCŽ45C"ÿþ"ÿýþMŒ¤C¸gstate  Cgsymbol  Cg new-action   Cg state-actions   Cgactions   Cgcurrent-action   2grule  4 gt  N Ðgsym  Y fgi  n ¿gprec n ¿gitem s ¿gi1 † ¼gsym ˜ ¥gsym-prec  Ð g sym-assoc  Ð g rule-prec Ð gkey   ±gn  b gl  ˆ ”gn  Ô ógl  ú gfilenamefsystem/base/lalr.upstream.scmŒ O ŒŒ  P ŒŒ  P ŒŒ Q ŒŒ  P ŒŒ  R ŒŒ  R ŒŒ  S "ŒŒ  S ŒŒ & T ŒŒ * T ŒŒ 1 b 7ŒŒ 4 b ŒŒ ;  ŒŒ <  ŒŒ C  ŒŒ D  ŒŒ F  ŒŒ N  ŒŒ Y  "ŒŒ Y  ŒŒ `  ŒŒ a  ŒŒ n " ŒŒ s $ ŒŒ s $ ŒŒ y & ŒŒ } & ŒŒ † ( ŒŒ † ( ŒŒ ) ŒŒ ‘ ) ŒŒ ˜ + 4ŒŒ ˜ + ŒŒ Ÿ  ŒŒ    ŒŒ ­ + ŒŒ ¹ , ŒŒ ¿ " ŒŒ Ä " ŒŒ Í " ŒŒ Ð 7 ŒŒ Û ; ŒŒ ß : ŒŒ á ; %ŒŒ ê < ŒŒ î : ŒŒ ð < %ŒŒ ø = ŒŒ ü : ŒŒ þ = %ŒŒ  > ŒŒ  : ŒŒ  > %ŒŒ  ? %ŒŒ  b ŒŒ - û ŒŒ 1 d %ŒŒ 4 e 3ŒŒ 9 e RŒŒ ; e AŒŒ < e )ŒŒ A f 3ŒŒ D f )ŒŒ O b ŒŒ S k &ŒŒ W k TŒŒ X k `ŒŒ ] l &ŒŒ b l ;ŒŒ b l /ŒŒ i é ŒŒ m é ŒŒ t ê "ŒŒ u ê ŒŒ ~ ë ŒŒ ƒ l MŒŒ ˆ j %ŒŒ  D ŒŒ ‘ D ŒŒ ˜ û ŒŒ œ m %ŒŒ Ÿ n 3ŒŒ ¤ n RŒŒ ¦ n AŒŒ § n )ŒŒ ¬ o 3ŒŒ ¯ o )ŒŒ ± W ŒŒ µ W ŒŒ ¹ W ŒŒ ½ W 3ŒŒ Á W ŒŒ à [ ŒŒ Ä [ @ŒŒ É [ OŒŒ Ê [ [ŒŒ Ï \ ŒŒ Ô \ 0ŒŒ Ô \ $ŒŒ Û é ŒŒ ß é ŒŒ æ ê "ŒŒ ç ê ŒŒ ð ë ŒŒ õ \ BŒŒ ú Z ŒŒ  D ŒŒ  D ŒŒ  û ŒŒ  ] ŒŒ  ^ (ŒŒ  ^ GŒŒ  ^ 6ŒŒ  ^ ŒŒ  _ (ŒŒ  _ 6ŒŒ ( _ ŒŒ = q 2ŒŒ @ q ,ŒŒ A q ŒŒz  C gnameg add-actionŒCh8ç] "*M‘$C4L>"G—"ÿÿÖ "ÿÿÏßgstate  7gaction  7gi   0gfilenamefsystem/base/lalr.upstream.scmŒ t ŒŒ  u ŒŒ v ŒŒ  u ŒŒ  w ŒŒ * u ŒŒ 0 u ŒŒ  7 gnamegadd-action-for-all-terminalsŒCÙ#ïðêññÞàh y]4>"G6qgmessage  gfilenamefsystem/base/lalr.upstream.scmŒ I ŒŒ  J ŒŒ  K ŒŒ   C hhâ]pHO OLLLLLLLLLQL QK4M5N"áM‘$"ÛM£$L £ •$>"ÑM —£"·’$ª M £˜M £"t M ’$g ž  ‘$4 >"G"  ‘$ — —£  —    "ÿÿ© — œ —     "ÿÿ"  £     "ÿÿy—"ÿÿS"sM £"ÿÿ> £ ‘$WM £$FM&4  £˜>"G"4  £˜>"G""ÿþÒ""ÿþÊ""M£$_"Lˆ$AM£M•$4M˜>"G"Ž"ÿÿ¾"  £"ÿÿ©"—"ÿþ "ÿþ4M >"G4J5M”$ J6CÚgconflict-messages  cg add-action  cgadd-action-for-all-terminals   cgi  N /gred  ` ·gk  | Ggj  ‚ 9grule  — 5glav  — 5gtoken Ÿ gx Ÿ gy Ÿ gz Ÿ g in-la-set? ­ Ôgshiftp  ¼ &gk  È gstate  Ò gsymbol  Ù  gfilenamefsystem/base/lalr.upstream.scmŒ 4 ŒŒ > A ŒŒ A y ŒŒ F y ,ŒŒ H y ŒŒ J y ŒŒ N { ŒŒ S | ŒŒ W { ŒŒ ` } ŒŒ ` } ŒŒ h ~ ŒŒ l ² #ŒŒ n ~ ŒŒ r ~ ŒŒ { ƒ 0ŒŒ | ƒ ŒŒ | ƒ ŒŒ ‚ „ ŒŒ ‡ … ŒŒ ‹ … ŒŒ Œ † $ŒŒ ‘ † 'ŒŒ ’ † $ŒŒ — ‡ $ŒŒ — † ŒŒ Ÿ ˆ ŒŒ ¤ ‰ ŒŒ ¨ ‰ ŒŒ ­ ‹ 4ŒŒ ­ ‹ "ŒŒ ³ Œ (ŒŒ · Œ $ŒŒ ¸  (ŒŒ Ø Ž +ŒŒ Ù Ž &ŒŒ Ý Ž "ŒŒ à  -ŒŒ å  =ŒŒ æ  -ŒŒ ê ’ -ŒŒ ö  &ŒŒ ù “ -ŒŒ þ “ 9ŒŒ  “ HŒŒ  “ &ŒŒ  ˆ ŒŒ  ˆ 3ŒŒ & ˆ ŒŒ ) ” ŒŒ / ” ŒŒ 9 „ ŒŒ > „ ŒŒ D „ ŒŒ G  ŒŒ K ² #ŒŒ M  ŒŒ Q  ŒŒ V  +ŒŒ Z  ŒŒ ^ û ŒŒ b € ŒŒ c  ŒŒ h  4ŒŒ m ³ #ŒŒ n  7ŒŒ o  4ŒŒ t  ŒŒ  ‚ ŒŒ ‡ ‚ "ŒŒ ˆ ‚ +ŒŒ  ³ #ŒŒ Ž ‚ .ŒŒ  ‚ +ŒŒ ” ‚ ŒŒ ¼ – ŒŒ ¼ – ŒŒ Ä — ŒŒ È ˜ ŒŒ Ë ™ ŒŒ Ï ™ ŒŒ Ò š ŒŒ Ò š ŒŒ Ù › !ŒŒ Ù š ŒŒ à œ ŒŒ ä œ ŒŒ å  ŒŒ î  &ŒŒ õ  ŒŒ  ž ŒŒ  ž ŒŒ  ˜ ŒŒ  « #ŒŒ  ˜ ŒŒ ) { ŒŒ / { ŒŒ 7   ŒŒ >   ŒŒ C   ŒŒ L G ŒŒ U G ŒŒ Y G ŒŒ a H ŒŒi  c gnameg build-tablesŒCäòhÀd])H"aˆ$VŽ4J545$* ’$$ Ž—"  ŒJŒK""Ž"ÿÿ©""ÿÿ—"<(CŽ”$ŽŽ"ÿÿÕŽ"ÿÿÄJ "ÿÿ¶\gacts  Àgaccums  Àgl  jgx   fgy  cgl  v ²gmax  v ²gsym  v ²gx  ‚ ² gfilenamefsystem/base/lalr.upstream.scmŒ ¤ ŒŒ  ¥ ŒŒ  ¥ ŒŒ ¦ ŒŒ § ŒŒ  § ŒŒ  ¨ ŒŒ  ¨ ŒŒ  © ŒŒ ¨ ŒŒ # ª ŒŒ - ª ŒŒ 1 ª %ŒŒ 5 ª ŒŒ ; « ŒŒ @ ¬ )ŒŒ A ¬ $ŒŒ B ¬ ŒŒ I ­ +ŒŒ M ­ %ŒŒ O ­ ŒŒ Z ® ŒŒ ` ® ŒŒ j ¦ ŒŒ v ° ŒŒ | ± ŒŒ ‚ ³ ŒŒ ‚ ³ ŒŒ ‡ ´ ŒŒ Š ´ ŒŒ Ž ´ ŒŒ ‘ µ ŒŒ ” µ "ŒŒ — µ *ŒŒ ¡ µ ŒŒ ¤ ¶ ŒŒ ² ¶ ŒŒ ² ° ŒŒ'  À gnamegmost-common-actionŒCÄóh]4L5ŽŒCˆgact  gfilenamefsystem/base/lalr.upstream.scmŒ ¹ ŒŒ  º ŒŒ º #ŒŒ º ŒŒ  » ŒŒ  º ŒŒ   Ch‰]LO6gacts  gfilenamefsystem/base/lalr.upstream.scmŒ ¸ ŒŒ  ¹ ŒŒ   gnamegtranslate-termsŒCôõêh —]45 ‘$ ŽL‚"€Cgx  gfilenamefsystem/base/lalr.upstream.scmŒ Æ /ŒŒ  Ç >ŒŒ Ç ;ŒŒ  Ç 6ŒŒ  È @ŒŒ  È ;ŒŒ  Ç 1ŒŒ   CöÄóh]4L5ŽŒCˆgact  gfilenamefsystem/base/lalr.upstream.scmŒ ¹ ŒŒ  º ŒŒ º #ŒŒ º ŒŒ  » ŒŒ  º ŒŒ   C h˜ß])OQ"zM‘$CM£M£‹$<45M$"44LO55Œ¤"M4O5Œ¤—"ÿÿ† "ÿÿ×gterms  ˜gmost-common-action  ˜gtranslate-terms   ˜gi   ‘gacts  ' ˆgact  : kgfilenamefsystem/base/lalr.upstream.scmŒ £ ŒŒ  ¾ ŒŒ  ¿ ŒŒ ¾ ŒŒ ' À ŒŒ ' À ŒŒ . Á ŒŒ / Á ŒŒ 3 Á ŒŒ 4  ŒŒ :  ŒŒ B Ä !ŒŒ H Ä .ŒŒ P Ä :ŒŒ S Ä !ŒŒ T Å !ŒŒ W Æ "ŒŒ f Å !ŒŒ g Ä ŒŒ h à ŒŒ u Ë ŒŒ v ¹ ŒŒ „ Ë ŒŒ … Ê ŒŒ ‹ ¾ ŒŒ ‘ ¾ ŒŒ  ˜ gnamegcompact-action-tableŒC÷øùLúåÿéLÛ   Ä ê Äh|]45ŒCtgx  gfilenamefsystem/base/lalr.upstream.scmŒ 3 (ŒŒ  3 :ŒŒ  3 DŒŒ  3 4ŒŒ   Chà ]{‰$͈$¿"ªˆ$cˆ$ò&"&"‚$¿Ž(6—45Ž "‚ (Ž  "ÿÿ{   Š$)4  5$4  >"G""4  >"G Ž  Œ   Œ   "ÿÿ~Ž   "ÿÿm6Š$)45$4 >"G""4 >"GŽŒ Œ"ÿþ–"1ˆ$e  ˆ$R   Š$>4 5  $" 4  5 $  6Ž Œ"ÿÿ£ 6645ŒŒ 45ŒŒ 45 4 5Œ 4 5 ‘$6"Z ˆ$0 4L  5 Ž45–Œ "ÿÿÉ45   454?6 ŽŒŒ Œ  "ÿÿˆ"ÿþÄ "ÿýE66 gtokens  Þggrammar  Þgk   Þglst   ¾g rev-terms   ¾grev-terms/prec   ¾g prec-level   ¾gterm   ~gt  * Ngprec  g vgprec  v goptype v gl ~ g rev-terms ~ grev-terms/prec ~ gterm œ glst  ‚ ³grev-nonterm-defs  ‚ ³gdef Œ îgnonterm ˜ çgt ª Ãgterms û ³g terms/prec  ³g nonterm-defs  ³gnonterms ! ³gdefs ; •gruleno  ; •g comp-defs  ; •g nonterm-def  E rg compiled-def  T rgcompiled-nonterm-defs  y •gfilenamefsystem/base/lalr.upstream.scmŒ Ò ŒŒ  ä ŒŒ â ŒŒ æ ŒŒ  â ŒŒ  ë ŒŒ  ï ŒŒ  ï ŒŒ  𠌌  𠌌 # ò ŒŒ ' ñ ŒŒ * ó ŒŒ * ó ŒŒ R ó ŒŒ U ô %ŒŒ Y ó ŒŒ ]  ŒŒ a  ŒŒ d õ #ŒŒ g ö /ŒŒ g ö #ŒŒ j Þ ŒŒ p Þ ŒŒ r Þ ŒŒ s Þ ŒŒ v õ ŒŒ ~ ÷ ŒŒ „ ú ŒŒ ‡ û #ŒŒ ™ û ŒŒ œ ü (ŒŒ œ ü ŒŒ ¡ › ŒŒ ¥ × ŒŒ ¦ Ú ŒŒ ² × ŒŒ ³ Û ŒŒ · Û ŒŒ ¾ Û ŒŒ Ï Ù ŒŒ Ó Ù ŒŒ Ú Ù ŒŒ å ÿ ŒŒ ê  ŒŒ ó  %ŒŒ ö  ŒŒ  þ ŒŒ  ÷ ŒŒ  ÷ 5ŒŒ  ÷ ŒŒ   ŒŒ   ŒŒ  › ŒŒ  × ŒŒ ! Ú ŒŒ - × ŒŒ . Û ŒŒ 2 Û ŒŒ 9 Û ŒŒ J Ù ŒŒ N Ù ŒŒ U Ù ŒŒ `  ŒŒ e  ŒŒ i  (ŒŒ m  ŒŒ p  ŒŒ ~  ŒŒ ‚  ŒŒ …  ŒŒ ‰  ŒŒ Œ  ŒŒ Œ  ŒŒ ‘  ŒŒ •  ŒŒ ˜  'ŒŒ ˜  ŒŒ  ˜ ŒŒ ¡  ŒŒ ¢  %ŒŒ ª  !ŒŒ ¸  %ŒŒ Ç  ŒŒ Ë  -ŒŒ Ï  !ŒŒ Ò  (ŒŒ ×  (ŒŒ ß  !ŒŒ ã  -ŒŒ ç  !ŒŒ ë  $ŒŒ ì  VŒŒ î  ŒŒ ð Ô ŒŒ ò  BŒŒ ó  RŒŒ ú  <ŒŒ û  'ŒŒ û  ŒŒ ÿ  -ŒŒ   BŒŒ   RŒŒ   <ŒŒ   'ŒŒ   ŒŒ   'ŒŒ   ŒŒ   -ŒŒ   6ŒŒ !  'ŒŒ !  ŒŒ $  ŒŒ ,  ŒŒ 0  ŒŒ 4  $ŒŒ 5  TŒŒ 7  ŒŒ ; ! ŒŒ > % ŒŒ B % ŒŒ E & 3ŒŒ E & ŒŒ H ' 3ŒŒ T & ŒŒ Y + +ŒŒ \ , 5ŒŒ c , +ŒŒ h - +ŒŒ r + ŒŒ s / ;ŒŒ y / ŒŒ „ 3 #ŒŒ  5 #ŒŒ • 0 ŒŒ • ! ŒŒ — ! 9ŒŒ š ! EŒŒ  Ô ŒŒ   ! 9ŒŒ § ! 3ŒŒ © $ 3ŒŒ ³ ! ŒŒ ³  ŒŒ ¶  8ŒŒ ¾  ŒŒ ¾ ë ŒŒ Á ì "ŒŒ  í "ŒŒ Ï ë ŒŒ Ó ç ŒŒ Ô ç QŒŒ Ö ç ŒŒ Ú å ŒŒ Þ å ŒŒœ  Þ gnamegrewrite-grammarŒCLh8ì] 4LL5$C4LL5$M–C6ägx  5gPosInNT 5gPosInT  5gfilenamefsystem/base/lalr.upstream.scmŒ < ŒŒ  = ŒŒ = ŒŒ  > ŒŒ  @ ŒŒ  @ ŒŒ ' A ŒŒ , B ŒŒ 1 C ŒŒ 5 C ŒŒ  5 gnamegencodeŒCLhÐF](CŽ4L5$" 4L5$ 4L5ŒCˆ${&jŽˆ$ZŽŽ(J4ŽL5$3(%4LL4LŽL5>"G"ÿÿcL666666>gl  Ïgfirst  Ïgrest   Ïgt   6gfilenamefsystem/base/lalr.upstream.scmŒ F ŒŒ  G ŒŒ H ŒŒ I ŒŒ  J ŒŒ  I ŒŒ  L ŒŒ  L ŒŒ + L )ŒŒ : K ŒŒ = M ŒŒ D M ŒŒ H N ŒŒ L K ŒŒ O O ŒŒ Q O &ŒŒ U N ŒŒ X P ŒŒ Y P ŒŒ ] P ŒŒ ` Q ŒŒ e P ŒŒ f R ŒŒ k R !ŒŒ p R ŒŒ t P ŒŒ z S ŒŒ { U ŒŒ € U 7ŒŒ … U DŒŒ Š U 7ŒŒ U ŒŒ Ÿ V ŒŒ £ W $ŒŒ § W ŒŒ « X ŒŒ ¯ X ŒŒ ³ X ŒŒ · X ŒŒ » X ŒŒ ¿ X ŒŒ à Z ŒŒ Ç Z ŒŒ Ë Z ŒŒ Ï Z ŒŒ.  Ï gnamegloopŒCh(µ] OLLLLQ6­grhs  'gruleno  'gloop   'gfilenamefsystem/base/lalr.upstream.scmŒ E ŒŒ  F ŒŒ  ' gnamegprocess-prec-directiveŒCêÄñLh8¥] 4L5$" 4L5$C6gx  2gt $gfilenamefsystem/base/lalr.upstream.scmŒ t ŒŒ  u +ŒŒ u 'ŒŒ  u <ŒŒ ( u ŒŒ . v .ŒŒ 2 v "ŒŒ  2 CLL£ !"!h0é]L”$C4445554L—5ŒCágj  *gfilenamefsystem/base/lalr.upstream.scmŒ Š *ŒŒ  ‹ 0ŒŒ ‹ ,ŒŒ Œ 0ŒŒ   6ŒŒ  Ž 7ŒŒ   8ŒŒ   8ŒŒ  Ž 7ŒŒ  6ŒŒ ! ‘ 6ŒŒ & ‘ >ŒŒ ( ‘ 6ŒŒ )  0ŒŒ  * gnamegloop-jŒCÛ#hØ™]lHOOLQLLQ45KŽˆ$†45"iˆ$\4 – ÿ–5 Ž 4 Œ5 4O >"G"sˆ$h&VŽ„$""4 Ž5€$"ŽŽ„€$4  >"G""Ž"ÿÿ‘" "ÿÿ…"Y4 5  444 555OQ4 5ŒŒ  — Œ Œ  "ÿþÜ ˆ$4 &' Žˆ$ ŽŽ —  ŽŒ Œ  "ÿþ©"ÿÿp"ÿÿl"ÿÿh 6Ž   "ÿþˆ 6‘g nonterm-def  Ñgruleno  Ñgterms   Ñgnonterms   ÑgNo-NT   Ñgencode   Ñgprocess-prec-directive   Ñgname  J Èglst  P ¹gi P ¹grev-productions-and-actions P ¹grhs g ³grest l ³gprod { ³grhs  œ gt  ° âgt  É ßg rhs-length  " tgloop-j  I Ygaction  [ tgfilenamefsystem/base/lalr.upstream.scmŒ 8 ŒŒ 2 : ŒŒ = h ŒŒ > h ŒŒ B h ŒŒ C j ŒŒ H j $ŒŒ J j ŒŒ J j ŒŒ P k ŒŒ S n ŒŒ W n ŒŒ X p ŒŒ ] p 5ŒŒ b p ?ŒŒ g p ŒŒ g p ŒŒ l q ŒŒ l p ŒŒ o r ŒŒ v r /ŒŒ y r )ŒŒ { r ŒŒ { p ŒŒ ~ t ŒŒ œ ] ŒŒ Ÿ ^ ŒŒ £ ^ ŒŒ ¦ ` ŒŒ ¨ ` &ŒŒ ¬ ` ŒŒ ¯ a "ŒŒ ° a ŒŒ ° a ŒŒ ¾ b ŒŒ à b (ŒŒ È b ŒŒ É b ŒŒ É a ŒŒ Ù c 'ŒŒ Û c ŒŒ Ü c ŒŒ æ ` ŒŒ ç d ŒŒ ë d ŒŒ ò d ŒŒ  e ŒŒ  e ŒŒ  ] ŒŒ  ‚ )ŒŒ " ‚ ŒŒ & „ $ŒŒ ( … 0ŒŒ ) … 7ŒŒ , † 8ŒŒ 2 ˆ 9ŒŒ 3 ‰ 9ŒŒ ; † 8ŒŒ = … 7ŒŒ @ … *ŒŒ I Š *ŒŒ Z … $ŒŒ [ „ ŒŒ [ ‚ ŒŒ b “ ŒŒ g ” %ŒŒ j ” ŒŒ t ’ ŒŒ t { ŒŒ w { ŒŒ { { ŒŒ ~ | ŒŒ € | +ŒŒ „ { ŒŒ ‡ } "ŒŒ ˆ } ŒŒ Œ { ŒŒ  ~ ŒŒ “  ŒŒ ˜ € .ŒŒ š € #ŒŒ  € ŒŒ § ~ ŒŒ ¹ o ŒŒ ¹ k ŒŒ ¼ k ŒŒ ¾ m 3ŒŒ È k ŒŒ Ì i ŒŒ Ï i FŒŒ Ñ i ŒŒ\  Ñ gnamegrewrite-nonterm-defŒCh8]"$ˆ$‡$CŽ—"ÿÿÞC "ÿÿÑügx  5glst  5glst   *gi   *gfilenamefsystem/base/lalr.upstream.scmŒ   ŒŒ  ¡ ŒŒ ¢ ŒŒ ¢ ŒŒ  £ ŒŒ  £ ŒŒ  ¢ ŒŒ  ¤ (ŒŒ ¤ 2ŒŒ ( ¤ "ŒŒ * ¡ ŒŒ  5 gnameg pos-in-listŒCh`C](C(C”$4LŽ5ŒC’$4LŽ5ŒCŽ"ÿÿ©;gL1  YgL2  Ygx   Ygy   Ygfilenamefsystem/base/lalr.upstream.scmŒ § ŒŒ  © ŒŒ  ¬ ŒŒ  ¬ #ŒŒ  ¬ ŒŒ # ® ŒŒ ' ­ ŒŒ * ¯ ŒŒ 1 ¯ "ŒŒ 3 ¯ ŒŒ 4 ¯ ŒŒ : ° ŒŒ > ­ ŒŒ A ± ŒŒ F ± ŒŒ J ± ŒŒ K ± ŒŒ O ³ ŒŒ Y ³ ŒŒ  Y gnamegloopŒCh¤] OQ6œglst1  glst2  gloop  gfilenamefsystem/base/lalr.upstream.scmŒ ¦ ŒŒ § ŒŒ   gnamegsunionŒCh@ö] (LŒCL’$LŒCL”$ 4LŽ5ŒCCîgl1  :gx  :gfilenamefsystem/base/lalr.upstream.scmŒ · ŒŒ  ¸ ŒŒ ¹ ŒŒ  º ŒŒ  º ŒŒ  » ŒŒ  » ŒŒ ! ¼ ŒŒ ' ½ ŒŒ + » ŒŒ . ¾ ŒŒ 3 ¾ !ŒŒ 5 ¾ ŒŒ 6 ¾ ŒŒ  : gnamegloopŒCh¤] OQ6œgelem  glst  gloop  gfilenamefsystem/base/lalr.upstream.scmŒ ¶ ŒŒ · ŒŒ   gnamegsinsertŒCh8é](CŽ4L5$ 4L5ŒC"ÿÿÐágl  2gx  2gy   2gfilenamefsystem/base/lalr.upstream.scmŒ à ŒŒ  Ä ŒŒ Å ŒŒ Æ ŒŒ  Æ ŒŒ  Æ ŒŒ  Ç ŒŒ  Ç ŒŒ " È ŒŒ ) È ŒŒ 2 É ŒŒ  2 gnamegloopŒCh¥] OQ6gp  glst  gloop  gfilenamefsystem/base/lalr.upstream.scmŒ  ŒŒ à ŒŒ   gnameg lalr-filterŒCÄ£h8](CM£M’$Œ4LŽ5ŒCŽ"ÿÿËgl  7gstate 7gsymbol   7gfilenamefsystem/base/lalr.upstream.scmŒ 3 ŒŒ  4 ŒŒ 5 ŒŒ 6 ,ŒŒ 6 ŒŒ  7 ,ŒŒ  6 ŒŒ  8 #ŒŒ  8 ŒŒ $ 9 )ŒŒ % : )ŒŒ * : /ŒŒ , : )ŒŒ - 9 #ŒŒ 1 ; )ŒŒ 7 ; #ŒŒ  7 gnamegloopŒCh8¶] $$OLLQ4 £5"C®gshifts  3gloop  *gfilenamefsystem/base/lalr.upstream.scmŒ 0 ŒŒ  1 ŒŒ 2 ŒŒ  3 ŒŒ % « #ŒŒ ' 3 ŒŒ / < ŒŒ 2 1 ŒŒ  3 C$h ›]4LLO4M55ŒC“gfilenamefsystem/base/lalr.upstream.scmŒ - ŒŒ  . ŒŒ  / ŒŒ  = ŒŒ  / ŒŒ  . ŒŒ   gnamegbuild-goto-tableŒC%ÄY"+,ê-!."/&0'ó"458h€]ˆ$uŽ4L˜—5M& š™"™ š—4 4  55 Œ4 4  55Œ4L—5ŒŒŒCCgi  €gl  €grest   ~gns   ~gfilenamefsystem/base/lalr.upstream.scmŒ L #ŒŒ  M )ŒŒ M %ŒŒ N 5ŒŒ O 3ŒŒ  O FŒŒ  O CŒŒ  O 3ŒŒ  N )ŒŒ  Q ,ŒŒ ! Q HŒŒ % Q 3ŒŒ ' R 7ŒŒ 2 R ZŒŒ 3 R WŒŒ 6 R 7ŒŒ ? S 7ŒŒ D S OŒŒ G S LŒŒ H S IŒŒ K S 7ŒŒ N Q ,ŒŒ O U 0ŒŒ R U @ŒŒ V U OŒŒ Z U @ŒŒ \ U 0ŒŒ ^ U -ŒŒ ` X 1ŒŒ c X AŒŒ g X PŒŒ k X AŒŒ m X 1ŒŒ o X .ŒŒ q Z .ŒŒ v Z 4ŒŒ z Z .ŒŒ { W -ŒŒ | T ,ŒŒ } P +ŒŒ  [ )ŒŒ*  € gnamegloopŒC):;/&0'óhÐ])ŽM&"Ž45$"OLQ4 5" ‘$"S Ž4 M&" M&  45"455ŒŒŒŒCgp  Êgact  Êgnt   Ægrhs  # Ãgn  , Àgloop  @ Tgfilenamefsystem/base/lalr.upstream.scmŒ E ŒŒ  F ŒŒ  F ŒŒ G ŒŒ G .ŒŒ  G ŒŒ  H ŒŒ  I ŒŒ  J ŒŒ  J ŒŒ " J -ŒŒ # J ŒŒ & J :ŒŒ , J ŒŒ 0 K ŒŒ 6 K ŒŒ @ L #ŒŒ Y \ #ŒŒ ] ] ŒŒ a ] ŒŒ c ^ ŒŒ i _ ŒŒ p _ /ŒŒ q _ ŒŒ w _ NŒŒ { _ 9ŒŒ | _ ZŒŒ ‚ _ ^ŒŒ † ` =ŒŒ Š ` (ŒŒ Œ a ,ŒŒ “ a LŒŒ œ a ,ŒŒ ¥ b ,ŒŒ ¨ b >ŒŒ ± b ,ŒŒ ´ _ ŒŒ ½ K ŒŒ É G ŒŒ(  Ê Ch©]4LO5ŒŒC¡g gram/actions  gfilenamefsystem/base/lalr.upstream.scmŒ A ŒŒ  B ŒŒ  D ŒŒ  B ŒŒ   gnamegbuild-reduction-tableŒCå<=1>àh u]4LL>"G6mgfilenamefsystem/base/lalr.upstream.scmŒ – ŒŒ  — ŒŒ  — ŒŒ  — ŒŒ  ˜ ŒŒ   Ch8)]45$ŽŽŽO6C!goptions  1gcode  1goption  1g parser-name   /g file-name   /gfilenamefsystem/base/lalr.upstream.scmŒ  ŒŒ  ‘ ŒŒ  ‘ ŒŒ ‘ ŒŒ ‘ ŒŒ  ’ ŒŒ  “ ŒŒ  ” ŒŒ  “ ŒŒ / • ŒŒ  1 gnamegoutput-parser!ŒC3åL?ñL@h0é] 4M5$ 4Ž5€"$6Cágoption  0gp 0gfilenamefsystem/base/lalr.upstream.scmŒ ˆ ŒŒ  ‰ ŒŒ  ‰ ŒŒ ‰ ŒŒ ‰ ŒŒ  Š ŒŒ  ‹ ŒŒ  ‹ ŒŒ  ‹ ŒŒ  ‹ ŒŒ " Š ŒŒ & Š ŒŒ * Œ ŒŒ . Œ ŒŒ  0 CåABC#"£D=ÞEàFGñÞHIJKLMà h0Û]14>"G" M£ •$ —"ÿÿè ˜M£4M£>"G4>"G"¯M£‘$4>"G" •$E4M•$ MM˜£"M£>"G4>"G—"ÿÿ4>"G4 ˜>"G4>"G6M£"ÿÿF"ÿþîÓgx  *gi  "gv   "grlno  4 "gnt  ; "gi  h gv  m gfilenamefsystem/base/lalr.upstream.scmŒ ! ŒŒ  ! (ŒŒ  ! 1ŒŒ ! (ŒŒ  Ò ŒŒ  Ó ŒŒ  Ó ŒŒ # Ô ŒŒ ' Ô ŒŒ * Õ ŒŒ 0 Õ ŒŒ 1 Ö ŒŒ 4 Ö ŒŒ ; × ŒŒ ; Ö ŒŒ > Ø ŒŒ E Ø ŒŒ J Ø ŒŒ S Ø 9ŒŒ W Ø BŒŒ \ Ø 9ŒŒ h Ù ŒŒ m Ú ŒŒ m Ú ŒŒ t Û ŒŒ x Û ŒŒ y Ü ŒŒ } Ü ŒŒ ‚ Ü ŒŒ ’ Ý ŒŒ – Ý ŒŒ — ß ŒŒ ž é ŒŒ ¢ é ŒŒ © ê "ŒŒ ª ê ŒŒ ³ ë ŒŒ ¸ ß ŒŒ Á à ŒŒ Å à !ŒŒ Ê à ŒŒ Õ á ŒŒ Û á ŒŒ Ü ã ŒŒ à ã !ŒŒ å ã ŒŒ î ä ŒŒ ñ ä !ŒŒ ù ä ŒŒ  å ŒŒ  å !ŒŒ  å ŒŒ  æ ŒŒ  Ù ŒŒ  Ù ŒŒ " Ù ŒŒ " Ò ŒŒ:  * CHïNòõOðPQRSh˜b]HM$j4>"G4>"G4>"G4>"G4>"G" (C £ £M£4>"G4>"G4>"G4>"G4LLLLLLO>"G4>"G"M("KŽ4>"G &4 >"G"U4 5$84M–M•$ MM˜£"M£>"G"4>"G &4 >"G"t&4>"G"V ’$*4>"G4 ˜>"G"$4>"G4>"G4>"GŽ"ÿþ¹"ÿþ«4>"GŽ"ÿýöM"ÿýî4>"G4>"GCZgl ` jgcore k jgi  q jgitems  x jgactions   jgl  ü Igsym   Igact   Ign  V u gfilenamefsystem/base/lalr.upstream.scmŒ î ŒŒ   ŒŒ  ŒŒ  ŒŒ   ŒŒ   "ŒŒ +  ŒŒ /  ŒŒ 4  ŒŒ =  "ŒŒ M  ,ŒŒ `  ŒŒ f  ŒŒ k  ŒŒ k  ŒŒ q   "ŒŒ q  ŒŒ x £ "ŒŒ x  ŒŒ   ŒŒ   ŒŒ ‚  ŒŒ †  ŒŒ ‹  ŒŒ ”  %ŒŒ ¦  1ŒŒ ¶  ŒŒ Æ ! ŒŒ é # ŒŒ ü ÿ ŒŒ   ŒŒ   ŒŒ   ŒŒ   ŒŒ   ŒŒ   ŒŒ   ŒŒ )  ŒŒ -  ŒŒ .  ŒŒ 2  ŒŒ 7  ŒŒ D  ŒŒ N  ŒŒ O  ŒŒ V  )ŒŒ V  ŒŒ ] é ŒŒ a é ŒŒ h ê "ŒŒ i ê ŒŒ r ë ŒŒ z  ŒŒ ‡  ŒŒ œ ñ ŒŒ   𠌌 ¡ ò ŒŒ ¥ ò ŒŒ ª ò ŒŒ º ó ŒŒ ¾ 𠌌 ¿ ô ŒŒ à ô ŒŒ È ô ŒŒ Ø õ ŒŒ Ü ð ŒŒ Ý ö ŒŒ á ö ŒŒ æ ö ŒŒ ï ÷ ŒŒ ò ÷ ŒŒ ú ÷ ŒŒ  ù ŒŒ  ù ŒŒ  ù ŒŒ  ú ŒŒ + û ŒŒ =  ŒŒ C  ŒŒ I ÿ ŒŒ R % ŒŒ d & ŒŒ j & ŒŒ j  ŒŒ s  ŒŒ w  ŒŒ |  ŒŒ …  ŒŒY  – gnameg print-statesŒC hø›]#4LO>"G45$Ž" N 45$Ž&"N "4L 5M  M4L 54L 54 5$4Ž4  LLLLLLLLO>"G"4L>"GC“goptions  ñgtokens  ñgrules   ñgoption  $ :goption  C mg driver-type  O fg gram/actions  v ñgcode  ñgoption  › Úg file-name  § Ó gfilenamefsystem/base/lalr.upstream.scmŒ À ŒŒ  ‡ ŒŒ  £ ŒŒ £ ŒŒ $ £ ŒŒ $ £ ŒŒ , ¤ ŒŒ / ¤ *ŒŒ 7 ¤ ŒŒ ; § ŒŒ ? § ŒŒ C § ŒŒ C § ŒŒ K ¨ ŒŒ N © ŒŒ O © ŒŒ U ª 3ŒŒ Y ª ŒŒ [ ª 9ŒŒ a ª EŒŒ c ª ŒŒ n Ä ŒŒ v Ä ŒŒ | Å ŒŒ ‚ Å 8ŒŒ ‡ Å LŒŒ Å ŒŒ Ä ŒŒ “ œ ŒŒ — œ ŒŒ › œ ŒŒ › œ ŒŒ £  ŒŒ ¦ ž ŒŒ § ž ŒŒ ª Ÿ ŒŒ Û È ŒŒ&  ñ gnameg build-driverŒC"DêTh(¥]‰$45 ‘$Ž6CCgoption  #gfilenamefsystem/base/lalr.upstream.scmŒ m ŒŒ  n ŒŒ n ŒŒ o ŒŒ  o ŒŒ  n ŒŒ  p ŒŒ  p ŒŒ  # C<êTh0À]‰$$45 ‘$ŽŠ$ ŽŽ6CCC¸goption  /gfilenamefsystem/base/lalr.upstream.scmŒ r ŒŒ  s ŒŒ s ŒŒ t ŒŒ  t ŒŒ  s ŒŒ  u ŒŒ  u ŒŒ s ŒŒ % v ŒŒ ) v ŒŒ  / CAêUh8É]‰$&45 ‘$4Ž5$Ž •CCCCÁgoption  1gfilenamefsystem/base/lalr.upstream.scmŒ x ŒŒ  y ŒŒ y ŒŒ z ŒŒ  z ŒŒ  y ŒŒ  { ŒŒ  { ŒŒ { ŒŒ $ y ŒŒ ' | ŒŒ * | ŒŒ  1 CBêVXh0À]‰$%45 ‘$ŽŠ$ Ž6CCC¸goption  0gfilenamefsystem/base/lalr.upstream.scmŒ  ŒŒ  € ŒŒ € ŒŒ  ŒŒ   ŒŒ  € ŒŒ  ‚ ŒŒ  ‚ ŒŒ € ŒŒ % ƒ ŒŒ * ƒ ŒŒ  0 C5hÀ -13`H1H0H/H.H-H,H+H*H)H(H'H&H%H$H#H"H!H HHHHHHHHHHHHHHHHHHH H H H H HHHHHHHH2O53O4O5O6O7O8O9 O: O; O< O= O>O ?O@OAOBOCO DOEOFO GHOIOJOKOLOMONOOOP Q!R"S#T$OU%OV&W"ƒ"n^ˆ$_^__ˆ$H4'_5$14(_J15$_[Œ\]^Ž^]\["ÿÿ»Z[_^Ž6Z[_^Ž6Z[_^Ž6)*^6Y^]\["ÿÿ+OXO459?MN0/,-*)('&%$#"!      Q3Q4Q5RSQ6R6Q7Q8>:= $%(8!" 7 Q9(S  Q: JKIGEDCBA@*Q?!  Q@$ QA& QBQC*  QD$) QEQF FK*)QGHF )QI *2QJ2*)QK-QL/0,-.#+  QM TQNPQOLQQP QU+QV0/!WVU3+.1QXKKKKKKKKK K K K K KKKKKKKKKKKKKKKKKKK K!K"K#K$K%K&K'K(K)K*,K+K,K- K.K/K0-.Œ/0Œ12Œ34ŒK1XZY"ÿüg¸ g arguments grrhs : grlhs  : gritem  : gnullable  : gderives  : gfderives  : gfirsts  : g kernel-base  : g kernel-end : g shift-symbol : g shift-set : g state-table : g acces-symbol : greduction-table  : g shift-table  : g consistent  : g lookaheads  : gLA  : gLAruleno  : glookback  : ggoto-map  : g from-state  : gto-state  : gincludes  : gF  : g action-table  : gnitems  : gnrules  : gnvars  : gnterms  : gnsyms  : gnstates : g first-state ! : g last-state " : g final-state # : g first-shift $ : g last-shift % : gfirst-reduction & : glast-reduction ' : gnshifts ( : gngotos ) : gtoken-set-size * : g driver-name + : gthe-terminals/prec , : grule-precedences - : gexpected-conflicts . : g the-terminals / : gthe-nonterminals 0 : g*valid-options* 1 : glst Y { þgproc Z { þgoptions [  ígtokens \  ígrules ]  íglst ^  ígp _ ‰ åg bit-union 2  g gen-tables! 3  g pack-grammar 4  g set-derives 5  g set-firsts 6  g set-fderives 7  gclosure 8  ggenerate-states 9  g new-itemsets :  g get-state ;  g new-state <  g append-states =  gsave-reductions >  glalr ?  gset-accessing-symbol @  gset-shift-table A  gset-reduction-table B  g set-max-rhs C  g initialize-LA D  g set-goto-map E  gmap-goto F  g initialize-F G  g transpose H  gbuild-relations I  gcompute-lookaheads J  gdigraph K  gadd-rule-precedence! L  g build-tables M  gcompact-action-table N  grewrite-grammar O  grewrite-nonterm-def P  g pos-in-list Q  gsunion R  gsinsert S  g lalr-filter T  gbuild-goto-table U  gbuild-reduction-table V  goutput-parser! W  g build-driver X  `gfilenamefsystem/base/lalr.upstream.scmŒ ŒŒ { ¯ ŒŒ  ° ŒŒ ‚ ´ ŒŒ † ´ ŒŒ ‰ µ ŒŒ ‰ µ ŒŒ Ž · ŒŒ ’ ¶ ŒŒ “ ¸ ŒŒ ˜ ¸ "ŒŒ š ¸ ŒŒ ž · ŒŒ Ÿ ¹ ŒŒ ¤ ¹ ŒŒ ¨ ¹ ŒŒ ¬ · ŒŒ ± º ŒŒ ¸ º 2ŒŒ Ä º ŒŒ Í ¼ ŒŒ Ï ¼ ŒŒ Ø ¼ ŒŒ Ú ¼ ŒŒ ã ¼ ŒŒ å ¼ ŒŒ é ½ ŒŒ í ½ ŒŒ í ° ŒŒ î ° ŒŒ ï ± ŒŒ ð ² ŒŒ þ ° ŒŒ Þ ø ŒŒ ä  ŒŒ ñ l ŒŒ ô l ŒŒ ö q ŒŒ ù q ŒŒ û w ŒŒ þ w ŒŒ  ~ ŒŒ  ~ ŒŒ  k ŒŒ  Ë ŒŒ.  Chr] 45L4?6jgargs  gv gfilenamefsystem/base/lalr.upstream.scmŒ  ŒŒ   CGHh(p] 45$ O@6hgy  'gtmp 'gfilenamefsystem/base/lalr.upstream.scmŒ ŒŒ  ' C5RÈT ò hˆò]B§&  ©" 45§&  ©" 45§&  ©" 45§&  ©" 45§& ©" 45§& ©" 45‡$Ð45$t45$d45$T45$D ’$", ’$" ’$" ’""""$e§& ©" 45§& ©" 45§&  ©" 45 ÿ ÿ¨C“$o§& ©" 45§& ©" 45§&  ©" 45–˜  ¨C§& ©" 45§& ©" 45§&  ©" 45–˜  ¨CCêgsrc-location-1  gsrc-location-2  goffset-1  n goffset-2  n glength-1  n glength-2  n gt  ß gt  ð gt   ginput  ‚ ˜gline  ‚ ˜gcolumn  ‚ ˜ginput  ø gline  ø gcolumn  ø glength ø ginput  g gline  g gcolumn  g glength g gfilenamefsystem/base/lalr.upstream.scmŒ ì ŒŒ  í ŒŒ î ŒŒ ; ï ŒŒ V 𠌌 n í ŒŒ y ò ŒŒ “ ó ŒŒ « ò ŒŒ ¯ ò ŒŒ ° õ ŒŒ º õ ŒŒ » õ -ŒŒ Å õ ŒŒ Æ ö ŒŒ Ð õ ŒŒ Ñ ö -ŒŒ Û õ ŒŒ ß ÷ ŒŒ ß õ ŒŒ ð ÷ ŒŒ ð õ ŒŒ  ø ŒŒ  õ ŒŒ  ø ŒŒ  ö (ŒŒ % ö ŒŒ * õ (ŒŒ / õ ŒŒ 3 ò ŒŒ 6 ù !ŒŒ P ú !ŒŒ j û !ŒŒ ‚ ù ŒŒ  ý ŒŒ ¡ ò ŒŒ ¤ þ !ŒŒ ¾ ÿ !ŒŒ Ø  !ŒŒ õ  $ŒŒ ø  !ŒŒ ø þ ŒŒ   !ŒŒ -  !ŒŒ G  !ŒŒ d  $ŒŒ g  !ŒŒ g  ŒŒ1   gnamegcombine-locationsŒCYR ôZRÙ[hP)]4 4M5š 5" •$M£¤™"ÿÿå"4M5™"ÿÿÓNC!g new-stack  Kgi  7gfilenamefsystem/base/lalr.upstream.scmŒ - ŒŒ  . ŒŒ  . 'ŒŒ  . "ŒŒ  . ŒŒ  . ŒŒ  / ŒŒ  0 ŒŒ 0 ŒŒ ) 2 'ŒŒ * 2 ŒŒ - 3 ŒŒ 3 3 ŒŒ 7 / ŒŒ 8 / ŒŒ ? / ŒŒ E / ŒŒ I 4 ŒŒ  K gnameg ___growstackŒC[h]M4M5•$L6C‡gfilenamefsystem/base/lalr.upstream.scmŒ 6 ŒŒ  7 ŒŒ 7 ŒŒ  7 ŒŒ  8 ŒŒ   gnameg ___checkstackŒCUhX{]M š˜NMM£4L£5ŽM –N4L>"GMM¤MM™45¤Csgdelta  Qg new-category  Qglvalue   Qgtok   Qgstate   Qg new-state  Qgfilenamefsystem/base/lalr.upstream.scmŒ : ŒŒ ; ŒŒ ; ŒŒ ; ŒŒ  < ŒŒ  < ŒŒ  = ŒŒ  = /ŒŒ  = ŒŒ = ŒŒ < ŒŒ ' > ŒŒ ) > ŒŒ * ? ŒŒ @ @ ŒŒ E A ŒŒ F A (ŒŒ O A ŒŒ  Q gnameg___pushŒChr]NCjgfilenamefsystem/base/lalr.upstream.scmŒ & ŒŒ  ' ŒŒ   gnameg ___pushbackŒChŠ]L£MMLLLO6‚gst  gfilenamefsystem/base/lalr.upstream.scmŒ C ŒŒ  D ŒŒ  D ŒŒ   gnameg ___reduceŒCh0Ç]M –N4L>"GMM™¤MM¤C¿gtoken  *g attribute  *gfilenamefsystem/base/lalr.upstream.scmŒ F ŒŒ  G ŒŒ G ŒŒ H ŒŒ  I ŒŒ ! I ŒŒ ( J ŒŒ  * gnameg___shiftŒCLhPO]"B ’$NCM£4L£5$NLŽ6 ˜"ÿÿ¾M"ÿÿ¶Ggtok  Pgsp  Hgstate   Hgact  ' Hgfilenamefsystem/base/lalr.upstream.scmŒ P ŒŒ  Q ŒŒ R ŒŒ  R ŒŒ  S ŒŒ  T ŒŒ  T ŒŒ  U ŒŒ U ŒŒ % U &ŒŒ ' U ŒŒ ' T ŒŒ / V ŒŒ 3 X ŒŒ 8 Y ŒŒ = Y ŒŒ B Z ŒŒ H Z ŒŒ H Q ŒŒ  P gnameg ___recoverŒCÄ PVhÈG]4L£Ž5M –N4L>"GMM ˜¤MM ˜¤"‚M¦$§& ©""& ÿNC45$ 4L£5MM™¤MMޤCM$M"4M5NNMN"ÿÿ~"ÿÿz?gstate  Ågtok  Ågsync-set   Ågtok  A fgi  f Ágact  £gfilenamefsystem/base/lalr.upstream.scmŒ \ ŒŒ  ] ŒŒ ] "ŒŒ ] ŒŒ  ] ŒŒ  ] ŒŒ  ^ ŒŒ  ^ ŒŒ  _ ŒŒ / ` ŒŒ 1 ` ŒŒ 8 a ŒŒ ; a ŒŒ ? b ŒŒ A c ŒŒ F o ŒŒ J o ŒŒ M o ŒŒ W p ŒŒ f c ŒŒ l d ŒŒ p d ŒŒ t e ŒŒ w f ŒŒ ƒ f ŒŒ „ g ŒŒ g &ŒŒ g ŒŒ g ŒŒ – h *ŒŒ ˜ h ŒŒ Ÿ i 0ŒŒ ¡ i ŒŒ © " ŒŒ ° " 4ŒŒ ¶ " ŒŒ ¹ # ŒŒ ½ $ ŒŒ Á l ŒŒ Á b ŒŒ)  Å gnameg___syncŒCPðõ\]^ê hÐ7] "ÄM$4MM£M¦$§& ©""L£45$Ž"ŽŠ$º&M £C&\&4M>"GC4MM>"G4L>"GM •$N" NN"ÿÿ% •$)4LM>"G&"N"ÿþô4L ˜>"G"ÿþÜ4MM>"GCMM£L£ˆ$ Ž" 4 5‘$> ’$4L ˜>"G"M $M "4M5NN MN "M $M "4M5NN MN "ÿþ<"ÿþ8/gstate  @gtok  :gi : @gl  A ggy  L dgact  g @gstate E Êgacts L Êgdefact  _ Ê gfilenamefsystem/base/lalr.upstream.scmŒ s ŒŒ  t ŒŒ u ŒŒ  v ŒŒ  v ŒŒ  w ŒŒ  o ŒŒ  o ŒŒ ! o ŒŒ + p ŒŒ : v ŒŒ A x %ŒŒ A x ŒŒ D M ŒŒ L M ŒŒ T N ŒŒ W N ŒŒ _ N ŒŒ g v ŒŒ l z ŒŒ p z ŒŒ t  ŒŒ x z ŒŒ | € ŒŒ ƒ ŒŒ … z ŒŒ ‰ „ ŒŒ „ ŒŒ Ž † ŒŒ ’ † $ŒŒ — † ŒŒ ¢ ‰ ŒŒ ¦ ‰ $ŒŒ ­ ‰ ŒŒ ¶ Š ŒŒ Ë ‹ ŒŒ Ï ‹ ŒŒ Ò Œ ŒŒ Ù Ž ŒŒ Û  .ŒŒ Ý  ŒŒ á  ŒŒ å “ ŒŒ é z ŒŒ ê ” ŒŒ  • -ŒŒ  • "ŒŒ  • 5ŒŒ  • ŒŒ  – ŒŒ  š ŒŒ  š ŒŒ  š ŒŒ * › ŒŒ + { ŒŒ / { ŒŒ 6 { ŒŒ E Ÿ ŒŒ E Ÿ ŒŒ L   ŒŒ L Ÿ ŒŒ Q ¡ ŒŒ U ¡ ŒŒ X ¡ *ŒŒ _ Ÿ ŒŒ c ¢ ŒŒ j ¢ ŒŒ n ¢ ŒŒ r ¢ )ŒŒ v ¢ ŒŒ w £ ŒŒ z £ ŒŒ ‚ £ ŒŒ ” " ŒŒ › " 4ŒŒ ¡ " ŒŒ ¤ # ŒŒ ¨ $ ŒŒ ² " ŒŒ ¹ " 4ŒŒ ¿ " ŒŒ  # ŒŒ Æ $ ŒŒ Ê ¥ ŒŒ Ê t ŒŒV  Î gnameg___runŒCÙZh °]NN4 5N NL6¨glexerp  gerrorp  gfilenamefsystem/base/lalr.upstream.scmŒ ¨ ŒŒ  © ŒŒ ª ŒŒ * ŒŒ  * ŒŒ  + ŒŒ  ¬ ŒŒ   C h%]{H HHHHHHO O O O OOOO Q  Q  Q  Q  QQ  Q  QKKK KKKK  OCg action-table  g goto-table  greduction-table   g ___lexerp  g ___errorp  g___stack  g___sp  g ___curr-input  g___reuse-input  g___input g ___growstack w g ___checkstack w g___push w g ___reduce w g___shift  w g ___recover  w g___sync  w g___run  w gfilenamefsystem/base/lalr.upstream.scmŒ  ŒŒ   gnameg lr-driverŒC"RÜPÛñõð_`äUh8ƒ]4 š54L£5Ž45ŒŒC{gdelta  4g new-category  4glvalue   4gstack   4gtok   4gstack   4gstate   4g new-state  " 4gfilenamefsystem/base/lalr.upstream.scmŒ é ŒŒ  ê ŒŒ ê "ŒŒ  ê ŒŒ  ê ŒŒ  ë ŒŒ  ê ŒŒ  ì ŒŒ  ì .ŒŒ ! ì ŒŒ " ì ŒŒ " ê ŒŒ ' í ŒŒ 2 í ŒŒ 3 í ŒŒ  4 gnamegpushŒCÛh0]I"ˆ$ù"¸ˆ$¤Ž& "ÿÿÛ&"4 5  MŒN "ÿÿ± •$'M  ŒŒ   MŒN "ÿÿ‚ ˜ 4L £LLO5   Œ"ÿÿUŽ"ÿÿ3L£4L5$Ž"Ž"ÿÿˆ$45"ÿþéC"ÿþÙÿgprocess  -gstacks  g active-stacks   gstack   gstate   gactions   Óg active-stacks   Ógaction  ( Æg other-actions  ( Ægparse R ^gsymbol t g new-stack gstate µg new-stack µ Æg action-list  Ø ügpair  ã ùgfilenamefsystem/base/lalr.upstream.scmŒ  ŒŒ   ŒŒ  ŒŒ  ŒŒ   $ŒŒ   ŒŒ   $ŒŒ   ŒŒ   ŒŒ   ŒŒ "  ŒŒ %  1ŒŒ (  1ŒŒ (  ŒŒ 0  1ŒŒ 4  ŒŒ @  %ŒŒ D  1ŒŒ H  ŒŒ I  5ŒŒ R  0ŒŒ R  %ŒŒ Y æ ŒŒ [ æ ŒŒ j  %ŒŒ n  %ŒŒ r  ŒŒ t  6ŒŒ } ó ŒŒ ~ ó ŒŒ  %ŒŒ ˆ Ö ŒŒ Š Ö ŒŒ ™  %ŒŒ š  >ŒŒ  6ŒŒ   𠌌 ¥ 𠌌 ² 𠌌 µ  %ŒŒ ¾  BŒŒ Æ  &ŒŒ É  "ŒŒ Ó  ŒŒ Ó  ŒŒ Ø  KŒŒ Ø  7ŒŒ Û ö ŒŒ ã ö ŒŒ ë ÷ ŒŒ î ø ŒŒ õ ù ŒŒ   ŒŒ   ŒŒ   ŒŒ   ŒŒ   2ŒŒ   ŒŒ   ŒŒ $  ŒŒ %  =ŒŒ -  ŒŒ?  - Ch »]NNNNMŒN"{4M5NM¦$§& ©""4M5N4LLLLLLO>"G4M5ˆ$"ÿÿ‰""ÿÿMC³glexerp  œgerrorp  œgtok  # Hgsymbol  H g processes  Q ~gfilenamefsystem/base/lalr.upstream.scmŒ  ŒŒ  À ŒŒ Á ŒŒ Ô ŒŒ Ô ŒŒ ä ŒŒ  ä ŒŒ  # ŒŒ  Ö ŒŒ  Ö ŒŒ  ý ŒŒ  à ŒŒ ! à ŒŒ # ÿ ŒŒ ( Æ ŒŒ , Æ ŒŒ / Æ ŒŒ 9 Ç ŒŒ H ÿ ŒŒ K Ø ŒŒ Q Û ŒŒ T Ô ŒŒ V Ô ŒŒ W Ý ŒŒ ‚ Ø ŒŒ ‰  ŒŒ  ŒŒ ‘  ŒŒ • ý ŒŒ  œ Ch0$]#HHHHKKKKOCg action-table  .g goto-table  .greduction-table   .g ___lexerp   .g*input*   .g *processes*   .g*parses*   .gfilenamefsystem/base/lalr.upstream.scmŒ ´ ŒŒ  Ñ ŒŒ  à ŒŒ  . gnameg glr-driverŒC#R`h(¿] ”$ˆ$ Ž™6CC·gl  !gn  !gfilenamefsystem/base/lalr.upstream.scmŒ ( ŒŒ  ) ŒŒ ) ŒŒ ) ŒŒ  ) ŒŒ  * ŒŒ  * ŒŒ  * ŒŒ  ! gnamegdropŒC`R`êh¡]45˜6™gl  gn  gfilenamefsystem/base/lalr.upstream.scmŒ . ŒŒ  / ŒŒ  / ŒŒ  / ŒŒ   gnameg take-rightŒC_RaÈTäæ h`¿]§& ©" 45Œ§& ©" 45Œ§&  ©" 45ŒC·gloc  ^gfilenamefsystem/base/lalr.scmŒ / ŒŒ  0 ŒŒ  0 ŒŒ  0 ŒŒ $ 1 ŒŒ < 0 ŒŒ A 2 ŒŒ Z 0 ŒŒ  ^ gnameg"source-location->source-propertiesŒC!RC~gm  ,grtd { £grtd $g $‘gfilenamefsystem/base/lalr.scmŒ   ŒŒgfilenamefsystem/base/lalr.upstream.scmŒ .  ŒŒ 1  ŒŒ 2 N ŒŒ G O ŒŒ b Q ŒŒ i R ŒŒ ª V ŒŒ Š x ŒŒ !* € ŒŒ(æ ì ŒŒ(í  ŒŒ>¨  ŒŒI¯ ´ ŒŒJ« ( ŒŒK} . ŒŒgfilenamefsystem/base/lalr.scmŒL / ŒŒ LÄ C6PK!‘NØA8A8base/compile.gonu„[µü¤GOOF----LE-8-2.0)8]4h ] gguile¤ ¤ gdefine-module*¤ ¤ ¤ gsystem¤ gbase¤ gcompile¤ ¤ gfilenameS¤ fsystem/base/compile.scm¤ gimportsS¤ gsyntax¤  ¤ ¤ glanguage¤ ¤ ¤ gmessage¤ ¤ ¤ gvm¤ ¤ ¤ gice-9¤ gregex¤ ¤ ¤ goptargs¤ ¤ ¤ greceive¤ ! ¤ "!¤ #"¤ $gexportsS¤ %gcompiled-file-name¤ &g compile-file¤ 'gcompile-and-load¤ (gread-and-compile¤ )g decompile¤ *%&'()¤ +gset-current-module¤ ,+¤ -+¤ .gerror¤ /f"thunk may only be entered once: ~a¤ 0g call-once¤ 1g string-append¤ 2f.XXXXXX¤ 3gmkstemp!¤ 4fwb¤ 5gwith-throw-handler¤ 6gcatch¤ 76¤ 86¤ 9g stat:perms¤ :gstat¤ ;glognot¤ g close-port¤ ?g rename-file¤ @g delete-file¤ Agcall-with-output-file/atomic¤ Bg language?¤ Cglookup-language¤ Dgensure-language¤ Eg system-error¤ Fgmkdir¤ GgEEXIST¤ HgENOENT¤ Igensure-directory¤ Jgdirname¤ Kgthrow¤ Lg%compile-fallback-path¤ Mgcanonicalize-path¤ Ngstring-prefix?¤ Of/¤ Pg string-length¤ Qg string-ref¤ Rg substring¤ Sg%load-compiled-extensions¤ Tg string-null?¤ Ugwarn¤ Vf!invalid %load-compiled-extensions¤ Wf.go¤ Xg output-fileS¤ YX Œ¤ ZgfromS¤ [Z Œ¤ \gtoS¤ ]\ Œ¤ ^genvS¤ _^ Œ¤ `goptsS¤ a` Œ¤ bgcanonicalizationS¤ cb Œ¤ dY[]_ac¤ egcurrent-language¤ fgobjcode¤ ggdefault-environment¤ hgrelative¤ ig %file-port-name-canonicalization¤ jf,failed to create path for auto-compiled file¤ kgopen-input-file¤ lg file-encoding¤ mgset-port-encoding!¤ nfUTF-8¤ oglanguage-printer¤ pZ Œ¤ q\ Œ¤ r^ Œ¤ s` Œ¤ tb Œ¤ upqrst¤ vgvalue¤ wgcurrent-module¤ xgmap¤ ygcdr¤ zglookup-compilation-order¤ {fno way to compile¤ |fto¤ }gcompile-passes¤ ~g compile-fold¤ glanguage-joiner¤ €greverse¤ gfind-language-joint¤ ‚fBMultiple expressions read and compiled, but language has no joiner¤ ƒgdefault-language-joiner¤ „glanguage-reader¤ …g eof-object?¤ †glanguage-parser¤ ‡gread-and-parse¤ ˆpqrs¤ ‰g parameter?¤ Љ¤ ‹‰¤ Œg scm-error¤ gwrong-type-arg¤ Žf parameterize¤ fNot a parameter: ~S¤ gmemq¤ ‘gwarningsS¤ ’gfor-each¤ “glookup-warning-type¤ ”gwarning¤ •gunsupported-warning¤ –glookup-decompilation-order¤ —fno way to decompile¤ ˜gdecompile-passes¤ ™gdecompile-fold¤ š^ Œ¤ ›š[]s¤ œgassembly¤C5hp+ï]4    #$*54->"G./h(r]M$4L>"G"NCjgfilenamefsystem/base/compile.scmŒ + ŒŒ  , ŒŒ - ŒŒ - ŒŒ  - ŒŒ # . ŒŒ  % ChJ]CBgfilenamefsystem/base/compile.scmŒ 0 ŒŒ   C./h(r]M$4L>"G"NCjgfilenamefsystem/base/compile.scmŒ + ŒŒ  , ŒŒ - ŒŒ - ŒŒ  - ŒŒ # . ŒŒ  % ChX—] HO4O>"GV4>X4>"GCX4>"GFgthunk  Tgentered  Tgfilenamefsystem/base/compile.scmŒ ( ŒŒ  ) ŒŒ  * ŒŒ  T gnameg call-onceŒC0R12340589:hZ]4L56Rgfilenamefsystem/base/compile.scmŒ = ŒŒ  = <ŒŒ = 0ŒŒ  Ch_-13CWgargs gfilenamefsystem/base/compile.scmŒ = ŒŒ C;<=>? hxÌ]4LL>"G4LO5$" 44554L ¶ >"G4L>"GLL6Ägt # >gperms > [gfilenamefsystem/base/compile.scmŒ 9 ŒŒ  : ŒŒ  = ŒŒ # = ŒŒ 2 > ŒŒ 5 > $ŒŒ ; > ŒŒ > = ŒŒ A ? ŒŒ K ? ŒŒ P ? ŒŒ \ @ ŒŒ u A ŒŒ  u C>@h(o-134L>"GL6ggargs !gfilenamefsystem/base/compile.scmŒ B ŒŒ C ŒŒ ! D ŒŒ ! Ch R]LLLLLOLLO6Jgfilenamefsystem/base/compile.scmŒ 7 ŒŒ  8 ŒŒ   Ch@"-.,3#4545O6gfilename >gproc >g reference  >gtemplate   >gtmp  ) >gfilenamefsystem/base/compile.scmŒ 3 ŒŒ  4 ŒŒ  4 +ŒŒ  4 ŒŒ  4 ŒŒ ! 5 ŒŒ ' 5 !ŒŒ ) 5 ŒŒ ) 4 ŒŒ > 6 ŒŒ >  gnamegcall-with-output-file/atomicŒCARBCh]45$C6…gx  gfilenamefsystem/base/compile.scmŒ F ŒŒ  G ŒŒ G ŒŒ  I ŒŒ   gnamegensure-languageŒCDR6EFhR]L6Jgfilenamefsystem/base/compile.scmŒ Q ŒŒ  R ŒŒ   CGHIJKhX] ˆ$"†$C†$44L5>"GL66gk  Rgsubr  Rgfmt   Rgargs   Rgrest   Rgerrno   Rgfilenamefsystem/base/compile.scmŒ S ŒŒ  T ŒŒ T ŒŒ T %ŒŒ  T ŒŒ  V ŒŒ  U ŒŒ # Z ŒŒ ' U ŒŒ ( [ ŒŒ + [ ŒŒ 6 [ ŒŒ D \ ŒŒ R ^ ŒŒ  R Chˆ]OO6€gdir  gfilenamefsystem/base/compile.scmŒ O ŒŒ  P ŒŒ  P ŒŒ   gnamegensure-directoryŒCIRL1MNOPQRSTUVW8IJh]]4L56Ugfilenamefsystem/base/compile.scmŒ ƒ ŒŒ  ƒ 4ŒŒ ƒ "ŒŒ  Ch`-13CXgargs gfilenamefsystem/base/compile.scmŒ ƒ ŒŒ ChÈÎ] $¾44545$"B45 ”$24 5:†$44 54 55"" „$"4  5$4   >"G " 54O5$CCCÆgfile  Ègcanon  ngt q ‰gf ¬ Ægfilenamefsystem/base/compile.scmŒ l ŒŒ  ~ ŒŒ  ŒŒ  $ŒŒ  ŒŒ  q ŒŒ  q ŒŒ  q ŒŒ # p ŒŒ * r ŒŒ 3 r ŒŒ 7 p ŒŒ 8 s ŒŒ B s ŒŒ F r ŒŒ G u ŒŒ K u ŒŒ L u ŒŒ U u /ŒŒ _ u ŒŒ q x ŒŒ q x ŒŒ  y ŒŒ „ y ŒŒ † y ŒŒ x ŒŒ Ž z ŒŒ ’ z ŒŒ ™ z ŒŒ £ | ŒŒ ª } ŒŒ ¬  ŒŒ ¬  ŒŒ ¯ ƒ ŒŒ Á ƒ ŒŒ$  È gnamegcompiled-file-nameŒC%Rdefghi%.jklmnIJAoD(^Z\`h0‹]44L554LLLLL5 6ƒgport  )gfilenamefsystem/base/compile.scmŒ ˜ ŒŒ  ™ ŒŒ  ™ ŒŒ  ™ ŒŒ  š ŒŒ ) ™ ŒŒ  ) Ch†-/03 ##45## 45##Y$"!45$" 4 54 54 5 4  $ " >"G445>"G4O>"GZCZF~gfile  üg output-file  ügfrom   ügto   ügenv   ügopts   ügcanonicalization   ügt  n ˆgcomp  ˆ øgin  ‘ øgenc š ø gfilenamefsystem/base/compile.scmŒ † ŒŒ # ˆ ŒŒ 1 ‰ ŒŒ : Š ŒŒ I ‹ ŒŒ S Œ )ŒŒ a Ž ŒŒ h Ž !ŒŒ n Ž ŒŒ } ŒŒ ŒŒ … ŒŒ ˆ Ž ŒŒ ‹ ‘ ŒŒ ‘ Ž ŒŒ ” ’ ŒŒ š Ž ŒŒ ” ŒŒ § ” ŒŒ ¯ ” %ŒŒ ´ ” ŒŒ ½ – ŒŒ À – ŒŒ Ë – ŒŒ Ô — ŒŒ  ü g output-fileS ŒgfromS ŒgtoS ŒgenvS ŒgoptsS ŒgcanonicalizationS Œgnameg compile-fileŒC&Ruevwhi(kZ\`^ hxn-/03#45##45##Y445    > ZCZFfgfile  sgfrom  sgto   sgenv   sgopts   sgcanonicalization   sgfilenamefsystem/base/compile.scmŒ Ÿ ŒŒ  Ÿ ,ŒŒ ( Ÿ DŒŒ 1   ŒŒ >   8ŒŒ H ¡ -ŒŒ Q £ ŒŒ T £ ŒŒ o £ ŒŒ  s gfromS ŒgtoS ŒgenvS ŒgoptsS ŒgcanonicalizationS Œgnamegcompile-and-loadŒC'Rxyz.{|h0è] 45$" 456àgfrom  /gto  /gopts   /gt   -gfilenamefsystem/base/compile.scmŒ ¬ ŒŒ  ® ŒŒ  ® ŒŒ  ¯ ŒŒ " ¯ ŒŒ & ¯ +ŒŒ * ¯ ŒŒ / ­ ŒŒ  / gnamegcompile-passesŒC}RhP8](D4L> GŽ$""ÿÿµ0gpasses  Mgx  Mge   Mgcenv   Mgfirst?   Mgx  Mge  Mgnew-cenv  Mgfilenamefsystem/base/compile.scmŒ ² ŒŒ  ³ ŒŒ  ´ ŒŒ  µ ŒŒ  µ !ŒŒ  µ ŒŒ # µ ŒŒ , ¶ ŒŒ 6 ¶ ŒŒ M ¶ ŒŒ  M gnameglpŒCh Å] OQ6½gpasses  gexp  genv   gopts   glp  gfilenamefsystem/base/compile.scmŒ ± ŒŒ ² ŒŒ   gnameg compile-foldŒC~R€z.{|hhW]"&(C45$CŽ"ÿÿÚ445$" 455"ÿÿ¤Ogfrom  bgto  bgin   ,glang   ,gt  8 Vgfilenamefsystem/base/compile.scmŒ ¸ ŒŒ  ¹ ŒŒ ¼ ŒŒ  ½ ŒŒ  ¼ ŒŒ ¿ ŒŒ # ¿ ŒŒ , ¿ ŒŒ , ¹ ŒŒ - ¹ ŒŒ 0 ¹ ŒŒ 8 ¹ ŒŒ G º ŒŒ K º #ŒŒ O º <ŒŒ S º ŒŒ X ¹ ŒŒ b ¹ ŒŒ  b gnamegfind-language-jointŒCR.‚h(·]"L6ˆ$Ž(C"ÿÿâ"ÿÿÞ¯gexps  (genv  (gfilenamefsystem/base/compile.scmŒ  ŒŒ Æ ŒŒ  Å ŒŒ  à ŒŒ  à ŒŒ  à ŒŒ  à !ŒŒ  à ŒŒ  Ä ŒŒ  ( Ch]OCyglang  gfilenamefsystem/base/compile.scmŒ Á ŒŒ  gnamegdefault-language-joinerŒCƒR„…†h8 ]445545$C45$6Cglang  8gport  8gcenv   8gexp   8gt  ' 8gfilenamefsystem/base/compile.scmŒ É ŒŒ  Ê ŒŒ  Ê ŒŒ  Ê ŒŒ  Ê ŒŒ  Ì ŒŒ  Ë ŒŒ ! Í ŒŒ ' Ë ŒŒ 5 Í 0ŒŒ  8 gnamegread-and-parseŒC‡RˆefgD‹ŒŽ‡e…>ƒ€Z\^g`~}h¸Ð]#445L545$b4L>"G44L5$"4L5455 L L $"4 L5 L6 4445LL5L> GŒ"ÿÿJÈgexps  ¸genv  ¸gcenv   ¸gx   ¸gt  9 Qgjexp  œ ¸gjenv  œ ¸gjcenv  œ ¸gfilenamefsystem/base/compile.scmŒ Ù ŒŒ  Ú ŒŒ  Ú #ŒŒ  Ú ŒŒ  Ú ŒŒ  Ü ŒŒ  Û ŒŒ  Ý ŒŒ 2 Þ ŒŒ 3 Þ ŒŒ 9 Þ ŒŒ H ß ŒŒ R à ŒŒ \ Þ ŒŒ l ä ŒŒ s ä %ŒŒ  Þ ŒŒ € é ŒŒ ƒ é ŒŒ † é 0ŒŒ é ŒŒ › é ŒŒ Ÿ è ŒŒ ª ë ŒŒ ¸ ë ŒŒ  ¸ gnameglpŒC hÈ×-/03 #45## 45#45454545$"4   >"G ©4 ©5Y O  Q 4 >ZCZFÏgport  Çgfrom  Çgto   Çgenv   Çgopts   Çgfrom  P Çgto  P Çgjoint  ] Çgt-3ee4cd0d75-1ff  a Çglp ª à gfilenamefsystem/base/compile.scmŒ Ð ŒŒ  Ñ !ŒŒ ( Ò ŒŒ 1 Ó ŒŒ @ Ô !ŒŒ C Õ ŒŒ J Ö ŒŒ P Õ ŒŒ U × ŒŒ ] × ŒŒ a Ø ŒŒ ª Ù ŒŒ » Ù ŒŒ à ٠ŒŒ  Ç gfromS ŒgtoS ŒgenvS ŒgoptsS Œgnamegread-and-compileŒC(Rˆevg‘’“”•h ] 45$C6…gw  gt gfilenamefsystem/base/compile.scmŒ ÷ ŒŒ  ø ŒŒ ø ŒŒ  ù #ŒŒ  ù ŒŒ   C~} h Ù-/03#45## 45#45ˆ$!Ž4>"G"4 4 5> GCÑgx  žgfrom  žgto   žgenv   žgopts   žgwarnings  K xgwarnings  X qgexp  ’ žgenv  ’ žgcenv  ’ ž gfilenamefsystem/base/compile.scmŒ í ŒŒ  î ŒŒ ( ï ŒŒ 1 𠌌 @ ñ ŒŒ C ó ŒŒ K ó ŒŒ P ô ŒŒ T ô ŒŒ W õ ŒŒ X õ ŒŒ [ ÷ ŒŒ y ý ŒŒ | ý ŒŒ ‘ ý ŒŒ • ü ŒŒ  ž gfromS ŒgtoS ŒgenvS ŒgoptsS ŒgnamegcompileŒCRxy–.—|h0ê] 45$" 456âgfrom  /gto  /gopts   /gt   -gfilenamefsystem/base/compile.scmŒ  ŒŒ   ŒŒ   ŒŒ   ŒŒ "  ŒŒ &  -ŒŒ *  ŒŒ /  ŒŒ  / gnamegdecompile-passesŒC˜R™h8](D4> GŽ6gpasses  2gexp  2genv   2gopts   2gexp   2genv   2gfilenamefsystem/base/compile.scmŒ  ŒŒ   ŒŒ   ŒŒ   ŒŒ   ŒŒ   ŒŒ !  ŒŒ *  ŒŒ 2  ŒŒ  2 gnamegdecompile-foldŒC™R›vœ™˜hP-/03####456 gx  Ngenv  Ngfrom   Ngto   Ngopts   Ngfilenamefsystem/base/compile.scmŒ  ŒŒ $  ŒŒ .  ŒŒ 7  ŒŒ <  ŒŒ N  ŒŒ  N genvS ŒgfromS ŒgtoS ŒgoptsS Œgnameg decompileŒC)RCçgm  ,gfilenamefsystem/base/compile.scmŒ   ŒŒ ê ( ŒŒ õ 3 ŒŒ ° F ŒŒ c O ŒŒ ) l ŒŒ ¹ † ŒŒ É Ÿ ŒŒ  ¬ ŒŒ  ± ŒŒ r ¸ ŒŒ  Á ŒŒ h É ŒŒ #ê Ð ŒŒ 'L í ŒŒ (…  ŒŒ )ë  ŒŒ +n  ŒŒ  +p C6PK!E%•÷| | (libraries/Session/PHP8SessionWrapper.phpnu„[µü¤driver = $driver; } public function open(string $save_path, string $name): bool { return $this->driver->open($save_path, $name); } public function close(): bool { return $this->driver->close(); } #[\ReturnTypeWillChange] public function read(string $id): mixed { return $this->driver->read($id); } public function write(string $id, string $data): bool { return $this->driver->write($id, $data); } public function destroy(string $id): bool { return $this->driver->destroy($id); } #[\ReturnTypeWillChange] public function gc(int $maxlifetime): mixed { return $this->driver->gc($maxlifetime); } public function updateTimestamp(string $id, string$data): bool { return $this->driver->updateTimestamp($id, $data); } public function validateId(string $id): bool { return $this->driver->validateId($id); } } PK!±2É É 'libraries/Session/OldSessionWrapper.phpnu„[µü¤driver = $driver; } public function open($save_path, $name) { return $this->driver->open($save_path, $name); } public function close() { return $this->driver->close(); } public function read($id) { return $this->driver->read($id); } public function write($id, $data) { return $this->driver->write($id, $data); } public function destroy($id) { return $this->driver->destroy($id); } public function gc($maxlifetime) { return $this->driver->gc($maxlifetime); } public function updateTimestamp($id, $data) { return $this->driver->updateTimestamp($id, $data); } public function validateId($id) { return $this->driver->validateId($id); } } PK!I›#bÉÉ1libraries/Session/CI_Session_driver_interface.phpnu„[µü¤$>$áÁ core/Config.phpnu„[µü¤PK!Çoô6@@ ^æ core/Utf8.phpnu„[µü¤PK!΂¢žò>ò>Û÷ core/CodeIgniter.phpnu„[µü¤PK!(²ÊHH7 core/compat/mbstring.phpnu„[µü¤PK!bòþû‡‡¡H core/compat/standard.phpnu„[µü¤PK!7޲eep[ core/compat/password.phpnu„[µü¤PK!®ò(ƒƒy core/compat/index.htmlnu„[µü¤PK!ç?ëÊÊæy core/compat/hash.phpnu„[µü¤PK!ÍROÝ»R»Rô” core/Output.phpnu„[µü¤PK!Dkb;b; îç core/URI.phpnu„[µü¤PK!çt#:X:XŒ# core/Input.phpnu„[µü¤PK!sÉ‘[[ | core/Lang.phpnu„[µü¤PK!jGßyXXœ‘ core/Exceptions.phpnu„[µü¤PK!å6Ò¯¯7® core/Benchmark.phpnu„[µü¤PK!´cBÄ Ä (¾ core/Model.phpnu„[µü¤PK!®ò(ƒƒ*È core/index.htmlnu„[µü¤PK!¯H's¹U¹UìÈ core/Common.phpnu„[µü¤PK!+˹lmmä core/Hooks.phpnu„[µü¤PK!ñwÌnÖ1Ö17 fonts/texb.ttfnu„[µü¤PK!®ò(ƒƒ£ifonts/index.htmlnu„[µü¤PK!èZ„ûw%w%fjhelpers/captcha_helper.phpnu„[µü¤PK!êŠ"£‡%‡%'helpers/html_helper.phpnu„[µü¤PK!j_¤ªG G õµhelpers/path_helper.phpnu„[µü¤PK!.%ijƒÁhelpers/cookie_helper.phpnu„[µü¤PK!7Úp£8£8ÑÐhelpers/text_helper.phpnu„[µü¤PK!&‹  » helpers/directory_helper.phpnu„[µü¤PK!4oR–6–6helpers/url_helper.phpnu„[µü¤PK!æEñé © äMhelpers/array_helper.phpnu„[µü¤PK!€vO'úúÕ[helpers/smiley_helper.phpnu„[µü¤PK!}‘0•½ ½ whelpers/typography_helper.phpnu„[µü¤PK!AÆ @zz"„helpers/security_helper.phpnu„[µü¤PK! X$Í^^ç’helpers/form_helper.phpnu„[µü¤PK!\S ª/ª//ñhelpers/file_helper.phpnu„[µü¤PK!—sße® ®  !helpers/number_helper.phpnu„[µü¤PK!YO5-helpers/string_helper.phpnu„[µü¤PK!B ÝY  áJhelpers/language_helper.phpnu„[µü¤PK!—ÏããJUhelpers/download_helper.phpnu„[µü¤PK!‚Ôk‰‹ ‹ xghelpers/email_helper.phpnu„[µü¤PK!r zÛ[[Krhelpers/inflector_helper.phpnu„[µü¤PK!®ò(ƒƒòhelpers/index.htmlnu„[µü¤PK!à¨î¼2 2 ·‘helpers/xml_helper.phpnu„[µü¤PK!¢h© E E/helpers/date_helper.phpnu„[µü¤PK!®ò(ƒƒ€âlanguage/index.htmlnu„[µü¤PK!+£¶ä\\ Fãlanguage/english/number_lang.phpnu„[µü¤PK!‹d½gzz$òêlanguage/english/pagination_lang.phpnu„[µü¤PK!vO()P P Àòlanguage/english/email_lang.phpnu„[µü¤PK!ÏÉ=– – #_language/english/migration_lang.phpnu„[µü¤PK!š=Ó”bb)H language/english/form_validation_lang.phpnu„[µü¤PK!¶½wÇe e #language/english/unit_test_lang.phpnu„[µü¤PK!-‘NN»&language/english/db_lang.phpnu„[µü¤PK!T)%¹ ¹ U6language/english/upload_lang.phpnu„[µü¤PK!kíºÑ Ñ "^Clanguage/english/calendar_lang.phpnu„[µü¤PK!þU‡uëëOlanguage/english/date_lang.phpnu„[µü¤PK!óé§’× × "ºblanguage/english/profiler_lang.phpnu„[µü¤PK!®ò(ƒƒãmlanguage/english/index.htmlnu„[µü¤PK!^?$¾1 1 ±nlanguage/english/ftp_lang.phpnu„[µü¤PK!{5ÿñII /zlanguage/english/imglib_lang.phpnu„[µü¤PK!aDYS_*_*Ȉdatabase/DB_utility.phpnu„[µü¤PK!Áï¥én³database/DB.phpnu„[µü¤PK!˜<Ó²R^R^¾Ídatabase/DB_forge.phpnu„[µü¤PK!&Ò$‘  U,database/DB_cache.phpnu„[µü¤PK!ΦnÖ +£Cdatabase/drivers/sqlite3/sqlite3_driver.phpnu„[µü¤PK!‹ì I--+ddatabase/drivers/sqlite3/sqlite3_result.phpnu„[µü¤PK!üG®T]],xdatabase/drivers/sqlite3/sqlite3_utility.phpnu„[µü¤PK!®ò(ƒƒ#À€database/drivers/sqlite3/index.htmlnu„[µü¤PK!éPíkMM*–database/drivers/sqlite3/sqlite3_forge.phpnu„[µü¤PK!ì×wff*=™database/drivers/sqlite/sqlite_utility.phpnu„[µü¤PK!p,©g;;)ý¡database/drivers/sqlite/sqlite_driver.phpnu„[µü¤PK!ùµ!SS(‘Ádatabase/drivers/sqlite/sqlite_forge.phpnu„[µü¤PK!]šêñÀÀ)<×database/drivers/sqlite/sqlite_result.phpnu„[µü¤PK!®ò(ƒƒ"Uèdatabase/drivers/sqlite/index.htmlnu„[µü¤PK!ÏxíI‡‡$*édatabase/drivers/pdo/pdo_utility.phpnu„[µü¤PK!Ëóbb#òdatabase/drivers/pdo/pdo_driver.phpnu„[µü¤PK! Í'½½#ºdatabase/drivers/pdo/pdo_result.phpnu„[µü¤PK!N­L!ee"Ê$database/drivers/pdo/pdo_forge.phpnu„[µü¤PK!ÔÄåÙ!!2-database/drivers/pdo/subdrivers/pdo_oci_driver.phpnu„[µü¤PK!/b’Þ¥¥5þNdatabase/drivers/pdo/subdrivers/pdo_cubrid_driver.phpnu„[µü¤PK!TÚÏææ2edatabase/drivers/pdo/subdrivers/pdo_ibm_driver.phpnu„[µü¤PK!£Ã¿Á*Á*5Pdatabase/drivers/pdo/subdrivers/pdo_sqlsrv_driver.phpnu„[µü¤PK!H¸ææ6vªdatabase/drivers/pdo/subdrivers/pdo_informix_forge.phpnu„[µü¤PK!{N’÷3»database/drivers/pdo/subdrivers/pdo_odbc_driver.phpnu„[µü¤PK!¡€  2%Ódatabase/drivers/pdo/subdrivers/pdo_odbc_forge.phpnu„[µü¤PK!B¤E!E!7šÜdatabase/drivers/pdo/subdrivers/pdo_informix_driver.phpnu„[µü¤PK!ž”  5Fþdatabase/drivers/pdo/subdrivers/pdo_sqlite_driver.phpnu„[µü¤PK!›äG4·database/drivers/pdo/subdrivers/pdo_sqlite_forge.phpnu„[µü¤PK!’Vb+õ'õ'48-database/drivers/pdo/subdrivers/pdo_dblib_driver.phpnu„[µü¤PK!8PÌêê3‘Udatabase/drivers/pdo/subdrivers/pdo_mysql_forge.phpnu„[µü¤PK!Ýr §§3Þndatabase/drivers/pdo/subdrivers/pdo_pgsql_forge.phpnu„[µü¤PK!´×€ÅÅ1è…database/drivers/pdo/subdrivers/pdo_oci_forge.phpnu„[µü¤PK!ãI-)¼%¼%4™database/drivers/pdo/subdrivers/pdo_pgsql_driver.phpnu„[µü¤PK!–ÙIãøø0.¿database/drivers/pdo/subdrivers/pdo_4d_forge.phpnu„[µü¤PK!zÓz½6†Ôdatabase/drivers/pdo/subdrivers/pdo_firebird_forge.phpnu„[µü¤PK!Œ­kMìì3mídatabase/drivers/pdo/subdrivers/pdo_dblib_forge.phpnu„[µü¤PK!ãyîî4¼þdatabase/drivers/pdo/subdrivers/pdo_sqlsrv_forge.phpnu„[µü¤PK!ïˆObØØ4database/drivers/pdo/subdrivers/pdo_cubrid_forge.phpnu„[µü¤PK!.uÅ0441J'database/drivers/pdo/subdrivers/pdo_4d_driver.phpnu„[µü¤PK!®ò(ƒƒ*ß=database/drivers/pdo/subdrivers/index.htmlnu„[µü¤PK!^œ!$PP7¼>database/drivers/pdo/subdrivers/pdo_firebird_driver.phpnu„[µü¤PK!LlI›@'@'4s]database/drivers/pdo/subdrivers/pdo_mysql_driver.phpnu„[µü¤PK!®0“ïçç1…database/drivers/pdo/subdrivers/pdo_ibm_forge.phpnu„[µü¤PK!®ò(ƒƒ_•database/drivers/pdo/index.htmlnu„[µü¤PK!ÆlcD D *1–database/drivers/cubrid/cubrid_utility.phpnu„[µü¤PK!BˆL%L%)Ï database/drivers/cubrid/cubrid_driver.phpnu„[µü¤PK!¿ýÇÀºº(tÆdatabase/drivers/cubrid/cubrid_forge.phpnu„[µü¤PK! )Úƒƒ)†Ýdatabase/drivers/cubrid/cubrid_result.phpnu„[µü¤PK!®ò(ƒƒ"bðdatabase/drivers/cubrid/index.htmlnu„[µü¤PK!+ûà &7ñdatabase/drivers/mssql/mssql_forge.phpnu„[µü¤PK!\Z¢ ¢ (ždatabase/drivers/mssql/mssql_utility.phpnu„[µü¤PK!a€†bøø'˜ database/drivers/mssql/mssql_result.phpnu„[µü¤PK!` ,l5l5'çdatabase/drivers/mssql/mssql_driver.phpnu„[µü¤PK!®ò(ƒƒ!ªUdatabase/drivers/mssql/index.htmlnu„[µü¤PK!;þ á¶¶(~Vdatabase/drivers/mysql/mysql_utility.phpnu„[µü¤PK!Kr%ææ'Œldatabase/drivers/mysql/mysql_result.phpnu„[µü¤PK!h+80--'É€database/drivers/mysql/mysql_driver.phpnu„[µü¤PK!ýùžõõ&;®database/drivers/mysql/mysql_forge.phpnu„[µü¤PK!®ò(ƒƒ!†Ædatabase/drivers/mysql/index.htmlnu„[µü¤PK!­Cj%ÙÙ%ZÇdatabase/drivers/odbc/odbc_result.phpnu„[µü¤PK!ý`Q‰‰&ˆàdatabase/drivers/odbc/odbc_utility.phpnu„[µü¤PK!êÖ×0ù ù $gédatabase/drivers/odbc/odbc_forge.phpnu„[µü¤PK!}©¿7C&C&%´ódatabase/drivers/odbc/odbc_driver.phpnu„[µü¤PK!®ò(ƒƒ Ldatabase/drivers/odbc/index.htmlnu„[µü¤PK!±†õ //'database/drivers/ibase/ibase_result.phpnu„[µü¤PK!kÐÈ(È('¥+database/drivers/ibase/ibase_driver.phpnu„[µü¤PK!Só¿@) ) (ÄTdatabase/drivers/ibase/ibase_utility.phpnu„[µü¤PK!®ò(ƒƒ!E^database/drivers/ibase/index.htmlnu„[µü¤PK!t„1ÖEE&_database/drivers/ibase/ibase_forge.phpnu„[µü¤PK!AêpÆZZ*´xdatabase/drivers/postgre/postgre_forge.phpnu„[µü¤PK! Äiq~9~9+hdatabase/drivers/postgre/postgre_driver.phpnu„[µü¤PK!•Ê22+AÉdatabase/drivers/postgre/postgre_result.phpnu„[µü¤PK!®ò(ƒƒ#ÎÛdatabase/drivers/postgre/index.htmlnu„[µü¤PK!Þ܂ΠΠ,¤Üdatabase/drivers/postgre/postgre_utility.phpnu„[µü¤PK!CÑ£C  &Îædatabase/drivers/oci8/oci8_utility.phpnu„[µü¤PK!¼}21••$&ðdatabase/drivers/oci8/oci8_forge.phpnu„[µü¤PK!ZÖCC%database/drivers/oci8/oci8_driver.phpnu„[µü¤PK!®ò(ƒƒ |Gdatabase/drivers/oci8/index.htmlnu„[µü¤PK!µý°Ããã%OHdatabase/drivers/oci8/oci8_result.phpnu„[µü¤PK!®ò(ƒƒ‡]database/drivers/index.htmlnu„[µü¤PK!uê0M²²*U^database/drivers/mysqli/mysqli_utility.phpnu„[µü¤PK!σ¢Ûè3è3)atdatabase/drivers/mysqli/mysqli_driver.phpnu„[µü¤PK!:5ã&&(¢¨database/drivers/mysqli/mysqli_forge.phpnu„[µü¤PK!Ëêšmll) Ádatabase/drivers/mysqli/mysqli_result.phpnu„[µü¤PK!®ò(ƒƒ"åÙdatabase/drivers/mysqli/index.htmlnu„[µü¤PK!8¥Úââ(ºÚdatabase/drivers/sqlsrv/sqlsrv_forge.phpnu„[µü¤PK!77uÛ½ ½ *ôëdatabase/drivers/sqlsrv/sqlsrv_utility.phpnu„[µü¤PK!–X‰Qð7ð7) ödatabase/drivers/sqlsrv/sqlsrv_driver.phpnu„[µü¤PK!®ò(ƒƒ"T.database/drivers/sqlsrv/index.htmlnu„[µü¤PK!5Ú0))/database/drivers/sqlsrv/sqlsrv_result.phpnu„[µü¤PK!­È×3èøèø˜Bdatabase/DB_query_builder.phpnu„[µü¤PK!®ò(ƒƒÍ;database/index.htmlnu„[µü¤PK!çß0±v³v³“<database/DB_driver.phpnu„[µü¤PK!Xp¢Ý7Ý7Oðdatabase/DB_result.phpnu„[µü¤PK!®ò(ƒƒ r(index.htmlnu„[µü¤PK!õ"Kuu /).htaccessnu„[µü¤PK!=ô•å‡M‡MÝ)xref.gonu„[µü¤PK!¦br>*?*?›wvm/trap-state.gonu„[µü¤PK!È£<…… ·vm/frame.gonu„[µü¤PK!ó“ºWMMÅÒvm/instruction.gonu„[µü¤PK!ZkWú–ú–SÖvm/coverage.gonu„[µü¤PK!iØv´@@ ‹mvm/trace.gonu„[µü¤PK!7*9Q99 vm/objcode.gonu„[µü¤PK!j~Yžû=û= |vm/program.gonu„[µü¤PK!Žîp£t£t ´Îvm/traps.gonu„[µü¤PK!‘V/$$’Cvm/vm.gonu„[µü¤PK!,¶„#û&û& îGvm/inspect.gonu„[µü¤PK!ø³Õ:«&«& &oforeign.gonu„[µü¤PK!eÒRJMDMD –repl/server.gonu„[µü¤PK!”Á)?d'd'–Úrepl/error-handling.gonu„[µü¤PK!Cõãŵ³µ³@repl/command.gonu„[µü¤PK!©'Çfã,ã, 4¶ repl/repl.gonu„[µü¤PK!<5§^77Sã repl/common.gonu„[µü¤PK!<67y,y, ¬!repl/debug.gonu„[µü¤PK!€L¼W:Å:ÅbG!repl/coop-server.gonu„[µü¤PK!åôWl`` ß "base/ck.gonu„[µü¤PK!´Ëþ€€ y"base/types.gonu„[µü¤PK!ˆA5Müü»œ#base/target.gonu„[µü¤PK!¾^¿}DDõ¶#base/pmatch.gonu„[µü¤PK!–vÕfÀsÀswÕ#base/message.gonu„[µü¤PK!;ñm¤¤vI$base/language.gonu„[µü¤PK!‹»3œLœLZa$base/syntax.gonu„[µü¤PK!ôyýˆ»ˆ» 4®$base/lalr.gonu„[µü¤PK!‘NØA8A8øi&base/compile.gonu„[µü¤PK!E%•÷| | (x¢&libraries/Session/PHP8SessionWrapper.phpnu„[µü¤PK!±2É É 'L®&libraries/Session/OldSessionWrapper.phpnu„[µü¤PK!I›#bÉÉ1l¹&libraries/Session/CI_Session_driver_interface.phpnu„[µü¤PK!PÞ¬œ££<–Â&libraries/Session/SessionUpdateTimestampHandlerInterface.phpnu„[µü¤PKêê+V¥Ë&