false
false
0

Contract Address Details

0x9bF4dc50f8C11206554de8FddaF4cdE5FAB332cc

Contract Name
TwoBearsBalances
Creator
0xebe894–7a24f6 at 0x3e29c0–1fbd42
Balance
3,942.701818447715135484 CLO
Tokens
Fetching tokens...
Transactions
161 Transactions
Transfers
53 Transfers
Gas Used
8,371,329
Last Balance Update
18596934
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
TwoBearsBalances




Optimization enabled
false
Compiler version
v0.8.16+commit.07a7930e




EVM Version
default




Verified at
2024-09-26T15:34:57.701425Z

Contract source code

// All rights reserved.
// SPDX-License-Identifier: No License (None)

pragma solidity ^0.8.16;

interface IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

contract TwoBearsBalances {

    struct Tokens { 
        uint8 standart; // 1 байта - стандарт токена
        uint8 decimal; // 1 байт - количество десятичных знаков
        uint16 priority; // 2 байта - приоритет токена для определения ценообразования (цена - отношение к токену с максимальным приоритетом)
        bytes8 symb; // 8 байт - аббревиатура токена
        address next; // 20 байт - адрес следующего токена (последний токен указывает на нулевой адрес)
    }

    struct Balances { 
        uint256 free; // Свободный баланс
        uint256 in_orders; // Баланс в ордерах
    }

    mapping(address => Tokens) private tokens; // Односвязный список всех токенов на бирже
    mapping(address => mapping(address => Balances)) private balances; // Балансы пользователей

    address public owner = msg.sender; // Владелец
    address public owner2 = 0xCA110B82bE575DfD1829191Cc38F7a4ab7D808bc; // второй владелец
    address public contractOrders; // Контракт с книгами ордеров
    address private constant firstToken = 0x0000000000000000000000000000000000000001; // первый адрес в списке токенов это нативный CLO
    address private endToken = firstToken; // всегда указывает на последний токен в списке токенов
   
    event Deposit(address indexed token, address indexed to, uint value);
    event Withdrawal(address indexed token, address indexed to, uint value);
    event Transfer(address indexed token, address indexed from, address indexed to, uint value);

    modifier onlyOwner() {
        require(msg.sender == owner, "Only owner can call this");
        _;
    }

    modifier onlyContractOrders() {
        require(msg.sender == contractOrders, "Only contract orders can call");
        _;
    }

    constructor()
    {
        tokens[firstToken] = Tokens(1, 18, 50000, "CLO", address(0x00));
    }

    // Депозитные функции

    receive() external payable {
        depositCLO();
    }

    function depositCLO() public payable { // пополнение нативным CLO
        balances[firstToken][msg.sender].free += msg.value;
        emit Deposit(firstToken, msg.sender, msg.value);
    }

    function depositERC20(address _token, uint _value) external {
        require(tokens[_token].standart == 20); // токен должен присутствовать в списке токенов
        IERC20(_token).transferFrom(msg.sender, address(this), _value);
        balances[_token][msg.sender].free += _value;
        emit Deposit(_token, msg.sender, _value);
    }

    function tokenReceived(address _from, uint _value, bytes memory _data) public returns (bytes4) { // новый ERC223
        require(tokens[msg.sender].standart == 223); // токен должен присутствовать в списке токенов
        balances[msg.sender][_from].free += _value;
        emit Deposit(msg.sender, _from, _value);
        return this.tokenReceived.selector; // возвращаем селектор этой функции
    }

    // Функция вывода свободного депозита

    function withdraw(address _token, address _recipient, uint _value) external {
        //require(tokens[_token].standart > 0); // токен должен присутствовать в списке токенов
        require((_value > 0) && (_value <= balances[_token][msg.sender].free)); // количество должно быть больше 0 (защита от фишинговых транзакций, так как токены не делают такую проверку), а также у пользователя должны быть доступные для вывода свободные средства
        require((_recipient != address(0)), "err: zero address"); // Адрес получателя ненулевой

        balances[_token][msg.sender].free -= _value;
        if(tokens[_token].standart == 1){ // вывод нативного CLO
            payable(_recipient).transfer(_value);
        }
        else{ // вывод токена
            IERC20(_token).transfer(_recipient, _value);
        }

        emit Withdrawal(_token, _recipient, _value);
    }

    function withdrawFee(address _token) external // вывести комиссию владельцев
    {
        uint _val = balances[_token][address(this)].free;
        require(_val > 0); // доступный баланс должен быть больше 0
        --_val;
        balances[_token][owner].free += (_val / 2);
        balances[_token][owner2].free += (_val - (_val / 2));
        balances[_token][address(this)].free -= _val;

        emit Transfer(_token, address(this), owner, _val / 2);
        emit Transfer(_token, address(this), owner2, _val - (_val / 2));
    }

    function transfer(address _token, address _recipient, uint _value) external { // внутрибиржевые переводы
        //require(tokens[_token].standart > 0); // токен должен присутствовать в списке токенов
        require((_value > 0) && (_value <= balances[_token][msg.sender].free)); // количество должно быть больше 0 (защита от фишинговых транзакций, так как токены не делают такую проверку), а также у пользователя должны быть доступные для вывода свободные средства
        require((_recipient != address(0)), "err: zero address"); // Адрес получателя ненулевой

        balances[_token][msg.sender].free -= _value;
        balances[_token][_recipient].free += _value;

        emit Transfer(_token, msg.sender, _recipient, _value);
    }

    // ФУНКЦИИ ВЛАДЕЛЬЦА

    function setContractOrders(address _newContractOrders) public onlyOwner // установить новый контракт ордеров
    {
        contractOrders = _newContractOrders;
    }

    function addToken(address _newToken, uint8 _standart, uint16 _priority) external onlyOwner // Добавление нового токена на dex
    {
        require(tokens[_newToken].standart == 0, "err: token exists"); // токен должен отсутствовать в списке токенов

        bytes8 _newSymb;
        string memory str = IERC20(_newToken).symbol();
        assembly {
            _newSymb := mload(add(str, 32))
        }    

        tokens[_newToken] = Tokens(_standart, IERC20(_newToken).decimals(), _priority, _newSymb, address(0x00));
        tokens[endToken].next = _newToken; // связываем последний токен с новым токеном
        endToken = _newToken; // новый токен становится последним
    }

    function delToken(address _delToken, address _prevToken) external onlyOwner // Делистинг токена
    { // _delToken - удаляемый токен, _prevToken - токен в списке перед удаляемым токеном
        require((_delToken != address(0)) && (_delToken != firstToken)); // Удаляемый токен не может быть нулевым адресом и нативной монетой CLO
        require(tokens[_prevToken].next == _delToken); // предыдущий токен в списке должен указывать на удаляемый токен
        require(IERC20(_delToken).balanceOf(address(this)) == 0); // контракт не должен иметь баланс в удаляемом токене
        if(_delToken == endToken) endToken = _prevToken; // если удаляется последний токен в списке
        tokens[_prevToken].next = tokens[_delToken].next; // исключаем удаляемый токен из списка
        delete tokens[_delToken]; // чистим память, данная операция поощрается EVM и будет возвращено часть газа
        //tokens[_delToken] = Tokens(0, 0, 0, 0, address(0x00)); 
    }

    function searchToken(address _searchToken, address _startSearchToken, uint _elem) public view returns (Tokens memory) // поиск предыдущего токена относительно заданного. Если _elem = 0, то функция просто выводит информацию по токену _searchToken
    {
        // _searchToken - ищем токен перед ним
        // _startSearchToken - от какого токена производится поиск (поиск с первого токена, если данного токена нет в списке)
        // _elem - сколько токенов обойти по списку
        require(tokens[_searchToken].standart > 0, "err: missing _searchToken"); // искомый токен должен присутствовать в списке токенов
        if(_elem == 0) return tokens[_searchToken]; // если _elem = 0, то функция вернет информацию по токену _searchToken

        _startSearchToken = tokens[_startSearchToken].standart > 0 ? _startSearchToken : firstToken; // определяем стартовую позицию
        require(_searchToken != _startSearchToken, "err: tokens are equal"); // искомый и предыдущий токен не должны быть равны
        
        address _nextToken;

        while (_elem > 0) {
            _nextToken = tokens[_startSearchToken].next;
            if((_nextToken == _searchToken) || (_nextToken == address(0x00))){
                break; // токен был найден или достигли конца списка
            } else {
                _startSearchToken = _nextToken;
            }
            --_elem;
        }

        return tokens[_startSearchToken]; // у возвращаемой структуры по полю "next" видно (0х00 - достигли конца списка, токен поиска - если поиск удался, другой адрес токена - значит не хватило итераций, следует возобновить поиск с этого элемента)
    }

    function getTokensInfo(address _startToken, uint _elem) public view returns (Tokens[] memory) // Возвращаем _elem токенов на бирже от указанного адреса
    {   
        Tokens[] memory result = new Tokens[](_elem);  
        _startToken = tokens[_startToken].standart > 0 ? _startToken : firstToken; // определяем стартовую позицию
        address _nextToken;

        for(uint i; i < _elem; i++){
            _nextToken = tokens[_startToken].next;
            result[i] = Tokens(tokens[_startToken].standart, tokens[_startToken].decimal, tokens[_startToken].priority, tokens[_startToken].symb, tokens[_startToken].next);

            if(_nextToken == address(0x00)){
                break; // достигли конца списка
            } else {
                _startToken = _nextToken;
            }
        }
        return (result); // возвращаем массив с инфой по токенам
    }

    function getTraderBalancesByTokens(address _trader, address[] calldata _tokens) public view returns (Balances[] memory) // Возвращает балансы трейдера (свободный баланс/ баланс в ордерах) по токенам в массиве
    {
        Balances[] memory result = new Balances[](_tokens.length);  
        for(uint i; i < _tokens.length; i++){
            result[i] = Balances(balances[_tokens[i]][_trader].free, balances[_tokens[i]][_trader].in_orders);
        }
        return (result); // возвращаем массив с балансами
    }

    // ФУНКЦИИ ДЛЯ КОНТРАКТА С КНИГАМИ ОРДЕРОВ

    function lockInOrder(address _token_in, address _token_out, address _owner, uint _value_in) external onlyContractOrders // Блокировка баланса в ордере. Функция вызывается только при создании ордера
    {
        require(tokens[_token_out].standart > 0); // получаемый токен должен присутствовать на бирже
        require(_value_in <= balances[_token_in][_owner].free); // количество входящего токена должно иметься в наличии 
        require(_token_in != _token_out); // токены не должны быть одинаковыми

        balances[_token_in][_owner].free -= _value_in; // блокируем средства входящего токена в ордере
        balances[_token_in][_owner].in_orders += _value_in;
    }

    function getTypeAndPriceOrder(address _token_in, uint _value_in, address _token_out, uint _value_out) external view returns (uint8, uint256) // вернуть тип ордера и цену ордера
    {
        uint8 _order_type = tokens[_token_in].priority < tokens[_token_out].priority ? 1 : 2; // тип ордера (1 - продажа, 2 - покупка)
        uint256 res = _order_type == 1 ? _value_out * (10**tokens[_token_in].decimal) / _value_in : _value_in * (10**tokens[_token_out].decimal) / _value_out; // расчет цены ордера
        return (_order_type, res);
    }

    function operSub(address _token, address _owner, uint _value) external onlyContractOrders // Функция забирает баланс заблокированный в ордере
    {
        balances[_token][_owner].in_orders -= _value;
    }

    function operAdd(address _token, address _owner, uint _value) external onlyContractOrders // Функция пополняет свободный баланс
    {
        balances[_token][_owner].free += _value;
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Deposit","inputs":[{"type":"address","name":"token","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"token","internalType":"address","indexed":true},{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Withdrawal","inputs":[{"type":"address","name":"token","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addToken","inputs":[{"type":"address","name":"_newToken","internalType":"address"},{"type":"uint8","name":"_standart","internalType":"uint8"},{"type":"uint16","name":"_priority","internalType":"uint16"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"contractOrders","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"delToken","inputs":[{"type":"address","name":"_delToken","internalType":"address"},{"type":"address","name":"_prevToken","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"depositCLO","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"depositERC20","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct TwoBearsBalances.Tokens[]","components":[{"type":"uint8","name":"standart","internalType":"uint8"},{"type":"uint8","name":"decimal","internalType":"uint8"},{"type":"uint16","name":"priority","internalType":"uint16"},{"type":"bytes8","name":"symb","internalType":"bytes8"},{"type":"address","name":"next","internalType":"address"}]}],"name":"getTokensInfo","inputs":[{"type":"address","name":"_startToken","internalType":"address"},{"type":"uint256","name":"_elem","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct TwoBearsBalances.Balances[]","components":[{"type":"uint256","name":"free","internalType":"uint256"},{"type":"uint256","name":"in_orders","internalType":"uint256"}]}],"name":"getTraderBalancesByTokens","inputs":[{"type":"address","name":"_trader","internalType":"address"},{"type":"address[]","name":"_tokens","internalType":"address[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTypeAndPriceOrder","inputs":[{"type":"address","name":"_token_in","internalType":"address"},{"type":"uint256","name":"_value_in","internalType":"uint256"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256","name":"_value_out","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"lockInOrder","inputs":[{"type":"address","name":"_token_in","internalType":"address"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"address","name":"_owner","internalType":"address"},{"type":"uint256","name":"_value_in","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"operAdd","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_owner","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"operSub","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_owner","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner2","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct TwoBearsBalances.Tokens","components":[{"type":"uint8","name":"standart","internalType":"uint8"},{"type":"uint8","name":"decimal","internalType":"uint8"},{"type":"uint16","name":"priority","internalType":"uint16"},{"type":"bytes8","name":"symb","internalType":"bytes8"},{"type":"address","name":"next","internalType":"address"}]}],"name":"searchToken","inputs":[{"type":"address","name":"_searchToken","internalType":"address"},{"type":"address","name":"_startSearchToken","internalType":"address"},{"type":"uint256","name":"_elem","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setContractOrders","inputs":[{"type":"address","name":"_newContractOrders","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bytes4","name":"","internalType":"bytes4"}],"name":"tokenReceived","inputs":[{"type":"address","name":"_from","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"},{"type":"bytes","name":"_data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transfer","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_recipient","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_recipient","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawFee","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x608060405233600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ca110b82be575dfd1829191cc38f7a4ab7d808bc600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156100e857600080fd5b506040518060a00160405280600160ff168152602001601260ff16815260200161c35061ffff1681526020017f434c4f000000000000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff16815250600080600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548167ffffffffffffffff021916908360c01c0217905550608082015181600001600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505061417c806102956000396000f3fe6080604052600436106101185760003560e01c806367579e21116100a0578063bc3e7f9911610064578063bc3e7f99146103bf578063beabacc8146103fc578063d9caed1214610425578063e06b44001461044e578063fef4d95b1461047957610127565b806367579e21146102dc57806381e1c10b146103055780638943ec021461032e5780638da5cb5b1461036b57806397feb9261461039657610127565b8063318fe1e1116100e7578063318fe1e1146101f857806331cefa8614610221578063527097251461024a5780635dd70a5114610275578063665558041461029e57610127565b80630da529b61461012c57806313442900146101555780631ac3ddeb146101925780631f2bff68146101bb57610127565b3661012757610125610483565b005b600080fd5b34801561013857600080fd5b50610153600480360381019061014e9190612fc3565b610582565b005b34801561016157600080fd5b5061017c60048036038101906101779190612fc3565b6106ad565b6040516101899190613101565b60405180910390f35b34801561019e57600080fd5b506101b960048036038101906101b4919061311c565b610baf565b005b3480156101c757600080fd5b506101e260048036038101906101dd9190613149565b610fd8565b6040516101ef91906132a0565b60405180910390f35b34801561020457600080fd5b5061021f600480360381019061021a919061331a565b611377565b005b34801561022d57600080fd5b506102486004803603810190610243919061311c565b6117eb565b005b34801561025657600080fd5b5061025f6118bf565b60405161026c919061337c565b60405180910390f35b34801561028157600080fd5b5061029c60048036038101906102979190613397565b6118e5565b005b3480156102aa57600080fd5b506102c560048036038101906102c091906133fe565b611bc9565b6040516102d3929190613483565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190612fc3565b611d8f565b005b34801561031157600080fd5b5061032c600480360381019061032791906134ac565b611eba565b005b34801561033a57600080fd5b5061035560048036038101906103509190613632565b612318565b60405161036291906136dc565b60405180910390f35b34801561037757600080fd5b50610380612484565b60405161038d919061337c565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b89190613149565b6124aa565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190613757565b612688565b6040516103f391906138a4565b60405180910390f35b34801561040857600080fd5b50610423600480360381019061041e9190612fc3565b612891565b005b34801561043157600080fd5b5061044c60048036038101906104479190612fc3565b612b45565b005b34801561045a57600080fd5b50610463612e71565b604051610470919061337c565b60405180910390f35b610481610483565b005b3460016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461051391906138f5565b925050819055503373ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62346040516105789190613929565b60405180910390a3565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610612576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610609906139a1565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546106a191906138f5565b92505081905550505050565b6106b5612e97565b60008060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff1611610749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074090613a0d565b60405180910390fd5b6000820361089e576000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900461ffff1661ffff1661ffff1681526020016000820160049054906101000a900460c01b77ffffffffffffffffffffffffffffffffffffffffffffffff191677ffffffffffffffffffffffffffffffffffffffffffffffff1916815260200160008201600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050610ba8565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff16116108fe576001610900565b825b92508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096790613a79565b60405180910390fd5b60005b6000831115610a5e576000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610a465750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610a5e5780935082610a5790613a99565b9250610973565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900461ffff1661ffff1661ffff1681526020016000820160049054906101000a900460c01b77ffffffffffffffffffffffffffffffffffffffffffffffff191677ffffffffffffffffffffffffffffffffffffffffffffffff1916815260200160008201600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509150505b9392505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111610c4057600080fd5b80610c4a90613a99565b9050600281610c599190613af1565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610d0991906138f5565b92505081905550600281610d1d9190613af1565b81610d289190613b22565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610dd891906138f5565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610e6e9190613b22565b92505081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698f600285610f0a9190613af1565b604051610f179190613929565b60405180910390a4600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698f600285610fb49190613af1565b85610fbf9190613b22565b604051610fcc9190613929565b60405180910390a45050565b606060008267ffffffffffffffff811115610ff657610ff5613507565b5b60405190808252806020026020018201604052801561102f57816020015b61101c612e97565b8152602001906001900390816110145790505b50905060008060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff1611611092576001611094565b835b93506000805b8481101561136b576000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506040518060a001604052806000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff1681526020016000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff1660ff1681526020016000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160029054906101000a900461ffff1661ffff1681526020016000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160049054906101000a900460c01b77ffffffffffffffffffffffffffffffffffffffffffffffff191681526020016000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525083828151811061131557611314613b56565b5b6020026020010181905250600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16031561136b57819550808061136390613b85565b91505061109a565b50819250505092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe90613c19565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff161461149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290613c85565b60405180910390fd5b6000808473ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156114e9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115129190613d70565b9050602081015191506040518060a001604052808560ff1681526020018673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561157a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159e9190613dce565b60ff1681526020018461ffff1681526020018377ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff168152506000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548167ffffffffffffffff021916908360c01c0217905550608082015181600001600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505084600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461187b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187290613c19565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c906139a1565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff16116119d357600080fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154811115611a5f57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611a9757600080fd5b80600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254611b269190613b22565b9250508190555080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254611bbc91906138f5565b9250508190555050505050565b60008060008060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160029054906101000a900461ffff1661ffff166000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160029054906101000a900461ffff1661ffff1610611c82576002611c85565b60015b9050600060018260ff1614611d0a57846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff16600a611cf09190613f2e565b88611cfb9190613f79565b611d059190613af1565b611d7c565b866000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff16600a611d669190613f2e565b86611d719190613f79565b611d7b9190613af1565b5b9050818193509350505094509492505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e16906139a1565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254611eae9190613b22565b92505081905550505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4190613c19565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611fb45750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611fbd57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461205657600080fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612091919061337c565b602060405180830381865afa1580156120ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d29190613fe8565b146120dc57600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121735780600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549060ff02191690556000820160016101000a81549060ff02191690556000820160026101000a81549061ffff02191690556000820160046101000a81549067ffffffffffffffff021916905560008201600c6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550505050565b600060df6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff161461237857600080fd5b82600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461240791906138f5565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f628560405161246b9190613929565b60405180910390a3638943ec0260e01b90509392505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60146000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff161461250857600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161254593929190614015565b6020604051808303816000875af1158015612564573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125889190614084565b5080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461261891906138f5565b925050819055503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f628360405161267c9190613929565b60405180910390a35050565b606060008383905067ffffffffffffffff8111156126a9576126a8613507565b5b6040519080825280602002602001820160405280156126e257816020015b6126cf612f01565b8152602001906001900390816126c75790505b50905060005b848490508110156128855760405180604001604052806001600088888681811061271557612714613b56565b5b905060200201602081019061272a919061311c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548152602001600160008888868181106127c1576127c0613b56565b5b90506020020160208101906127d6919061311c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015481525082828151811061286757612866613b56565b5b6020026020010181905250808061287d90613b85565b9150506126e8565b50809150509392505050565b6000811180156129205750600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548111155b61292957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298f906140fd565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254612a279190613b22565b9250508190555080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254612abd91906138f5565b925050819055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698f84604051612b389190613929565b60405180910390a4505050565b600081118015612bd45750600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548111155b612bdd57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c43906140fd565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254612cdb9190613b22565b9250508190555060016000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff1603612d87578173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612d81573d6000803e3d6000fd5b50612e07565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401612dc292919061411d565b6020604051808303816000875af1158015612de1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e059190614084565b505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b639883604051612e649190613929565b60405180910390a3505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040518060a00160405280600060ff168152602001600060ff168152602001600061ffff168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b604051806040016040528060008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f5a82612f2f565b9050919050565b612f6a81612f4f565b8114612f7557600080fd5b50565b600081359050612f8781612f61565b92915050565b6000819050919050565b612fa081612f8d565b8114612fab57600080fd5b50565b600081359050612fbd81612f97565b92915050565b600080600060608486031215612fdc57612fdb612f25565b5b6000612fea86828701612f78565b9350506020612ffb86828701612f78565b925050604061300c86828701612fae565b9150509250925092565b600060ff82169050919050565b61302c81613016565b82525050565b600061ffff82169050919050565b61304981613032565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b6130848161304f565b82525050565b61309381612f4f565b82525050565b60a0820160008201516130af6000850182613023565b5060208201516130c26020850182613023565b5060408201516130d56040850182613040565b5060608201516130e8606085018261307b565b5060808201516130fb608085018261308a565b50505050565b600060a0820190506131166000830184613099565b92915050565b60006020828403121561313257613131612f25565b5b600061314084828501612f78565b91505092915050565b600080604083850312156131605761315f612f25565b5b600061316e85828601612f78565b925050602061317f85828601612fae565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a0820160008201516131cb6000850182613023565b5060208201516131de6020850182613023565b5060408201516131f16040850182613040565b506060820151613204606085018261307b565b506080820151613217608085018261308a565b50505050565b600061322983836131b5565b60a08301905092915050565b6000602082019050919050565b600061324d82613189565b6132578185613194565b9350613262836131a5565b8060005b8381101561329357815161327a888261321d565b975061328583613235565b925050600181019050613266565b5085935050505092915050565b600060208201905081810360008301526132ba8184613242565b905092915050565b6132cb81613016565b81146132d657600080fd5b50565b6000813590506132e8816132c2565b92915050565b6132f781613032565b811461330257600080fd5b50565b600081359050613314816132ee565b92915050565b60008060006060848603121561333357613332612f25565b5b600061334186828701612f78565b9350506020613352868287016132d9565b925050604061336386828701613305565b9150509250925092565b61337681612f4f565b82525050565b6000602082019050613391600083018461336d565b92915050565b600080600080608085870312156133b1576133b0612f25565b5b60006133bf87828801612f78565b94505060206133d087828801612f78565b93505060406133e187828801612f78565b92505060606133f287828801612fae565b91505092959194509250565b6000806000806080858703121561341857613417612f25565b5b600061342687828801612f78565b945050602061343787828801612fae565b935050604061344887828801612f78565b925050606061345987828801612fae565b91505092959194509250565b61346e81613016565b82525050565b61347d81612f8d565b82525050565b60006040820190506134986000830185613465565b6134a56020830184613474565b9392505050565b600080604083850312156134c3576134c2612f25565b5b60006134d185828601612f78565b92505060206134e285828601612f78565b9150509250929050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61353f826134f6565b810181811067ffffffffffffffff8211171561355e5761355d613507565b5b80604052505050565b6000613571612f1b565b905061357d8282613536565b919050565b600067ffffffffffffffff82111561359d5761359c613507565b5b6135a6826134f6565b9050602081019050919050565b82818337600083830152505050565b60006135d56135d084613582565b613567565b9050828152602081018484840111156135f1576135f06134f1565b5b6135fc8482856135b3565b509392505050565b600082601f830112613619576136186134ec565b5b81356136298482602086016135c2565b91505092915050565b60008060006060848603121561364b5761364a612f25565b5b600061365986828701612f78565b935050602061366a86828701612fae565b925050604084013567ffffffffffffffff81111561368b5761368a612f2a565b5b61369786828701613604565b9150509250925092565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6136d6816136a1565b82525050565b60006020820190506136f160008301846136cd565b92915050565b600080fd5b600080fd5b60008083601f840112613717576137166134ec565b5b8235905067ffffffffffffffff811115613734576137336136f7565b5b6020830191508360208202830111156137505761374f6136fc565b5b9250929050565b6000806000604084860312156137705761376f612f25565b5b600061377e86828701612f78565b935050602084013567ffffffffffffffff81111561379f5761379e612f2a565b5b6137ab86828701613701565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6137ec81612f8d565b82525050565b60408201600082015161380860008501826137e3565b50602082015161381b60208501826137e3565b50505050565b600061382d83836137f2565b60408301905092915050565b6000602082019050919050565b6000613851826137b7565b61385b81856137c2565b9350613866836137d3565b8060005b8381101561389757815161387e8882613821565b975061388983613839565b92505060018101905061386a565b5085935050505092915050565b600060208201905081810360008301526138be8184613846565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061390082612f8d565b915061390b83612f8d565b9250828201905080821115613923576139226138c6565b5b92915050565b600060208201905061393e6000830184613474565b92915050565b600082825260208201905092915050565b7f4f6e6c7920636f6e7472616374206f72646572732063616e2063616c6c000000600082015250565b600061398b601d83613944565b915061399682613955565b602082019050919050565b600060208201905081810360008301526139ba8161397e565b9050919050565b7f6572723a206d697373696e67205f736561726368546f6b656e00000000000000600082015250565b60006139f7601983613944565b9150613a02826139c1565b602082019050919050565b60006020820190508181036000830152613a26816139ea565b9050919050565b7f6572723a20746f6b656e732061726520657175616c0000000000000000000000600082015250565b6000613a63601583613944565b9150613a6e82613a2d565b602082019050919050565b60006020820190508181036000830152613a9281613a56565b9050919050565b6000613aa482612f8d565b915060008203613ab757613ab66138c6565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613afc82612f8d565b9150613b0783612f8d565b925082613b1757613b16613ac2565b5b828204905092915050565b6000613b2d82612f8d565b9150613b3883612f8d565b9250828203905081811115613b5057613b4f6138c6565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613b9082612f8d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bc257613bc16138c6565b5b600182019050919050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869730000000000000000600082015250565b6000613c03601883613944565b9150613c0e82613bcd565b602082019050919050565b60006020820190508181036000830152613c3281613bf6565b9050919050565b7f6572723a20746f6b656e20657869737473000000000000000000000000000000600082015250565b6000613c6f601183613944565b9150613c7a82613c39565b602082019050919050565b60006020820190508181036000830152613c9e81613c62565b9050919050565b600067ffffffffffffffff821115613cc057613cbf613507565b5b613cc9826134f6565b9050602081019050919050565b60005b83811015613cf4578082015181840152602081019050613cd9565b60008484015250505050565b6000613d13613d0e84613ca5565b613567565b905082815260208101848484011115613d2f57613d2e6134f1565b5b613d3a848285613cd6565b509392505050565b600082601f830112613d5757613d566134ec565b5b8151613d67848260208601613d00565b91505092915050565b600060208284031215613d8657613d85612f25565b5b600082015167ffffffffffffffff811115613da457613da3612f2a565b5b613db084828501613d42565b91505092915050565b600081519050613dc8816132c2565b92915050565b600060208284031215613de457613de3612f25565b5b6000613df284828501613db9565b91505092915050565b60008160011c9050919050565b6000808291508390505b6001851115613e5257808604811115613e2e57613e2d6138c6565b5b6001851615613e3d5780820291505b8081029050613e4b85613dfb565b9450613e12565b94509492505050565b600082613e6b5760019050613f27565b81613e795760009050613f27565b8160018114613e8f5760028114613e9957613ec8565b6001915050613f27565b60ff841115613eab57613eaa6138c6565b5b8360020a915084821115613ec257613ec16138c6565b5b50613f27565b5060208310610133831016604e8410600b8410161715613efd5782820a905083811115613ef857613ef76138c6565b5b613f27565b613f0a8484846001613e08565b92509050818404811115613f2157613f206138c6565b5b81810290505b9392505050565b6000613f3982612f8d565b9150613f4483613016565b9250613f717fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613e5b565b905092915050565b6000613f8482612f8d565b9150613f8f83612f8d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613fc857613fc76138c6565b5b828202905092915050565b600081519050613fe281612f97565b92915050565b600060208284031215613ffe57613ffd612f25565b5b600061400c84828501613fd3565b91505092915050565b600060608201905061402a600083018661336d565b614037602083018561336d565b6140446040830184613474565b949350505050565b60008115159050919050565b6140618161404c565b811461406c57600080fd5b50565b60008151905061407e81614058565b92915050565b60006020828403121561409a57614099612f25565b5b60006140a88482850161406f565b91505092915050565b7f6572723a207a65726f2061646472657373000000000000000000000000000000600082015250565b60006140e7601183613944565b91506140f2826140b1565b602082019050919050565b60006020820190508181036000830152614116816140da565b9050919050565b6000604082019050614132600083018561336d565b61413f6020830184613474565b939250505056fea2646970667358221220245f4f2cfc6b4cd099616fc10db37f91a52f6f07e8cbc41d5007d08576bf766664736f6c63430008100033

Deployed ByteCode

0x6080604052600436106101185760003560e01c806367579e21116100a0578063bc3e7f9911610064578063bc3e7f99146103bf578063beabacc8146103fc578063d9caed1214610425578063e06b44001461044e578063fef4d95b1461047957610127565b806367579e21146102dc57806381e1c10b146103055780638943ec021461032e5780638da5cb5b1461036b57806397feb9261461039657610127565b8063318fe1e1116100e7578063318fe1e1146101f857806331cefa8614610221578063527097251461024a5780635dd70a5114610275578063665558041461029e57610127565b80630da529b61461012c57806313442900146101555780631ac3ddeb146101925780631f2bff68146101bb57610127565b3661012757610125610483565b005b600080fd5b34801561013857600080fd5b50610153600480360381019061014e9190612fc3565b610582565b005b34801561016157600080fd5b5061017c60048036038101906101779190612fc3565b6106ad565b6040516101899190613101565b60405180910390f35b34801561019e57600080fd5b506101b960048036038101906101b4919061311c565b610baf565b005b3480156101c757600080fd5b506101e260048036038101906101dd9190613149565b610fd8565b6040516101ef91906132a0565b60405180910390f35b34801561020457600080fd5b5061021f600480360381019061021a919061331a565b611377565b005b34801561022d57600080fd5b506102486004803603810190610243919061311c565b6117eb565b005b34801561025657600080fd5b5061025f6118bf565b60405161026c919061337c565b60405180910390f35b34801561028157600080fd5b5061029c60048036038101906102979190613397565b6118e5565b005b3480156102aa57600080fd5b506102c560048036038101906102c091906133fe565b611bc9565b6040516102d3929190613483565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190612fc3565b611d8f565b005b34801561031157600080fd5b5061032c600480360381019061032791906134ac565b611eba565b005b34801561033a57600080fd5b5061035560048036038101906103509190613632565b612318565b60405161036291906136dc565b60405180910390f35b34801561037757600080fd5b50610380612484565b60405161038d919061337c565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b89190613149565b6124aa565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190613757565b612688565b6040516103f391906138a4565b60405180910390f35b34801561040857600080fd5b50610423600480360381019061041e9190612fc3565b612891565b005b34801561043157600080fd5b5061044c60048036038101906104479190612fc3565b612b45565b005b34801561045a57600080fd5b50610463612e71565b604051610470919061337c565b60405180910390f35b610481610483565b005b3460016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461051391906138f5565b925050819055503373ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62346040516105789190613929565b60405180910390a3565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610612576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610609906139a1565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546106a191906138f5565b92505081905550505050565b6106b5612e97565b60008060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff1611610749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074090613a0d565b60405180910390fd5b6000820361089e576000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900461ffff1661ffff1661ffff1681526020016000820160049054906101000a900460c01b77ffffffffffffffffffffffffffffffffffffffffffffffff191677ffffffffffffffffffffffffffffffffffffffffffffffff1916815260200160008201600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050610ba8565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff16116108fe576001610900565b825b92508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096790613a79565b60405180910390fd5b60005b6000831115610a5e576000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610a465750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610a5e5780935082610a5790613a99565b9250610973565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900461ffff1661ffff1661ffff1681526020016000820160049054906101000a900460c01b77ffffffffffffffffffffffffffffffffffffffffffffffff191677ffffffffffffffffffffffffffffffffffffffffffffffff1916815260200160008201600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509150505b9392505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111610c4057600080fd5b80610c4a90613a99565b9050600281610c599190613af1565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610d0991906138f5565b92505081905550600281610d1d9190613af1565b81610d289190613b22565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610dd891906138f5565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610e6e9190613b22565b92505081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698f600285610f0a9190613af1565b604051610f179190613929565b60405180910390a4600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698f600285610fb49190613af1565b85610fbf9190613b22565b604051610fcc9190613929565b60405180910390a45050565b606060008267ffffffffffffffff811115610ff657610ff5613507565b5b60405190808252806020026020018201604052801561102f57816020015b61101c612e97565b8152602001906001900390816110145790505b50905060008060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff1611611092576001611094565b835b93506000805b8481101561136b576000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506040518060a001604052806000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff1681526020016000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff1660ff1681526020016000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160029054906101000a900461ffff1661ffff1681526020016000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160049054906101000a900460c01b77ffffffffffffffffffffffffffffffffffffffffffffffff191681526020016000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525083828151811061131557611314613b56565b5b6020026020010181905250600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16031561136b57819550808061136390613b85565b91505061109a565b50819250505092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe90613c19565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff161461149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290613c85565b60405180910390fd5b6000808473ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156114e9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115129190613d70565b9050602081015191506040518060a001604052808560ff1681526020018673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561157a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159e9190613dce565b60ff1681526020018461ffff1681526020018377ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff168152506000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548167ffffffffffffffff021916908360c01c0217905550608082015181600001600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505084600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461187b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187290613c19565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c906139a1565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff16116119d357600080fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154811115611a5f57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611a9757600080fd5b80600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254611b269190613b22565b9250508190555080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254611bbc91906138f5565b9250508190555050505050565b60008060008060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160029054906101000a900461ffff1661ffff166000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160029054906101000a900461ffff1661ffff1610611c82576002611c85565b60015b9050600060018260ff1614611d0a57846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff16600a611cf09190613f2e565b88611cfb9190613f79565b611d059190613af1565b611d7c565b866000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff16600a611d669190613f2e565b86611d719190613f79565b611d7b9190613af1565b5b9050818193509350505094509492505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e16906139a1565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254611eae9190613b22565b92505081905550505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4190613c19565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611fb45750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611fbd57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461205657600080fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612091919061337c565b602060405180830381865afa1580156120ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d29190613fe8565b146120dc57600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121735780600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549060ff02191690556000820160016101000a81549060ff02191690556000820160026101000a81549061ffff02191690556000820160046101000a81549067ffffffffffffffff021916905560008201600c6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550505050565b600060df6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff161461237857600080fd5b82600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461240791906138f5565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f628560405161246b9190613929565b60405180910390a3638943ec0260e01b90509392505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60146000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff161461250857600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161254593929190614015565b6020604051808303816000875af1158015612564573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125889190614084565b5080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461261891906138f5565b925050819055503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f628360405161267c9190613929565b60405180910390a35050565b606060008383905067ffffffffffffffff8111156126a9576126a8613507565b5b6040519080825280602002602001820160405280156126e257816020015b6126cf612f01565b8152602001906001900390816126c75790505b50905060005b848490508110156128855760405180604001604052806001600088888681811061271557612714613b56565b5b905060200201602081019061272a919061311c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548152602001600160008888868181106127c1576127c0613b56565b5b90506020020160208101906127d6919061311c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015481525082828151811061286757612866613b56565b5b6020026020010181905250808061287d90613b85565b9150506126e8565b50809150509392505050565b6000811180156129205750600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548111155b61292957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298f906140fd565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254612a279190613b22565b9250508190555080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254612abd91906138f5565b925050819055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698f84604051612b389190613929565b60405180910390a4505050565b600081118015612bd45750600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548111155b612bdd57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c43906140fd565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254612cdb9190613b22565b9250508190555060016000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff1603612d87578173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612d81573d6000803e3d6000fd5b50612e07565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401612dc292919061411d565b6020604051808303816000875af1158015612de1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e059190614084565b505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b639883604051612e649190613929565b60405180910390a3505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040518060a00160405280600060ff168152602001600060ff168152602001600061ffff168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b604051806040016040528060008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f5a82612f2f565b9050919050565b612f6a81612f4f565b8114612f7557600080fd5b50565b600081359050612f8781612f61565b92915050565b6000819050919050565b612fa081612f8d565b8114612fab57600080fd5b50565b600081359050612fbd81612f97565b92915050565b600080600060608486031215612fdc57612fdb612f25565b5b6000612fea86828701612f78565b9350506020612ffb86828701612f78565b925050604061300c86828701612fae565b9150509250925092565b600060ff82169050919050565b61302c81613016565b82525050565b600061ffff82169050919050565b61304981613032565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b6130848161304f565b82525050565b61309381612f4f565b82525050565b60a0820160008201516130af6000850182613023565b5060208201516130c26020850182613023565b5060408201516130d56040850182613040565b5060608201516130e8606085018261307b565b5060808201516130fb608085018261308a565b50505050565b600060a0820190506131166000830184613099565b92915050565b60006020828403121561313257613131612f25565b5b600061314084828501612f78565b91505092915050565b600080604083850312156131605761315f612f25565b5b600061316e85828601612f78565b925050602061317f85828601612fae565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a0820160008201516131cb6000850182613023565b5060208201516131de6020850182613023565b5060408201516131f16040850182613040565b506060820151613204606085018261307b565b506080820151613217608085018261308a565b50505050565b600061322983836131b5565b60a08301905092915050565b6000602082019050919050565b600061324d82613189565b6132578185613194565b9350613262836131a5565b8060005b8381101561329357815161327a888261321d565b975061328583613235565b925050600181019050613266565b5085935050505092915050565b600060208201905081810360008301526132ba8184613242565b905092915050565b6132cb81613016565b81146132d657600080fd5b50565b6000813590506132e8816132c2565b92915050565b6132f781613032565b811461330257600080fd5b50565b600081359050613314816132ee565b92915050565b60008060006060848603121561333357613332612f25565b5b600061334186828701612f78565b9350506020613352868287016132d9565b925050604061336386828701613305565b9150509250925092565b61337681612f4f565b82525050565b6000602082019050613391600083018461336d565b92915050565b600080600080608085870312156133b1576133b0612f25565b5b60006133bf87828801612f78565b94505060206133d087828801612f78565b93505060406133e187828801612f78565b92505060606133f287828801612fae565b91505092959194509250565b6000806000806080858703121561341857613417612f25565b5b600061342687828801612f78565b945050602061343787828801612fae565b935050604061344887828801612f78565b925050606061345987828801612fae565b91505092959194509250565b61346e81613016565b82525050565b61347d81612f8d565b82525050565b60006040820190506134986000830185613465565b6134a56020830184613474565b9392505050565b600080604083850312156134c3576134c2612f25565b5b60006134d185828601612f78565b92505060206134e285828601612f78565b9150509250929050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61353f826134f6565b810181811067ffffffffffffffff8211171561355e5761355d613507565b5b80604052505050565b6000613571612f1b565b905061357d8282613536565b919050565b600067ffffffffffffffff82111561359d5761359c613507565b5b6135a6826134f6565b9050602081019050919050565b82818337600083830152505050565b60006135d56135d084613582565b613567565b9050828152602081018484840111156135f1576135f06134f1565b5b6135fc8482856135b3565b509392505050565b600082601f830112613619576136186134ec565b5b81356136298482602086016135c2565b91505092915050565b60008060006060848603121561364b5761364a612f25565b5b600061365986828701612f78565b935050602061366a86828701612fae565b925050604084013567ffffffffffffffff81111561368b5761368a612f2a565b5b61369786828701613604565b9150509250925092565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6136d6816136a1565b82525050565b60006020820190506136f160008301846136cd565b92915050565b600080fd5b600080fd5b60008083601f840112613717576137166134ec565b5b8235905067ffffffffffffffff811115613734576137336136f7565b5b6020830191508360208202830111156137505761374f6136fc565b5b9250929050565b6000806000604084860312156137705761376f612f25565b5b600061377e86828701612f78565b935050602084013567ffffffffffffffff81111561379f5761379e612f2a565b5b6137ab86828701613701565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6137ec81612f8d565b82525050565b60408201600082015161380860008501826137e3565b50602082015161381b60208501826137e3565b50505050565b600061382d83836137f2565b60408301905092915050565b6000602082019050919050565b6000613851826137b7565b61385b81856137c2565b9350613866836137d3565b8060005b8381101561389757815161387e8882613821565b975061388983613839565b92505060018101905061386a565b5085935050505092915050565b600060208201905081810360008301526138be8184613846565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061390082612f8d565b915061390b83612f8d565b9250828201905080821115613923576139226138c6565b5b92915050565b600060208201905061393e6000830184613474565b92915050565b600082825260208201905092915050565b7f4f6e6c7920636f6e7472616374206f72646572732063616e2063616c6c000000600082015250565b600061398b601d83613944565b915061399682613955565b602082019050919050565b600060208201905081810360008301526139ba8161397e565b9050919050565b7f6572723a206d697373696e67205f736561726368546f6b656e00000000000000600082015250565b60006139f7601983613944565b9150613a02826139c1565b602082019050919050565b60006020820190508181036000830152613a26816139ea565b9050919050565b7f6572723a20746f6b656e732061726520657175616c0000000000000000000000600082015250565b6000613a63601583613944565b9150613a6e82613a2d565b602082019050919050565b60006020820190508181036000830152613a9281613a56565b9050919050565b6000613aa482612f8d565b915060008203613ab757613ab66138c6565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613afc82612f8d565b9150613b0783612f8d565b925082613b1757613b16613ac2565b5b828204905092915050565b6000613b2d82612f8d565b9150613b3883612f8d565b9250828203905081811115613b5057613b4f6138c6565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613b9082612f8d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bc257613bc16138c6565b5b600182019050919050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869730000000000000000600082015250565b6000613c03601883613944565b9150613c0e82613bcd565b602082019050919050565b60006020820190508181036000830152613c3281613bf6565b9050919050565b7f6572723a20746f6b656e20657869737473000000000000000000000000000000600082015250565b6000613c6f601183613944565b9150613c7a82613c39565b602082019050919050565b60006020820190508181036000830152613c9e81613c62565b9050919050565b600067ffffffffffffffff821115613cc057613cbf613507565b5b613cc9826134f6565b9050602081019050919050565b60005b83811015613cf4578082015181840152602081019050613cd9565b60008484015250505050565b6000613d13613d0e84613ca5565b613567565b905082815260208101848484011115613d2f57613d2e6134f1565b5b613d3a848285613cd6565b509392505050565b600082601f830112613d5757613d566134ec565b5b8151613d67848260208601613d00565b91505092915050565b600060208284031215613d8657613d85612f25565b5b600082015167ffffffffffffffff811115613da457613da3612f2a565b5b613db084828501613d42565b91505092915050565b600081519050613dc8816132c2565b92915050565b600060208284031215613de457613de3612f25565b5b6000613df284828501613db9565b91505092915050565b60008160011c9050919050565b6000808291508390505b6001851115613e5257808604811115613e2e57613e2d6138c6565b5b6001851615613e3d5780820291505b8081029050613e4b85613dfb565b9450613e12565b94509492505050565b600082613e6b5760019050613f27565b81613e795760009050613f27565b8160018114613e8f5760028114613e9957613ec8565b6001915050613f27565b60ff841115613eab57613eaa6138c6565b5b8360020a915084821115613ec257613ec16138c6565b5b50613f27565b5060208310610133831016604e8410600b8410161715613efd5782820a905083811115613ef857613ef76138c6565b5b613f27565b613f0a8484846001613e08565b92509050818404811115613f2157613f206138c6565b5b81810290505b9392505050565b6000613f3982612f8d565b9150613f4483613016565b9250613f717fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613e5b565b905092915050565b6000613f8482612f8d565b9150613f8f83612f8d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613fc857613fc76138c6565b5b828202905092915050565b600081519050613fe281612f97565b92915050565b600060208284031215613ffe57613ffd612f25565b5b600061400c84828501613fd3565b91505092915050565b600060608201905061402a600083018661336d565b614037602083018561336d565b6140446040830184613474565b949350505050565b60008115159050919050565b6140618161404c565b811461406c57600080fd5b50565b60008151905061407e81614058565b92915050565b60006020828403121561409a57614099612f25565b5b60006140a88482850161406f565b91505092915050565b7f6572723a207a65726f2061646472657373000000000000000000000000000000600082015250565b60006140e7601183613944565b91506140f2826140b1565b602082019050919050565b60006020820190508181036000830152614116816140da565b9050919050565b6000604082019050614132600083018561336d565b61413f6020830184613474565b939250505056fea2646970667358221220245f4f2cfc6b4cd099616fc10db37f91a52f6f07e8cbc41d5007d08576bf766664736f6c63430008100033