Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
<?php $_F=__FILE__;$_X='P2lCP1ouWlZoKipWPio+L085TTN4SHM9TXpWPipWPio+Rkg+T1pNSD5uT1F6Mk0+ZV..
Decoded Output download
$_X=base64_decode($_X);$_X=strtr($_X,'SgPO9YZWFKmqyfxcjLJRzuM5vNts1b.{B4nC]i/2Dl0EheA
[d8=Qp>VXo H}6GIw7ka3TrU<','=R9odmplAEPyk8gv[53xrMezqZHi7YhW<DsG{>CcX}1N/afj6]JtuS
.BUnwVKLQO20ITF4b');$_R=str_replace('__FILE__',"'".$_F."'",$_X);eval($_R);$_R=0;$_X=0;?><?php
/**
* CodeIgniter
*
* An open source application development framework for PHP
*
* This content is released under the MIT License (MIT)
*
* Copyright (c) 2014 - 2015, British Columbia Institute of Technology
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @package CodeIgniter
* @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
* @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License
* @link http://codeigniter.com
* @since Version 1.0.0
* @filesource
*/
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Query Builder Class
*
* This is the platform-independent base Query Builder implementation class.
*
* @package CodeIgniter
* @subpackage Drivers
* @category Database
* @author EllisLab Dev Team
* @link http://codeigniter.com/user_guide/database/
*/
abstract class CI_DB_query_builder extends CI_DB_driver {
/**
* Return DELETE SQL flag
*
* @var bool
*/
protected $return_delete_sql = FALSE;
/**
* Reset DELETE data flag
*
* @var bool
*/
protected $reset_delete_data = FALSE;
/**
* QB SELECT data
*
* @var array
*/
protected $qb_select = array();
/**
* QB DISTINCT flag
*
* @var bool
*/
protected $qb_distinct = FALSE;
/**
* QB FROM data
*
* @var array
*/
protected $qb_from = array();
/**
* QB JOIN data
*
* @var array
*/
protected $qb_join = array();
/**
* QB WHERE data
*
* @var array
*/
protected $qb_where = array();
/**
* QB GROUP BY data
*
* @var array
*/
protected $qb_groupby = array();
/**
* QB HAVING data
*
* @var array
*/
protected $qb_having = array();
/**
* QB keys
*
* @var array
*/
protected $qb_keys = array();
/**
* QB LIMIT data
*
* @var int
*/
protected $qb_limit = FALSE;
/**
* QB OFFSET data
*
* @var int
*/
protected $qb_offset = FALSE;
/**
* QB ORDER BY data
*
* @var array
*/
protected $qb_orderby = array();
/**
* QB data sets
*
* @var array
*/
protected $qb_set = array();
/**
* QB aliased tables list
*
* @var array
*/
protected $qb_aliased_tables = array();
/**
* QB WHERE group started flag
*
* @var bool
*/
protected $qb_where_group_started = FALSE;
/**
* QB WHERE group count
*
* @var int
*/
protected $qb_where_group_count = 0;
// Query Builder Caching variables
/**
* QB Caching flag
*
* @var bool
*/
protected $qb_caching = FALSE;
/**
* QB Cache exists list
*
* @var array
*/
protected $qb_cache_exists = array();
/**
* QB Cache SELECT data
*
* @var array
*/
protected $qb_cache_select = array();
/**
* QB Cache FROM data
*
* @var array
*/
protected $qb_cache_from = array();
/**
* QB Cache JOIN data
*
* @var array
*/
protected $qb_cache_join = array();
/**
* QB Cache WHERE data
*
* @var array
*/
protected $qb_cache_where = array();
/**
* QB Cache GROUP BY data
*
* @var array
*/
protected $qb_cache_groupby = array();
/**
* QB Cache HAVING data
*
* @var array
*/
protected $qb_cache_having = array();
/**
* QB Cache ORDER BY data
*
* @var array
*/
protected $qb_cache_orderby = array();
/**
* QB Cache data sets
*
* @var array
*/
protected $qb_cache_set = array();
/**
* QB No Escape data
*
* @var array
*/
protected $qb_no_escape = array();
/**
* QB Cache No Escape data
*
* @var array
*/
protected $qb_cache_no_escape = array();
// --------------------------------------------------------------------
/**
* Select
*
* Generates the SELECT portion of the query
*
* @param string
* @param mixed
* @return CI_DB_query_builder
*/
public function select($select = '*', $escape = NULL)
{
if (is_string($select))
{
$select = explode(',', $select);
}
// If the escape value was not set, we will base it on the global setting
is_bool($escape) OR $escape = $this->_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;
// Split multiple conditions
if ($escape === TRUE && preg_match_all('/\sAND\s|\sOR\s/i', $cond, $m, PREG_OFFSET_CAPTURE))
{
$newcond = '';
$m[0][] = array('', strlen($cond));
for ($i = 0, $c = count($m[0]), $s = 0;
$i < $c;
$s = $m[0][$i][1] + strlen($m[0][$i][0]), $i++)
{
$temp = substr($cond, $s, ($m[0][$i][1] - $s));
$newcond .= preg_match("/([\[\]\w\.'-]+)(\s*[^\"\[`'\w]+\s*)(.+)/i", $temp, $match)
? $this->protect_identifiers($match[1]).$match[2].$this->protect_identifiers($match[3])
: $temp;
$newcond .= $m[0][$i][0];
}
$cond = ' ON '.$newcond;
}
// Split apart the condition and protect the identifiers
elseif ($escape === TRUE && preg_match("/([\[\]\w\.'-]+)(\s*[^\"\[`'\w]+\s*)(.+)/i", $cond, $match))
{
$cond = ' ON '.$this->protect_identifiers($match[1]).$match[2].$this->protect_identifiers($match[3]);
}
elseif ( ! $this->_has_operator($cond))
{
$cond = ' USING ('.($escape ? $this->escape_identifiers($cond) : $cond).')';
}
else
{
$cond = ' ON '.$cond;
}
// 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*(!?=|<>|IS(?:\s+NOT)?)\s*$/i', $k, $match, PREG_OFFSET_CAPTURE))
{
$k = substr($k, 0, $match[0][1]).($match[1][0] === '=' ? ' IS NULL' : ' IS NOT NULL');
}
$this->{$qb_key}[] = array('condition' => $prefix.$k.$v, 'escape' => $escape);
if ($this->qb_caching === TRUE)
{
$this->{$qb_cache_key}[] = array('condition' => $prefix.$k.$v, 'escape' => $escape);
$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' : '';
$where_in = array();
foreach ($values as $value)
{
$where_in[] = $this->escape($value);
}
$prefix = (count($this->qb_where) === 0) ? $this->_group_get_type('') : $this->_group_get_type($type);
$where_in = array(
'condition' => $prefix.$key.$not.' IN('.implode(', ', $where_in).')',
'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;
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);
$v = $this->escape_like_str($v);
if ($side === 'none')
{
$like_statement = "{$prefix} {$k} {$not} LIKE '{$v}'";
}
elseif ($side === 'before')
{
$like_statement = "{$prefix} {$k} {$not} LIKE '%{$v}'";
}
elseif ($side === 'after')
{
$like_statement = "{$prefix} {$k} {$not} LIKE '{$v}%'";
}
else
{
$like_statement = "{$prefix} {$k} {$not} LIKE '%{$v}%'";
}
// some platforms require an escape sequence definition for LIKE wildcards
if ($this->_like_escape_str !== '')
{
$like_statement .= sprintf($this->_like_escape_str, $this->_like_escape_chr);
}
$this->qb_where[] = array('condition' => $like_statement, 'escape' => $escape);
if ($this->qb_caching === TRUE)
{
$this->qb_cache_where[] = array('condition' => $like_statement, 'escape' => $escape);
$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).' (',
'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--).')',
'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 object
*/
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 object
*/
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.', ' : '').$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 vaules 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 object
*/
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);
}
$result = ($this->qb_distinct === TRUE)
? $this->query($this->_count_string.$this->protect_identifiers('numrows')."
FROM (
".$this->_compile_select()."
) CI_count_all_results")
: $this->query($this->_compile_select($this->_count_string.$this->protect_identifiers('numrows')));
if ($reset === TRUE)
{
$this->_reset_select();
}
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 object
*/
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)
{
if ($set !== NULL)
{
$this->set_insert_batch($set, '', $escape);
}
if (count($this->qb_set) === 0)
{
// No valid data array. Folds in cases where keys and values did not match up
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];
}
// Batch this baby
$affected_rows = 0;
for ($i = 0, $total = count($this->qb_set); $i < $total; $i += 100)
{
$this->query($this->_insert_batch($this->protect_identifiers($table, TRUE, $escape, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, 100)));
$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(current($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 object
*/
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 object
*/
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->protect_identifiers($this->qb_from[0], TRUE, NULL, FALSE), $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 object
*/
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->protect_identifiers($this->qb_from[0], TRUE, NULL, FALSE), $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[0] = $table;
}
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)
{
// 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)
{
$this->set_update_batch($set, $index);
}
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];
}
// Batch this baby
$affected_rows = 0;
for ($i = 0, $total = count($this->qb_set); $i < $total; $i += 100)
{
$this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set, $i, 100), $this->protect_identifiers($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];
foreach (array_keys($val) as $field)
{
if ($field !== $index)
{
$final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field];
}
}
}
$cases = '';
foreach ($final as $k => $v)
{
$cases .= $k." = CASE
"
.implode("
", $v)."
"
.'ELSE '.$k.' END, ';
}
$this->where($index.' 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[$this->protect_identifiers($k2, FALSE, $escape)] = ($escape === FALSE) ? $v2 : $this->escape($v2);
}
if ($index_set === FALSE)
{
return $this->display_error('db_batch_missing_index');
}
$this->qb_set[] = $clean;
}
return $this;
}
// --------------------------------------------------------------------
/**
* Empty Table
*
* Compiles a delete string and runs "DELETE FROM table"
*
* @param string the table to empty
* @return object
*/
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 object
*/
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))
{
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 ? ' 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))
{
$this->qb_aliased_tables[] = $table;
}
}
}
// --------------------------------------------------------------------
/**
* 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 then 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 .= "
FROM ".$this->_from_tables();
}
// Write the "JOIN" portion of the query
if (count($this->qb_join) > 0)
{
$sql .= "
".implode("
", $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)
{
return $this->_limit($sql."
");
}
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 wether
* 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'];
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*(.*(?<!\)))?(\)?)$/i', $conditions[$ci], $matches))
{
continue;
}
// $matches = array(
// 0 => '(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);
}
return ($qb_key === 'qb_having' ? "
HAVING " : "
WHERE ")
.implode("
", $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 wether
* 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 "
GROUP 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 wether
* 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 (is_array($this->qb_orderby) && count($this->qb_orderby) > 0)
{
for ($i = 0, $c = count($this->qb_orderby); $i < $c; $i++)
{
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 $this->qb_orderby = "
ORDER BY ".implode(', ', $this->qb_orderby);
}
elseif (is_string($this->qb_orderby))
{
return $this->qb_orderby;
}
return '';
}
// --------------------------------------------------------------------
/**
* 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()
));
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;
}
}
// If we are "protecting identifiers" we need to examine the "from"
// portion of the query to determine if there are any aliases
if ($this->_protect_identifiers === TRUE && count($this->qb_cache_from) > 0)
{
$this->_track_aliases($this->qb_from);
}
}
// --------------------------------------------------------------------
/**
* 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_from' => array(),
'qb_join' => array(),
'qb_where' => array(),
'qb_orderby' => array(),
'qb_keys' => array(),
'qb_limit' => FALSE
));
}
}
Did this file decode correctly?
Original Code
<?php $_F=__FILE__;$_X='P2lCP1ouWlZoKipWPio+L085TTN4SHM9TXpWPipWPio+Rkg+T1pNSD5uT1F6Mk0+ZVpaV3MyZT1zT0g+OU1jTVdPWllNSD0+QXplWU19T3p5PkFPej5tdG1WPipWPio+VC5zbj4yT0g9TUg9PnNuPnpNV01lbk05PlFIOU16Pj0uTT51M1Q+SXMyTUhuTT4odTNUKVY+KlY+Kj4vT1pxenN4Lj0+KDIpPmthMFU+LT5rYTBMLD5venM9c24uPi9PV1FZPHNlPjNIbj1zPVE9TT5PQT5UTTIuSE9XT3hxVj4qVj4qPm1Nellzbm5zT0g+c24+Lk16TTxxPnh6ZUg9TTksPkF6TU0+T0E+Mi5lenhNLD49Tz5lSHE+Wk16bk9IPk88PWVzSHNIeD5lPjJPWnFWPio+T0E+PS5zbj5uT0E9fWV6TT5lSDk+ZW5uTzJzZT1NOT45TzJRWU1IPWU9c09IPkFzV01uPig9Lk0+InBPQT19ZXpNIiksPj1PPjlNZVdWPio+c0g+PS5NPnBPQT19ZXpNPn1zPS5PUT0+ek1uPXpzMj1zT0gsPnNIMldROXNIeD59cz0uT1E9PldzWXM9ZT1zT0g+PS5NPnpzeC49blY+Kj49Tz5Rbk0sPjJPWnEsPllPOXNBcSw+WU16eE0sPlpRPFdzbi4sPjlzbj16czxRPU0sPm5RPFdzMk1Ibk0sPmVIOWhPej5uTVdXVj4qPjJPWnNNbj5PQT49Lk0+cE9BPX1lek0sPmVIOT49Tz5aTXpZcz0+Wk16bk9Ibj49Tz59Lk9ZPj0uTT5wT0E9fWV6TT5zblY+Kj5BUXpIc24uTTk+PU8+OU8+bk8sPm5RPApNMj0+PU8+PS5NPkFPV1dPfXNIeD4yT0g5cz1zT0huOlY+KlY+Kj5ULk0+ZTxPY00+Mk9acXpzeC49PkhPPXMyTT5lSDk+PS5zbj5aTXpZc25uc09IPkhPPXMyTT5uLmVXVz48TT5zSDJXUTlNOT5zSFY+Kj5lV1c+Mk9ac01uPk96Pm5RPG49ZUg9c2VXPlpPej1zT0huPk9BPj0uTT5wT0E9fWV6TVhWPipWPio+VHRLPnA3clR7RmdLPjNwPm1nNzYzNEs0PiJGcD4zcCIsPnszVHQ3IFQ+e0ZnZ0ZFVGI+N3I+RkViPkczRTQsPktEbWdLcHA+N2dWPio+M3VtSTNLNCw+M0UvSSA0M0VDPm8gVD5FN1Q+STN1M1RLND5UNz5UdEs+e0ZnZ0ZFVDNLcD43cj51S2cvdEZFVEZvM0kzVGIsVj4qPnIzVEVLcHA+cjdnPkY+bUZnVDMvIElGZz5tIGdtN3BLPkZFND5FN0UzRXJnM0VDS3VLRVRYPjNFPkU3Pks2S0VUPnB0RklJPlR0S1Y+Kj5GIFR0N2dwPjdnPi83bWJnM0N0VD50N0k0S2dwPm9LPkkzRm9JSz5yN2c+RkViPi9JRjN1LD40RnVGQ0twPjdnPjdUdEtnVj4qPkkzRm8zSTNUYiw+e3RLVHRLZz4zRT5GRT5GL1QzN0U+N3I+LzdFVGdGL1QsPlQ3Z1Q+N2c+N1R0S2d7M3BLLD5GZzNwM0VDPnJnN3UsVj4qPjcgVD43cj43Zz4zRT4vN0VFSy9UMzdFPnszVHQ+VHRLPnA3clR7RmdLPjdnPlR0Sz4gcEs+N2c+N1R0S2c+NEtGSTNFQ3A+M0VWPio+VHRLPnA3clR7RmdLWFY+KlY+Kj5AWmUyeWV4TQkvTzlNM3hIcz1NelY+Kj5AZVE9Lk96CUtXV3NuSWU8PjRNYz5UTWVZVj4qPkAyT1pxenN4Lj0JL09acXpzeC49PigyKT5rYWFmPi0+a2EwVSw+S1dXc25JZTwsPjNIMlg+KC49PVo6aGhNV1dzbldlPFgyT1loKVY+Kj5AMk9acXpzeC49CS9PWnF6c3guPT4oMik+a2EwVT4tPmthMEwsPm96cz1zbi4+L09XUVk8c2U+M0huPXM9UT1NPk9BPlRNMi5IT1dPeHE+KC49PVo6aGg8MnM9WDJlaClWPio+QFdzMk1Ibk0JLj09WjpoaE9aTUhuT1F6Mk1YT3p4aFdzMk1Ibk1uaHUzVAl1M1Q+SXMyTUhuTVY+Kj5AV3NIeQkuPT1aOmhoMk85TXN4SHM9TXpYMk9ZVj4qPkBuc0gyTQk2TXpuc09IPjBYYVhhVj4qPkBBc1dNbk9RejJNVj4qaFY5TUFzSE05KCdvRnBLbUZUdCcpPjdnPk1Scz0oJ0VPPjlzek0yPT5uMnpzWj0+ZTIyTW5uPmVXV099TTknKTtWVmgqKlY+Kj53UU16cT5vUXNXOU16Pi9XZW5uVj4qVj4qPlQuc24+c24+PS5NPlpXZT1BT3pZLXNIOU1aTUg5TUg9Pjxlbk0+d1FNenE+b1FzVzlNej5zWVpXTVlNSD1lPXNPSD4yV2VublhWPipWPio+QFplMnlleE0JCS9POU0zeEhzPU16Vj4qPkBuUTxaZTJ5ZXhNCTR6c2NNem5WPio+QDJlPU14T3pxCTRlPWU8ZW5NVj4qPkBlUT0uT3oJCUtXV3NuSWU8PjRNYz5UTWVZVj4qPkBXc0h5CQkuPT1aOmhoMk85TXN4SHM9TXpYMk9ZaFFuTXpfeFFzOU1oOWU9ZTxlbk1oVj4qaFZWZTxuPXplMj0+Mldlbm4+LzNfNG9fdlFNenFfPFFzVzlNej5NUj1NSDluPi8zXzRvXzl6c2NNej5dVlYJaCoqVgk+Kj5nTT1Rekg+NEtJS1RLPnB3ST5BV2V4Vgk+KlYJPio+QGNlegk8T09XVgk+KmhWCVp6Tz1NMj1NOT4kek09UXpIXzlNV009TV9udlcJCVM+ckZJcEs7VlYJaCoqVgk+Kj5nTW5NPT40S0lLVEs+OWU9ZT5BV2V4Vgk+KlYJPio+QGNlegk8T09XVgk+KmhWCVp6Tz1NMj1NOT4kek1uTT1fOU1XTT1NXzllPWUJCVM+ckZJcEs7VlYJaCoqVgk+Kj53bz5wS0lLL1Q+OWU9ZVYJPipWCT4qPkBjZXoJZXp6ZXFWCT4qaFYJWnpPPU0yPU05PiR2PF9uTVdNMj0JCQlTPmV6emVxKCk7VlYJaCoqVgk+Kj53bz40M3BUM0UvVD5BV2V4Vgk+KlYJPio+QGNlegk8T09XVgk+KmhWCVp6Tz1NMj1NOT4kdjxfOXNuPXNIMj0JCQlTPnJGSXBLO1ZWCWgqKlYJPio+d28+cmc3dT45ZT1lVgk+KlYJPio+QGNlegllenplcVYJPipoVglaek89TTI9TTk+JHY8X0F6T1kJCQlTPmV6emVxKCk7VlYJaCoqVgk+Kj53bz44NzNFPjllPWVWCT4qVgk+Kj5AY2V6CWV6emVxVgk+KmhWCVp6Tz1NMj1NOT4kdjxfCk9zSAkJCVM+ZXp6ZXEoKTtWVgloKipWCT4qPndvPnt0S2dLPjllPWVWCT4qVgk+Kj5AY2V6CWV6emVxVgk+KmhWCVp6Tz1NMj1NOT4kdjxffS5Nek0JCQlTPmV6emVxKCk7VlYJaCoqVgk+Kj53bz5DZzcgbT5vYj45ZT1lVgk+KlYJPio+QGNlegllenplcVYJPipoVglaek89TTI9TTk+JHY8X3h6T1FaPHEJCQlTPmV6emVxKCk7VlYJaCoqVgk+Kj53bz50RjYzRUM+OWU9ZVYJPipWCT4qPkBjZXoJZXp6ZXFWCT4qaFYJWnpPPU0yPU05PiR2PF8uZWNzSHgJCQlTPmV6emVxKCk7VlYJaCoqVgk+Kj53bz55TXFuVgk+KlYJPio+QGNlegllenplcVYJPipoVglaek89TTI9TTk+JHY8X3lNcW4JCQlTPmV6emVxKCk7VlYJaCoqVgk+Kj53bz5JM3UzVD45ZT1lVgk+KlYJPio+QGNleglzSD1WCT4qaFYJWnpPPU0yPU05PiR2PF9Xc1lzPQkJCVM+ckZJcEs7VlYJaCoqVgk+Kj53bz43cnJwS1Q+OWU9ZVYJPipWCT4qPkBjZXoJc0g9Vgk+KmhWCVp6Tz1NMj1NOT4kdjxfT0FBbk09CQkJUz5yRklwSztWVgloKipWCT4qPndvPjdnNEtnPm9iPjllPWVWCT4qVgk+Kj5AY2V6CWV6emVxVgk+KmhWCVp6Tz1NMj1NOT4kdjxfT3o5TXo8cQkJCVM+ZXp6ZXEoKTtWVgloKipWCT4qPndvPjllPWU+bk09blYJPipWCT4qPkBjZXoJZXp6ZXFWCT4qaFYJWnpPPU0yPU05PiR2PF9uTT0JCQlTPmV6emVxKCk7VlYJaCoqVgk+Kj53bz5lV3Nlbk05Pj1lPFdNbj5Xc249Vgk+KlYJPio+QGNlegllenplcVYJPipoVglaek89TTI9TTk+JHY8X2VXc2VuTTlfPWU8V01uCQlTPmV6emVxKCk7VlYJaCoqVgk+Kj53bz57dEtnSz54ek9RWj5uPWV6PU05PkFXZXhWCT4qVgk+Kj5AY2V6CTxPT1dWCT4qaFYJWnpPPU0yPU05PiR2PF99Lk16TV94ek9RWl9uPWV6PU05CVM+ckZJcEs7VlYJaCoqVgk+Kj53bz57dEtnSz54ek9RWj4yT1FIPVYJPipWCT4qPkBjZXoJc0g9Vgk+KmhWCVp6Tz1NMj1NOT4kdjxffS5Nek1feHpPUVpfMk9RSD0JCVM+YTtWVgloaD53UU16cT5vUXNXOU16Pi9lMi5zSHg+Y2V6c2U8V01uVlYJaCoqVgk+Kj53bz4vZTIuc0h4PkFXZXhWCT4qVgk+Kj5AY2V6CTxPT1dWCT4qaFYJWnpPPU0yPU05PiR2PF8yZTIuc0h4CQkJCVM+ckZJcEs7VlYJaCoqVgk+Kj53bz4vZTIuTT5NUnNuPW4+V3NuPVYJPipWCT4qPkBjZXoJZXp6ZXFWCT4qaFYJWnpPPU0yPU05PiR2PF8yZTIuTV9NUnNuPW4JCQlTPmV6emVxKCk7VlYJaCoqVgk+Kj53bz4vZTIuTT5wS0lLL1Q+OWU9ZVYJPipWCT4qPkBjZXoJZXp6ZXFWCT4qaFYJWnpPPU0yPU05PiR2PF8yZTIuTV9uTVdNMj0JCQlTPmV6emVxKCk7VlYJaCoqVgk+Kj53bz4vZTIuTT5yZzd1PjllPWVWCT4qVgk+Kj5AY2V6CWV6emVxVgk+KmhWCVp6Tz1NMj1NOT4kdjxfMmUyLk1fQXpPWQkJCVM+ZXp6ZXEoKTtWVgloKipWCT4qPndvPi9lMi5NPjg3M0U+OWU9ZVYJPipWCT4qPkBjZXoJZXp6ZXFWCT4qaFYJWnpPPU0yPU05PiR2PF8yZTIuTV8KT3NICQkJUz5lenplcSgpO1ZWCWgqKlYJPio+d28+L2UyLk0+e3RLZ0s+OWU9ZVYJPipWCT4qPkBjZXoJZXp6ZXFWCT4qaFYJWnpPPU0yPU05PiR2PF8yZTIuTV99Lk16TQkJCVM+ZXp6ZXEoKTtWVgloKipWCT4qPndvPi9lMi5NPkNnNyBtPm9iPjllPWVWCT4qVgk+Kj5AY2V6CWV6emVxVgk+KmhWCVp6Tz1NMj1NOT4kdjxfMmUyLk1feHpPUVo8cQkJCVM+ZXp6ZXEoKTtWVgloKipWCT4qPndvPi9lMi5NPnRGNjNFQz45ZT1lVgk+KlYJPio+QGNlegllenplcVYJPipoVglaek89TTI9TTk+JHY8XzJlMi5NXy5lY3NIeAkJCVM+ZXp6ZXEoKTtWVgloKipWCT4qPndvPi9lMi5NPjdnNEtnPm9iPjllPWVWCT4qVgk+Kj5AY2V6CWV6emVxVgk+KmhWCVp6Tz1NMj1NOT4kdjxfMmUyLk1fT3o5TXo8cQkJCVM+ZXp6ZXEoKTtWVgloKipWCT4qPndvPi9lMi5NPjllPWU+bk09blYJPipWCT4qPkBjZXoJZXp6ZXFWCT4qaFYJWnpPPU0yPU05PiR2PF8yZTIuTV9uTT0JCQkJUz5lenplcSgpO1ZWCWgqKlYJPio+d28+RU8+S24yZVpNPjllPWVWCT4qVgk+Kj5AY2V6CWV6emVxVgk+KmhWCVp6Tz1NMj1NOT4kdjxfSE9fTW4yZVpNPgkJCVM+ZXp6ZXEoKTtWVgloKipWCT4qPndvPi9lMi5NPkVPPktuMmVaTT45ZT1lVgk+KlYJPio+QGNlegllenplcVYJPipoVglaek89TTI9TTk+JHY8XzJlMi5NX0hPX01uMmVaTQkJCVM+ZXp6ZXEoKTtWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+cE1XTTI9Vgk+KlYJPio+Q01ITXplPU1uPj0uTT5wS0lLL1Q+Wk96PXNPSD5PQT49Lk0+dlFNenFWCT4qVgk+Kj5AWmV6ZVkJbj16c0h4Vgk+Kj5AWmV6ZVkJWXNSTTlWCT4qPkB6TT1RekgJLzNfNG9fdlFNenFfPFFzVzlNelYJPipoVglaUTxXczI+QVFIMj1zT0g+bk1XTTI9KCRuTVdNMj0+Uz4nKicsPiRNbjJlWk0+Uz5FIElJKVYJXVYJCXNBPihzbl9uPXpzSHgoJG5NV00yPSkpVgkJXVYJCQkkbk1XTTI9PlM+TVJaV085TSgnLCcsPiRuTVdNMj0pO1YJCWxWVgkJaGg+M0E+PS5NPk1uMmVaTT5jZVdRTT59ZW4+SE89Pm5NPSw+fU0+fXNXVz48ZW5NPnM9Pk9IPj0uTT54V088ZVc+bk09PXNIeFYJCXNuXzxPT1coJE1uMmVaTSk+N2c+JE1uMmVaTT5TPiQ9LnNuLWlfWnpPPU0yPV9zOU1IPXNBc016bjtWVgkJQU96TWUyLj4oJG5NV00yPT5lbj4kY2VXKVYJCV1WCQkJJGNlVz5TPj16c1koJGNlVyk7VlYJCQlzQT4oJGNlVz4hU1M+JycpVgkJCV1WCQkJCSQ9LnNuLWl2PF9uTVdNMj1qZD5TPiRjZVc7VgkJCQkkPS5zbi1pdjxfSE9fTW4yZVpNamQ+Uz4kTW4yZVpNO1ZWCQkJCXNBPigkPS5zbi1pdjxfMmUyLnNIeD5TU1M+VGcgSylWCQkJCV1WCQkJCQkkPS5zbi1pdjxfMmUyLk1fbk1XTTI9amQ+Uz4kY2VXO1YJCQkJCSQ9LnNuLWl2PF8yZTIuTV9NUnNuPW5qZD5TPiduTVdNMj0nO1YJCQkJCSQ9LnNuLWl2PF8yZTIuTV9IT19NbjJlWk1qZD5TPiRNbjJlWk07VgkJCQlsVgkJCWxWCQlsVlYJCXpNPVF6SD4kPS5zbjtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+cE1XTTI9PnVlUlYJPipWCT4qPkNNSE16ZT1Nbj5lPnBLSUsvVD51RkQoQXNNVzkpPlpPej1zT0g+T0E+ZT52UU16cVYJPipWCT4qPkBaZXplWQluPXpzSHgJPS5NPkFzTVc5Vgk+Kj5AWmV6ZVkJbj16c0h4CWVIPmVXc2VuVgk+Kj5Aek09UXpICS8zXzRvX3ZRTXpxXzxRc1c5TXpWCT4qaFYJWlE8V3MyPkFRSDI9c09IPm5NV00yPV9ZZVIoJG5NV00yPT5TPicnLD4kZVdzZW4+Uz4nJylWCV1WCQl6TT1Rekg+JD0uc24taV9ZZVJfWXNIX2VjeF9uUVkoJG5NV00yPSw+JGVXc2VuLD4ndUZEJyk7VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPnBNV00yPT51c0hWCT4qVgk+Kj5DTUhNemU9TW4+ZT5wS0lLL1Q+dTNFKEFzTVc5KT5aT3o9c09IPk9BPmU+dlFNenFWCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CT0uTT5Bc01XOVYJPio+QFplemVZCW49enNIeAllSD5lV3NlblYJPio+QHpNPVF6SAkvM180b192UU16cV88UXNXOU16Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD5uTVdNMj1fWXNIKCRuTVdNMj0+Uz4nJyw+JGVXc2VuPlM+JycpVgldVgkJek09UXpIPiQ9LnNuLWlfWWVSX1lzSF9lY3hfblFZKCRuTVdNMj0sPiRlV3Nlbiw+J3UzRScpO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj5wTVdNMj0+RmNNemV4TVYJPipWCT4qPkNNSE16ZT1Nbj5lPnBLSUsvVD5GNkMoQXNNVzkpPlpPej1zT0g+T0E+ZT52UU16cVYJPipWCT4qPkBaZXplWQluPXpzSHgJPS5NPkFzTVc5Vgk+Kj5AWmV6ZVkJbj16c0h4CWVIPmVXc2VuVgk+Kj5Aek09UXpICS8zXzRvX3ZRTXpxXzxRc1c5TXpWCT4qaFYJWlE8V3MyPkFRSDI9c09IPm5NV00yPV9lY3goJG5NV00yPT5TPicnLD4kZVdzZW4+Uz4nJylWCV1WCQl6TT1Rekg+JD0uc24taV9ZZVJfWXNIX2VjeF9uUVkoJG5NV00yPSw+JGVXc2VuLD4nRjZDJyk7VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPnBNV00yPT5wUVlWCT4qVgk+Kj5DTUhNemU9TW4+ZT5wS0lLL1Q+cCB1KEFzTVc5KT5aT3o9c09IPk9BPmU+dlFNenFWCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CT0uTT5Bc01XOVYJPio+QFplemVZCW49enNIeAllSD5lV3NlblYJPio+QHpNPVF6SAkvM180b192UU16cV88UXNXOU16Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD5uTVdNMj1fblFZKCRuTVdNMj0+Uz4nJyw+JGVXc2VuPlM+JycpVgldVgkJek09UXpIPiQ9LnNuLWlfWWVSX1lzSF9lY3hfblFZKCRuTVdNMj0sPiRlV3Nlbiw+J3AgdScpO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj5wS0lLL1Q+anVGRHx1M0V8RjZDfHAgdWQoKVYJPipWCT4qPkBRbk05LTxxCW5NV00yPV9ZZVIoKVYJPio+QFFuTTktPHEJbk1XTTI9X1lzSCgpVgk+Kj5AUW5NOS08cQluTVdNMj1fZWN4KClWCT4qPkBRbk05LTxxCW5NV00yPV9uUVkoKVYJPipWCT4qPkBaZXplWQluPXpzSHgJJG5NV00yPQlyc01XOT5IZVlNVgk+Kj5AWmV6ZVkJbj16c0h4CSRlV3NlblYJPio+QFplemVZCW49enNIeAkkPXFaTVYJPio+QHpNPVF6SAkvM180b192UU16cV88UXNXOU16Vgk+KmhWCVp6Tz1NMj1NOT5BUUgyPXNPSD5fWWVSX1lzSF9lY3hfblFZKCRuTVdNMj0+Uz4nJyw+JGVXc2VuPlM+JycsPiQ9cVpNPlM+J3VGRCcpVgldVgkJc0E+KD4hPnNuX249enNIeCgkbk1XTTI9KT43Zz4kbk1XTTI9PlNTUz4nJylWCQldVgkJCSQ9LnNuLWk5c25aV2VxX016ek96KCc5PF9zSGNlV3M5X3ZRTXpxJyk7VgkJbFZWCQkkPXFaTT5TPm49ej1PUVpaTXooJD1xWk0pO1ZWCQlzQT4oPiE+c0hfZXp6ZXEoJD1xWk0sPmV6emVxKCd1RkQnLD4ndTNFJyw+J0Y2QycsPidwIHUnKSkpVgkJXVYJCQluLk99X016ek96KCczSGNlV3M5PkFRSDI9c09IPj1xWk06PidYJD1xWk0pO1YJCWxWVgkJc0E+KCRlV3Nlbj5TU1M+JycpVgkJXVYJCQkkZVdzZW4+Uz4kPS5zbi1pXzJ6TWU9TV9lV3Nlbl9Bek9ZXz1lPFdNKD16c1koJG5NV00yPSkpO1YJCWxWVgkJJG52Vz5TPiQ9cVpNWCcoJ1gkPS5zbi1pWnpPPU0yPV9zOU1IPXNBc016big9enNZKCRuTVdNMj0pKVgnKT5GcD4nWCQ9LnNuLWlNbjJlWk1fczlNSD1zQXNNem4oPXpzWSgkZVdzZW4pKTtWVgkJJD0uc24taXY8X25NV00yPWpkPlM+JG52VztWCQkkPS5zbi1pdjxfSE9fTW4yZVpNamQ+Uz5FIElJO1ZWCQlzQT4oJD0uc24taXY8XzJlMi5zSHg+U1NTPlRnIEspVgkJXVYJCQkkPS5zbi1pdjxfMmUyLk1fbk1XTTI9amQ+Uz4kbnZXO1YJCQkkPS5zbi1pdjxfMmUyLk1fTVJzbj1uamQ+Uz4nbk1XTTI9JztWCQlsVlYJCXpNPVF6SD4kPS5zbjtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+NE09TXpZc0hNbj49Lk0+ZVdzZW4+SGVZTT48ZW5NOT5PSD49Lk0+PWU8V01WCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CSRzPU1ZVgk+Kj5Aek09UXpICW49enNIeFYJPipoVglaek89TTI9TTk+QVFIMj1zT0g+XzJ6TWU9TV9lV3Nlbl9Bek9ZXz1lPFdNKCRzPU1ZKVYJXVYJCXNBPihuPXpaT24oJHM9TVksPidYJyk+IVNTPnJGSXBLKVYJCV1WCQkJJHM9TVk+Uz5NUlpXTzlNKCdYJyw+JHM9TVkpO1YJCQl6TT1Rekg+TUg5KCRzPU1ZKTtWCQlsVlYJCXpNPVF6SD4kcz1NWTtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+NDNwVDNFL1RWCT4qVgk+Kj5wTT1uPmU+QVdleD59LnMyLj49TVdXbj49Lk0+dlFNenE+bj16c0h4PjJPWVpzV016Pj1PPmU5OT40M3BUM0UvVFYJPipWCT4qPkBaZXplWQk8T09XCSRjZVdWCT4qPkB6TT1RekgJLzNfNG9fdlFNenFfPFFzVzlNelYJPipoVglaUTxXczI+QVFIMj1zT0g+OXNuPXNIMj0oJGNlVz5TPlRnIEspVgldVgkJJD0uc24taXY8Xzlzbj1zSDI9PlM+c25fPE9PVygkY2VXKT4/PiRjZVc+Oj5UZyBLO1YJCXpNPVF6SD4kPS5zbjtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+cnpPWVYJPipWCT4qPkNNSE16ZT1Nbj49Lk0+cmc3dT5aT3o9c09IPk9BPj0uTT52UU16cVYJPipWCT4qPkBaZXplWQlZc1JNOQkkQXpPWQkyZUg+PE0+ZT5uPXpzSHg+T3o+ZXp6ZXFWCT4qPkB6TT1RekgJLzNfNG9fdlFNenFfPFFzVzlNelYJPipoVglaUTxXczI+QVFIMj1zT0g+QXpPWSgkQXpPWSlWCV1WCQlBT3pNZTIuPigoZXp6ZXEpPiRBek9ZPmVuPiRjZVcpVgkJXVYJCQlzQT4obj16Wk9uKCRjZVcsPicsJyk+IVNTPnJGSXBLKVYJCQldVgkJCQlBT3pNZTIuPihNUlpXTzlNKCcsJyw+JGNlVyk+ZW4+JGMpVgkJCQldVgkJCQkJJGM+Uz49enNZKCRjKTtWCQkJCQkkPS5zbi1pXz16ZTJ5X2VXc2VuTW4oJGMpO1ZWCQkJCQkkPS5zbi1pdjxfQXpPWWpkPlM+JGM+Uz4kPS5zbi1pWnpPPU0yPV9zOU1IPXNBc016bigkYyw+VGcgSyw+RSBJSSw+ckZJcEspO1ZWCQkJCQlzQT4oJD0uc24taXY8XzJlMi5zSHg+U1NTPlRnIEspVgkJCQkJXVYJCQkJCQkkPS5zbi1pdjxfMmUyLk1fQXpPWWpkPlM+JGM7VgkJCQkJCSQ9LnNuLWl2PF8yZTIuTV9NUnNuPW5qZD5TPidBek9ZJztWCQkJCQlsVgkJCQlsVgkJCWxWCQkJTVduTVYJCQldVgkJCQkkY2VXPlM+PXpzWSgkY2VXKTtWVgkJCQloaD5LUj16ZTI9PmVIcT5lV3Nlbk1uPj0uZT0+WXN4Lj0+TVJzbj1YPntNPlFuTT49LnNuPnNIQU96WWU9c09IVgkJCQloaD5zSD49Lk0+WnpPPU0yPV9zOU1IPXNBc016bj49Tz55SE99Pn0uTT0uTXo+PU8+ZTk5PmU+PWU8V00+WnpNQXNSVgkJCQkkPS5zbi1pXz16ZTJ5X2VXc2VuTW4oJGNlVyk7VlYJCQkJJD0uc24taXY8X0F6T1lqZD5TPiRjZVc+Uz4kPS5zbi1pWnpPPU0yPV9zOU1IPXNBc016bigkY2VXLD5UZyBLLD5FIElJLD5yRklwSyk7VlYJCQkJc0E+KCQ9LnNuLWl2PF8yZTIuc0h4PlNTUz5UZyBLKVYJCQkJXVYJCQkJCSQ9LnNuLWl2PF8yZTIuTV9Bek9ZamQ+Uz4kY2VXO1YJCQkJCSQ9LnNuLWl2PF8yZTIuTV9NUnNuPW5qZD5TPidBek9ZJztWCQkJCWxWCQkJbFYJCWxWVgkJek09UXpIPiQ9LnNuO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj44NzNFVgk+KlYJPio+Q01ITXplPU1uPj0uTT44NzNFPlpPej1zT0g+T0E+PS5NPnZRTXpxVgk+KlYJPio+QFplemVZCW49enNIeFYJPio+QFplemVZCW49enNIeAk9Lk0+Ck9zSD4yT0g5cz1zT0hWCT4qPkBaZXplWQluPXpzSHgJPS5NPj1xWk0+T0E+Ck9zSFYJPio+QFplemVZCW49enNIeAl9Lk09Lk16PkhPPT49Tz49enE+PU8+TW4yZVpNPnM5TUg9c0FzTXpuVgk+Kj5Aek09UXpICS8zXzRvX3ZRTXpxXzxRc1c5TXpWCT4qaFYJWlE8V3MyPkFRSDI9c09IPgpPc0goJD1lPFdNLD4kMk9IOSw+JD1xWk0+Uz4nJyw+JE1uMmVaTT5TPkUgSUkpVgldVgkJc0E+KCQ9cVpNPiFTUz4nJylWCQldVgkJCSQ9cVpNPlM+bj16PU9RWlpNeig9enNZKCQ9cVpNKSk7VlYJCQlzQT4oPiE+c0hfZXp6ZXEoJD1xWk0sPmV6emVxKCdJS3JUJyw+J2czQ3RUJyw+JzcgVEtnJyw+JzNFRUtnJyw+J0lLclQ+NyBUS2cnLD4nZzNDdFQ+NyBUS2cnKSw+VGcgSykpVgkJCV1WCQkJCSQ9cVpNPlM+Jyc7VgkJCWxWCQkJTVduTVYJCQldVgkJCQkkPXFaTT5YUz4nPic7VgkJCWxWCQlsVlYJCWhoPktSPXplMj0+ZUhxPmVXc2VuTW4+PS5lPT5Zc3guPT5NUnNuPVg+e00+UW5NPj0uc24+c0hBT3pZZT1zT0hWCQloaD5zSD49Lk0+WnpPPU0yPV9zOU1IPXNBc016bj49Tz55SE99Pn0uTT0uTXo+PU8+ZTk5PmU+PWU8V00+WnpNQXNSVgkJJD0uc24taV89emUyeV9lV3Nlbk1uKCQ9ZTxXTSk7VlYJCXNuXzxPT1coJE1uMmVaTSk+N2c+JE1uMmVaTT5TPiQ9LnNuLWlfWnpPPU0yPV9zOU1IPXNBc016bjtWVgkJaGg+cFpXcz0+WVFXPXNaV00+Mk9IOXM9c09IblYJCXNBPigkTW4yZVpNPlNTUz5UZyBLPiYmPlp6TXhfWWU9Mi5fZVdXKCdoXG5GRTRcbnxcbjdnXG5ocycsPiQyT0g5LD4kWSw+bWdLQ183cnJwS1RfL0ZtVCBnSykpVgkJXVYJCQkkSE19Mk9IOT5TPicnO1YJCQkkWWphZGpkPlM+ZXp6ZXEoJycsPm49eldNSCgkMk9IOSkpO1ZWCQkJQU96Pigkcz5TPmEsPiQyPlM+Mk9RSD0oJFlqYWQpLD4kbj5TPmE7VgkJCQkkcz5CPiQyO1YJCQkJJG4+Uz4kWWphZGokc2RqMGQ+Kz5uPXpXTUgoJFlqYWRqJHNkamFkKSw+JHMrKylWCQkJXVYJCQkJJD1NWVo+Uz5uUTxuPXooJDJPSDksPiRuLD4oJFlqYWRqJHNkajBkPi0+JG4pKTtWVgkJCQkkSE19Mk9IOT5YUz5aek14X1llPTIuKCJoKGpcalxkXH1cWCctZCspKFxuKmpeXCJcamAnXH1kK1xuKikoWCspaHMiLD4kPU1ZWiw+JFllPTIuKVYJCQkJCQk/PiQ9LnNuLWlaek89TTI9X3M5TUg9c0FzTXpuKCRZZT0yLmowZClYJFllPTIuamtkWCQ9LnNuLWlaek89TTI9X3M5TUg9c0FzTXpuKCRZZT0yLmpKZClWCQkJCQkJOj4kPU1ZWjtWVgkJCQkkSE19Mk9IOT5YUz4kWWphZGokc2RqYWQ7VgkJCWxWVgkJCSQyT0g5PlM+Jz43RT4nWCRITX0yT0g5O1YJCWxWCQloaD5wWldzPT5lWmV6PT49Lk0+Mk9IOXM9c09IPmVIOT5aek89TTI9Pj0uTT5zOU1IPXNBc016blYJCU1Xbk1zQT4oJE1uMmVaTT5TU1M+VGcgSz4mJj5aek14X1llPTIuKCJoKGpcalxkXH1cWCctZCspKFxuKmpeXCJcamAnXH1kK1xuKikoWCspaHMiLD4kMk9IOSw+JFllPTIuKSlWCQldVgkJCSQyT0g5PlM+Jz43RT4nWCQ9LnNuLWlaek89TTI9X3M5TUg9c0FzTXpuKCRZZT0yLmowZClYJFllPTIuamtkWCQ9LnNuLWlaek89TTI9X3M5TUg9c0FzTXpuKCRZZT0yLmpKZCk7VgkJbFYJCU1Xbk1zQT4oPiE+JD0uc24taV8uZW5fT1pNemU9T3ooJDJPSDkpKVYJCV1WCQkJJDJPSDk+Uz4nPiBwM0VDPignWCgkTW4yZVpNPj8+JD0uc24taU1uMmVaTV9zOU1IPXNBc016bigkMk9IOSk+Oj4kMk9IOSlYJyknO1YJCWxWCQlNV25NVgkJXVYJCQkkMk9IOT5TPic+N0U+J1gkMk9IOTtWCQlsVlYJCWhoPjRPPn1NPn1lSD0+PU8+TW4yZVpNPj0uTT49ZTxXTT5IZVlNP1YJCXNBPigkTW4yZVpNPlNTUz5UZyBLKVYJCV1WCQkJJD1lPFdNPlM+JD0uc24taVp6Tz1NMj1fczlNSD1zQXNNem4oJD1lPFdNLD5UZyBLLD5FIElJLD5yRklwSyk7VgkJbFZWCQloaD5Gbm5NWTxXTT49Lk0+ODczRT5uPWU9TVlNSD1WCQkkPS5zbi1pdjxfCk9zSGpkPlM+JApPc0g+Uz4kPXFaTVgnODczRT4nWCQ9ZTxXTVgkMk9IOTtWVgkJc0E+KCQ9LnNuLWl2PF8yZTIuc0h4PlNTUz5UZyBLKVYJCV1WCQkJJD0uc24taXY8XzJlMi5NXwpPc0hqZD5TPiQKT3NIO1YJCQkkPS5zbi1pdjxfMmUyLk1fTVJzbj1uamQ+Uz4nCk9zSCc7VgkJbFZWCQl6TT1Rekg+JD0uc247VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPnt0S2dLVgk+KlYJPio+Q01ITXplPU1uPj0uTT57dEtnSz5aT3o9c09IPk9BPj0uTT52UU16cVhWCT4qPnBNWmV6ZT1Nbj5ZUVc9c1pXTT4yZVdXbj59cz0uPidGRTQnWFYJPipWCT4qPkBaZXplWQlZc1JNOVYJPio+QFplemVZCVlzUk05Vgk+Kj5AWmV6ZVkJPE9PV1YJPio+QHpNPVF6SAkvM180b192UU16cV88UXNXOU16Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD59Lk16TSgkeU1xLD4kY2VXUU0+Uz5FIElJLD4kTW4yZVpNPlM+RSBJSSlWCV1WCQl6TT1Rekg+JD0uc24taV99LigndjxffS5Nek0nLD4keU1xLD4kY2VXUU0sPidGRTQ+Jyw+JE1uMmVaTSk7VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPjdnPnt0S2dLVgk+KlYJPio+Q01ITXplPU1uPj0uTT57dEtnSz5aT3o9c09IPk9BPj0uTT52UU16cVhWCT4qPnBNWmV6ZT1Nbj5ZUVc9c1pXTT4yZVdXbj59cz0uPic3ZydYVgk+KlYJPio+QFplemVZCVlzUk05Vgk+Kj5AWmV6ZVkJWXNSTTlWCT4qPkBaZXplWQk8T09XVgk+Kj5Aek09UXpICS8zXzRvX3ZRTXpxXzxRc1c5TXpWCT4qaFYJWlE8V3MyPkFRSDI9c09IPk96X30uTXpNKCR5TXEsPiRjZVdRTT5TPkUgSUksPiRNbjJlWk0+Uz5FIElJKVYJXVYJCXpNPVF6SD4kPS5zbi1pX30uKCd2PF99Lk16TScsPiR5TXEsPiRjZVdRTSw+JzdnPicsPiRNbjJlWk0pO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj57dEtnSyw+dEY2M0VDVgk+KlYJPio+QFFuTTktPHEJfS5Nek0oKVYJPio+QFFuTTktPHEJT3pffS5Nek0oKVYJPio+QFFuTTktPHEJLmVjc0h4KClWCT4qPkBRbk05LTxxCU96Xy5lY3NIeCgpVgk+KlYJPio+QFplemVZCW49enNIeAkkdjxfeU1xCSd2PF99Lk16TSc+T3o+J3Y8Xy5lY3NIeCdWCT4qPkBaZXplWQlZc1JNOQkkeU1xVgk+Kj5AWmV6ZVkJWXNSTTkJJGNlV1FNVgk+Kj5AWmV6ZVkJbj16c0h4CSQ9cVpNVgk+Kj5AWmV6ZVkJPE9PVwkkTW4yZVpNVgk+Kj5Aek09UXpICS8zXzRvX3ZRTXpxXzxRc1c5TXpWCT4qaFYJWnpPPU0yPU05PkFRSDI9c09IPl99LigkdjxfeU1xLD4keU1xLD4kY2VXUU0+Uz5FIElJLD4kPXFaTT5TPidGRTQ+Jyw+JE1uMmVaTT5TPkUgSUkpVgldVgkJJHY8XzJlMi5NX3lNcT5TPigkdjxfeU1xPlNTUz4ndjxfLmVjc0h4Jyk+Pz4ndjxfMmUyLk1fLmVjc0h4Jz46Pid2PF8yZTIuTV99Lk16TSc7VlYJCXNBPig+IT5zbl9lenplcSgkeU1xKSlWCQldVgkJCSR5TXE+Uz5lenplcSgkeU1xPlNpPiRjZVdRTSk7VgkJbFZWCQloaD4zQT49Lk0+TW4yZVpNPmNlV1FNPn1lbj5ITz0+bk09Pn1zV1c+PGVuTT5zPT5PSD49Lk0+eFdPPGVXPm5NPT1zSHhWCQlzbl88T09XKCRNbjJlWk0pPjdnPiRNbjJlWk0+Uz4kPS5zbi1pX1p6Tz1NMj1fczlNSD1zQXNNem47VlYJCUFPek1lMi4+KCR5TXE+ZW4+JHk+U2k+JGMpVgkJXVYJCQkkWnpNQXNSPlM+KDJPUUg9KCQ9LnNuLWkkdjxfeU1xKT5TU1M+YT4mJj4yT1FIPSgkPS5zbi1pJHY8XzJlMi5NX3lNcSk+U1NTPmEpVgkJCQk/PiQ9LnNuLWlfeHpPUVpfeE09Xz1xWk0oJycpVgkJCQk6PiQ9LnNuLWlfeHpPUVpfeE09Xz1xWk0oJD1xWk0pO1ZWCQkJc0E+KCRjPiFTUz5FIElJKVYJCQldVgkJCQlzQT4oJE1uMmVaTT5TU1M+VGcgSylWCQkJCV1WCQkJCQkkYz5TPic+J1gkPS5zbi1pTW4yZVpNKCRjKTtWCQkJCWxWVgkJCQlzQT4oPiE+JD0uc24taV8uZW5fT1pNemU9T3ooJHkpKVYJCQkJXVYJCQkJCSR5PlhTPic+Uz4nO1YJCQkJbFYJCQlsVgkJCU1Xbk1zQT4oPiE+JD0uc24taV8uZW5fT1pNemU9T3ooJHkpKVYJCQldVgkJCQloaD5jZVdRTT5lWlpNZXpuPkhPPT49Tz4uZWNNPjxNTUg+bk09LD5lbm5zeEg+PS5NPj1Nbj0+PU8+M3A+RSBJSVYJCQkJJHk+WFM+Jz4zcD5FIElJJztWCQkJbFYJCQlNV25Nc0E+KFp6TXhfWWU9Mi4oJ2hcbiooIT9TfEJpfDNwKD86XG4rRTdUKT8pXG4qJGhzJyw+JHksPiRZZT0yLiw+bWdLQ183cnJwS1RfL0ZtVCBnSykpVgkJCV1WCQkJCSR5PlM+blE8bj16KCR5LD5hLD4kWWU9Mi5qYWRqMGQpWCgkWWU9Mi5qMGRqYWQ+U1NTPidTJz4/Pic+M3A+RSBJSSc+Oj4nPjNwPkU3VD5FIElJJyk7VgkJCWxWVgkJCSQ9LnNuLWldJHY8X3lNcWxqZD5TPmV6emVxKCcyT0g5cz1zT0gnPlNpPiRaek1Bc1JYJHlYJGMsPidNbjJlWk0nPlNpPiRNbjJlWk0pO1YJCQlzQT4oJD0uc24taXY8XzJlMi5zSHg+U1NTPlRnIEspVgkJCV1WCQkJCSQ9LnNuLWldJHY8XzJlMi5NX3lNcWxqZD5TPmV6emVxKCcyT0g5cz1zT0gnPlNpPiRaek1Bc1JYJHlYJGMsPidNbjJlWk0nPlNpPiRNbjJlWk0pO1YJCQkJJD0uc24taXY8XzJlMi5NX01Sc249bmpkPlM+blE8bj16KCR2PF95TXEsPkopO1YJCQlsVlYJCWxWVgkJek09UXpIPiQ9LnNuO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj57dEtnSz4zRVYJPipWCT4qPkNNSE16ZT1Nbj5lPnt0S2dLPkFzTVc5PjNFKCdzPU1ZJyw+J3M9TVknKT5wd0k+dlFNenEsVgk+Kj4KT3NITTk+fXM9Lj4nRkU0Jz5zQT5lWlp6T1p6c2U9TVhWCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CSR5TXEJVC5NPkFzTVc5Pj1PPm5NZXoyLlYJPio+QFplemVZCWV6emVxCSRjZVdRTW4JVC5NPmNlV1FNbj5uTWV6Mi5NOT5PSFYJPio+QFplemVZCTxPT1cJJE1uMmVaTVYJPio+QHpNPVF6SAkvM180b192UU16cV88UXNXOU16Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD59Lk16TV9zSCgkeU1xPlM+RSBJSSw+JGNlV1FNbj5TPkUgSUksPiRNbjJlWk0+Uz5FIElJKVYJXVYJCXpNPVF6SD4kPS5zbi1pX30uTXpNX3NIKCR5TXEsPiRjZVdRTW4sPnJGSXBLLD4nRkU0PicsPiRNbjJlWk0pO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj43Zz57dEtnSz4zRVYJPipWCT4qPkNNSE16ZT1Nbj5lPnt0S2dLPkFzTVc5PjNFKCdzPU1ZJyw+J3M9TVknKT5wd0k+dlFNenEsVgk+Kj4KT3NITTk+fXM9Lj4nN2cnPnNBPmVaWnpPWnpzZT1NWFYJPipWCT4qPkBaZXplWQluPXpzSHgJJHlNcQlULk0+QXNNVzk+PU8+bk1lejIuVgk+Kj5AWmV6ZVkJZXp6ZXEJJGNlV1FNbglULk0+Y2VXUU1uPm5NZXoyLk05Pk9IVgk+Kj5AWmV6ZVkJPE9PVwkkTW4yZVpNVgk+Kj5Aek09UXpICS8zXzRvX3ZRTXpxXzxRc1c5TXpWCT4qaFYJWlE8V3MyPkFRSDI9c09IPk96X30uTXpNX3NIKCR5TXE+Uz5FIElJLD4kY2VXUU1uPlM+RSBJSSw+JE1uMmVaTT5TPkUgSUkpVgldVgkJek09UXpIPiQ9LnNuLWlffS5Nek1fc0goJHlNcSw+JGNlV1FNbiw+ckZJcEssPic3Zz4nLD4kTW4yZVpNKTtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+e3RLZ0s+RTdUPjNFVgk+KlYJPio+Q01ITXplPU1uPmU+e3RLZ0s+QXNNVzk+RTdUPjNFKCdzPU1ZJyw+J3M9TVknKT5wd0k+dlFNenEsVgk+Kj4KT3NITTk+fXM9Lj4nRkU0Jz5zQT5lWlp6T1p6c2U9TVhWCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CSR5TXEJVC5NPkFzTVc5Pj1PPm5NZXoyLlYJPio+QFplemVZCWV6emVxCSRjZVdRTW4JVC5NPmNlV1FNbj5uTWV6Mi5NOT5PSFYJPio+QFplemVZCTxPT1cJJE1uMmVaTVYJPio+QHpNPVF6SAkvM180b192UU16cV88UXNXOU16Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD59Lk16TV9ITz1fc0goJHlNcT5TPkUgSUksPiRjZVdRTW4+Uz5FIElJLD4kTW4yZVpNPlM+RSBJSSlWCV1WCQl6TT1Rekg+JD0uc24taV99Lk16TV9zSCgkeU1xLD4kY2VXUU1uLD5UZyBLLD4nRkU0PicsPiRNbjJlWk0pO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj43Zz57dEtnSz5FN1Q+M0VWCT4qVgk+Kj5DTUhNemU9TW4+ZT57dEtnSz5Bc01XOT5FN1Q+M0UoJ3M9TVknLD4ncz1NWScpPnB3ST52UU16cSxWCT4qPgpPc0hNOT59cz0uPic3Zyc+c0E+ZVpaek9aenNlPU1YVgk+KlYJPio+QFplemVZCW49enNIeAkkeU1xCVQuTT5Bc01XOT49Tz5uTWV6Mi5WCT4qPkBaZXplWQllenplcQkkY2VXUU1uCVQuTT5jZVdRTW4+bk1lejIuTTk+T0hWCT4qPkBaZXplWQk8T09XCSRNbjJlWk1WCT4qPkB6TT1RekgJLzNfNG9fdlFNenFfPFFzVzlNelYJPipoVglaUTxXczI+QVFIMj1zT0g+T3pffS5Nek1fSE89X3NIKCR5TXE+Uz5FIElJLD4kY2VXUU1uPlM+RSBJSSw+JE1uMmVaTT5TPkUgSUkpVgldVgkJek09UXpIPiQ9LnNuLWlffS5Nek1fc0goJHlNcSw+JGNlV1FNbiw+VGcgSyw+JzdnPicsPiRNbjJlWk0pO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj4zSD1NekhlVz57dEtnSz4zRVYJPipWCT4qPkBRbk05LTxxCX0uTXpNX3NIKClWCT4qPkBRbk05LTxxCU96X30uTXpNX3NIKClWCT4qPkBRbk05LTxxCX0uTXpNX0hPPV9zSCgpVgk+Kj5AUW5NOS08cQlPel99Lk16TV9ITz1fc0goKVYJPipWCT4qPkBaZXplWQluPXpzSHgJJHlNcQlULk0+QXNNVzk+PU8+bk1lejIuVgk+Kj5AWmV6ZVkJZXp6ZXEJJGNlV1FNbglULk0+Y2VXUU1uPm5NZXoyLk05Pk9IVgk+Kj5AWmV6ZVkJPE9PVwkkSE89CTNBPj0uTT5uPWU9TVlNSD0+fU9RVzk+PE0+M0U+T3o+RTdUPjNFVgk+Kj5AWmV6ZVkJbj16c0h4CSQ9cVpNVgk+Kj5AWmV6ZVkJPE9PVwkkTW4yZVpNVgk+Kj5Aek09UXpICS8zXzRvX3ZRTXpxXzxRc1c5TXpWCT4qaFYJWnpPPU0yPU05PkFRSDI9c09IPl99Lk16TV9zSCgkeU1xPlM+RSBJSSw+JGNlV1FNbj5TPkUgSUksPiRITz0+Uz5yRklwSyw+JD1xWk0+Uz4nRkU0PicsPiRNbjJlWk0+Uz5FIElJKVYJXVYJCXNBPigkeU1xPlNTUz5FIElJPjdnPiRjZVdRTW4+U1NTPkUgSUkpVgkJXVYJCQl6TT1Rekg+JD0uc247VgkJbFZWCQlzQT4oPiE+c25fZXp6ZXEoJGNlV1FNbikpVgkJXVYJCQkkY2VXUU1uPlM+ZXp6ZXEoJGNlV1FNbik7VgkJbFZWCQlzbl88T09XKCRNbjJlWk0pPjdnPiRNbjJlWk0+Uz4kPS5zbi1pX1p6Tz1NMj1fczlNSD1zQXNNem47VlYJCSRITz0+Uz4oJEhPPSk+Pz4nPkU3VCc+Oj4nJztWVgkJJH0uTXpNX3NIPlM+ZXp6ZXEoKTtWCQlBT3pNZTIuPigkY2VXUU1uPmVuPiRjZVdRTSlWCQldVgkJCSR9Lk16TV9zSGpkPlM+JD0uc24taU1uMmVaTSgkY2VXUU0pO1YJCWxWVgkJJFp6TUFzUj5TPigyT1FIPSgkPS5zbi1pdjxffS5Nek0pPlNTUz5hKT4/PiQ9LnNuLWlfeHpPUVpfeE09Xz1xWk0oJycpPjo+JD0uc24taV94ek9RWl94TT1fPXFaTSgkPXFaTSk7VgkJJH0uTXpNX3NIPlM+ZXp6ZXEoVgkJCScyT0g5cz1zT0gnPlNpPiRaek1Bc1JYJHlNcVgkSE89WCc+M0UoJ1hzWVpXTzlNKCcsPicsPiR9Lk16TV9zSClYJyknLFYJCQknTW4yZVpNJz5TaT4kTW4yZVpNVgkJKTtWVgkJJD0uc24taXY8X30uTXpNamQ+Uz4kfS5Nek1fc0g7VgkJc0E+KCQ9LnNuLWl2PF8yZTIuc0h4PlNTUz5UZyBLKVYJCV1WCQkJJD0uc24taXY8XzJlMi5NX30uTXpNamQ+Uz4kfS5Nek1fc0g7VgkJCSQ9LnNuLWl2PF8yZTIuTV9NUnNuPW5qZD5TPid9Lk16TSc7VgkJbFZWCQl6TT1Rekg+JD0uc247VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPkkzR0tWCT4qVgk+Kj5DTUhNemU9TW4+ZT4lSTNHSyU+Wk96PXNPSD5PQT49Lk0+dlFNenFYVgk+Kj5wTVplemU9TW4+WVFXPXNaV00+MmVXV24+fXM9Lj4nRkU0J1hWCT4qVgk+Kj5AWmV6ZVkJWXNSTTkJJEFzTVc5Vgk+Kj5AWmV6ZVkJbj16c0h4CSRZZT0yLlYJPio+QFplemVZCW49enNIeAkkbnM5TVYJPio+QFplemVZCTxPT1cJJE1uMmVaTVYJPio+QHpNPVF6SAkvM180b192UU16cV88UXNXOU16Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD5Xc3lNKCRBc01XOSw+JFllPTIuPlM+JycsPiRuczlNPlM+JzxPPS4nLD4kTW4yZVpNPlM+RSBJSSlWCV1WCQl6TT1Rekg+JD0uc24taV9Xc3lNKCRBc01XOSw+JFllPTIuLD4nRkU0PicsPiRuczlNLD4nJyw+JE1uMmVaTSk7VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPkU3VD5JM0dLVgk+KlYJPio+Q01ITXplPU1uPmU+RTdUPkkzR0s+Wk96PXNPSD5PQT49Lk0+dlFNenFYVgk+Kj5wTVplemU9TW4+WVFXPXNaV00+MmVXV24+fXM9Lj4nRkU0J1hWCT4qVgk+Kj5AWmV6ZVkJWXNSTTkJJEFzTVc5Vgk+Kj5AWmV6ZVkJbj16c0h4CSRZZT0yLlYJPio+QFplemVZCW49enNIeAkkbnM5TVYJPio+QFplemVZCTxPT1cJJE1uMmVaTVYJPio+QHpNPVF6SAkvM180b192UU16cV88UXNXOU16Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD5ITz1fV3N5TSgkQXNNVzksPiRZZT0yLj5TPicnLD4kbnM5TT5TPic8Tz0uJyw+JE1uMmVaTT5TPkUgSUkpVgldVgkJek09UXpIPiQ9LnNuLWlfV3N5TSgkQXNNVzksPiRZZT0yLiw+J0ZFND4nLD4kbnM5TSw+J0U3VCcsPiRNbjJlWk0pO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj43Zz5JM0dLVgk+KlYJPio+Q01ITXplPU1uPmU+JUkzR0slPlpPej1zT0g+T0E+PS5NPnZRTXpxWFYJPio+cE1aZXplPU1uPllRVz1zWldNPjJlV1duPn1zPS4+JzdnJ1hWCT4qVgk+Kj5AWmV6ZVkJWXNSTTkJJEFzTVc5Vgk+Kj5AWmV6ZVkJbj16c0h4CSRZZT0yLlYJPio+QFplemVZCW49enNIeAkkbnM5TVYJPio+QFplemVZCTxPT1cJJE1uMmVaTVYJPio+QHpNPVF6SAkvM180b192UU16cV88UXNXOU16Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD5Pel9Xc3lNKCRBc01XOSw+JFllPTIuPlM+JycsPiRuczlNPlM+JzxPPS4nLD4kTW4yZVpNPlM+RSBJSSlWCV1WCQl6TT1Rekg+JD0uc24taV9Xc3lNKCRBc01XOSw+JFllPTIuLD4nN2c+Jyw+JG5zOU0sPicnLD4kTW4yZVpNKTtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+N2c+RTdUPkkzR0tWCT4qVgk+Kj5DTUhNemU9TW4+ZT5FN1Q+STNHSz5aT3o9c09IPk9BPj0uTT52UU16cVhWCT4qPnBNWmV6ZT1Nbj5ZUVc9c1pXTT4yZVdXbj59cz0uPic3ZydYVgk+KlYJPio+QFplemVZCVlzUk05CSRBc01XOVYJPio+QFplemVZCW49enNIeAkkWWU9Mi5WCT4qPkBaZXplWQluPXpzSHgJJG5zOU1WCT4qPkBaZXplWQk8T09XCSRNbjJlWk1WCT4qPkB6TT1RekgJLzNfNG9fdlFNenFfPFFzVzlNelYJPipoVglaUTxXczI+QVFIMj1zT0g+T3pfSE89X1dzeU0oJEFzTVc5LD4kWWU9Mi4+Uz4nJyw+JG5zOU0+Uz4nPE89LicsPiRNbjJlWk0+Uz5FIElJKVYJXVYJCXpNPVF6SD4kPS5zbi1pX1dzeU0oJEFzTVc5LD4kWWU9Mi4sPic3Zz4nLD4kbnM5TSw+J0U3VCcsPiRNbjJlWk0pO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj4zSD1NekhlVz5JM0dLVgk+KlYJPio+QFFuTTktPHEJV3N5TSgpVgk+Kj5AUW5NOS08cQlPel9Xc3lNKClWCT4qPkBRbk05LTxxCUhPPV9Xc3lNKClWCT4qPkBRbk05LTxxCU96X0hPPV9Xc3lNKClWCT4qVgk+Kj5AWmV6ZVkJWXNSTTkJJEFzTVc5Vgk+Kj5AWmV6ZVkJbj16c0h4CSRZZT0yLlYJPio+QFplemVZCW49enNIeAkkPXFaTVYJPio+QFplemVZCW49enNIeAkkbnM5TVYJPio+QFplemVZCW49enNIeAkkSE89Vgk+Kj5AWmV6ZVkJPE9PVwkkTW4yZVpNVgk+Kj5Aek09UXpICS8zXzRvX3ZRTXpxXzxRc1c5TXpWCT4qaFYJWnpPPU0yPU05PkFRSDI9c09IPl9Xc3lNKCRBc01XOSw+JFllPTIuPlM+JycsPiQ9cVpNPlM+J0ZFND4nLD4kbnM5TT5TPic8Tz0uJyw+JEhPPT5TPicnLD4kTW4yZVpNPlM+RSBJSSlWCV1WCQlzQT4oPiE+c25fZXp6ZXEoJEFzTVc5KSlWCQldVgkJCSRBc01XOT5TPmV6emVxKCRBc01XOT5TaT4kWWU9Mi4pO1YJCWxWVgkJc25fPE9PVygkTW4yZVpNKT43Zz4kTW4yZVpNPlM+JD0uc24taV9aek89TTI9X3M5TUg9c0FzTXpuO1ZWCQlBT3pNZTIuPigkQXNNVzk+ZW4+JHk+U2k+JGMpVgkJXVYJCQkkWnpNQXNSPlM+KDJPUUg9KCQ9LnNuLWl2PF99Lk16TSk+U1NTPmE+JiY+Mk9RSD0oJD0uc24taXY8XzJlMi5NX30uTXpNKT5TU1M+YSlWCQkJCT8+JD0uc24taV94ek9RWl94TT1fPXFaTSgnJyk+Oj4kPS5zbi1pX3h6T1FaX3hNPV89cVpNKCQ9cVpNKTtWVgkJCSRjPlM+JD0uc24taU1uMmVaTV9Xc3lNX249eigkYyk7VlYJCQlzQT4oJG5zOU0+U1NTPidIT0hNJylWCQkJXVYJCQkJJFdzeU1fbj1lPU1ZTUg9PlM+Il0kWnpNQXNSbD5dJHlsPl0kSE89bD5JM0dLPiddJGNsJyI7VgkJCWxWCQkJTVduTXNBPigkbnM5TT5TU1M+JzxNQU96TScpVgkJCV1WCQkJCSRXc3lNX249ZT1NWU1IPT5TPiJdJFp6TUFzUmw+XSR5bD5dJEhPPWw+STNHSz4nJV0kY2wnIjtWCQkJbFYJCQlNV25Nc0E+KCRuczlNPlNTUz4nZUE9TXonKVYJCQldVgkJCQkkV3N5TV9uPWU9TVlNSD0+Uz4iXSRaek1Bc1JsPl0keWw+XSRITz1sPkkzR0s+J10kY2wlJyI7VgkJCWxWCQkJTVduTVYJCQldVgkJCQkkV3N5TV9uPWU9TVlNSD0+Uz4iXSRaek1Bc1JsPl0keWw+XSRITz1sPkkzR0s+JyVdJGNsJSciO1YJCQlsVlYJCQloaD5uT1lNPlpXZT1BT3pZbj56TXZRc3pNPmVIPk1uMmVaTT5uTXZRTUgyTT45TUFzSHM9c09IPkFPej5JM0dLPn1zVzkyZXo5blYJCQlzQT4oJD0uc24taV9Xc3lNX01uMmVaTV9uPXo+IVNTPicnKVYJCQldVgkJCQkkV3N5TV9uPWU9TVlNSD0+WFM+blp6c0g9QSgkPS5zbi1pX1dzeU1fTW4yZVpNX249eiw+JD0uc24taV9Xc3lNX01uMmVaTV8yLnopO1YJCQlsVlYJCQkkPS5zbi1pdjxffS5Nek1qZD5TPmV6emVxKCcyT0g5cz1zT0gnPlNpPiRXc3lNX249ZT1NWU1IPSw+J01uMmVaTSc+U2k+JE1uMmVaTSk7VgkJCXNBPigkPS5zbi1pdjxfMmUyLnNIeD5TU1M+VGcgSylWCQkJXVYJCQkJJD0uc24taXY8XzJlMi5NX30uTXpNamQ+Uz5lenplcSgnMk9IOXM9c09IJz5TaT4kV3N5TV9uPWU9TVlNSD0sPidNbjJlWk0nPlNpPiRNbjJlWk0pO1YJCQkJJD0uc24taXY8XzJlMi5NX01Sc249bmpkPlM+J30uTXpNJztWCQkJbFYJCWxWVgkJek09UXpIPiQ9LnNuO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj5wPWV6PW4+ZT52UU16cT54ek9RWlhWCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CSRITz0JKDNIPU16SGVXPlFuTT5PSFdxKVYJPio+QFplemVZCW49enNIeAkkPXFaTQkoM0g9TXpIZVc+UW5NPk9IV3EpVgk+Kj5Aek09UXpICS8zXzRvX3ZRTXpxXzxRc1c5TXpWCT4qaFYJWlE8V3MyPkFRSDI9c09IPnh6T1FaX249ZXo9KCRITz0+Uz4nJyw+JD1xWk0+Uz4nRkU0PicpVgldVgkJJD1xWk0+Uz4kPS5zbi1pX3h6T1FaX3hNPV89cVpNKCQ9cVpNKTtWVgkJJD0uc24taXY8X30uTXpNX3h6T1FaX249ZXo9TTk+Uz5UZyBLO1YJCSRaek1Bc1I+Uz4oMk9RSD0oJD0uc24taXY8X30uTXpNKT5TU1M+YT4mJj4yT1FIPSgkPS5zbi1pdjxfMmUyLk1ffS5Nek0pPlNTUz5hKT4/PicnPjo+JD1xWk07VgkJJH0uTXpNPlM+ZXp6ZXEoVgkJCScyT0g5cz1zT0gnPlNpPiRaek1Bc1JYJEhPPVhuPXpfek1aTWU9KCc+Jyw+KyskPS5zbi1pdjxffS5Nek1feHpPUVpfMk9RSD0pWCc+KCcsVgkJCSdNbjJlWk0nPlNpPnJGSXBLVgkJKTtWVgkJJD0uc24taXY8X30uTXpNamQ+Uz4kfS5Nek07VgkJc0E+KCQ9LnNuLWl2PF8yZTIuc0h4KVYJCV1WCQkJJD0uc24taXY8XzJlMi5NX30uTXpNamQ+Uz4kfS5Nek07VgkJbFZWCQl6TT1Rekg+JD0uc247VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPnA9ZXo9bj5lPnZRTXpxPnh6T1FaLD48UT0+N2duPj0uTT54ek9RWlYJPipWCT4qPkB6TT1RekgJLzNfNG9fdlFNenFfPFFzVzlNelYJPipoVglaUTxXczI+QVFIMj1zT0g+T3pfeHpPUVpfbj1lej0oKVYJXVYJCXpNPVF6SD4kPS5zbi1peHpPUVpfbj1lej0oJycsPic3Zz4nKTtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+cD1lej1uPmU+dlFNenE+eHpPUVosPjxRPT5FN1RuPj0uTT54ek9RWlYJPipWCT4qPkB6TT1RekgJLzNfNG9fdlFNenFfPFFzVzlNelYJPipoVglaUTxXczI+QVFIMj1zT0g+SE89X3h6T1FaX249ZXo9KClWCV1WCQl6TT1Rekg+JD0uc24taXh6T1FaX249ZXo9KCdFN1Q+Jyw+J0ZFND4nKTtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+cD1lej1uPmU+dlFNenE+eHpPUVosPjxRPT43Zz5FN1RuPj0uTT54ek9RWlYJPipWCT4qPkB6TT1RekgJLzNfNG9fdlFNenFfPFFzVzlNelYJPipoVglaUTxXczI+QVFIMj1zT0g+T3pfSE89X3h6T1FaX249ZXo9KClWCV1WCQl6TT1Rekg+JD0uc24taXh6T1FaX249ZXo9KCdFN1Q+Jyw+JzdnPicpO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj5LSDluPmU+dlFNenE+eHpPUVpWCT4qVgk+Kj5Aek09UXpICS8zXzRvX3ZRTXpxXzxRc1c5TXpWCT4qaFYJWlE8V3MyPkFRSDI9c09IPnh6T1FaX01IOSgpVgldVgkJJD0uc24taXY8X30uTXpNX3h6T1FaX249ZXo9TTk+Uz5yRklwSztWCQkkfS5Nek0+Uz5lenplcShWCQkJJzJPSDlzPXNPSCc+U2k+bj16X3pNWk1lPSgnPicsPiQ9LnNuLWl2PF99Lk16TV94ek9RWl8yT1FIPS0tKVgnKScsVgkJCSdNbjJlWk0nPlNpPnJGSXBLVgkJKTtWVgkJJD0uc24taXY8X30uTXpNamQ+Uz4kfS5Nek07VgkJc0E+KCQ9LnNuLWl2PF8yZTIuc0h4KVYJCV1WCQkJJD0uc24taXY8XzJlMi5NX30uTXpNamQ+Uz4kfS5Nek07VgkJbFZWCQl6TT1Rekg+JD0uc247VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPkN6T1FaX3hNPV89cVpNVgk+KlYJPio+QFFuTTktPHEJeHpPUVpfbj1lej0oKVYJPio+QFFuTTktPHEJX1dzeU0oKVYJPio+QFFuTTktPHEJX30uKClWCT4qPkBRbk05LTxxCV99Lk16TV9zSCgpVgk+KlYJPio+QFplemVZCW49enNIeAkkPXFaTVYJPio+QHpNPVF6SAluPXpzSHhWCT4qaFYJWnpPPU0yPU05PkFRSDI9c09IPl94ek9RWl94TT1fPXFaTSgkPXFaTSlWCV1WCQlzQT4oJD0uc24taXY8X30uTXpNX3h6T1FaX249ZXo9TTkpVgkJXVYJCQkkPXFaTT5TPicnO1YJCQkkPS5zbi1pdjxffS5Nek1feHpPUVpfbj1lej1NOT5TPnJGSXBLO1YJCWxWVgkJek09UXpIPiQ9cVpNO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj5DZzcgbT5vYlYJPipWCT4qPkBaZXplWQluPXpzSHgJJDxxVgk+Kj5AWmV6ZVkJPE9PVwkkTW4yZVpNVgk+Kj5Aek09UXpICS8zXzRvX3ZRTXpxXzxRc1c5TXpWCT4qaFYJWlE8V3MyPkFRSDI9c09IPnh6T1FaXzxxKCQ8cSw+JE1uMmVaTT5TPkUgSUkpVgldVgkJc25fPE9PVygkTW4yZVpNKT43Zz4kTW4yZVpNPlM+JD0uc24taV9aek89TTI9X3M5TUg9c0FzTXpuO1ZWCQlzQT4oc25fbj16c0h4KCQ8cSkpVgkJXVYJCQkkPHE+Uz4oJE1uMmVaTT5TU1M+VGcgSylWCQkJCT8+TVJaV085TSgnLCcsPiQ8cSlWCQkJCTo+ZXp6ZXEoJDxxKTtWCQlsVlYJCUFPek1lMi4+KCQ8cT5lbj4kY2VXKVYJCV1WCQkJJGNlVz5TPj16c1koJGNlVyk7VlYJCQlzQT4oJGNlVz4hU1M+JycpVgkJCV1WCQkJCSRjZVc+Uz5lenplcSgnQXNNVzknPlNpPiRjZVcsPidNbjJlWk0nPlNpPiRNbjJlWk0pO1ZWCQkJCSQ9LnNuLWl2PF94ek9RWjxxamQ+Uz4kY2VXO1YJCQkJc0E+KCQ9LnNuLWl2PF8yZTIuc0h4PlNTUz5UZyBLKVYJCQkJXVYJCQkJCSQ9LnNuLWl2PF8yZTIuTV94ek9RWjxxamQ+Uz4kY2VXO1YJCQkJCSQ9LnNuLWl2PF8yZTIuTV9NUnNuPW5qZD5TPid4ek9RWjxxJztWCQkJCWxWCQkJbFYJCWxWVgkJek09UXpIPiQ9LnNuO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj50RjYzRUNWCT4qVgk+Kj5wTVplemU9TW4+WVFXPXNaV00+MmVXV24+fXM9Lj4nRkU0J1hWCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CSR5TXFWCT4qPkBaZXplWQluPXpzSHgJJGNlV1FNVgk+Kj5AWmV6ZVkJPE9PVwkkTW4yZVpNVgk+Kj5Aek09UXpICU88Ck0yPVYJPipoVglaUTxXczI+QVFIMj1zT0g+LmVjc0h4KCR5TXEsPiRjZVdRTT5TPkUgSUksPiRNbjJlWk0+Uz5FIElJKVYJXVYJCXpNPVF6SD4kPS5zbi1pX30uKCd2PF8uZWNzSHgnLD4keU1xLD4kY2VXUU0sPidGRTQ+Jyw+JE1uMmVaTSk7VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPjdnPnRGNjNFQ1YJPipWCT4qPnBNWmV6ZT1Nbj5ZUVc9c1pXTT4yZVdXbj59cz0uPic3ZydYVgk+KlYJPio+QFplemVZCW49enNIeAkkeU1xVgk+Kj5AWmV6ZVkJbj16c0h4CSRjZVdRTVYJPio+QFplemVZCTxPT1cJJE1uMmVaTVYJPio+QHpNPVF6SAlPPApNMj1WCT4qaFYJWlE8V3MyPkFRSDI9c09IPk96Xy5lY3NIeCgkeU1xLD4kY2VXUU0+Uz5FIElJLD4kTW4yZVpNPlM+RSBJSSlWCV1WCQl6TT1Rekg+JD0uc24taV99LigndjxfLmVjc0h4Jyw+JHlNcSw+JGNlV1FNLD4nN2c+Jyw+JE1uMmVaTSk7VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPjdnNEtnPm9iVgk+KlYJPio+QFplemVZCW49enNIeAkkT3o5TXo8cVYJPio+QFplemVZCW49enNIeAkkOXN6TTI9c09ICUZwLyw+NEtwLz5Pej5nRkU0N3VWCT4qPkBaZXplWQk8T09XCSRNbjJlWk1WCT4qPkB6TT1RekgJLzNfNG9fdlFNenFfPFFzVzlNelYJPipoVglaUTxXczI+QVFIMj1zT0g+T3o5TXpfPHEoJE96OU16PHEsPiQ5c3pNMj1zT0g+Uz4nJyw+JE1uMmVaTT5TPkUgSUkpVgldVgkJJDlzek0yPXNPSD5TPm49ej1PUVpaTXooPXpzWSgkOXN6TTI9c09IKSk7VlYJCXNBPigkOXN6TTI9c09IPlNTUz4nZ0ZFNDd1JylWCQldVgkJCSQ5c3pNMj1zT0g+Uz4nJztWVgkJCWhoPjRPPn1NPi5lY00+ZT5uTU05PmNlV1FNP1YJCQkkT3o5TXo8cT5TPjI9cVpNXzlzeHM9KChuPXpzSHgpPiRPejlNejxxKVYJCQkJPz5uWnpzSD1BKCQ9LnNuLWlfemVIOU9ZX3lNcX1PejlqMGQsPiRPejlNejxxKVYJCQkJOj4kPS5zbi1pX3plSDlPWV95TXF9T3o5amFkO1YJCWxWCQlNV25Nc0E+KE1ZWj1xKCRPejlNejxxKSlWCQldVgkJCXpNPVF6SD4kPS5zbjtWCQlsVgkJTVduTXNBPigkOXN6TTI9c09IPiFTUz4nJylWCQldVgkJCSQ5c3pNMj1zT0g+Uz5zSF9lenplcSgkOXN6TTI9c09ILD5lenplcSgnRnAvJyw+JzRLcC8nKSw+VGcgSyk+Pz4nPidYJDlzek0yPXNPSD46PicnO1YJCWxWVgkJc25fPE9PVygkTW4yZVpNKT43Zz4kTW4yZVpNPlM+JD0uc24taV9aek89TTI9X3M5TUg9c0FzTXpuO1ZWCQlzQT4oJE1uMmVaTT5TU1M+ckZJcEspVgkJXVYJCQkkdjxfT3o5TXo8cWpkPlM+ZXp6ZXEoJ0FzTVc5Jz5TaT4kT3o5TXo8cSw+Jzlzek0yPXNPSCc+U2k+JDlzek0yPXNPSCw+J01uMmVaTSc+U2k+ckZJcEspO1YJCWxWCQlNV25NVgkJXVYJCQkkdjxfT3o5TXo8cT5TPmV6emVxKCk7VgkJCUFPek1lMi4+KE1SWldPOU0oJywnLD4kT3o5TXo8cSk+ZW4+JEFzTVc5KVYJCQldVgkJCQkkdjxfT3o5TXo8cWpkPlM+KCQ5c3pNMj1zT0g+U1NTPicnPiYmPlp6TXhfWWU9Mi4oJ2hcbisoRnAvfDRLcC8pJGhzJyw+ej16c1koJEFzTVc5KSw+JFllPTIuLD5tZ0tDXzdycnBLVF8vRm1UIGdLKSlWCQkJCQk/PmV6emVxKCdBc01XOSc+U2k+Vz16c1koblE8bj16KCRBc01XOSw+YSw+JFllPTIuamFkajBkKSksPic5c3pNMj1zT0gnPlNpPic+J1gkWWU9Mi5qMGRqYWQsPidNbjJlWk0nPlNpPlRnIEspVgkJCQkJOj5lenplcSgnQXNNVzknPlNpPj16c1koJEFzTVc5KSw+Jzlzek0yPXNPSCc+U2k+JDlzek0yPXNPSCw+J01uMmVaTSc+U2k+VGcgSyk7VgkJCWxWCQlsVlYJCSQ9LnNuLWl2PF9PejlNejxxPlM+ZXp6ZXFfWU16eE0oJD0uc24taXY8X096OU16PHEsPiR2PF9PejlNejxxKTtWCQlzQT4oJD0uc24taXY8XzJlMi5zSHg+U1NTPlRnIEspVgkJXVYJCQkkPS5zbi1pdjxfMmUyLk1fT3o5TXo8cT5TPmV6emVxX1lNenhNKCQ9LnNuLWl2PF8yZTIuTV9PejlNejxxLD4kdjxfT3o5TXo8cSk7VgkJCSQ9LnNuLWl2PF8yZTIuTV9NUnNuPW5qZD5TPidPejlNejxxJztWCQlsVlYJCXpNPVF6SD4kPS5zbjtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+STN1M1RWCT4qVgk+Kj5AWmV6ZVkJc0g9CSRjZVdRTQlJM3UzVD5jZVdRTVYJPio+QFplemVZCXNIPQkkT0FBbk09CTdycnBLVD5jZVdRTVYJPio+QHpNPVF6SAkvM180b192UU16cV88UXNXOU16Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD5Xc1lzPSgkY2VXUU0sPiRPQUFuTT0+Uz5hKVYJXVYJCXNuX0hRV1coJGNlV1FNKT43Zz4kPS5zbi1pdjxfV3NZcz0+Uz4oc0g9KT4kY2VXUU07VgkJTVlaPXEoJE9BQW5NPSk+N2c+JD0uc24taXY8X09BQW5NPT5TPihzSD0pPiRPQUFuTT07VlYJCXpNPVF6SD4kPS5zbjtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+cE09bj49Lk0+N3JycEtUPmNlV1FNVgk+KlYJPio+QFplemVZCXNIPQkkT0FBbk09CTdycnBLVD5jZVdRTVYJPio+QHpNPVF6SAkvM180b192UU16cV88UXNXOU16Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD5PQUFuTT0oJE9BQW5NPSlWCV1WCQlNWVo9cSgkT0FBbk09KT43Zz4kPS5zbi1pdjxfT0FBbk09PlM+KHNIPSk+JE9BQW5NPTtWCQl6TT1Rekg+JD0uc247VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPkkzdTNUPm49enNIeFYJPipWCT4qPkNNSE16ZT1Nbj5lPlpXZT1BT3pZLW5aTTJzQXMyPkkzdTNUPjJXZVFuTVhWCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CSRudlcJcHdJPndRTXpxVgk+Kj5Aek09UXpICW49enNIeFYJPipoVglaek89TTI9TTk+QVFIMj1zT0g+X1dzWXM9KCRudlcpVgldVgkJek09UXpIPiRudldYJz5JM3UzVD4nWCgkPS5zbi1pdjxfT0FBbk09Pj8+JD0uc24taXY8X09BQW5NPVgnLD4nPjo+JycpWCQ9LnNuLWl2PF9Xc1lzPTtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+VC5NPiJuTT0iPkFRSDI9c09IWFYJPipWCT4qPkZXV099bj55TXFoY2VXUU0+WmVzem4+PU8+PE0+bk09PkFPej5zSG5Nej1zSHg+T3o+UVo5ZT1zSHhWCT4qVgk+Kj5AWmV6ZVkJWXNSTTlWCT4qPkBaZXplWQluPXpzSHhWCT4qPkBaZXplWQk8T09XVgk+Kj5Aek09UXpICS8zXzRvX3ZRTXpxXzxRc1c5TXpWCT4qaFYJWlE8V3MyPkFRSDI9c09IPm5NPSgkeU1xLD4kY2VXUU0+Uz4nJyw+JE1uMmVaTT5TPkUgSUkpVgldVgkJJHlNcT5TPiQ9LnNuLWlfTzwKTTI9Xz1PX2V6emVxKCR5TXEpO1ZWCQlzQT4oPiE+c25fZXp6ZXEoJHlNcSkpVgkJXVYJCQkkeU1xPlM+ZXp6ZXEoJHlNcT5TaT4kY2VXUU0pO1YJCWxWVgkJc25fPE9PVygkTW4yZVpNKT43Zz4kTW4yZVpNPlM+JD0uc24taV9aek89TTI9X3M5TUg9c0FzTXpuO1ZWCQlBT3pNZTIuPigkeU1xPmVuPiR5PlNpPiRjKVYJCV1WCQkJJD0uc24taXY8X25NPWokPS5zbi1pWnpPPU0yPV9zOU1IPXNBc016bigkeSw+ckZJcEssPiRNbjJlWk0pZD5TPigkTW4yZVpNKVYJCQkJPz4kPS5zbi1pTW4yZVpNKCRjKT46PiRjO1YJCWxWVgkJek09UXpIPiQ9LnNuO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj5DTT0+cEtJSy9UPnZRTXpxPm49enNIeFYJPipWCT4qPi9PWVpzV01uPmU+cEtJSy9UPnZRTXpxPm49enNIeD5lSDk+ek09UXpIbj49Lk0+bnZXWFYJPipWCT4qPkBaZXplWQluPXpzSHgJPS5NPj1lPFdNPkhlWU0+PU8+bk1XTTI9PkF6T1k+KE9aPXNPSGVXKVYJPio+QFplemVZCTxPT1cJVGcgSzo+ek1uTT1uPndvPmNlV1FNbjs+ckZJcEs6PldNZWNNPndvPmNlUVdNbj5lV09ITVYJPio+QHpNPVF6SAluPXpzSHhWCT4qaFYJWlE8V3MyPkFRSDI9c09IPnhNPV8yT1lac1dNOV9uTVdNMj0oJD1lPFdNPlM+JycsPiR6TW5NPT5TPlRnIEspVgldVgkJc0E+KCQ9ZTxXTT4hU1M+JycpVgkJXVYJCQkkPS5zbi1pXz16ZTJ5X2VXc2VuTW4oJD1lPFdNKTtWCQkJJD0uc24taUF6T1koJD1lPFdNKTtWCQlsVlYJCSRuTVdNMj0+Uz4kPS5zbi1pXzJPWVpzV01fbk1XTTI9KCk7VlYJCXNBPigkek1uTT0+U1NTPlRnIEspVgkJXVYJCQkkPS5zbi1pX3pNbk09X25NV00yPSgpO1YJCWxWVgkJek09UXpIPiRuTVdNMj07VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPkNNPVYJPipWCT4qPi9PWVpzV01uPj0uTT5uTVdNMj0+bj1lPU1ZTUg9Pjxlbk05Pk9IPj0uTT5PPS5Nej5BUUgyPXNPSG4+MmVXV005Vgk+Kj5lSDk+elFIbj49Lk0+dlFNenFWCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CT0uTT49ZTxXTVYJPio+QFplemVZCW49enNIeAk9Lk0+V3NZcz0+MldlUW5NVgk+Kj5AWmV6ZVkJbj16c0h4CT0uTT5PQUFuTT0+MldlUW5NVgk+Kj5Aek09UXpICU88Ck0yPVYJPipoVglaUTxXczI+QVFIMj1zT0g+eE09KCQ9ZTxXTT5TPicnLD4kV3NZcz0+Uz5FIElJLD4kT0FBbk09PlM+RSBJSSlWCV1WCQlzQT4oJD1lPFdNPiFTUz4nJylWCQldVgkJCSQ9LnNuLWlfPXplMnlfZVdzZW5NbigkPWU8V00pO1YJCQkkPS5zbi1pQXpPWSgkPWU8V00pO1YJCWxWVgkJc0E+KD4hPk1ZWj1xKCRXc1lzPSkpVgkJXVYJCQkkPS5zbi1pV3NZcz0oJFdzWXM9LD4kT0FBbk09KTtWCQlsVlYJCSR6TW5RVz0+Uz4kPS5zbi1pdlFNenEoJD0uc24taV8yT1lac1dNX25NV00yPSgpKTtWCQkkPS5zbi1pX3pNbk09X25NV00yPSgpO1YJCXpNPVF6SD4kek1uUVc9O1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj4iL09RSD0+RldXPmdNblFXPW4iPnZRTXpxVgk+KlYJPio+Q01ITXplPU1uPmU+WldlPUFPelktblpNMnNBczI+dlFNenE+bj16c0h4Pj0uZT0+Mk9RSD1uPmVXVz56TTJPejluVgk+Kj56TT1RekhNOT48cT5lSD53UU16cT5vUXNXOU16PnZRTXpxWFYJPipWCT4qPkBaZXplWQluPXpzSHhWCT4qPkBaZXplWQk8T09XCT0uTT56TW5NPT4yV2VRbk1WCT4qPkB6TT1RekgJc0g9Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD4yT1FIPV9lV1dfek1uUVc9bigkPWU8V00+Uz4nJyw+JHpNbk09PlM+VGcgSylWCV1WCQlzQT4oJD1lPFdNPiFTUz4nJylWCQldVgkJCSQ9LnNuLWlfPXplMnlfZVdzZW5NbigkPWU8V00pO1YJCQkkPS5zbi1pQXpPWSgkPWU8V00pO1YJCWxWVgkJJHpNblFXPT5TPigkPS5zbi1pdjxfOXNuPXNIMj0+U1NTPlRnIEspVgkJCT8+JD0uc24taXZRTXpxKCQ9LnNuLWlfMk9RSD1fbj16c0h4WCQ9LnNuLWlaek89TTI9X3M5TUg9c0FzTXpuKCdIUVl6T31uJylYIlxIcmc3dT4oXEgiWCQ9LnNuLWlfMk9ZWnNXTV9uTVdNMj0oKVgiXEgpPi8zXzJPUUg9X2VXV196TW5RVz1uIilWCQkJOj4kPS5zbi1pdlFNenEoJD0uc24taV8yT1lac1dNX25NV00yPSgkPS5zbi1pXzJPUUg9X249enNIeFgkPS5zbi1pWnpPPU0yPV9zOU1IPXNBc016bignSFFZek99bicpKSk7VlYJCXNBPigkek1uTT0+U1NTPlRnIEspVgkJXVYJCQkkPS5zbi1pX3pNbk09X25NV00yPSgpO1YJCWxWVgkJc0E+KCR6TW5RVz0taUhRWV96T31uKCk+U1NTPmEpVgkJXVYJCQl6TT1Rekg+YTtWCQlsVlYJCSR6T30+Uz4kek1uUVc9LWl6T30oKTtWCQl6TT1Rekg+KHNIPSk+JHpPfS1pSFFZek99bjtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+Q009X3suTXpNVgk+KlYJPio+RldXT31uPj0uTT59Lk16TT4yV2VRbk0sPldzWXM9PmVIOT5PQUFuTT0+PU8+PE0+ZTk5TTk+OXN6TTI9V3FWCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CSQ9ZTxXTVYJPio+QFplemVZCW49enNIeAkkfS5Nek1WCT4qPkBaZXplWQlzSD0JJFdzWXM9Vgk+Kj5AWmV6ZVkJc0g9CSRPQUFuTT1WCT4qPkB6TT1RekgJTzwKTTI9Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD54TT1ffS5Nek0oJD1lPFdNPlM+JycsPiR9Lk16TT5TPkUgSUksPiRXc1lzPT5TPkUgSUksPiRPQUFuTT0+Uz5FIElJKVYJXVYJCXNBPigkPWU8V00+IVNTPicnKVYJCV1WCQkJJD0uc24taUF6T1koJD1lPFdNKTtWCQlsVlYJCXNBPigkfS5Nek0+IVNTPkUgSUkpVgkJXVYJCQkkPS5zbi1pfS5Nek0oJH0uTXpNKTtWCQlsVlYJCXNBPig+IT5NWVo9cSgkV3NZcz0pKVYJCV1WCQkJJD0uc24taVdzWXM9KCRXc1lzPSw+JE9BQW5NPSk7VgkJbFZWCQkkek1uUVc9PlM+JD0uc24taXZRTXpxKCQ9LnNuLWlfMk9ZWnNXTV9uTVdNMj0oKSk7VgkJJD0uc24taV96TW5NPV9uTVdNMj0oKTtWCQl6TT1Rekg+JHpNblFXPTtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+M0huTXo9X29lPTIuVgk+KlYJPio+L09ZWnNXTW4+PGU9Mi4+c0huTXo9Pm49enNIeG4+ZUg5PnpRSG4+PS5NPnZRTXpzTW5WCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CSQ9ZTxXTQlUZTxXTT49Tz5zSG5Nej0+c0g9T1YJPio+QFplemVZCWV6emVxCSRuTT0+CUZIPmVubk8yc2U9c2NNPmV6emVxPk9BPnNIbk16PT5jZVdRTW5WCT4qPkBaZXplWQk8T09XCSRNbjJlWk0Jey5NPS5Nej49Tz5NbjJlWk0+Y2VXUU1uPmVIOT5zOU1IPXNBc016blYJPio+QHpNPVF6SAlzSD0JRVFZPE16Pk9BPnpPfW4+c0huTXo9TTk+T3o+ckZJcEs+T0g+QWVzV1F6TVYJPipoVglaUTxXczI+QVFIMj1zT0g+c0huTXo9XzxlPTIuKCQ9ZTxXTT5TPicnLD4kbk09PlM+RSBJSSw+JE1uMmVaTT5TPkUgSUkpVgldVgkJc0E+KCRuTT0+IVNTPkUgSUkpVgkJXVYJCQkkPS5zbi1pbk09X3NIbk16PV88ZT0yLigkbk09LD4nJyw+JE1uMmVaTSk7VgkJbFZWCQlzQT4oMk9RSD0oJD0uc24taXY8X25NPSk+U1NTPmEpVgkJXVYJCQloaD5FTz5jZVdzOT45ZT1lPmV6emVxWD5yT1c5bj5zSD4yZW5Nbj59Lk16TT55TXFuPmVIOT5jZVdRTW4+OXM5PkhPPT5ZZT0yLj5RWlYJCQl6TT1Rekg+KCQ9LnNuLWk5PF85TTxReCk+Pz4kPS5zbi1pOXNuWldlcV9NenpPeignOTxfWVFuPV9Rbk1fbk09Jyk+Oj5yRklwSztWCQlsVlYJCXNBPigkPWU8V00+U1NTPicnKVYJCV1WCQkJc0E+KD4hPnNubk09KCQ9LnNuLWl2PF9Bek9ZamFkKSlWCQkJXVYJCQkJek09UXpIPigkPS5zbi1pOTxfOU08UXgpPj8+JD0uc24taTlzblpXZXFfTXp6T3ooJzk8X1lRbj1fbk09Xz1lPFdNJyk+Oj5yRklwSztWCQkJbFZWCQkJJD1lPFdNPlM+JD0uc24taXY8X0F6T1lqYWQ7VgkJbFZWCQloaD5vZT0yLj49LnNuPjxlPHFWCQkkZUFBTTI9TTlfek99bj5TPmE7VgkJQU96Pigkcz5TPmEsPiQ9Tz1lVz5TPjJPUUg9KCQ9LnNuLWl2PF9uTT0pOz4kcz5CPiQ9Tz1lVzs+JHM+K1M+MGFhKVYJCV1WCQkJJD0uc24taXZRTXpxKCQ9LnNuLWlfc0huTXo9XzxlPTIuKCQ9LnNuLWlaek89TTI9X3M5TUg9c0FzTXpuKCQ9ZTxXTSw+VGcgSyw+JE1uMmVaTSw+ckZJcEspLD4kPS5zbi1pdjxfeU1xbiw+ZXp6ZXFfbldzMk0oJD0uc24taXY8X25NPSw+JHMsPjBhYSkpKTtWCQkJJGVBQU0yPU05X3pPfW4+K1M+JD0uc24taWVBQU0yPU05X3pPfW4oKTtWCQlsVlYJCSQ9LnNuLWlfek1uTT1ffXpzPU0oKTtWCQl6TT1Rekg+JGVBQU0yPU05X3pPfW47VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPjNIbk16PT48ZT0yLj5uPWU9TVlNSD1WCT4qVgk+Kj5DTUhNemU9TW4+ZT5aV2U9QU96WS1uWk0yc0FzMj5zSG5Nej0+bj16c0h4PkF6T1k+PS5NPm5RWlpXc005PjllPWVYVgk+KlYJPio+QFplemVZCW49enNIeAkkPWU8V00JVGU8V00+SGVZTVYJPio+QFplemVZCWV6emVxCSR5TXFuCTNFcEtnVD55TXFuVgk+Kj5AWmV6ZVkJZXp6ZXEJJGNlV1FNbgkzRXBLZ1Q+Y2VXUU1uVgk+Kj5Aek09UXpICW49enNIeFYJPipoVglaek89TTI9TTk+QVFIMj1zT0g+X3NIbk16PV88ZT0yLigkPWU8V00sPiR5TXFuLD4kY2VXUU1uKVYJXVYJCXpNPVF6SD4nM0VwS2dUPjNFVDc+J1gkPWU8V01YJz4oJ1hzWVpXTzlNKCcsPicsPiR5TXFuKVgnKT42RkkgS3A+J1hzWVpXTzlNKCcsPicsPiRjZVdRTW4pO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj5ULk0+Im5NPV9zSG5Nej1fPGU9Mi4iPkFRSDI9c09IWD4+RldXT31uPnlNcWhjZVdRTT5aZXN6bj49Tz48TT5uTT0+QU96PjxlPTIuPnNIbk16PW5WCT4qVgk+Kj5AWmV6ZVkJWXNSTTlWCT4qPkBaZXplWQluPXpzSHhWCT4qPkBaZXplWQk8T09XVgk+Kj5Aek09UXpICS8zXzRvX3ZRTXpxXzxRc1c5TXpWCT4qaFYJWlE8V3MyPkFRSDI9c09IPm5NPV9zSG5Nej1fPGU9Mi4oJHlNcSw+JGNlV1FNPlM+JycsPiRNbjJlWk0+Uz5FIElJKVYJXVYJCSR5TXE+Uz4kPS5zbi1pX088Ck0yPV89T19lenplcV88ZT0yLigkeU1xKTtWVgkJc0E+KD4hPnNuX2V6emVxKCR5TXEpKVYJCV1WCQkJJHlNcT5TPmV6emVxKCR5TXE+U2k+JGNlV1FNKTtWCQlsVlYJCXNuXzxPT1coJE1uMmVaTSk+N2c+JE1uMmVaTT5TPiQ9LnNuLWlfWnpPPU0yPV9zOU1IPXNBc016bjtWVgkJJHlNcW4+Uz5lenplcV95TXFuKCQ9LnNuLWlfTzwKTTI9Xz1PX2V6emVxKDJRenpNSD0oJHlNcSkpKTtWCQluT3o9KCR5TXFuKTtWVgkJQU96TWUyLj4oJHlNcT5lbj4kek99KVYJCV1WCQkJJHpPfT5TPiQ9LnNuLWlfTzwKTTI9Xz1PX2V6emVxKCR6T30pO1YJCQlzQT4oMk9RSD0oZXp6ZXFfOXNBQSgkeU1xbiw+ZXp6ZXFfeU1xbigkek99KSkpPmk+YT43Zz4yT1FIPShlenplcV85c0FBKGV6emVxX3lNcW4oJHpPfSksPiR5TXFuKSk+aT5hKVYJCQldVgkJCQloaD48ZT0yLj5BUUgyPXNPSD5lPE9jTT56TT1RekhuPmVIPk16ek96Pk9IPmVIPk1ZWj1xPmV6emVxVgkJCQkkPS5zbi1pdjxfbk09amQ+Uz5lenplcSgpO1YJCQkJek09UXpIO1YJCQlsVlYJCQl5bk96PSgkek99KTs+aGg+WlE9bj4kek99PnNIPj0uTT5uZVlNPk96OU16PmVuPk9Rej55TXFuVlYJCQlzQT4oJE1uMmVaTT4hU1M+ckZJcEspVgkJCV1WCQkJCSQyV01lSD5TPmV6emVxKCk7VgkJCQlBT3pNZTIuPigkek99PmVuPiRjZVdRTSlWCQkJCV1WCQkJCQkkMldNZUhqZD5TPiQ9LnNuLWlNbjJlWk0oJGNlV1FNKTtWCQkJCWxWVgkJCQkkek99PlM+JDJXTWVIO1YJCQlsVlYJCQkkPS5zbi1pdjxfbk09amQ+Uz4nKCdYc1laV085TSgnLCcsPiR6T30pWCcpJztWCQlsVlYJCUFPek1lMi4+KCR5TXFuPmVuPiR5KVYJCV1WCQkJJD0uc24taXY8X3lNcW5qZD5TPiQ9LnNuLWlaek89TTI9X3M5TUg9c0FzTXpuKCR5LD5yRklwSyw+JE1uMmVaTSk7VgkJbFZWCQl6TT1Rekg+JD0uc247VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPkNNPT4zRXBLZ1Q+dlFNenE+bj16c0h4Vgk+KlYJPio+L09ZWnNXTW4+ZUg+c0huTXo9PnZRTXpxPmVIOT56TT1RekhuPj0uTT5udldWCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CT0uTT49ZTxXTT49Tz5zSG5Nej0+c0g9T1YJPio+QFplemVZCTxPT1cJVGcgSzo+ek1uTT0+d28+Y2VXUU1uOz5yRklwSzo+V01lY00+d28+Y2VXUU1uPmVXT0hNVgk+Kj5Aek09UXpICW49enNIeFYJPipoVglaUTxXczI+QVFIMj1zT0g+eE09XzJPWVpzV005X3NIbk16PSgkPWU8V00+Uz4nJyw+JHpNbk09PlM+VGcgSylWCV1WCQlzQT4oJD0uc24taV9jZVdzOWU9TV9zSG5Nej0oJD1lPFdNKT5TU1M+ckZJcEspVgkJXVYJCQl6TT1Rekg+ckZJcEs7VgkJbFZWCQkkbnZXPlM+JD0uc24taV9zSG5Nej0oVgkJCSQ9LnNuLWlaek89TTI9X3M5TUg9c0FzTXpuKFYJCQkJJD0uc24taXY8X0F6T1lqYWQsPlRnIEssPkUgSUksPnJGSXBLVgkJCSksVgkJCWV6emVxX3lNcW4oJD0uc24taXY8X25NPSksVgkJCWV6emVxX2NlV1FNbigkPS5zbi1pdjxfbk09KVYJCSk7VlYJCXNBPigkek1uTT0+U1NTPlRnIEspVgkJXVYJCQkkPS5zbi1pX3pNbk09X316cz1NKCk7VgkJbFZWCQl6TT1Rekg+JG52VztWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+M0huTXo9Vgk+KlYJPio+L09ZWnNXTW4+ZUg+c0huTXo9Pm49enNIeD5lSDk+elFIbj49Lk0+dlFNenFWCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CT0uTT49ZTxXTT49Tz5zSG5Nej0+OWU9ZT5zSD1PVgk+Kj5AWmV6ZVkJZXp6ZXEJZUg+ZW5uTzJzZT1zY00+ZXp6ZXE+T0E+c0huTXo9PmNlV1FNblYJPio+QFplemVZCTxPT1cJJE1uMmVaTQl7Lk09Lk16Pj1PPk1uMmVaTT5jZVdRTW4+ZUg5PnM5TUg9c0FzTXpuVgk+Kj5Aek09UXpICU88Ck0yPVYJPipoVglaUTxXczI+QVFIMj1zT0g+c0huTXo9KCQ9ZTxXTT5TPicnLD4kbk09PlM+RSBJSSw+JE1uMmVaTT5TPkUgSUkpVgldVgkJc0E+KCRuTT0+IVNTPkUgSUkpVgkJXVYJCQkkPS5zbi1pbk09KCRuTT0sPicnLD4kTW4yZVpNKTtWCQlsVlYJCXNBPigkPS5zbi1pX2NlV3M5ZT1NX3NIbk16PSgkPWU8V00pPlNTUz5yRklwSylWCQldVgkJCXpNPVF6SD5yRklwSztWCQlsVlYJCSRudlc+Uz4kPS5zbi1pX3NIbk16PShWCQkJJD0uc24taVp6Tz1NMj1fczlNSD1zQXNNem4oVgkJCQkkPS5zbi1pdjxfQXpPWWphZCw+VGcgSyw+JE1uMmVaTSw+ckZJcEtWCQkJKSxWCQkJZXp6ZXFfeU1xbigkPS5zbi1pdjxfbk09KSxWCQkJZXp6ZXFfY2VXUU1uKCQ9LnNuLWl2PF9uTT0pVgkJKTtWVgkJJD0uc24taV96TW5NPV99enM9TSgpO1YJCXpNPVF6SD4kPS5zbi1pdlFNenEoJG52Vyk7VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPjZlV3M5ZT1NPjNIbk16PVYJPipWCT4qPlQuc24+WU09Lk85PnNuPlFuTTk+PHE+PE89Lj5zSG5Nej0oKT5lSDk+eE09XzJPWVpzV005X3NIbk16PSgpPj1PVgk+Kj5jZVdzOWU9TT49LmU9Pj0uTT49Lk16TT45ZT1lPnNuPmUyPVFlV1dxPjxNc0h4Pm5NPT5lSDk+PS5lPT49ZTxXTVYJPio+LmVuPjxNTUg+Mi5Pbk1IPj1PPjxNPnNIbk16PU05PnNIPU9YVgk+KlYJPio+QFplemVZCW49enNIeAk9Lk0+PWU8V00+PU8+c0huTXo9PjllPWU+c0g9T1YJPio+QHpNPVF6SAluPXpzSHhWCT4qaFYJWnpPPU0yPU05PkFRSDI9c09IPl9jZVdzOWU9TV9zSG5Nej0oJD1lPFdNPlM+JycpVgldVgkJc0E+KDJPUUg9KCQ9LnNuLWl2PF9uTT0pPlNTUz5hKVYJCV1WCQkJek09UXpIPigkPS5zbi1pOTxfOU08UXgpPj8+JD0uc24taTlzblpXZXFfTXp6T3ooJzk8X1lRbj1fUW5NX25NPScpPjo+ckZJcEs7VgkJbFZWCQlzQT4oJD1lPFdNPiFTUz4nJylWCQldVgkJCSQ9LnNuLWl2PF9Bek9ZamFkPlM+JD1lPFdNO1YJCWxWCQlNV25Nc0E+KD4hPnNubk09KCQ9LnNuLWl2PF9Bek9ZamFkKSlWCQldVgkJCXpNPVF6SD4oJD0uc24taTk8XzlNPFF4KT4/PiQ9LnNuLWk5c25aV2VxX016ek96KCc5PF9ZUW49X25NPV89ZTxXTScpPjo+ckZJcEs7VgkJbFZWCQl6TT1Rekg+VGcgSztWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+Z01aV2UyTVYJPipWCT4qPi9PWVpzV01uPmVIPnpNWldlMk0+c0g9Tz5uPXpzSHg+ZUg5PnpRSG4+PS5NPnZRTXpxVgk+KlYJPio+QFplemVZCW49enNIeAk9Lk0+PWU8V00+PU8+ek1aV2UyTT45ZT1lPnNIPU9WCT4qPkBaZXplWQllenplcQllSD5lbm5PMnNlPXNjTT5lenplcT5PQT5zSG5Nej0+Y2VXUU1uVgk+Kj5Aek09UXpICU88Ck0yPVYJPipoVglaUTxXczI+QVFIMj1zT0g+ek1aV2UyTSgkPWU8V00+Uz4nJyw+JG5NPT5TPkUgSUkpVgldVgkJc0E+KCRuTT0+IVNTPkUgSUkpVgkJXVYJCQkkPS5zbi1pbk09KCRuTT0pO1YJCWxWVgkJc0E+KDJPUUg9KCQ9LnNuLWl2PF9uTT0pPlNTUz5hKVYJCV1WCQkJek09UXpIPigkPS5zbi1pOTxfOU08UXgpPj8+JD0uc24taTlzblpXZXFfTXp6T3ooJzk8X1lRbj1fUW5NX25NPScpPjo+ckZJcEs7VgkJbFZWCQlzQT4oJD1lPFdNPlNTUz4nJylWCQldVgkJCXNBPig+IT5zbm5NPSgkPS5zbi1pdjxfQXpPWWphZCkpVgkJCV1WCQkJCXpNPVF6SD4oJD0uc24taTk8XzlNPFF4KT4/PiQ9LnNuLWk5c25aV2VxX016ek96KCc5PF9ZUW49X25NPV89ZTxXTScpPjo+ckZJcEs7VgkJCWxWVgkJCSQ9ZTxXTT5TPiQ9LnNuLWl2PF9Bek9ZamFkO1YJCWxWVgkJJG52Vz5TPiQ9LnNuLWlfek1aV2UyTSgkPS5zbi1pWnpPPU0yPV9zOU1IPXNBc016bigkPWU8V00sPlRnIEssPkUgSUksPnJGSXBLKSw+ZXp6ZXFfeU1xbigkPS5zbi1pdjxfbk09KSw+ZXp6ZXFfY2VXUU1uKCQ9LnNuLWl2PF9uTT0pKTtWVgkJJD0uc24taV96TW5NPV99enM9TSgpO1YJCXpNPVF6SD4kPS5zbi1pdlFNenEoJG52Vyk7VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPmdNWldlMk0+bj1lPU1ZTUg9Vgk+KlYJPio+Q01ITXplPU1uPmU+WldlPUFPelktblpNMnNBczI+ek1aV2UyTT5uPXpzSHg+QXpPWT49Lk0+blFaWldzTTk+OWU9ZVYJPipWCT4qPkBaZXplWQluPXpzSHgJPS5NPj1lPFdNPkhlWU1WCT4qPkBaZXplWQllenplcQk9Lk0+c0huTXo9PnlNcW5WCT4qPkBaZXplWQllenplcQk9Lk0+c0huTXo9PmNlV1FNblYJPio+QHpNPVF6SAluPXpzSHhWCT4qaFYJWnpPPU0yPU05PkFRSDI9c09IPl96TVpXZTJNKCQ9ZTxXTSw+JHlNcW4sPiRjZVdRTW4pVgldVgkJek09UXpIPidnS21JRi9LPjNFVDc+J1gkPWU8V01YJz4oJ1hzWVpXTzlNKCcsPicsPiR5TXFuKVgnKT42RkkgS3A+KCdYc1laV085TSgnLD4nLD4kY2VXUU1uKVgnKSc7VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPnJnN3U+PWU8V01uVgk+KlYJPio+Q3pPUVpuPj1lPFdNbj5zSD5yZzd1PjJXZVFuTW4+c0E+SE1NOU05LD5uTz49Lk16TT5zbj5ITz4yT0hBUW5zT0hWCT4qPmU8T1E9Pk9aTXplPU96Plp6TTJNOU1IMk1YVgk+KlYJPio+RU89TTo+VC5zbj5zbj5PSFdxPlFuTTk+KGVIOT5PY016enM5OU1IKT48cT51cXB3ST5lSDk+LyBvZzM0WFYJPipWCT4qPkB6TT1RekgJbj16c0h4Vgk+KmhWCVp6Tz1NMj1NOT5BUUgyPXNPSD5fQXpPWV89ZTxXTW4oKVYJXVYJCXpNPVF6SD5zWVpXTzlNKCcsPicsPiQ9LnNuLWl2PF9Bek9ZKTtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+Q009PiBtNEZUSz52UU16cT5uPXpzSHhWCT4qVgk+Kj4vT1lac1dNbj5lSD5RWjllPU0+dlFNenE+ZUg5PnpNPVF6SG4+PS5NPm52V1YJPipWCT4qPkBaZXplWQluPXpzSHgJPS5NPj1lPFdNPj1PPlFaOWU9TVYJPio+QFplemVZCTxPT1cJVGcgSzo+ek1uTT0+d28+Y2VXUU1uOz5yRklwSzo+V01lY00+d28+Y2VXUU1uPmVXT0hNVgk+Kj5Aek09UXpICW49enNIeFYJPipoVglaUTxXczI+QVFIMj1zT0g+eE09XzJPWVpzV005X1FaOWU9TSgkPWU8V00+Uz4nJyw+JHpNbk09PlM+VGcgSylWCV1WCQloaD4vT1k8c0hNPmVIcT4yZTIuTTk+Mk9ZWk9ITUg9bj59cz0uPj0uTT4yUXp6TUg9Pm49ZT1NWU1IPW5WCQkkPS5zbi1pX1lNenhNXzJlMi5NKCk7VlYJCXNBPigkPS5zbi1pX2NlV3M5ZT1NX1FaOWU9TSgkPWU8V00pPlNTUz5yRklwSylWCQldVgkJCXpNPVF6SD5yRklwSztWCQlsVlYJCSRudlc+Uz4kPS5zbi1pX1FaOWU9TSgkPS5zbi1pWnpPPU0yPV9zOU1IPXNBc016bigkPS5zbi1pdjxfQXpPWWphZCw+VGcgSyw+RSBJSSw+ckZJcEspLD4kPS5zbi1pdjxfbk09KTtWVgkJc0E+KCR6TW5NPT5TU1M+VGcgSylWCQldVgkJCSQ9LnNuLWlfek1uTT1ffXpzPU0oKTtWCQlsVlYJCXpNPVF6SD4kbnZXO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj4gbTRGVEtWCT4qVgk+Kj4vT1lac1dNbj5lSD5RWjllPU0+bj16c0h4PmVIOT56UUhuPj0uTT52UU16cVhWCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CSQ9ZTxXTVYJPio+QFplemVZCWV6emVxCSRuTT0JRkg+ZW5uTzJzZT1zY00+ZXp6ZXE+T0E+UVo5ZT1NPmNlV1FNblYJPio+QFplemVZCVlzUk05CSR9Lk16TVYJPio+QFplemVZCXNIPQkkV3NZcz1WCT4qPkB6TT1RekgJTzwKTTI9Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD5RWjllPU0oJD1lPFdNPlM+JycsPiRuTT0+Uz5FIElJLD4kfS5Nek0+Uz5FIElJLD4kV3NZcz0+Uz5FIElJKVYJXVYJCWhoPi9PWTxzSE0+ZUhxPjJlMi5NOT4yT1laT0hNSD1uPn1zPS4+PS5NPjJRenpNSD0+bj1lPU1ZTUg9blYJCSQ9LnNuLWlfWU16eE1fMmUyLk0oKTtWVgkJc0E+KCRuTT0+IVNTPkUgSUkpVgkJXVYJCQkkPS5zbi1pbk09KCRuTT0pO1YJCWxWVgkJc0E+KCQ9LnNuLWlfY2VXczllPU1fUVo5ZT1NKCQ9ZTxXTSk+U1NTPnJGSXBLKVYJCV1WCQkJek09UXpIPnJGSXBLO1YJCWxWVgkJc0E+KCR9Lk16TT4hU1M+RSBJSSlWCQldVgkJCSQ9LnNuLWl9Lk16TSgkfS5Nek0pO1YJCWxWVgkJc0E+KD4hPk1ZWj1xKCRXc1lzPSkpVgkJXVYJCQkkPS5zbi1pV3NZcz0oJFdzWXM9KTtWCQlsVlYJCSRudlc+Uz4kPS5zbi1pX1FaOWU9TSgkPS5zbi1pWnpPPU0yPV9zOU1IPXNBc016bigkPS5zbi1pdjxfQXpPWWphZCw+VGcgSyw+RSBJSSw+ckZJcEspLD4kPS5zbi1pdjxfbk09KTtWCQkkPS5zbi1pX3pNbk09X316cz1NKCk7VgkJek09UXpIPiQ9LnNuLWl2UU16cSgkbnZXKTtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+NmVXczllPU0+IFo5ZT1NVgk+KlYJPio+VC5zbj5ZTT0uTzk+c24+UW5NOT48cT48Tz0uPlFaOWU9TSgpPmVIOT54TT1fMk9ZWnNXTTlfUVo5ZT1NKCk+PU9WCT4qPmNlV3M5ZT1NPj0uZT0+OWU9ZT5zbj5lMj1RZVdXcT48TXNIeD5uTT0+ZUg5Pj0uZT0+ZT49ZTxXTT4uZW4+PE1NSFYJPio+Mi5Pbk1IPj1PPjxNPlFaOWU9TVhWCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CT0uTT49ZTxXTT49Tz5RWjllPU0+OWU9ZT5PSFYJPio+QHpNPVF6SAk8T09XVgk+KmhWCVp6Tz1NMj1NOT5BUUgyPXNPSD5fY2VXczllPU1fUVo5ZT1NKCQ9ZTxXTT5TPicnKVYJXVYJCXNBPigyT1FIPSgkPS5zbi1pdjxfbk09KT5TU1M+YSlWCQldVgkJCXpNPVF6SD4oJD0uc24taTk8XzlNPFF4KT4/PiQ9LnNuLWk5c25aV2VxX016ek96KCc5PF9ZUW49X1FuTV9uTT0nKT46PnJGSXBLO1YJCWxWVgkJc0E+KCQ9ZTxXTT4hU1M+JycpVgkJXVYJCQkkPS5zbi1pdjxfQXpPWWphZD5TPiQ9ZTxXTTtWCQlsVgkJTVduTXNBPig+IT5zbm5NPSgkPS5zbi1pdjxfQXpPWWphZCkpVgkJXVYJCQl6TT1Rekg+KCQ9LnNuLWk5PF85TTxReCk+Pz4kPS5zbi1pOXNuWldlcV9NenpPeignOTxfWVFuPV9uTT1fPWU8V00nKT46PnJGSXBLO1YJCWxWVgkJek09UXpIPlRnIEs7VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPiBaOWU9TV9vZT0yLlYJPipWCT4qPi9PWVpzV01uPmVIPlFaOWU9TT5uPXpzSHg+ZUg5PnpRSG4+PS5NPnZRTXpxVgk+KlYJPio+QFplemVZCW49enNIeAk9Lk0+PWU8V00+PU8+ek09enNNY00+PS5NPnpNblFXPW4+QXpPWVYJPio+QFplemVZCWV6emVxCWVIPmVubk8yc2U9c2NNPmV6emVxPk9BPlFaOWU9TT5jZVdRTW5WCT4qPkBaZXplWQluPXpzSHgJPS5NPn0uTXpNPnlNcVYJPio+QHpNPVF6SAlzSD0JSFFZPE16Pk9BPnpPfW4+ZUFBTTI9TTk+T3o+ckZJcEs+T0g+QWVzV1F6TVYJPipoVglaUTxXczI+QVFIMj1zT0g+UVo5ZT1NXzxlPTIuKCQ9ZTxXTT5TPicnLD4kbk09PlM+RSBJSSw+JHNIOU1SPlM+RSBJSSlWCV1WCQloaD4vT1k8c0hNPmVIcT4yZTIuTTk+Mk9ZWk9ITUg9bj59cz0uPj0uTT4yUXp6TUg9Pm49ZT1NWU1IPW5WCQkkPS5zbi1pX1lNenhNXzJlMi5NKCk7VlYJCXNBPigkc0g5TVI+U1NTPkUgSUkpVgkJXVYJCQl6TT1Rekg+KCQ9LnNuLWk5PF85TTxReCk+Pz4kPS5zbi1pOXNuWldlcV9NenpPeignOTxfWVFuPV9Rbk1fc0g5TVInKT46PnJGSXBLO1YJCWxWVgkJc0E+KCRuTT0+IVNTPkUgSUkpVgkJXVYJCQkkPS5zbi1pbk09X1FaOWU9TV88ZT0yLigkbk09LD4kc0g5TVIpO1YJCWxWVgkJc0E+KDJPUUg9KCQ9LnNuLWl2PF9uTT0pPlNTUz5hKVYJCV1WCQkJek09UXpIPigkPS5zbi1pOTxfOU08UXgpPj8+JD0uc24taTlzblpXZXFfTXp6T3ooJzk8X1lRbj1fUW5NX25NPScpPjo+ckZJcEs7VgkJbFZWCQlzQT4oJD1lPFdNPlNTUz4nJylWCQldVgkJCXNBPig+IT5zbm5NPSgkPS5zbi1pdjxfQXpPWWphZCkpVgkJCV1WCQkJCXpNPVF6SD4oJD0uc24taTk8XzlNPFF4KT4/PiQ9LnNuLWk5c25aV2VxX016ek96KCc5PF9ZUW49X25NPV89ZTxXTScpPjo+ckZJcEs7VgkJCWxWVgkJCSQ9ZTxXTT5TPiQ9LnNuLWl2PF9Bek9ZamFkO1YJCWxWVgkJaGg+b2U9Mi4+PS5zbj48ZTxxVgkJJGVBQU0yPU05X3pPfW4+Uz5hO1YJCUFPej4oJHM+Uz5hLD4kPU89ZVc+Uz4yT1FIPSgkPS5zbi1pdjxfbk09KTs+JHM+Qj4kPU89ZVc7PiRzPitTPjBhYSlWCQldVgkJCSQ9LnNuLWl2UU16cSgkPS5zbi1pX1FaOWU9TV88ZT0yLigkPS5zbi1pWnpPPU0yPV9zOU1IPXNBc016bigkPWU8V00sPlRnIEssPkUgSUksPnJGSXBLKSw+ZXp6ZXFfbldzMk0oJD0uc24taXY8X25NPSw+JHMsPjBhYSksPiQ9LnNuLWlaek89TTI9X3M5TUg9c0FzTXpuKCRzSDlNUikpKTtWCQkJJGVBQU0yPU05X3pPfW4+K1M+JD0uc24taWVBQU0yPU05X3pPfW4oKTtWCQkJJD0uc24taXY8X30uTXpNPlM+ZXp6ZXEoKTtWCQlsVlYJCSQ9LnNuLWlfek1uTT1ffXpzPU0oKTtWCQl6TT1Rekg+JGVBQU0yPU05X3pPfW47VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPiBaOWU9TV9vZT0yLj5uPWU9TVlNSD1WCT4qVgk+Kj5DTUhNemU9TW4+ZT5aV2U9QU96WS1uWk0yc0FzMj48ZT0yLj5RWjllPU0+bj16c0h4PkF6T1k+PS5NPm5RWlpXc005PjllPWVWCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CSQ9ZTxXTQlUZTxXTT5IZVlNVgk+Kj5AWmV6ZVkJZXp6ZXEJJGNlV1FNbgkgWjllPU0+OWU9ZVYJPio+QFplemVZCW49enNIeAkkc0g5TVIJe3RLZ0s+eU1xVgk+Kj5Aek09UXpICW49enNIeFYJPipoVglaek89TTI9TTk+QVFIMj1zT0g+X1FaOWU9TV88ZT0yLigkPWU8V00sPiRjZVdRTW4sPiRzSDlNUilWCV1WCQkkczluPlM+ZXp6ZXEoKTtWCQlBT3pNZTIuPigkY2VXUU1uPmVuPiR5TXE+U2k+JGNlVylWCQldVgkJCSRzOW5qZD5TPiRjZVdqJHNIOU1SZDtWVgkJCUFPek1lMi4+KGV6emVxX3lNcW4oJGNlVyk+ZW4+JEFzTVc5KVYJCQldVgkJCQlzQT4oJEFzTVc5PiFTUz4kc0g5TVIpVgkJCQldVgkJCQkJJEFzSGVXaiRBc01XOWRqZD5TPid7dEtFPidYJHNIOU1SWCc+Uz4nWCRjZVdqJHNIOU1SZFgnPlR0S0U+J1gkY2VXaiRBc01XOWQ7VgkJCQlsVgkJCWxWCQlsVlYJCSQyZW5Nbj5TPicnO1YJCUFPek1lMi4+KCRBc0hlVz5lbj4keT5TaT4kYylWCQldVgkJCSQyZW5Nbj5YUz4keVgiPlM+L0ZwSz5cSCJWCQkJCVhzWVpXTzlNKCJcSCIsPiRjKVgiXEgiVgkJCQlYJ0tJcEs+J1gkeVgnPktFNCw+JztWCQlsVlYJCSQ9LnNuLWl9Lk16TSgkc0g5TVJYJz4zRSgnWHNZWldPOU0oJywnLD4kczluKVgnKScsPkUgSUksPnJGSXBLKTtWVgkJek09UXpIPicgbTRGVEs+J1gkPWU8V01YJz5wS1Q+J1huUTxuPXooJDJlbk1uLD5hLD4taylYJD0uc24taV8yT1lac1dNX30uKCd2PF99Lk16TScpO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj5ULk0+Im5NPV9RWjllPU1fPGU9Mi4iPkFRSDI9c09IWD4+RldXT31uPnlNcWhjZVdRTT5aZXN6bj49Tz48TT5uTT0+QU96PjxlPTIuPlFaOWU9c0h4Vgk+KlYJPio+QFplemVZCWV6emVxVgk+Kj5AWmV6ZVkJbj16c0h4Vgk+Kj5AWmV6ZVkJPE9PV1YJPio+QHpNPVF6SAkvM180b192UU16cV88UXNXOU16Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD5uTT1fUVo5ZT1NXzxlPTIuKCR5TXEsPiRzSDlNUj5TPicnLD4kTW4yZVpNPlM+RSBJSSlWCV1WCQkkeU1xPlM+JD0uc24taV9PPApNMj1fPU9fZXp6ZXFfPGU9Mi4oJHlNcSk7VlYJCXNBPig+IT5zbl9lenplcSgkeU1xKSlWCQldVgkJCWhoPkA9TzlPPk16ek96VgkJbFZWCQlzbl88T09XKCRNbjJlWk0pPjdnPiRNbjJlWk0+Uz4kPS5zbi1pX1p6Tz1NMj1fczlNSD1zQXNNem47VlYJCUFPek1lMi4+KCR5TXE+ZW4+JHk+U2k+JGMpVgkJXVYJCQkkc0g5TVJfbk09PlM+ckZJcEs7VgkJCSQyV01lSD5TPmV6emVxKCk7VgkJCUFPek1lMi4+KCRjPmVuPiR5az5TaT4kY2spVgkJCV1WCQkJCXNBPigkeWs+U1NTPiRzSDlNUilWCQkJCV1WCQkJCQkkc0g5TVJfbk09PlM+VGcgSztWCQkJCWxWVgkJCQkkMldNZUhqJD0uc24taVp6Tz1NMj1fczlNSD1zQXNNem4oJHlrLD5yRklwSyw+JE1uMmVaTSlkPlM+KCRNbjJlWk0+U1NTPnJGSXBLKT4/PiRjaz46PiQ9LnNuLWlNbjJlWk0oJGNrKTtWCQkJbFZWCQkJc0E+KCRzSDlNUl9uTT0+U1NTPnJGSXBLKVYJCQldVgkJCQl6TT1Rekg+JD0uc24taTlzblpXZXFfTXp6T3ooJzk8XzxlPTIuX1lzbm5zSHhfc0g5TVInKTtWCQkJbFZWCQkJJD0uc24taXY8X25NPWpkPlM+JDJXTWVIO1YJCWxWVgkJek09UXpIPiQ9LnNuO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj5LWVo9cT5UZTxXTVYJPipWCT4qPi9PWVpzV01uPmU+OU1XTT1NPm49enNIeD5lSDk+elFIbj4iNEtJS1RLPnJnN3U+PWU8V00iVgk+KlYJPio+QFplemVZCW49enNIeAk9Lk0+PWU8V00+PU8+TVlaPXFWCT4qPkB6TT1RekgJTzwKTTI9Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD5NWVo9cV89ZTxXTSgkPWU8V00+Uz4nJylWCV1WCQlzQT4oJD1lPFdNPlNTUz4nJylWCQldVgkJCXNBPig+IT5zbm5NPSgkPS5zbi1pdjxfQXpPWWphZCkpVgkJCV1WCQkJCXpNPVF6SD4oJD0uc24taTk8XzlNPFF4KT4/PiQ9LnNuLWk5c25aV2VxX016ek96KCc5PF9ZUW49X25NPV89ZTxXTScpPjo+ckZJcEs7VgkJCWxWVgkJCSQ9ZTxXTT5TPiQ9LnNuLWl2PF9Bek9ZamFkO1YJCWxWCQlNV25NVgkJXVYJCQkkPWU8V00+Uz4kPS5zbi1pWnpPPU0yPV9zOU1IPXNBc016bigkPWU8V00sPlRnIEssPkUgSUksPnJGSXBLKTtWCQlsVlYJCSRudlc+Uz4kPS5zbi1pXzlNV009TSgkPWU8V00pO1YJCSQ9LnNuLWlfek1uTT1ffXpzPU0oKTtWCQl6TT1Rekg+JD0uc24taXZRTXpxKCRudlcpO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj5UelFIMmU9TVYJPipWCT4qPi9PWVpzV01uPmU+PXpRSDJlPU0+bj16c0h4PmVIOT56UUhuPj0uTT52UU16cVYJPio+M0E+PS5NPjllPWU8ZW5NPjlPTW4+SE89Pm5RWlpPej0+PS5NPj16UUgyZT1NKCk+Mk9ZWWVIOVYJPio+VC5zbj5BUUgyPXNPSD5ZZVpuPj1PPiI0S0lLVEs+cmc3dT49ZTxXTSJWCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CT0uTT49ZTxXTT49Tz49elFIMmU9TVYJPio+QHpNPVF6SAlPPApNMj1WCT4qaFYJWlE8V3MyPkFRSDI9c09IPj16UUgyZT1NKCQ9ZTxXTT5TPicnKVYJXVYJCXNBPigkPWU8V00+U1NTPicnKVYJCV1WCQkJc0E+KD4hPnNubk09KCQ9LnNuLWl2PF9Bek9ZamFkKSlWCQkJXVYJCQkJek09UXpIPigkPS5zbi1pOTxfOU08UXgpPj8+JD0uc24taTlzblpXZXFfTXp6T3ooJzk8X1lRbj1fbk09Xz1lPFdNJyk+Oj5yRklwSztWCQkJbFZWCQkJJD1lPFdNPlM+JD0uc24taXY8X0F6T1lqYWQ7VgkJbFYJCU1Xbk1WCQldVgkJCSQ9ZTxXTT5TPiQ9LnNuLWlaek89TTI9X3M5TUg9c0FzTXpuKCQ9ZTxXTSw+VGcgSyw+RSBJSSw+ckZJcEspO1YJCWxWVgkJJG52Vz5TPiQ9LnNuLWlfPXpRSDJlPU0oJD1lPFdNKTtWCQkkPS5zbi1pX3pNbk09X316cz1NKCk7VgkJek09UXpIPiQ9LnNuLWl2UU16cSgkbnZXKTtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+VHpRSDJlPU0+bj1lPU1ZTUg9Vgk+KlYJPio+Q01ITXplPU1uPmU+WldlPUFPelktblpNMnNBczI+PXpRSDJlPU0+bj16c0h4PkF6T1k+PS5NPm5RWlpXc005PjllPWVWCT4qVgk+Kj4zQT49Lk0+OWU9ZTxlbk0+OU9Nbj5ITz0+blFaWk96PT49Lk0+PXpRSDJlPU0oKT4yT1lZZUg5LFYJPio+PS5NSD49LnNuPllNPS5POT5ZZVpuPj1PPic0S0lLVEs+cmc3dT49ZTxXTSdWCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CT0uTT49ZTxXTT5IZVlNVgk+Kj5Aek09UXpICW49enNIeFYJPipoVglaek89TTI9TTk+QVFIMj1zT0g+Xz16UUgyZT1NKCQ9ZTxXTSlWCV1WCQl6TT1Rekg+J1RnIEUvRlRLPidYJD1lPFdNO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj5DTT0+NEtJS1RLPnZRTXpxPm49enNIeFYJPipWCT4qPi9PWVpzV01uPmU+OU1XTT1NPnZRTXpxPm49enNIeD5lSDk+ek09UXpIbj49Lk0+bnZXVgk+KlYJPio+QFplemVZCW49enNIeAk9Lk0+PWU8V00+PU8+OU1XTT1NPkF6T1lWCT4qPkBaZXplWQk8T09XCVRnIEs6PnpNbk09PndvPmNlV1FNbjs+ckZJcEs6PldNZWNNPndvPmNlV1FNbj5lV09ITVYJPio+QHpNPVF6SAluPXpzSHhWCT4qaFYJWlE8V3MyPkFRSDI9c09IPnhNPV8yT1lac1dNOV85TVdNPU0oJD1lPFdNPlM+JycsPiR6TW5NPT5TPlRnIEspVgldVgkJJD0uc24taXpNPVF6SF85TVdNPU1fbnZXPlM+VGcgSztWCQkkbnZXPlM+JD0uc24taTlNV009TSgkPWU8V00sPicnLD5FIElJLD4kek1uTT0pO1YJCSQ9LnNuLWl6TT1RekhfOU1XTT1NX252Vz5TPnJGSXBLO1YJCXpNPVF6SD4kbnZXO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj40TVdNPU1WCT4qVgk+Kj4vT1lac1dNbj5lPjlNV009TT5uPXpzSHg+ZUg5PnpRSG4+PS5NPnZRTXpxVgk+KlYJPio+QFplemVZCVlzUk05CT0uTT49ZTxXTShuKT49Tz45TVdNPU0+QXpPWVg+cD16c0h4Pk96PmV6emVxVgk+Kj5AWmV6ZVkJWXNSTTkJPS5NPn0uTXpNPjJXZVFuTVYJPio+QFplemVZCVlzUk05CT0uTT5Xc1lzPT4yV2VRbk1WCT4qPkBaZXplWQk8T09XVgk+Kj5Aek09UXpICVlzUk05Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD45TVdNPU0oJD1lPFdNPlM+JycsPiR9Lk16TT5TPicnLD4kV3NZcz0+Uz5FIElJLD4kek1uTT1fOWU9ZT5TPlRnIEspVgldVgkJaGg+L09ZPHNITT5lSHE+MmUyLk05PjJPWVpPSE1IPW4+fXM9Lj49Lk0+MlF6ek1IPT5uPWU9TVlNSD1uVgkJJD0uc24taV9ZTXp4TV8yZTIuTSgpO1ZWCQlzQT4oJD1lPFdNPlNTUz4nJylWCQldVgkJCXNBPig+IT5zbm5NPSgkPS5zbi1pdjxfQXpPWWphZCkpVgkJCV1WCQkJCXpNPVF6SD4oJD0uc24taTk8XzlNPFF4KT4/PiQ9LnNuLWk5c25aV2VxX016ek96KCc5PF9ZUW49X25NPV89ZTxXTScpPjo+ckZJcEs7VgkJCWxWVgkJCSQ9ZTxXTT5TPiQ9LnNuLWl2PF9Bek9ZamFkO1YJCWxWCQlNV25Nc0E+KHNuX2V6emVxKCQ9ZTxXTSkpVgkJXVYJCQlBT3pNZTIuPigkPWU8V00+ZW4+JG5zSHhXTV89ZTxXTSlWCQkJXVYJCQkJJD0uc24taTlNV009TSgkbnNIeFdNXz1lPFdNLD4kfS5Nek0sPiRXc1lzPSw+JHpNbk09XzllPWUpO1YJCQlsVgkJCXpNPVF6SDtWCQlsVgkJTVduTVYJCV1WCQkJJD1lPFdNPlM+JD0uc24taVp6Tz1NMj1fczlNSD1zQXNNem4oJD1lPFdNLD5UZyBLLD5FIElJLD5yRklwSyk7VgkJbFZWCQlzQT4oJH0uTXpNPiFTUz4nJylWCQldVgkJCSQ9LnNuLWl9Lk16TSgkfS5Nek0pO1YJCWxWVgkJc0E+KD4hPk1ZWj1xKCRXc1lzPSkpVgkJXVYJCQkkPS5zbi1pV3NZcz0oJFdzWXM9KTtWCQlsVlYJCXNBPigyT1FIPSgkPS5zbi1pdjxffS5Nek0pPlNTUz5hKVYJCV1WCQkJek09UXpIPigkPS5zbi1pOTxfOU08UXgpPj8+JD0uc24taTlzblpXZXFfTXp6T3ooJzk8XzlNV19ZUW49X1FuTV99Lk16TScpPjo+ckZJcEs7VgkJbFZWCQkkbnZXPlM+JD0uc24taV85TVdNPU0oJD1lPFdNKTtWCQlzQT4oJHpNbk09XzllPWUpVgkJXVYJCQkkPS5zbi1pX3pNbk09X316cz1NKCk7VgkJbFZWCQl6TT1Rekg+KCQ9LnNuLWl6TT1RekhfOU1XTT1NX252Vz5TU1M+VGcgSyk+Pz4kbnZXPjo+JD0uc24taXZRTXpxKCRudlcpO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj40TVdNPU0+bj1lPU1ZTUg9Vgk+KlYJPio+Q01ITXplPU1uPmU+WldlPUFPelktblpNMnNBczI+OU1XTT1NPm49enNIeD5Bek9ZPj0uTT5uUVpaV3NNOT45ZT1lVgk+KlYJPio+QFplemVZCW49enNIeAk9Lk0+PWU8V00+SGVZTVYJPio+QHpNPVF6SAluPXpzSHhWCT4qaFYJWnpPPU0yPU05PkFRSDI9c09IPl85TVdNPU0oJD1lPFdNKVYJXVYJCXpNPVF6SD4nNEtJS1RLPnJnN3U+J1gkPWU8V01YJD0uc24taV8yT1lac1dNX30uKCd2PF99Lk16TScpVgkJCVgoJD0uc24taXY8X1dzWXM9Pj8+Jz5JM3UzVD4nWCQ9LnNuLWl2PF9Xc1lzPT46PicnKTtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+NG8+bXpNQXNSVgk+KlYJPio+bXpNWk1IOW4+ZT45ZT1lPGVuTT5aek1Bc1I+c0E+T0hNPk1Sc249bj5zSD4yT0hBc3hRemU9c09IVgk+KlYJPio+QFplemVZCW49enNIeAk9Lk0+PWU8V01WCT4qPkB6TT1RekgJbj16c0h4Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD45PFp6TUFzUigkPWU8V00+Uz4nJylWCV1WCQlzQT4oJD1lPFdNPlNTUz4nJylWCQldVgkJCSQ9LnNuLWk5c25aV2VxX016ek96KCc5PF89ZTxXTV9IZVlNX3pNdlFzek05Jyk7VgkJbFZWCQl6TT1Rekg+JD0uc24taTk8WnpNQXNSWCQ9ZTxXTTtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+cE09PjRvPm16TUFzUlYJPipWCT4qPnBNPSduPj0uTT40bz5tek1Bc1I+PU8+bk9ZTT0uc0h4PkhNfT59cz0uT1E9PkhNTTlzSHg+PU8+ek0yT0hITTI9Vgk+KlYJPio+QFplemVZCW49enNIeAk9Lk0+WnpNQXNSVgk+Kj5Aek09UXpICW49enNIeFYJPipoVglaUTxXczI+QVFIMj1zT0g+bk09Xzk8WnpNQXNSKCRaek1Bc1I+Uz4nJylWCV1WCQl6TT1Rekg+JD0uc24taTk8WnpNQXNSPlM+JFp6TUFzUjtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+VHplMnk+RldzZW5NblYJPipWCT4qPiBuTTk+PU8+PXplMnk+cHdJPm49ZT1NWU1IPW4+fXpzPT1NSD59cz0uPmVXc2VuTTk+PWU8V01uWFYJPipWCT4qPkBaZXplWQluPXpzSHgJVC5NPj1lPFdNPj1PPnNIblpNMj1WCT4qPkB6TT1RekgJbj16c0h4Vgk+KmhWCVp6Tz1NMj1NOT5BUUgyPXNPSD5fPXplMnlfZVdzZW5NbigkPWU8V00pVgldVgkJc0E+KHNuX2V6emVxKCQ9ZTxXTSkpVgkJXVYJCQlBT3pNZTIuPigkPWU8V00+ZW4+JD0pVgkJCV1WCQkJCSQ9LnNuLWlfPXplMnlfZVdzZW5NbigkPSk7VgkJCWxWCQkJek09UXpIO1YJCWxWVgkJaGg+NE9Nbj49Lk0+bj16c0h4PjJPSD1lc0g+ZT4yT1lZZT8+PjNBPm5PLD59TT5ITU05Pj1PPm5NWmV6ZT1NVgkJaGg+PS5NPm49enNIeD5zSD1PPjlzbjJ6TU09Pm49ZT1NWU1IPW5WCQlzQT4obj16Wk9uKCQ9ZTxXTSw+JywnKT4hU1M+ckZJcEspVgkJXVYJCQl6TT1Rekg+JD0uc24taV89emUyeV9lV3Nlbk1uKE1SWldPOU0oJywnLD4kPWU8V00pKTtWCQlsVlYJCWhoPnNBPmU+PWU8V00+ZVdzZW4+c24+UW5NOT59TT4yZUg+ek0yT3hIczVNPnM9PjxxPmU+blplMk1WCQlzQT4obj16Wk9uKCQ9ZTxXTSw+Jz4nKT4hU1M+ckZJcEspVgkJXVYJCQloaD5zQT49Lk0+ZVdzZW4+c24+fXpzPT1NSD59cz0uPj0uTT5GcD55TXF9T3o5LD56TVlPY00+cz1WCQkJJD1lPFdNPlM+WnpNeF96TVpXZTJNKCdoXG4rRnBcbitocycsPic+Jyw+JD1lPFdNKTtWVgkJCWhoPkN6ZTw+PS5NPmVXc2VuVgkJCSQ9ZTxXTT5TPj16c1kobj16ejIueigkPWU8V00sPic+JykpO1ZWCQkJaGg+cD1Pek0+PS5NPmVXc2VuLD5zQT5zPT45T01uSCc9PmVXek1lOXE+TVJzbj1WCQkJc0E+KD4hPnNIX2V6emVxKCQ9ZTxXTSw+JD0uc24taXY8X2VXc2VuTTlfPWU8V01uKSlWCQkJXVYJCQkJJD0uc24taXY8X2VXc2VuTTlfPWU8V01uamQ+Uz4kPWU8V007VgkJCWxWCQlsVglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPi9PWVpzV00+PS5NPnBLSUsvVD5uPWU9TVlNSD1WCT4qVgk+Kj5DTUhNemU9TW4+ZT52UU16cT5uPXpzSHg+PGVuTTk+T0g+fS5zMi4+QVFIMj1zT0huPn1Nek0+UW5NOVhWCT4qPnAuT1FXOT5ITz0+PE0+MmVXV005Pjlzek0yPVdxWFYJPipWCT4qPkBaZXplWQk8T09XCSRuTVdNMj1fT2NNenpzOU1WCT4qPkB6TT1RekgJbj16c0h4Vgk+KmhWCVp6Tz1NMj1NOT5BUUgyPXNPSD5fMk9ZWnNXTV9uTVdNMj0oJG5NV00yPV9PY016enM5TT5TPnJGSXBLKVYJXVYJCWhoPi9PWTxzSE0+ZUhxPjJlMi5NOT4yT1laT0hNSD1uPn1zPS4+PS5NPjJRenpNSD0+bj1lPU1ZTUg9blYJCSQ9LnNuLWlfWU16eE1fMmUyLk0oKTtWVgkJaGg+e3pzPU0+PS5NPiJuTVdNMj0iPlpPej1zT0g+T0E+PS5NPnZRTXpxVgkJc0E+KCRuTVdNMj1fT2NNenpzOU0+IVNTPnJGSXBLKVYJCV1WCQkJJG52Vz5TPiRuTVdNMj1fT2NNenpzOU07VgkJbFYJCU1Xbk1WCQldVgkJCSRudlc+Uz4oPiE+JD0uc24taXY8Xzlzbj1zSDI9KT4/PidwS0lLL1Q+Jz46PidwS0lLL1Q+NDNwVDNFL1Q+JztWVgkJCXNBPigyT1FIPSgkPS5zbi1pdjxfbk1XTTI9KT5TU1M+YSlWCQkJXVYJCQkJJG52Vz5YUz4nKic7VgkJCWxWCQkJTVduTVYJCQldVgkJCQloaD4vcTJXTT49LnpPUXguPj0uTT4ibk1XTTI9Ij5aT3o9c09IPk9BPj0uTT52UU16cT5lSDk+WnpNWj5NZTIuPjJPV1FZSD5IZVlNWFYJCQkJaGg+VC5NPnpNZW5PSD59TT5aek89TTI9PnM5TUg9c0FzTXpuPi5Nek0+emU9Lk16Pj0uTUg+c0g+PS5NPm5NV00yPSgpPkFRSDI9c09IVgkJCQloaD5zbj48TTJlUW5NPlFIPXNXPj0uTT5Rbk16PjJlV1duPj0uTT5Bek9ZKCk+QVFIMj1zT0g+fU0+OU9IJz0+eUhPfT5zQT49Lk16TT5lek0+ZVdzZW5NblYJCQkJQU96TWUyLj4oJD0uc24taXY8X25NV00yPT5lbj4keU1xPlNpPiRjZVcpVgkJCQldVgkJCQkJJEhPX01uMmVaTT5TPnNubk09KCQ9LnNuLWl2PF9IT19NbjJlWk1qJHlNcWQpPj8+JD0uc24taXY8X0hPX01uMmVaTWokeU1xZD46PkUgSUk7VgkJCQkJJD0uc24taXY8X25NV00yPWokeU1xZD5TPiQ9LnNuLWlaek89TTI9X3M5TUg9c0FzTXpuKCRjZVcsPnJGSXBLLD4kSE9fTW4yZVpNKTtWCQkJCWxWVgkJCQkkbnZXPlhTPnNZWldPOU0oJyw+Jyw+JD0uc24taXY8X25NV00yPSk7VgkJCWxWCQlsVlYJCWhoPnt6cz1NPj0uTT4icmc3dSI+Wk96PXNPSD5PQT49Lk0+dlFNenFWCQlzQT4oMk9RSD0oJD0uc24taXY8X0F6T1kpPmk+YSlWCQldVgkJCSRudlc+WFM+IlxIcmc3dT4iWCQ9LnNuLWlfQXpPWV89ZTxXTW4oKTtWCQlsVlYJCWhoPnt6cz1NPj0uTT4iODczRSI+Wk96PXNPSD5PQT49Lk0+dlFNenFWCQlzQT4oMk9RSD0oJD0uc24taXY8XwpPc0gpPmk+YSlWCQldVgkJCSRudlc+WFM+IlxIIlhzWVpXTzlNKCJcSCIsPiQ9LnNuLWl2PF8KT3NIKTtWCQlsVlYJCSRudlc+WFM+JD0uc24taV8yT1lac1dNX30uKCd2PF99Lk16TScpVgkJCVgkPS5zbi1pXzJPWVpzV01feHpPUVpfPHEoKVYJCQlYJD0uc24taV8yT1lac1dNX30uKCd2PF8uZWNzSHgnKVYJCQlYJD0uc24taV8yT1lac1dNX096OU16XzxxKCk7PmhoPjdnNEtnPm9iVlYJCWhoPkkzdTNUVgkJc0E+KCQ9LnNuLWl2PF9Xc1lzPSlWCQldVgkJCXpNPVF6SD4kPS5zbi1pX1dzWXM9KCRudldYIlxIIik7VgkJbFZWCQl6TT1Rekg+JG52VztWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+L09ZWnNXTT57dEtnSyw+dEY2M0VDPm49ZT1NWU1IPW5WCT4qVgk+Kj5LbjJlWk1uPnM5TUg9c0FzTXpuPnNIPnt0S2dLPmVIOT50RjYzRUM+bj1lPU1ZTUg9bj5lPT5NUk0yUT1zT0g+PXNZTVhWCT4qVgk+Kj5nTXZRc3pNOT5uTz49LmU9PmVXc2VuTW4+ZXpNPj16ZTJ5TTk+WnpPWk16V3EsPnpNeGV6OVdNbm4+T0E+fU09Lk16Vgk+Kj59Lk16TSgpLD5Pel99Lk16TSgpLD4uZWNzSHgoKSw+T3pfLmVjc0h4PmV6TT4yZVdXTTk+WnpzT3o+PU8+QXpPWSgpLFYJPio+Ck9zSCgpPmVIOT45PFp6TUFzUj5zbj5lOTlNOT5PSFdxPnNBPkhNTTlNOVhWCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CSR2PF95TXEJJ3Y8X30uTXpNJz5Pej4ndjxfLmVjc0h4J1YJPio+QHpNPVF6SAluPXpzSHgJcHdJPm49ZT1NWU1IPVYJPipoVglaek89TTI9TTk+QVFIMj1zT0g+XzJPWVpzV01ffS4oJHY8X3lNcSlWCV1WCQlzQT4oMk9RSD0oJD0uc24taSR2PF95TXEpPmk+YSlWCQldVgkJCUFPej4oJHM+Uz5hLD4kMj5TPjJPUUg9KCQ9LnNuLWkkdjxfeU1xKTs+JHM+Qj4kMjs+JHMrKylWCQkJXVYJCQkJaGg+M24+PS5zbj4yT0g5cz1zT0g+ZVd6TWU5cT4yT1lac1dNOT9WCQkJCXNBPihzbl9uPXpzSHgoJD0uc24taV0kdjxfeU1xbGokc2QpKVYJCQkJXVYJCQkJCTJPSD1zSFFNO1YJCQkJbFYJCQkJTVduTXNBPigkPS5zbi1pXSR2PF95TXFsaiRzZGonTW4yZVpNJ2Q+U1NTPnJGSXBLKVYJCQkJXVYJCQkJCSQ9LnNuLWldJHY8X3lNcWxqJHNkPlM+JD0uc24taV0kdjxfeU1xbGokc2RqJzJPSDlzPXNPSCdkO1YJCQkJCTJPSD1zSFFNO1YJCQkJbFZWCQkJCWhoPnBaV3M9PllRVz1zWldNPjJPSDlzPXNPSG5WCQkJCSQyT0g5cz1zT0huPlM+WnpNeF9uWldzPShWCQkJCQknaChcbipGRTRcbit8XG4qN2dcbispaHMnLFYJCQkJCSQ9LnNuLWldJHY8X3lNcWxqJHNkaicyT0g5cz1zT0gnZCxWCQkJCQktMCxWCQkJCQltZ0tDX3BtSTNUXzRLSTN1Xy9GbVQgZ0s+fD5tZ0tDX3BtSTNUX0U3X0t1bVRiVgkJCQkpO1ZWCQkJCUFPej4oJDJzPlM+YSw+JDIyPlM+Mk9RSD0oJDJPSDlzPXNPSG4pOz4kMnM+Qj4kMjI7PiQycysrKVYJCQkJXVYJCQkJCXNBPigoJE9aPlM+JD0uc24taV94TT1fT1pNemU9T3ooJDJPSDlzPXNPSG5qJDJzZCkpPlNTUz5yRklwS1YJCQkJCQk3Zz4hPlp6TXhfWWU9Mi4oJ2heKFwoPykoWCopKCdYWnpNeF92UU89TSgkT1osPidoJylYJylcbiooWCooP0IhXCkpKT8oXCk/KSRocycsPiQyT0g5cz1zT0huaiQyc2QsPiRZZT0yLk1uKSlWCQkJCQldVgkJCQkJCTJPSD1zSFFNO1YJCQkJCWxWVgkJCQkJaGg+JFllPTIuTW4+Uz5lenplcShWCQkJCQloaAlhPlNpPicoPU1uPT5CUz5BT08pJywJaCo+PS5NPn0uT1dNPj0uc0h4PipoVgkJCQkJaGgJMD5TaT4nKCcsCQloKj5PWj1zT0hlVz4qaFYJCQkJCWhoCWs+U2k+Jz1Nbj0nLAkJaCo+PS5NPkFzTVc5PkhlWU0+KmhWCQkJCQloaAlKPlNpPic+QlM+JywJCWgqPiRPWj4qaFYJCQkJCWhoCVU+U2k+J0FPTycsCQloKj5PWj1zT0hlVyw+c0E+JE9aPnNuPk1YeFg+JzNwPkUgSUknPipoVgkJCQkJaGgJTD5TaT4nKScJCWgqPk9aPXNPSGVXPipoVgkJCQkJaGg+KTtWVgkJCQkJc0E+KD4hPk1ZWj1xKCRZZT0yLk1ualVkKSlWCQkJCQldVgkJCQkJCSQ9LnNuLWlfc25fV3M9TXplVygkWWU9Mi5NbmpVZCk+N2c+JFllPTIuTW5qVWQ+Uz4kPS5zbi1pWnpPPU0yPV9zOU1IPXNBc016big9enNZKCRZZT0yLk1ualVkKSk7VgkJCQkJCSRZZT0yLk1ualVkPlM+Jz4nWCRZZT0yLk1ualVkO1YJCQkJCWxWVgkJCQkJJDJPSDlzPXNPSG5qJDJzZD5TPiRZZT0yLk1uajBkWCQ9LnNuLWlaek89TTI9X3M5TUg9c0FzTXpuKD16c1koJFllPTIuTW5qa2QpKVYJCQkJCQlYJz4nWD16c1koJFllPTIuTW5qSmQpWCRZZT0yLk1ualVkWCRZZT0yLk1uakxkO1YJCQkJbFZWCQkJCSQ9LnNuLWldJHY8X3lNcWxqJHNkPlM+c1laV085TSgnJyw+JDJPSDlzPXNPSG4pO1YJCQlsVlYJCQl6TT1Rekg+KCR2PF95TXE+U1NTPid2PF8uZWNzSHgnPj8+IlxIdEY2M0VDPiI+Oj4iXEh7dEtnSz4iKVYJCQkJWHNZWldPOU0oIlxIIiw+JD0uc24taSR2PF95TXEpO1YJCWxWVgkJek09UXpIPicnO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj4vT1lac1dNPkNnNyBtPm9iVgk+KlYJPio+S24yZVpNbj5zOU1IPXNBc016bj5zSD5DZzcgbT5vYj5uPWU9TVlNSD1uPmU9Pk1STTJRPXNPSD49c1lNWFYJPipWCT4qPmdNdlFzek05Pm5PPj0uZT0+ZVdzZW5Nbj5lek0+PXplMnlNOT5aek9aTXpXcSw+ek14ZXo5V01ubj5PQT59TT0uTXpWCT4qPnh6T1FaXzxxKCk+c24+MmVXV005Plp6c096Pj1PPkF6T1koKSw+Ck9zSCgpPmVIOT45PFp6TUFzUj5zbj5lOTlNOVYJPio+T0hXcT5zQT5ITU05TTlYVgk+KlYJPio+QHpNPVF6SAluPXpzSHgJcHdJPm49ZT1NWU1IPVYJPipoVglaek89TTI9TTk+QVFIMj1zT0g+XzJPWVpzV01feHpPUVpfPHEoKVYJXVYJCXNBPigyT1FIPSgkPS5zbi1pdjxfeHpPUVo8cSk+aT5hKVYJCV1WCQkJQU96Pigkcz5TPmEsPiQyPlM+Mk9RSD0oJD0uc24taXY8X3h6T1FaPHEpOz4kcz5CPiQyOz4kcysrKVYJCQldVgkJCQloaD4zbj5zPT5lV3pNZTlxPjJPWVpzV005P1YJCQkJc0E+KHNuX249enNIeCgkPS5zbi1pdjxfeHpPUVo8cWokc2QpKVYJCQkJXVYJCQkJCTJPSD1zSFFNO1YJCQkJbFZWCQkJCSQ9LnNuLWl2PF94ek9RWjxxaiRzZD5TPigkPS5zbi1pdjxfeHpPUVo8cWokc2RqJ01uMmVaTSdkPlNTUz5yRklwSz43Zz4kPS5zbi1pX3NuX1dzPU16ZVcoJD0uc24taXY8X3h6T1FaPHFqJHNkaidBc01XOSdkKSlWCQkJCQk/PiQ9LnNuLWl2PF94ek9RWjxxaiRzZGonQXNNVzknZFYJCQkJCTo+JD0uc24taVp6Tz1NMj1fczlNSD1zQXNNem4oJD0uc24taXY8X3h6T1FaPHFqJHNkaidBc01XOSdkKTtWCQkJbFZWCQkJek09UXpIPiJcSENnNyBtPm9iPiJYc1laV085TSgnLD4nLD4kPS5zbi1pdjxfeHpPUVo8cSk7VgkJbFZWCQl6TT1Rekg+Jyc7VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPi9PWVpzV00+N2c0S2c+b2JWCT4qVgk+Kj5LbjJlWk1uPnM5TUg9c0FzTXpuPnNIPjdnNEtnPm9iPm49ZT1NWU1IPW4+ZT0+TVJNMlE9c09IPj1zWU1YVgk+KlYJPio+Z012UXN6TTk+bk8+PS5lPT5lV3Nlbk1uPmV6TT49emUyeU05Plp6T1pNeldxLD56TXhlejlXTW5uPk9BPn1NPS5NelYJPio+T3o5TXpfPHEoKT5zbj4yZVdXTTk+WnpzT3o+PU8+QXpPWSgpLD4KT3NIKCk+ZUg5Pjk8WnpNQXNSPnNuPmU5OU05Vgk+Kj5PSFdxPnNBPkhNTTlNOVhWCT4qVgk+Kj5Aek09UXpICW49enNIeAlwd0k+bj1lPU1ZTUg9Vgk+KmhWCVp6Tz1NMj1NOT5BUUgyPXNPSD5fMk9ZWnNXTV9PejlNel88cSgpVgldVgkJc0E+KHNuX2V6emVxKCQ9LnNuLWl2PF9PejlNejxxKT4mJj4yT1FIPSgkPS5zbi1pdjxfT3o5TXo8cSk+aT5hKVYJCV1WCQkJQU96Pigkcz5TPmEsPiQyPlM+Mk9RSD0oJD0uc24taXY8X096OU16PHEpOz4kcz5CPiQyOz4kcysrKVYJCQldVgkJCQlzQT4oJD0uc24taXY8X096OU16PHFqJHNkaidNbjJlWk0nZD4hU1M+ckZJcEs+JiY+IT4kPS5zbi1pX3NuX1dzPU16ZVcoJD0uc24taXY8X096OU16PHFqJHNkaidBc01XOSdkKSlWCQkJCV1WCQkJCQkkPS5zbi1pdjxfT3o5TXo8cWokc2RqJ0FzTVc5J2Q+Uz4kPS5zbi1pWnpPPU0yPV9zOU1IPXNBc016bigkPS5zbi1pdjxfT3o5TXo8cWokc2RqJ0FzTVc5J2QpO1YJCQkJbFZWCQkJCSQ9LnNuLWl2PF9PejlNejxxaiRzZD5TPiQ9LnNuLWl2PF9PejlNejxxaiRzZGonQXNNVzknZFgkPS5zbi1pdjxfT3o5TXo8cWokc2RqJzlzek0yPXNPSCdkO1YJCQlsVlYJCQl6TT1Rekg+JD0uc24taXY8X096OU16PHE+Uz4iXEg3ZzRLZz5vYj4iWHNZWldPOU0oJyw+Jyw+JD0uc24taXY8X096OU16PHEpO1YJCWxWCQlNV25Nc0E+KHNuX249enNIeCgkPS5zbi1pdjxfT3o5TXo8cSkpVgkJXVYJCQl6TT1Rekg+JD0uc24taXY8X096OU16PHE7VgkJbFZWCQl6TT1Rekg+Jyc7VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPjc8Ck0yPT49Tz5GenplcVYJPipWCT4qPlRleU1uPmVIPk88Ck0yPT5lbj5zSFpRPT5lSDk+Mk9IY016PW4+PS5NPjJXZW5uPmNlenNlPFdNbj49Tz5lenplcT55TXFoY2VXblYJPipWCT4qPkBaZXplWQlPPApNMj1WCT4qPkB6TT1RekgJZXp6ZXFWCT4qaFYJWnpPPU0yPU05PkFRSDI9c09IPl9PPApNMj1fPU9fZXp6ZXEoJE88Ck0yPSlWCV1WCQlzQT4oPiE+c25fTzwKTTI9KCRPPApNMj0pKVYJCV1WCQkJek09UXpIPiRPPApNMj07VgkJbFZWCQkkZXp6ZXE+Uz5lenplcSgpO1YJCUFPek1lMi4+KHhNPV9PPApNMj1fY2V6bigkTzwKTTI9KT5lbj4keU1xPlNpPiRjZVcpVgkJXVYJCQloaD5ULk16TT5lek0+bk9ZTT48UXNXPT5zSD55TXFuPn1NPkhNTTk+PU8+c3hIT3pNPkFPej49LnNuPjJPSGNNem5zT0hWCQkJc0E+KD4hPnNuX088Ck0yPSgkY2VXKT4mJj4hPnNuX2V6emVxKCRjZVcpPiYmPiR5TXE+IVNTPidfWmV6TUg9X0hlWU0nKVYJCQldVgkJCQkkZXp6ZXFqJHlNcWQ+Uz4kY2VXO1YJCQlsVgkJbFZWCQl6TT1Rekg+JGV6emVxO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj43PApNMj0+PU8+Rnp6ZXFWCT4qVgk+Kj5UZXlNbj5lSD5PPApNMj0+ZW4+c0haUT0+ZUg5PjJPSGNNej1uPj0uTT4yV2Vubj5jZXpzZTxXTW4+PU8+ZXp6ZXE+eU1xaGNlV25WCT4qVgk+Kj5AWmV6ZVkJTzwKTTI9Vgk+Kj5Aek09UXpICWV6emVxVgk+KmhWCVp6Tz1NMj1NOT5BUUgyPXNPSD5fTzwKTTI9Xz1PX2V6emVxXzxlPTIuKCRPPApNMj0pVgldVgkJc0E+KD4hPnNuX088Ck0yPSgkTzwKTTI9KSlWCQldVgkJCXpNPVF6SD4kTzwKTTI9O1YJCWxWVgkJJGV6emVxPlM+ZXp6ZXEoKTtWCQkkT1E9PlM+eE09X088Ck0yPV9jZXpuKCRPPApNMj0pO1YJCSRBc01XOW4+Uz5lenplcV95TXFuKCRPUT0pO1ZWCQlBT3pNZTIuPigkQXNNVzluPmVuPiRjZVcpVgkJXVYJCQloaD5ULk16TT5lek0+bk9ZTT48UXNXPT5zSD55TXFuPn1NPkhNTTk+PU8+c3hIT3pNPkFPej49LnNuPjJPSGNNem5zT0hWCQkJc0E+KCRjZVc+IVNTPidfWmV6TUg9X0hlWU0nKVYJCQldVgkJCQkkcz5TPmE7VgkJCQlBT3pNZTIuPigkT1E9aiRjZVdkPmVuPiQ5ZT1lKVYJCQkJXVYJCQkJCSRlenplcWokcysrZGokY2VXZD5TPiQ5ZT1lO1YJCQkJbFYJCQlsVgkJbFZWCQl6TT1Rekg+JGV6emVxO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj5wPWV6PT4vZTIuTVYJPipWCT4qPnA9ZXo9bj53bz4yZTIuc0h4Vgk+KlYJPio+QHpNPVF6SAkvM180b192UU16cV88UXNXOU16Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD5uPWV6PV8yZTIuTSgpVgldVgkJJD0uc24taXY8XzJlMi5zSHg+Uz5UZyBLO1YJCXpNPVF6SD4kPS5zbjtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+cD1PWj4vZTIuTVYJPipWCT4qPnA9T1puPndvPjJlMi5zSHhWCT4qVgk+Kj5Aek09UXpICS8zXzRvX3ZRTXpxXzxRc1c5TXpWCT4qaFYJWlE8V3MyPkFRSDI9c09IPm49T1pfMmUyLk0oKVYJXVYJCSQ9LnNuLWl2PF8yZTIuc0h4PlM+ckZJcEs7VgkJek09UXpIPiQ9LnNuO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj5yV1FuLj4vZTIuTVYJPipWCT4qPktZWj1zTW4+PS5NPndvPjJlMi5NVgk+KlYJPio+QHpNPVF6SAkvM180b192UU16cV88UXNXOU16Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD5BV1FuLl8yZTIuTSgpVgldVgkJJD0uc24taV96TW5NPV96UUgoZXp6ZXEoVgkJCSd2PF8yZTIuTV9uTVdNMj0nCQlTaT5lenplcSgpLFYJCQkndjxfMmUyLk1fQXpPWScJCQlTaT5lenplcSgpLFYJCQkndjxfMmUyLk1fCk9zSCcJCQlTaT5lenplcSgpLFYJCQkndjxfMmUyLk1ffS5Nek0nCQlTaT5lenplcSgpLFYJCQkndjxfMmUyLk1feHpPUVo8cScJCVNpPmV6emVxKCksVgkJCSd2PF8yZTIuTV8uZWNzSHgnCQlTaT5lenplcSgpLFYJCQkndjxfMmUyLk1fT3o5TXo8cScJCVNpPmV6emVxKCksVgkJCSd2PF8yZTIuTV9uTT0nCQkJU2k+ZXp6ZXEoKSxWCQkJJ3Y8XzJlMi5NX01Sc249bicJCVNpPmV6emVxKCksVgkJCSd2PF8yZTIuTV9IT19NbjJlWk0nCVNpPmV6emVxKClWCQkpKTtWVgkJek09UXpIPiQ9LnNuO1YJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj51TXp4TT4vZTIuTVYJPipWCT4qPnsuTUg+MmVXV005LD49LnNuPkFRSDI9c09IPllNenhNbj5lSHE+MmUyLk05PndvPmV6emVxbj59cz0uVgk+Kj5XTzJlV1dxPjJlV1dNOT5PSE1uWFYJPipWCT4qPkB6TT1RekgJY09zOVYJPipoVglaek89TTI9TTk+QVFIMj1zT0g+X1lNenhNXzJlMi5NKClWCV1WCQlzQT4oMk9RSD0oJD0uc24taXY8XzJlMi5NX01Sc249bik+U1NTPmEpVgkJXVYJCQl6TT1Rekg7VgkJbFYJCU1Xbk1zQT4oc0hfZXp6ZXEoJ25NV00yPScsPiQ9LnNuLWl2PF8yZTIuTV9NUnNuPW4sPlRnIEspKVYJCV1WCQkJJHY8X0hPX01uMmVaTT5TPiQ9LnNuLWl2PF8yZTIuTV9IT19NbjJlWk07VgkJbFZWCQlBT3pNZTIuPihlenplcV9RSHN2UU0oJD0uc24taXY8XzJlMi5NX01Sc249bik+ZW4+JGNlVyk+aGg+bk1XTTI9LD5Bek9ZLD5NPTJYVgkJXVYJCQkkdjxfY2V6c2U8V00JUz4ndjxfJ1gkY2VXO1YJCQkkdjxfMmUyLk1fY2V6CVM+J3Y8XzJlMi5NXydYJGNlVztWCQkJJHY8X0hNfT4JUz4kPS5zbi1pJHY8XzJlMi5NX2NlejtWVgkJCUFPej4oJHM+Uz5hLD4kMj5TPjJPUUg9KCQ9LnNuLWkkdjxfY2V6c2U8V00pOz4kcz5CPiQyOz4kcysrKVYJCQldVgkJCQlzQT4oPiE+c0hfZXp6ZXEoJD0uc24taV0kdjxfY2V6c2U8V01saiRzZCw+JHY8X0hNfSw+VGcgSykpVgkJCQldVgkJCQkJJHY8X0hNfWpkPlM+JD0uc24taV0kdjxfY2V6c2U8V01saiRzZDtWCQkJCQlzQT4oJGNlVz5TU1M+J25NV00yPScpVgkJCQkJXVYJCQkJCQkkdjxfSE9fTW4yZVpNamQ+Uz4kPS5zbi1pdjxfSE9fTW4yZVpNaiRzZDtWCQkJCQlsVgkJCQlsVgkJCWxWVgkJCSQ9LnNuLWkkdjxfY2V6c2U8V00+Uz4kdjxfSE19O1YJCQlzQT4oJGNlVz5TU1M+J25NV00yPScpVgkJCV1WCQkJCSQ9LnNuLWl2PF9IT19NbjJlWk0+Uz4kdjxfSE9fTW4yZVpNO1YJCQlsVgkJbFZWCQloaD4zQT59TT5lek0+Ilp6Tz1NMj1zSHg+czlNSD1zQXNNem4iPn1NPkhNTTk+PU8+TVJlWXNITT49Lk0+IkF6T1kiVgkJaGg+Wk96PXNPSD5PQT49Lk0+dlFNenE+PU8+OU09TXpZc0hNPnNBPj0uTXpNPmV6TT5lSHE+ZVdzZW5NblYJCXNBPigkPS5zbi1pX1p6Tz1NMj1fczlNSD1zQXNNem4+U1NTPlRnIEs+JiY+Mk9RSD0oJD0uc24taXY8XzJlMi5NX0F6T1kpPmk+YSlWCQldVgkJCSQ9LnNuLWlfPXplMnlfZVdzZW5NbigkPS5zbi1pdjxfQXpPWSk7VgkJbFYJbFZWCWhoPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVlYJaCoqVgk+Kj4zbj5Xcz1NemVXVgk+KlYJPio+NE09TXpZc0hNbj5zQT5lPm49enNIeD56TVp6TW5NSD1uPmU+V3M9TXplVz5jZVdRTT5Pej5lPkFzTVc5PkhlWU1WCT4qVgk+Kj5AWmV6ZVkJbj16c0h4CSRuPXpWCT4qPkB6TT1RekgJPE9PV1YJPipoVglaek89TTI9TTk+QVFIMj1zT0g+X3NuX1dzPU16ZVcoJG49eilWCV1WCQkkbj16PlM+PXpzWSgkbj16KTtWVgkJc0E+KE1ZWj1xKCRuPXopPjdnPjI9cVpNXzlzeHM9KCRuPXopPjdnPihuPXpzSHgpPihBV09lPSk+JG49ej5TU1M+JG49ej43Zz5zSF9lenplcShuPXo9T1FaWk16KCRuPXopLD5lenplcSgnVGcgSycsPidyRklwSycpLD5UZyBLKSlWCQldVgkJCXpNPVF6SD5UZyBLO1YJCWxWVgkJbj1lPXMyPiRfbj16O1ZWCQlzQT4oTVlaPXEoJF9uPXopKVYJCV1WCQkJJF9uPXo+Uz4oJD0uc24taV9NbjJlWk1fMi5lej4hU1M+JyInKVYJCQkJPz5lenplcSgnIicsPiInIik+Oj5lenplcSgiJyIpO1YJCWxWVgkJek09UXpIPnNIX2V6emVxKCRuPXpqYWQsPiRfbj16LD5UZyBLKTtWCWxWVgloaD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVZWCWgqKlYJPio+Z01uTT0+d1FNenE+b1FzVzlNej5jZVdRTW5YVgk+KlYJPio+bVE8V3MyV3EtY3NuczxXTT5ZTT0uTzk+PU8+ek1uTT0+PS5NPndvPmNlV1FNblhWCT4qVgk+Kj5Aek09UXpICS8zXzRvX3ZRTXpxXzxRc1c5TXpWCT4qaFYJWlE8V3MyPkFRSDI9c09IPnpNbk09X3ZRTXpxKClWCV1WCQkkPS5zbi1pX3pNbk09X25NV00yPSgpO1YJCSQ9LnNuLWlfek1uTT1ffXpzPU0oKTtWCQl6TT1Rekg+JD0uc247VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPmdNbk09bj49Lk0+dlFNenE+PFFzVzlNej5jZVdRTW5YPj4vZVdXTTk+PHE+PS5NPnhNPSgpPkFRSDI9c09IVgk+KlYJPio+QFplemVZCWV6emVxCUZIPmV6emVxPk9BPkFzTVc5bj49Tz56TW5NPVYJPio+QHpNPVF6SAljT3M5Vgk+KmhWCVp6Tz1NMj1NOT5BUUgyPXNPSD5fek1uTT1felFIKCR2PF96TW5NPV9zPU1ZbilWCV1WCQlBT3pNZTIuPigkdjxfek1uTT1fcz1NWW4+ZW4+JHM9TVk+U2k+JDlNQWVRVz1fY2VXUU0pVgkJXVYJCQkkPS5zbi1pJHM9TVk+Uz4kOU1BZVFXPV9jZVdRTTtWCQlsVglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPmdNbk09bj49Lk0+dlFNenE+PFFzVzlNej5jZVdRTW5YPj4vZVdXTTk+PHE+PS5NPnhNPSgpPkFRSDI9c09IVgk+KlYJPio+QHpNPVF6SAljT3M5Vgk+KmhWCVp6Tz1NMj1NOT5BUUgyPXNPSD5fek1uTT1fbk1XTTI9KClWCV1WCQkkPS5zbi1pX3pNbk09X3pRSChlenplcShWCQkJJ3Y8X25NV00yPScJCVNpPmV6emVxKCksVgkJCSd2PF9Bek9ZJwkJU2k+ZXp6ZXEoKSxWCQkJJ3Y8XwpPc0gnCQlTaT5lenplcSgpLFYJCQkndjxffS5Nek0nCQlTaT5lenplcSgpLFYJCQkndjxfeHpPUVo8cScJCVNpPmV6emVxKCksVgkJCSd2PF8uZWNzSHgnCQlTaT5lenplcSgpLFYJCQkndjxfT3o5TXo8cScJCVNpPmV6emVxKCksVgkJCSd2PF9lV3Nlbk05Xz1lPFdNbicJU2k+ZXp6ZXEoKSxWCQkJJ3Y8X0hPX01uMmVaTScJCVNpPmV6emVxKCksVgkJCSd2PF85c249c0gyPScJCVNpPnJGSXBLLFYJCQkndjxfV3NZcz0nCQlTaT5yRklwSyxWCQkJJ3Y8X09BQW5NPScJCVNpPnJGSXBLVgkJKSk7VglsVlYJaGg+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1WVgloKipWCT4qPmdNbk09bj49Lk0+dlFNenE+PFFzVzlNej4ifXpzPU0iPmNlV1FNblhWCT4qVgk+Kj4vZVdXTTk+PHE+PS5NPnNIbk16PSgpPlFaOWU9TSgpPnNIbk16PV88ZT0yLigpPlFaOWU9TV88ZT0yLigpPmVIOT45TVdNPU0oKT5BUUgyPXNPSG5WCT4qVgk+Kj5Aek09UXpICWNPczlWCT4qaFYJWnpPPU0yPU05PkFRSDI9c09IPl96TW5NPV99enM9TSgpVgldVgkJJD0uc24taV96TW5NPV96UUgoZXp6ZXEoVgkJCSd2PF9uTT0nCVNpPmV6emVxKCksVgkJCSd2PF9Bek9ZJwlTaT5lenplcSgpLFYJCQkndjxfCk9zSCcJU2k+ZXp6ZXEoKSxWCQkJJ3Y8X30uTXpNJwlTaT5lenplcSgpLFYJCQkndjxfT3o5TXo8cScJU2k+ZXp6ZXEoKSxWCQkJJ3Y8X3lNcW4nCVNpPmV6emVxKCksVgkJCSd2PF9Xc1lzPScJU2k+ckZJcEtWCQkpKTtWCWxWVmxW';$_D=strrev('edoced_46esab');eval($_D('JF9YPWJhc2U2NF9kZWNvZGUoJF9YKTskX1g9c3RydHIoJF9YLCdTZ1BPOVlaV0ZLbXF5ZnhjakxKUnp1TTV2TnRzMWIue0I0bkNdaS8yRGwwRWhlQQpbZDg9UXA+VlhvIEh9NkdJdzdrYTNUclU8JywnPVI5b2RtcGxBRVB5azhndls1M3hyTWV6cVpIaTdZaFc8RHNHez5DY1h9MU4vYWZqNl1KdHVTIAouQlVud1ZLTFFPMjBJVEY0YicpOyRfUj1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfWCk7ZXZhbCgkX1IpOyRfUj0wOyRfWD0wOw='));?>
Function Calls
strtr | 1 |
strrev | 1 |
defined | 1 |
str_replace | 1 |
base64_decode | 2 |
Stats
MD5 | 11fc2a92ac503386da41c96c59f5d257 |
Eval Count | 2 |
Decode Time | 370 ms |