Overview
Max Total Supply
524.98872216 imBTC
Holders
4,551 ( -0.022%)
Market
Price
$58,634.00 @ 22.482802 ETH (+0.31%)
Onchain Market Cap
$30,782,188.74
Circulating Supply Market Cap
$0.00
Other Info
Token Contract (WITH 8 Decimals)
Balance
0.01566639 imBTCValue
$918.58 ( ~0.352223148201373 Eth) [0.0030%]Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
IMBTC
Compiler Version
v0.5.0+commit.1d4f565a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-10-25 */ pragma solidity 0.5.0; // File: src/erc777/IERC777.sol /** * @dev Interface of the ERC777Token standard as defined in the EIP. * * This contract uses the * [ERC1820 registry standard](https://eips.ethereum.org/EIPS/eip-1820) to let * token holders and recipients react to token movements by using setting implementers * for the associated interfaces in said registry. See `IERC1820Registry` and * `ERC1820Implementer`. */ interface IERC777 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() external view returns (string memory); /** * @dev Returns the smallest part of the token that is not divisible. This * means all token operations (creation, movement and destruction) must have * amounts that are a multiple of this number. * * For most token contracts, this value will equal 1. */ function granularity() external view returns (uint256); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by an account (`owner`). */ function balanceOf(address owner) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * If send or receive hooks are registered for the caller and `recipient`, * the corresponding functions will be called with `data` and empty * `operatorData`. See `IERC777Sender` and `IERC777Recipient`. * * Emits a `Sent` event. * * Requirements * * - the caller must have at least `amount` tokens. * - `recipient` cannot be the zero address. * - if `recipient` is a contract, it must implement the `tokensReceived` * interface. */ function send(address recipient, uint256 amount, bytes calldata data) external; /** * @dev Destroys `amount` tokens from the caller's account, reducing the * total supply. * * If a send hook is registered for the caller, the corresponding function * will be called with `data` and empty `operatorData`. See `IERC777Sender`. * * Emits a `Burned` event. * * Requirements * * - the caller must have at least `amount` tokens. */ function burn(uint256 amount, bytes calldata data) external; /** * @dev Returns true if an account is an operator of `tokenHolder`. * Operators can send and burn tokens on behalf of their owners. All * accounts are their own operator. * * See `operatorSend` and `operatorBurn`. */ function isOperatorFor(address operator, address tokenHolder) external view returns (bool); /** * @dev Make an account an operator of the caller. * * See `isOperatorFor`. * * Emits an `AuthorizedOperator` event. * * Requirements * * - `operator` cannot be calling address. */ function authorizeOperator(address operator) external; /** * @dev Make an account an operator of the caller. * * See `isOperatorFor` and `defaultOperators`. * * Emits a `RevokedOperator` event. * * Requirements * * - `operator` cannot be calling address. */ function revokeOperator(address operator) external; /** * @dev Returns the list of default operators. These accounts are operators * for all token holders, even if `authorizeOperator` was never called on * them. * * This list is immutable, but individual holders may revoke these via * `revokeOperator`, in which case `isOperatorFor` will return false. */ function defaultOperators() external view returns (address[] memory); /** * @dev Moves `amount` tokens from `sender` to `recipient`. The caller must * be an operator of `sender`. * * If send or receive hooks are registered for `sender` and `recipient`, * the corresponding functions will be called with `data` and * `operatorData`. See `IERC777Sender` and `IERC777Recipient`. * * Emits a `Sent` event. * * Requirements * * - `sender` cannot be the zero address. * - `sender` must have at least `amount` tokens. * - the caller must be an operator for `sender`. * - `recipient` cannot be the zero address. * - if `recipient` is a contract, it must implement the `tokensReceived` * interface. */ function operatorSend( address sender, address recipient, uint256 amount, bytes calldata data, bytes calldata operatorData ) external; /** * @dev Destoys `amount` tokens from `account`, reducing the total supply. * The caller must be an operator of `account`. * * If a send hook is registered for `account`, the corresponding function * will be called with `data` and `operatorData`. See `IERC777Sender`. * * Emits a `Burned` event. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. * - the caller must be an operator for `account`. */ function operatorBurn( address account, uint256 amount, bytes calldata data, bytes calldata operatorData ) external; event Sent( address indexed operator, address indexed from, address indexed to, uint256 amount, bytes data, bytes operatorData ); event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData); event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData); event AuthorizedOperator(address indexed operator, address indexed tokenHolder); event RevokedOperator(address indexed operator, address indexed tokenHolder); } // File: src/erc777/IERC777Recipient.sol /** * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP. * * Accounts can be notified of `IERC777` tokens being sent to them by having a * contract implement this interface (contract holders can be their own * implementer) and registering it on the * [ERC1820 global registry](https://eips.ethereum.org/EIPS/eip-1820). * * See `IERC1820Registry` and `ERC1820Implementer`. */ interface IERC777Recipient { /** * @dev Called by an `IERC777` token contract whenever tokens are being * moved or created into a registered account (`to`). The type of operation * is conveyed by `from` being the zero address or not. * * This call occurs _after_ the token contract's state is updated, so * `IERC777.balanceOf`, etc., can be used to query the post-operation state. * * This function may revert to prevent the operation from being executed. */ function tokensReceived( address operator, address from, address to, uint amount, bytes calldata userData, bytes calldata operatorData ) external; } // File: src/erc777/IERC777Sender.sol /** * @dev Interface of the ERC777TokensSender standard as defined in the EIP. * * `IERC777` Token holders can be notified of operations performed on their * tokens by having a contract implement this interface (contract holders can be * their own implementer) and registering it on the * [ERC1820 global registry](https://eips.ethereum.org/EIPS/eip-1820). * * See `IERC1820Registry` and `ERC1820Implementer`. */ interface IERC777Sender { /** * @dev Called by an `IERC777` token contract whenever a registered holder's * (`from`) tokens are about to be moved or destroyed. The type of operation * is conveyed by `to` being the zero address or not. * * This call occurs _before_ the token contract's state is updated, so * `IERC777.balanceOf`, etc., can be used to query the pre-operation state. * * This function may revert to prevent the operation from being executed. */ function tokensToSend( address operator, address from, address to, uint amount, bytes calldata userData, bytes calldata operatorData ) external; } // File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see `ERC20Detailed`. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a `Transfer` event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through `transferFrom`. This is * zero by default. * * This value changes when `approve` or `transferFrom` are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * > Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an `Approval` event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a `Transfer` event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to `approve`. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: openzeppelin-solidity/contracts/math/SafeMath.sol /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } // File: openzeppelin-solidity/contracts/utils/Address.sol /** * @dev Collection of functions related to the address type, */ library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing a contract. * * > It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } // File: openzeppelin-solidity/contracts/introspection/IERC1820Registry.sol /** * @dev Interface of the global ERC1820 Registry, as defined in the * [EIP](https://eips.ethereum.org/EIPS/eip-1820). Accounts may register * implementers for interfaces in this registry, as well as query support. * * Implementers may be shared by multiple accounts, and can also implement more * than a single interface for each account. Contracts can implement interfaces * for themselves, but externally-owned accounts (EOA) must delegate this to a * contract. * * `IERC165` interfaces can also be queried via the registry. * * For an in-depth explanation and source code analysis, see the EIP text. */ interface IERC1820Registry { /** * @dev Sets `newManager` as the manager for `account`. A manager of an * account is able to set interface implementers for it. * * By default, each account is its own manager. Passing a value of `0x0` in * `newManager` will reset the manager to this initial state. * * Emits a `ManagerChanged` event. * * Requirements: * * - the caller must be the current manager for `account`. */ function setManager(address account, address newManager) external; /** * @dev Returns the manager for `account`. * * See `setManager`. */ function getManager(address account) external view returns (address); /** * @dev Sets the `implementer` contract as `account`'s implementer for * `interfaceHash`. * * `account` being the zero address is an alias for the caller's address. * The zero address can also be used in `implementer` to remove an old one. * * See `interfaceHash` to learn how these are created. * * Emits an `InterfaceImplementerSet` event. * * Requirements: * * - the caller must be the current manager for `account`. * - `interfaceHash` must not be an `IERC165` interface id (i.e. it must not * end in 28 zeroes). * - `implementer` must implement `IERC1820Implementer` and return true when * queried for support, unless `implementer` is the caller. See * `IERC1820Implementer.canImplementInterfaceForAddress`. */ function setInterfaceImplementer(address account, bytes32 interfaceHash, address implementer) external; /** * @dev Returns the implementer of `interfaceHash` for `account`. If no such * implementer is registered, returns the zero address. * * If `interfaceHash` is an `IERC165` interface id (i.e. it ends with 28 * zeroes), `account` will be queried for support of it. * * `account` being the zero address is an alias for the caller's address. */ function getInterfaceImplementer(address account, bytes32 interfaceHash) external view returns (address); /** * @dev Returns the interface hash for an `interfaceName`, as defined in the * corresponding * [section of the EIP](https://eips.ethereum.org/EIPS/eip-1820#interface-name). */ function interfaceHash(string calldata interfaceName) external pure returns (bytes32); /** * @notice Updates the cache with whether the contract implements an ERC165 interface or not. * @param account Address of the contract for which to update the cache. * @param interfaceId ERC165 interface for which to update the cache. */ function updateERC165Cache(address account, bytes4 interfaceId) external; /** * @notice Checks whether a contract implements an ERC165 interface or not. * If the result is not cached a direct lookup on the contract address is performed. * If the result is not cached or the cached value is out-of-date, the cache MUST be updated manually by calling * 'updateERC165Cache' with the contract address. * @param account Address of the contract to check. * @param interfaceId ERC165 interface to check. * @return True if `account.address()` implements `interfaceId`, false otherwise. */ function implementsERC165Interface(address account, bytes4 interfaceId) external view returns (bool); /** * @notice Checks whether a contract implements an ERC165 interface or not without using nor updating the cache. * @param account Address of the contract to check. * @param interfaceId ERC165 interface to check. * @return True if `account.address()` implements `interfaceId`, false otherwise. */ function implementsERC165InterfaceNoCache(address account, bytes4 interfaceId) external view returns (bool); event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer); event ManagerChanged(address indexed account, address indexed newManager); } // File: src/erc777/EarnERC777.sol contract EarnERC777 is IERC777, IERC20 { using SafeMath for uint256; using Address for address; struct Balance { uint256 value; uint256 exchangeRate; } uint256 constant RATE_SCALE = 10**18; uint256 constant DECIMAL_SCALE = 10**18; IERC1820Registry internal _erc1820 = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24); mapping(address => Balance) internal _balances; uint256 internal _totalSupply; uint256 internal _exchangeRate; string internal _name; string internal _symbol; uint8 internal _decimals; // We inline the result of the following hashes because Solidity doesn't resolve them at compile time. // See https://github.com/ethereum/solidity/issues/4024. // keccak256("ERC777TokensSender") bytes32 constant internal TOKENS_SENDER_INTERFACE_HASH = 0x29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe895; // keccak256("ERC777TokensRecipient") bytes32 constant internal TOKENS_RECIPIENT_INTERFACE_HASH = 0xb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b; //Empty, This is only used to respond the defaultOperators query. address[] internal _defaultOperatorsArray; // For each account, a mapping of its operators and revoked default operators. mapping(address => mapping(address => bool)) internal _operators; // ERC20-allowances mapping (address => mapping (address => uint256)) internal _allowances; constructor( string memory symbol, string memory name, uint8 decimals ) public { require(decimals <= 18, "decimals must be less or equal than 18"); _name = name; _symbol = symbol; _decimals = decimals; _exchangeRate = 10**18; // register interfaces _erc1820.setInterfaceImplementer(address(this), keccak256("ERC777Token"), address(this)); _erc1820.setInterfaceImplementer(address(this), keccak256("ERC20Token"), address(this)); } /** * @dev See `IERC777.name`. */ function name() external view returns (string memory) { return _name; } /** * @dev See `IERC777.symbol`. */ function symbol() external view returns (string memory) { return _symbol; } /** * @dev See `ERC20Detailed.decimals`. * * Always returns 18, as per the * [ERC777 EIP](https://eips.ethereum.org/EIPS/eip-777#backward-compatibility). */ function decimals() external view returns (uint8) { return _decimals; } /** * @dev See `IERC777.granularity`. * * This implementation always returns `1`. */ function granularity() external view returns (uint256) { return 1; } /** * @dev See `IERC777.totalSupply`. */ function totalSupply() external view returns (uint256) { return _totalSupply.div(DECIMAL_SCALE); } /** * @dev Returns the amount of tokens owned by an account (`tokenHolder`). */ function balanceOf(address who) external view returns (uint256) { return _balanceOf(who); } function _balanceOf(address who) internal view returns (uint256) { return _getBalance(who).value.div(DECIMAL_SCALE); } function accuracyBalanceOf(address who) external view returns (uint256) { return _getBalance(who).value ; } /** * @dev See `IERC777.send`. * * Also emits a `Transfer` event for ERC20 compatibility. */ function send(address recipient, uint256 amount, bytes calldata data) external { _send(msg.sender, msg.sender, recipient, amount, data, "", true); } /** * @dev See `IERC20.transfer`. * * Unlike `send`, `recipient` is _not_ required to implement the `tokensReceived` * interface if it is a contract. * * Also emits a `Sent` event. */ function transfer(address recipient, uint256 amount) external returns (bool) { return _transfer(recipient, amount); } function _transfer(address recipient, uint256 amount) internal returns (bool) { require(recipient != address(0), "ERC777: transfer to the zero address"); address from = msg.sender; _callTokensToSend(from, from, recipient, amount, "", ""); _move(from, from, recipient, amount, "", ""); _callTokensReceived(from, from, recipient, amount, "", "", false); return true; } /** * @dev See `IERC777.burn`. * * Also emits a `Transfer` event for ERC20 compatibility. */ function burn(uint256 amount, bytes calldata data) external { _burn(msg.sender, msg.sender, amount, data, ""); } /** * @dev See `IERC777.isOperatorFor`. */ function isOperatorFor( address operator, address tokenHolder ) public view returns (bool) { return operator == tokenHolder || _operators[tokenHolder][operator]; } /** * @dev See `IERC777.authorizeOperator`. */ function authorizeOperator(address operator) external { require(msg.sender != operator, "ERC777: authorizing self as operator"); _operators[msg.sender][operator] = true; emit AuthorizedOperator(operator, msg.sender); } /** * @dev See `IERC777.revokeOperator`. */ function revokeOperator(address operator) external { require(operator != msg.sender, "ERC777: revoking self as operator"); delete _operators[msg.sender][operator]; emit RevokedOperator(operator, msg.sender); } /** * @dev See `IERC777.defaultOperators`. */ function defaultOperators() external view returns (address[] memory) { return _defaultOperatorsArray; } /** * @dev See `IERC777.operatorSend`. * * Emits `Sent` and `Transfer` events. */ function operatorSend( address sender, address recipient, uint256 amount, bytes calldata data, bytes calldata operatorData ) external { require(isOperatorFor(msg.sender, sender), "ERC777: caller is not an operator for holder"); _send(msg.sender, sender, recipient, amount, data, operatorData, true); } /** * @dev See `IERC777.operatorBurn`. * * Emits `Sent` and `Transfer` events. */ function operatorBurn(address account, uint256 amount, bytes calldata data, bytes calldata operatorData) external { require(isOperatorFor(msg.sender, account), "ERC777: caller is not an operator for holder"); _burn(msg.sender, account, amount, data, operatorData); } /** * @dev See `IERC20.allowance`. * * Note that operator and allowance concepts are orthogonal: operators may * not have allowance, and accounts with allowance may not be operators * themselves. */ function allowance(address holder, address spender) external view returns (uint256) { return _allowances[holder][spender]; } /** * @dev See `IERC20.approve`. * * Note that accounts cannot have allowance issued by their operators. */ function approve(address spender, uint256 value) external returns (bool) { address holder = msg.sender; _approve(holder, spender, value); return true; } /** * @dev See `IERC20.transferFrom`. * * Note that operator and allowance concepts are orthogonal: operators cannot * call `transferFrom` (unless they have allowance), and accounts with * allowance cannot call `operatorSend` (unless they are operators). * * Emits `Sent` and `Transfer` events. */ function transferFrom(address holder, address recipient, uint256 amount) external returns (bool) { return _transferFrom(holder, recipient, amount); } function _transferFrom(address holder, address recipient, uint256 amount) internal returns (bool) { require(recipient != address(0), "ERC777: transfer to the zero address"); require(holder != address(0), "ERC777: transfer from the zero address"); address spender = msg.sender; _callTokensToSend(spender, holder, recipient, amount, "", ""); _move(spender, holder, recipient, amount, "", ""); _approve(holder, spender, _allowances[holder][spender].sub(amount)); _callTokensReceived(spender, holder, recipient, amount, "", "", false); return true; } /** * @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * If a send hook is registered for `raccount`, the corresponding function * will be called with `operator`, `data` and `operatorData`. * * See `IERC777Sender` and `IERC777Recipient`. * * Emits `Sent` and `Transfer` events. * * Requirements * * - `account` cannot be the zero address. * - if `account` is a contract, it must implement the `tokensReceived` * interface. */ function _mint( address operator, address account, uint256 amount, bytes memory userData, bytes memory operatorData ) internal { require(account != address(0), "ERC777: mint to the zero address"); _callTokensReceived(operator, address(0), account, amount, userData, operatorData, false); uint256 scaleAmount = amount.mul(DECIMAL_SCALE); _totalSupply = _totalSupply.add(scaleAmount); _addBalance(account, scaleAmount); emit Minted(operator, account, amount, userData, operatorData); emit Transfer(address(0), account, amount); } function _getBalance(address account) internal view returns (Balance memory) { Balance memory balance = _balances[account]; if (balance.value == uint256(0)) { balance.value = 0; balance.exchangeRate = _exchangeRate; } else if (balance.exchangeRate != _exchangeRate) { balance.value = balance.value.mul(_exchangeRate).div(balance.exchangeRate); balance.exchangeRate = _exchangeRate; } return balance; } function _addBalance(address account, uint256 amount) internal { Balance memory balance = _getBalance(account); balance.value = balance.value.add(amount); _balances[account] = balance; } function _subBalance(address account, uint256 amount) internal { Balance memory balance = _getBalance(account); balance.value = balance.value.sub(amount); _balances[account] = balance; } /** * @dev Send tokens * @param operator address operator requesting the transfer * @param from address token holder address * @param to address recipient address * @param amount uint256 amount of tokens to transfer * @param userData bytes extra information provided by the token holder (if any) * @param operatorData bytes extra information provided by the operator (if any) * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient */ function _send( address operator, address from, address to, uint256 amount, bytes memory userData, bytes memory operatorData, bool requireReceptionAck ) internal { require(from != address(0), "ERC777: send from the zero address"); require(to != address(0), "ERC777: send to the zero address"); _callTokensToSend(operator, from, to, amount, userData, operatorData); _move(operator, from, to, amount, userData, operatorData); _callTokensReceived(operator, from, to, amount, userData, operatorData, requireReceptionAck); } /** * @dev Burn tokens * @param operator address operator requesting the operation * @param from address token holder address * @param amount uint256 amount of tokens to burn * @param data bytes extra information provided by the token holder * @param operatorData bytes extra information provided by the operator (if any) */ function _burn( address operator, address from, uint256 amount, bytes memory data, bytes memory operatorData ) internal { require(from != address(0), "ERC777: burn from the zero address"); _callTokensToSend(operator, from, address(0), amount, data, operatorData); uint256 scaleAmount = amount.mul(DECIMAL_SCALE); _totalSupply = _totalSupply.sub(scaleAmount); _subBalance(from, scaleAmount); emit Burned(operator, from, amount, data, operatorData); emit Transfer(from, address(0), amount); } function _move( address operator, address from, address to, uint256 amount, bytes memory userData, bytes memory operatorData ) internal { uint256 scaleAmount = amount.mul(DECIMAL_SCALE); _subBalance(from,scaleAmount); _addBalance(to,scaleAmount); emit Sent(operator, from, to, amount, userData, operatorData); emit Transfer(from, to, amount); } function _approve(address holder, address spender, uint256 value) internal { // TODO: restore this require statement if this function becomes internal, or is called at a new callsite. It is // currently unnecessary. //require(holder != address(0), "ERC777: approve from the zero address"); require(spender != address(0), "ERC777: approve to the zero address"); _allowances[holder][spender] = value; emit Approval(holder, spender, value); } /** * @dev Call from.tokensToSend() if the interface is registered * @param operator address operator requesting the transfer * @param from address token holder address * @param to address recipient address * @param amount uint256 amount of tokens to transfer * @param userData bytes extra information provided by the token holder (if any) * @param operatorData bytes extra information provided by the operator (if any) */ function _callTokensToSend( address operator, address from, address to, uint256 amount, bytes memory userData, bytes memory operatorData ) internal { address implementer = _erc1820.getInterfaceImplementer(from, TOKENS_SENDER_INTERFACE_HASH); if (implementer != address(0)) { IERC777Sender(implementer).tokensToSend(operator, from, to, amount, userData, operatorData); } } /** * @dev Call to.tokensReceived() if the interface is registered. Reverts if the recipient is a contract but * tokensReceived() was not registered for the recipient * @param operator address operator requesting the transfer * @param from address token holder address * @param to address recipient address * @param amount uint256 amount of tokens to transfer * @param userData bytes extra information provided by the token holder (if any) * @param operatorData bytes extra information provided by the operator (if any) * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient */ function _callTokensReceived( address operator, address from, address to, uint256 amount, bytes memory userData, bytes memory operatorData, bool requireReceptionAck ) internal { address implementer = _erc1820.getInterfaceImplementer(to, TOKENS_RECIPIENT_INTERFACE_HASH); if (implementer != address(0)) { IERC777Recipient(implementer).tokensReceived(operator, from, to, amount, userData, operatorData); } else if (requireReceptionAck) { require(!to.isContract(), "ERC777: token recipient contract has no implementer for ERC777TokensRecipient"); } } function _distributeRevenue(address account) internal returns (bool) { uint256 value = _getBalance(account).value; require(value > 0, 'Token: the revenue balance must be large than zero'); require(_totalSupply > value, 'Token: total supply must be large than revenue'); delete _balances[account]; _exchangeRate = _exchangeRate.mul(_totalSupply.mul(RATE_SCALE).div(_totalSupply.sub(value))).div(RATE_SCALE); emit Transfer(account, address(0), value.div(DECIMAL_SCALE)); emit RevenueDistributed(account, _exchangeRate, value.div(DECIMAL_SCALE), value.mod(DECIMAL_SCALE)); return true; } function exchangeRate() external view returns (uint256) { return _exchangeRate; } event RevenueDistributed(address indexed account, uint256 exchangeRate, uint256 value, uint256 remainder); } // File: openzeppelin-solidity/contracts/access/Roles.sol /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } // File: src/Ownable.sol /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be aplied to your functions to restrict their use to * the owner. */ contract Ownable { address private _owner; address private _newOwner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Returns the address of the new owner will be set */ function newOwner() public view returns (address) { return _newOwner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address account) public onlyOwner { _transferOwnership(account); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address account) internal { require(account != address(0), "Ownable: new owner is the zero address"); require(account != _newOwner, "Ownable: new owner is the same as previous owner"); _newOwner = account; } /** * @dev Transfers ownership of the contract to a new account (‘ newOwner ‘). * Can only be called by the current owner . */ function acceptOwnership() public { require(msg.sender == _newOwner, "Ownable: msg.sender is not the same as newOwner"); emit OwnershipTransferred(_owner, _newOwner); _owner = _newOwner; _newOwner = address(0); } } // File: src/MinterRole.sol contract MinterRole is Ownable { using Roles for Roles.Role; event MinterAdded(address indexed operator, address indexed account); event MinterRemoved(address indexed operator, address indexed account); Roles.Role private _minters; constructor () internal { _addMinter(msg.sender); } modifier onlyMinter() { require(isMinter(msg.sender), "MinterRole: caller does not have the Minter role"); _; } function isMinter(address account) public view returns (bool) { return _minters.has(account); } function addMinter(address account) public onlyOwner { _addMinter(account); } function removeMinter(address account) public onlyOwner { _removeMinter(account); } function _addMinter(address account) internal { _minters.add(account); emit MinterAdded(msg.sender, account); } function _removeMinter(address account) internal { _minters.remove(account); emit MinterRemoved(msg.sender, account); } } // File: src/Pausable.sol /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ contract Pausable is Ownable { /** * @dev Emitted when the pause is triggered by a pauser (`account`). */ event Paused(address indexed account); /** * @dev Emitted when the pause is lifted by a pauser (`account`). */ event Unpaused(address indexed account); bool private _paused; /** * @dev Initializes the contract in unpaused state. Assigns the Pauser role * to the deployer. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Called by a pauser to pause, triggers stopped state. */ function pause() public onlyOwner whenNotPaused { _paused = true; emit Paused(msg.sender); } /** * @dev Called by a pauser to unpause, returns to normal state. */ function unpause() public onlyOwner whenPaused { _paused = false; emit Unpaused(msg.sender); } } // File: src/SwitchTransferable.sol contract SwitchTransferable is Ownable { event TransferEnabled(address indexed operator); event TransferDisabled(address indexed operator); bool private _transferable; constructor () internal { _transferable = false; } modifier whenTransferable() { require(_transferable, "transferable must be true"); _; } modifier whenNotTransferable() { require(!_transferable, "transferable must not be true"); _; } function transferable() public view returns (bool) { return _transferable; } function enableTransfer() public onlyOwner whenNotTransferable { _transferable = true; emit TransferEnabled(msg.sender); } function disableTransfer() public onlyOwner whenTransferable { _transferable = false; emit TransferDisabled(msg.sender); } } // File: src/IMBTC.sol contract IMBTC is EarnERC777, MinterRole, Pausable, SwitchTransferable { address internal _revenueAddress; constructor() EarnERC777("imBTC","The Tokenized Bitcoin",8) public { } function transfer(address recipient, uint256 amount) external whenNotPaused whenTransferable returns (bool) { return super._transfer(recipient, amount); } function send(address recipient, uint256 amount, bytes calldata data) external whenTransferable whenNotPaused { super._send(msg.sender, msg.sender, recipient, amount, data, "", true); } function burn(uint256 amount, bytes calldata data) external whenTransferable whenNotPaused { super._burn(msg.sender, msg.sender, amount, data, ""); } function operatorSend( address sender, address recipient, uint256 amount, bytes calldata data, bytes calldata operatorData ) external whenTransferable whenNotPaused { require(isOperatorFor(msg.sender, sender), "ERC777: caller is not an operator for holder"); super._send(msg.sender, sender, recipient, amount, data, operatorData, true); } function operatorBurn(address account, uint256 amount, bytes calldata data, bytes calldata operatorData) external whenTransferable whenNotPaused { require(isOperatorFor(msg.sender, account), "ERC777: caller is not an operator for holder"); super._burn(msg.sender, account, amount, data, operatorData); } function mint(address recipient, uint256 amount, bytes calldata userData, bytes calldata operatorData) external onlyMinter whenNotPaused { super._mint(msg.sender, recipient, amount, userData, operatorData); } function transferFrom(address holder, address recipient, uint256 amount) external whenNotPaused returns (bool) { require(transferable(), "Token: transferable must be true"); return super._transferFrom(holder, recipient, amount); } function setRevenueAddress(address account) external onlyOwner { require(_allowances[account][address(this)] > 0, "Token: the allowances of account must be large than zero"); _revenueAddress = account; emit RevenueAddressSet(account); } function revenueAddress() external view returns (address) { return _revenueAddress; } function revenue() external view returns (uint256) { return _balanceOf(_revenueAddress); } event RevenueAddressSet(address indexed account); function distributeRevenue() external whenNotPaused { require(_revenueAddress != address(0), 'Token: revenue address must not be zero'); _distributeRevenue(_revenueAddress); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"defaultOperators","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"holder","type":"address"},{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"distributeRevenue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"exchangeRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"revenue","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"setRevenueAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"granularity","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"},{"name":"data","type":"bytes"},{"name":"operatorData","type":"bytes"}],"name":"operatorSend","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"transferable","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"}],"name":"authorizeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"},{"name":"data","type":"bytes"}],"name":"send","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isMinter","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"disableTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"revenueAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"accuracyBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"operator","type":"address"},{"name":"tokenHolder","type":"address"}],"name":"isOperatorFor","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"},{"name":"userData","type":"bytes"},{"name":"operatorData","type":"bytes"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"enableTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"}],"name":"revokeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"amount","type":"uint256"},{"name":"data","type":"bytes"},{"name":"operatorData","type":"bytes"}],"name":"operatorBurn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"},{"name":"data","type":"bytes"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"RevenueAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"}],"name":"TransferEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"}],"name":"TransferDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"},{"indexed":false,"name":"exchangeRate","type":"uint256"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"remainder","type":"uint256"}],"name":"RevenueDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"},{"indexed":false,"name":"operatorData","type":"bytes"}],"name":"Sent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"},{"indexed":false,"name":"operatorData","type":"bytes"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"},{"indexed":false,"name":"operatorData","type":"bytes"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"tokenHolder","type":"address"}],"name":"AuthorizedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"tokenHolder","type":"address"}],"name":"RevokedOperator","type":"event"}]
Contract Creation Code
6080604052731820a4b7618bde71dce8cdc73aab6c95905fad246000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006557600080fd5b506040805190810160405280600581526020017f696d4254430000000000000000000000000000000000000000000000000000008152506040805190810160405280601581526020017f54686520546f6b656e697a656420426974636f696e0000000000000000000000815250600860128160ff161115151562000177576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f646563696d616c73206d757374206265206c657373206f7220657175616c207481526020017f68616e203138000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b81600490805190602001906200018f9291906200080c565b508260059080519060200190620001a89291906200080c565b5080600660006101000a81548160ff021916908360ff160217905550670de0b6b3a76400006003819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329965a1d3060405180807f455243373737546f6b656e000000000000000000000000000000000000000000815250600b0190506040518091039020306040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050600060405180830381600087803b1580156200030157600080fd5b505af115801562000316573d6000803e3d6000fd5b505050506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329965a1d3060405180807f4552433230546f6b656e00000000000000000000000000000000000000000000815250600a0190506040518091039020306040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050600060405180830381600087803b1580156200044857600080fd5b505af11580156200045d573d6000803e3d6000fd5b5050505050505033600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36200053c3362000578640100000000026401000000009004565b6000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff021916908315150217905550620008bb565b6200059c81600c620005f964010000000002620053eb179091906401000000009004565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3c091dafb1d99e4a4c333024492eac3b2cd8bf921a3dd547c937db33be307bb860405160405180910390a350565b620006148282620006e8640100000000026401000000009004565b1515156200068a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515620007b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f526f6c65733a206163636f756e7420697320746865207a65726f20616464726581526020017f737300000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200084f57805160ff191683800117855562000880565b8280016001018555821562000880579182015b828111156200087f57825182559160200191906001019062000862565b5b5090506200088f919062000893565b5090565b620008b891905b80821115620008b45760008160009055506001016200089a565b5090565b90565b6156c980620008cb6000396000f3fe6080604052600436106101e3576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306e48538146101e857806306fdde0314610254578063095ea7b3146102e457806318160ddd1461035757806323b872dd146103825780632d07953a146104155780633092afd51461042c578063313ce5671461047d5780633ba0b9a9146104ae5780633e9491a2146104d95780633f4ba83a1461050457806345338d631461051b578063556f0dc71461056c5780635c975abb1461059757806362ad1b83146105c657806370a08231146106eb57806379ba5097146107505780638456cb59146107675780638da5cb5b1461077e5780638f32d59b146107d557806392ff0d3114610804578063959b8c3f1461083357806395d89b4114610884578063983b2d56146109145780639bd9bbc614610965578063a9059cbb14610a15578063aa271e1a14610a88578063b187984f14610af1578063b410908d14610b08578063d4ee1d9014610b5f578063d6644ff714610bb6578063d95b637114610c1b578063dcdc7dd014610ca4578063dd62ed3e14610da9578063f1b50c1d14610e2e578063f2fde38b14610e45578063fad8b32a14610e96578063fc673c4f14610ee7578063fe9d930314610fec575b600080fd5b3480156101f457600080fd5b506101fd61107c565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610240578082015181840152602081019050610225565b505050509050019250505060405180910390f35b34801561026057600080fd5b5061026961110a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a957808201518184015260208101905061028e565b50505050905090810190601f1680156102d65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102f057600080fd5b5061033d6004803603604081101561030757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506111ac565b604051808215151515815260200191505060405180910390f35b34801561036357600080fd5b5061036c6111c8565b6040518082815260200191505060405180910390f35b34801561038e57600080fd5b506103fb600480360360608110156103a557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506111ec565b604051808215151515815260200191505060405180910390f35b34801561042157600080fd5b5061042a611303565b005b34801561043857600080fd5b5061047b6004803603602081101561044f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114a3565b005b34801561048957600080fd5b5061049261152b565b604051808260ff1660ff16815260200191505060405180910390f35b3480156104ba57600080fd5b506104c3611542565b6040518082815260200191505060405180910390f35b3480156104e557600080fd5b506104ee61154c565b6040518082815260200191505060405180910390f35b34801561051057600080fd5b5061051961157e565b005b34801561052757600080fd5b5061056a6004803603602081101561053e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116de565b005b34801561057857600080fd5b506105816118fb565b6040518082815260200191505060405180910390f35b3480156105a357600080fd5b506105ac611904565b604051808215151515815260200191505060405180910390f35b3480156105d257600080fd5b506106e9600480360360a08110156105e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561065057600080fd5b82018360208201111561066257600080fd5b8035906020019184600183028401116401000000008311171561068457600080fd5b9091929391929390803590602001906401000000008111156106a557600080fd5b8201836020820111156106b757600080fd5b803590602001918460018302840111640100000000831117156106d957600080fd5b909192939192939050505061191b565b005b3480156106f757600080fd5b5061073a6004803603602081101561070e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b69565b6040518082815260200191505060405180910390f35b34801561075c57600080fd5b50610765611b7b565b005b34801561077357600080fd5b5061077c611dab565b005b34801561078a57600080fd5b50610793611f0c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107e157600080fd5b506107ea611f36565b604051808215151515815260200191505060405180910390f35b34801561081057600080fd5b50610819611f8e565b604051808215151515815260200191505060405180910390f35b34801561083f57600080fd5b506108826004803603602081101561085657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fa5565b005b34801561089057600080fd5b50610899612161565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108d95780820151818401526020810190506108be565b50505050905090810190601f1680156109065780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561092057600080fd5b506109636004803603602081101561093757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612203565b005b34801561097157600080fd5b50610a136004803603606081101561098857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109cf57600080fd5b8201836020820111156109e157600080fd5b80359060200191846001830284011164010000000083111715610a0357600080fd5b909192939192939050505061228b565b005b348015610a2157600080fd5b50610a6e60048036036040811015610a3857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506123fe565b604051808215151515815260200191505060405180910390f35b348015610a9457600080fd5b50610ad760048036036020811015610aab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061251b565b604051808215151515815260200191505060405180910390f35b348015610afd57600080fd5b50610b06612538565b005b348015610b1457600080fd5b50610b1d612698565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b6b57600080fd5b50610b746126c2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610bc257600080fd5b50610c0560048036036020811015610bd957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506126ec565b6040518082815260200191505060405180910390f35b348015610c2757600080fd5b50610c8a60048036036040811015610c3e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612702565b604051808215151515815260200191505060405180910390f35b348015610cb057600080fd5b50610da760048036036080811015610cc757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610d0e57600080fd5b820183602082011115610d2057600080fd5b80359060200191846001830284011164010000000083111715610d4257600080fd5b909192939192939080359060200190640100000000811115610d6357600080fd5b820183602082011115610d7557600080fd5b80359060200191846001830284011164010000000083111715610d9757600080fd5b90919293919293905050506127cc565b005b348015610db557600080fd5b50610e1860048036036040811015610dcc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612991565b6040518082815260200191505060405180910390f35b348015610e3a57600080fd5b50610e43612a18565b005b348015610e5157600080fd5b50610e9460048036036020811015610e6857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b79565b005b348015610ea257600080fd5b50610ee560048036036020811015610eb957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c01565b005b348015610ef357600080fd5b50610fea60048036036080811015610f0a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610f5157600080fd5b820183602082011115610f6357600080fd5b80359060200191846001830284011164010000000083111715610f8557600080fd5b909192939192939080359060200190640100000000811115610fa657600080fd5b820183602082011115610fb857600080fd5b80359060200191846001830284011164010000000083111715610fda57600080fd5b9091929391929390505050612db4565b005b348015610ff857600080fd5b5061107a6004803603604081101561100f57600080fd5b81019080803590602001909291908035906020019064010000000081111561103657600080fd5b82018360208201111561104857600080fd5b8035906020019184600183028401116401000000008311171561106a57600080fd5b9091929391929390505050612ffe565b005b6060600780548060200260200160405190810160405280929190818152602001828054801561110057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116110b6575b5050505050905090565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111a25780601f10611177576101008083540402835291602001916111a2565b820191906000526020600020905b81548152906001019060200180831161118557829003601f168201915b5050505050905090565b6000803390506111bd81858561316d565b600191505092915050565b60006111e7670de0b6b3a764000060025461332390919063ffffffff16565b905090565b6000600d60009054906101000a900460ff16151515611273576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61127b611f8e565b15156112ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f546f6b656e3a207472616e7366657261626c65206d757374206265207472756581525060200191505060405180910390fd5b6112fa8484846133b6565b90509392505050565b600d60009054906101000a900460ff16151515611388576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611475576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f546f6b656e3a20726576656e75652061646472657373206d757374206e6f742081526020017f6265207a65726f0000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6114a0600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613683565b50565b6114ab611f36565b151561151f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611528816139b9565b50565b6000600660009054906101000a900460ff16905090565b6000600354905090565b6000611579600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613a2a565b905090565b611586611f36565b15156115fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600d60009054906101000a900460ff16151561167e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600d60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa60405160405180910390a2565b6116e6611f36565b151561175a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111515611874576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001807f546f6b656e3a2074686520616c6c6f77616e636573206f66206163636f756e7481526020017f206d757374206265206c61726765207468616e207a65726f000000000000000081525060400191505060405180910390fd5b80600d60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f27b897754d1deeb07d290d26a64625918a5bc4185daca6a3c569cd4331571baf60405160405180910390a250565b60006001905090565b6000600d60009054906101000a900460ff16905090565b600d60019054906101000a900460ff16151561199f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f7472616e7366657261626c65206d75737420626520747275650000000000000081525060200191505060405180910390fd5b600d60009054906101000a900460ff16151515611a24576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611a2e3388612702565b1515611ac8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f81526020017f7220666f7220686f6c646572000000000000000000000000000000000000000081525060400191505060405180910390fd5b611b603388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506001613a5a565b50505050505050565b6000611b7482613a2a565b9050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001807f4f776e61626c653a206d73672e73656e646572206973206e6f7420746865207381526020017f616d65206173206e65774f776e6572000000000000000000000000000000000081525060400191505060405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611db3611f36565b1515611e27576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600d60009054906101000a900460ff16151515611eac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25860405160405180910390a2565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6000600d60019054906101000a900460ff16905090565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415151561206f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f4552433737373a20617574686f72697a696e672073656c66206173206f70657281526020017f61746f720000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f960405160405180910390a350565b606060058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f95780601f106121ce576101008083540402835291602001916121f9565b820191906000526020600020905b8154815290600101906020018083116121dc57829003601f168201915b5050505050905090565b61220b611f36565b151561227f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61228881613bfe565b50565b600d60019054906101000a900460ff16151561230f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f7472616e7366657261626c65206d75737420626520747275650000000000000081525060200191505060405180910390fd5b600d60009054906101000a900460ff16151515612394576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6123f83333868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505060206040519081016040528060008152506001613a5a565b50505050565b6000600d60009054906101000a900460ff16151515612485576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b600d60019054906101000a900460ff161515612509576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f7472616e7366657261626c65206d75737420626520747275650000000000000081525060200191505060405180910390fd5b6125138383613c6f565b905092915050565b600061253182600c613dd790919063ffffffff16565b9050919050565b612540611f36565b15156125b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600d60019054906101000a900460ff161515612638576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f7472616e7366657261626c65206d75737420626520747275650000000000000081525060200191505060405180910390fd5b6000600d60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167fb982dae7b403c8420da5251b5cce66f0975c48bd3d6fe1ae31eb19f5106b3ce360405160405180910390a2565b6000600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006126f782613efa565b600001519050919050565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806127c45750600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b905092915050565b6127d53361251b565b151561286f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f4d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766581526020017f20746865204d696e74657220726f6c650000000000000000000000000000000081525060400191505060405180910390fd5b600d60009054906101000a900460ff161515156128f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61298933878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613ff1565b505050505050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612a20611f36565b1515612a94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600d60019054906101000a900460ff16151515612b19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f7472616e7366657261626c65206d757374206e6f74206265207472756500000081525060200191505060405180910390fd5b6001600d60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f5285f0ad5858236d5f2ce2ec9ff0b2d3aa04320499b71f022e64d9c7549a325c60405160405180910390a2565b612b81611f36565b1515612bf5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612bfe81614298565b50565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612ccb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4552433737373a207265766f6b696e672073656c66206173206f70657261746f81526020017f720000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690553373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa160405160405180910390a350565b600d60019054906101000a900460ff161515612e38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f7472616e7366657261626c65206d75737420626520747275650000000000000081525060200191505060405180910390fd5b600d60009054906101000a900460ff16151515612ebd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612ec73387612702565b1515612f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f81526020017f7220666f7220686f6c646572000000000000000000000000000000000000000081525060400191505060405180910390fd5b612ff633878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050614493565b505050505050565b600d60019054906101000a900460ff161515613082576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f7472616e7366657261626c65206d75737420626520747275650000000000000081525060200191505060405180910390fd5b600d60009054906101000a900460ff16151515613107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61316833338585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506020604051908101604052806000815250614493565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613238576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f4552433737373a20617070726f766520746f20746865207a65726f206164647281526020017f657373000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000808211151561339c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b600082848115156133a957fe5b0490508091505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515613482576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f4552433737373a207472616e7366657220746f20746865207a65726f2061646481526020017f726573730000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561354d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4552433737373a207472616e736665722066726f6d20746865207a65726f206181526020017f646472657373000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000339050613580818686866020604051908101604052806000815250602060405190810160405280600081525061475e565b6135ae8186868660206040519081016040528060008152506020604051908101604052806000815250614abf565b613647858261364286600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614cb690919063ffffffff16565b61316d565b61367781868686602060405190810160405280600081525060206040519081016040528060008152506000614d41565b60019150509392505050565b60008061368f83613efa565b600001519050600081111515613733576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001807f546f6b656e3a2074686520726576656e75652062616c616e6365206d7573742081526020017f6265206c61726765207468616e207a65726f000000000000000000000000000081525060400191505060405180910390fd5b806002541115156137d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f546f6b656e3a20746f74616c20737570706c79206d757374206265206c61726781526020017f65207468616e20726576656e756500000000000000000000000000000000000081525060400191505060405180910390fd5b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090555050613895670de0b6b3a764000061388761387661384b85600254614cb690919063ffffffff16565b613868670de0b6b3a764000060025461518e90919063ffffffff16565b61332390919063ffffffff16565b60035461518e90919063ffffffff16565b61332390919063ffffffff16565b600381905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef613906670de0b6b3a76400008561332390919063ffffffff16565b6040518082815260200191505060405180910390a38273ffffffffffffffffffffffffffffffffffffffff167f615e44f94de69b66b60b6cdd78b2056d4ebbd39a1338646e5cf21328ead50d23600354613971670de0b6b3a76400008561332390919063ffffffff16565b61398c670de0b6b3a76400008661525b90919063ffffffff16565b60405180848152602001838152602001828152602001935050505060405180910390a26001915050919050565b6139cd81600c6152e990919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4b5ef9a786cf64a7d82ebcf2d5132667edc9faef4ac36260d9a9e52c526b623260405160405180910390a350565b6000613a53670de0b6b3a7640000613a4184613efa565b6000015161332390919063ffffffff16565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515613b25576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4552433737373a2073656e642066726f6d20746865207a65726f20616464726581526020017f737300000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614151515613bca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433737373a2073656e6420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b613bd887878787878761475e565b613be6878787878787614abf565b613bf587878787878787614d41565b50505050505050565b613c1281600c6153eb90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3c091dafb1d99e4a4c333024492eac3b2cd8bf921a3dd547c937db33be307bb860405160405180910390a350565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515613d3b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f4552433737373a207472616e7366657220746f20746865207a65726f2061646481526020017f726573730000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000339050613d6e818286866020604051908101604052806000815250602060405190810160405280600081525061475e565b613d9c8182868660206040519081016040528060008152506020604051908101604052806000815250614abf565b613dcc81828686602060405190810160405280600081525060206040519081016040528060008152506000614d41565b600191505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613ea3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f526f6c65733a206163636f756e7420697320746865207a65726f20616464726581526020017f737300000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b613f02615683565b613f0a615683565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604080519081016040529081600082015481526020016001820154815250509050600081600001511415613f93576000816000018181525050600354816020018181525050613fe8565b6003548160200151141515613fe757613fd18160200151613fc3600354846000015161518e90919063ffffffff16565b61332390919063ffffffff16565b8160000181815250506003548160200181815250505b5b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515614096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433737373a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b6140a7856000868686866000614d41565b60006140c4670de0b6b3a76400008561518e90919063ffffffff16565b90506140db816002546154c890919063ffffffff16565b6002819055506140eb8582615552565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d868686604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561418757808201518184015260208101905061416c565b50505050905090810190601f1680156141b45780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156141ed5780820151818401526020810190506141d2565b50505050905090810190601f16801561421a5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a38473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a3505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515614363576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526020017f646472657373000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561444f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f4f776e61626c653a206e6577206f776e6572206973207468652073616d65206181526020017f732070726576696f7573206f776e65720000000000000000000000000000000081525060400191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561455e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4552433737373a206275726e2066726f6d20746865207a65726f20616464726581526020017f737300000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61456d8585600086868661475e565b600061458a670de0b6b3a76400008561518e90919063ffffffff16565b90506145a181600254614cb690919063ffffffff16565b6002819055506145b185826155e1565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098868686604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561464d578082015181840152602081019050614632565b50505050905090810190601f16801561467a5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156146b3578082015181840152602081019050614698565b50505050905090810190601f1680156146e05780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a3505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956001026040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561484557600080fd5b505afa158015614859573d6000803e3d6000fd5b505050506040513d602081101561486f57600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515614ab6578073ffffffffffffffffffffffffffffffffffffffff166375ab97828888888888886040518763ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156149e55780820151818401526020810190506149ca565b50505050905090810190601f168015614a125780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015614a4b578082015181840152602081019050614a30565b50505050905090810190601f168015614a785780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b158015614a9d57600080fd5b505af1158015614ab1573d6000803e3d6000fd5b505050505b50505050505050565b6000614adc670de0b6b3a76400008561518e90919063ffffffff16565b9050614ae886826155e1565b614af28582615552565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987878787604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015614ba5578082015181840152602081019050614b8a565b50505050905090810190601f168015614bd25780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015614c0b578082015181840152602081019050614bf0565b50505050905090810190601f168015614c385780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a48473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a350505050505050565b6000828211151515614d30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b600082840390508091505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6001026040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b158015614e2857600080fd5b505afa158015614e3c573d6000803e3d6000fd5b505050506040513d6020811015614e5257600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561509c578073ffffffffffffffffffffffffffffffffffffffff166223de298989898989896040518763ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015614fc7578082015181840152602081019050614fac565b50505050905090810190601f168015614ff45780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b8381101561502d578082015181840152602081019050615012565b50505050905090810190601f16801561505a5780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b15801561507f57600080fd5b505af1158015615093573d6000803e3d6000fd5b50505050615184565b8115615183576150c18673ffffffffffffffffffffffffffffffffffffffff16615670565b151515615182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604d8152602001807f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637481526020017f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f81526020017f6b656e73526563697069656e740000000000000000000000000000000000000081525060600191505060405180910390fd5b5b5b5050505050505050565b6000808314156151a15760009050615255565b600082840290508284828115156151b457fe5b04141515615250576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81526020017f770000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b809150505b92915050565b60008082141515156152d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f536166654d6174683a206d6f64756c6f206279207a65726f000000000000000081525060200191505060405180910390fd5b81838115156152e057fe5b06905092915050565b6152f38282613dd7565b151561538d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c81526020017f650000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6153f58282613dd7565b15151561546a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000808284019050838110151515615548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b61555a615683565b61556383613efa565b905061557c8282600001516154c890919063ffffffff16565b81600001818152505080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155905050505050565b6155e9615683565b6155f283613efa565b905061560b828260000151614cb690919063ffffffff16565b81600001818152505080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155905050505050565b600080823b905060008111915050919050565b60408051908101604052806000815260200160008152509056fea165627a7a7230582014a1ffdbe46054ad16a0f14292981e1e42c6b1845e892779ddcf21a37e3b7ea60029
Deployed Bytecode
0x6080604052600436106101e3576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306e48538146101e857806306fdde0314610254578063095ea7b3146102e457806318160ddd1461035757806323b872dd146103825780632d07953a146104155780633092afd51461042c578063313ce5671461047d5780633ba0b9a9146104ae5780633e9491a2146104d95780633f4ba83a1461050457806345338d631461051b578063556f0dc71461056c5780635c975abb1461059757806362ad1b83146105c657806370a08231146106eb57806379ba5097146107505780638456cb59146107675780638da5cb5b1461077e5780638f32d59b146107d557806392ff0d3114610804578063959b8c3f1461083357806395d89b4114610884578063983b2d56146109145780639bd9bbc614610965578063a9059cbb14610a15578063aa271e1a14610a88578063b187984f14610af1578063b410908d14610b08578063d4ee1d9014610b5f578063d6644ff714610bb6578063d95b637114610c1b578063dcdc7dd014610ca4578063dd62ed3e14610da9578063f1b50c1d14610e2e578063f2fde38b14610e45578063fad8b32a14610e96578063fc673c4f14610ee7578063fe9d930314610fec575b600080fd5b3480156101f457600080fd5b506101fd61107c565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610240578082015181840152602081019050610225565b505050509050019250505060405180910390f35b34801561026057600080fd5b5061026961110a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a957808201518184015260208101905061028e565b50505050905090810190601f1680156102d65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102f057600080fd5b5061033d6004803603604081101561030757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506111ac565b604051808215151515815260200191505060405180910390f35b34801561036357600080fd5b5061036c6111c8565b6040518082815260200191505060405180910390f35b34801561038e57600080fd5b506103fb600480360360608110156103a557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506111ec565b604051808215151515815260200191505060405180910390f35b34801561042157600080fd5b5061042a611303565b005b34801561043857600080fd5b5061047b6004803603602081101561044f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114a3565b005b34801561048957600080fd5b5061049261152b565b604051808260ff1660ff16815260200191505060405180910390f35b3480156104ba57600080fd5b506104c3611542565b6040518082815260200191505060405180910390f35b3480156104e557600080fd5b506104ee61154c565b6040518082815260200191505060405180910390f35b34801561051057600080fd5b5061051961157e565b005b34801561052757600080fd5b5061056a6004803603602081101561053e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116de565b005b34801561057857600080fd5b506105816118fb565b6040518082815260200191505060405180910390f35b3480156105a357600080fd5b506105ac611904565b604051808215151515815260200191505060405180910390f35b3480156105d257600080fd5b506106e9600480360360a08110156105e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561065057600080fd5b82018360208201111561066257600080fd5b8035906020019184600183028401116401000000008311171561068457600080fd5b9091929391929390803590602001906401000000008111156106a557600080fd5b8201836020820111156106b757600080fd5b803590602001918460018302840111640100000000831117156106d957600080fd5b909192939192939050505061191b565b005b3480156106f757600080fd5b5061073a6004803603602081101561070e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b69565b6040518082815260200191505060405180910390f35b34801561075c57600080fd5b50610765611b7b565b005b34801561077357600080fd5b5061077c611dab565b005b34801561078a57600080fd5b50610793611f0c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107e157600080fd5b506107ea611f36565b604051808215151515815260200191505060405180910390f35b34801561081057600080fd5b50610819611f8e565b604051808215151515815260200191505060405180910390f35b34801561083f57600080fd5b506108826004803603602081101561085657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fa5565b005b34801561089057600080fd5b50610899612161565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108d95780820151818401526020810190506108be565b50505050905090810190601f1680156109065780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561092057600080fd5b506109636004803603602081101561093757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612203565b005b34801561097157600080fd5b50610a136004803603606081101561098857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109cf57600080fd5b8201836020820111156109e157600080fd5b80359060200191846001830284011164010000000083111715610a0357600080fd5b909192939192939050505061228b565b005b348015610a2157600080fd5b50610a6e60048036036040811015610a3857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506123fe565b604051808215151515815260200191505060405180910390f35b348015610a9457600080fd5b50610ad760048036036020811015610aab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061251b565b604051808215151515815260200191505060405180910390f35b348015610afd57600080fd5b50610b06612538565b005b348015610b1457600080fd5b50610b1d612698565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b6b57600080fd5b50610b746126c2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610bc257600080fd5b50610c0560048036036020811015610bd957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506126ec565b6040518082815260200191505060405180910390f35b348015610c2757600080fd5b50610c8a60048036036040811015610c3e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612702565b604051808215151515815260200191505060405180910390f35b348015610cb057600080fd5b50610da760048036036080811015610cc757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610d0e57600080fd5b820183602082011115610d2057600080fd5b80359060200191846001830284011164010000000083111715610d4257600080fd5b909192939192939080359060200190640100000000811115610d6357600080fd5b820183602082011115610d7557600080fd5b80359060200191846001830284011164010000000083111715610d9757600080fd5b90919293919293905050506127cc565b005b348015610db557600080fd5b50610e1860048036036040811015610dcc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612991565b6040518082815260200191505060405180910390f35b348015610e3a57600080fd5b50610e43612a18565b005b348015610e5157600080fd5b50610e9460048036036020811015610e6857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b79565b005b348015610ea257600080fd5b50610ee560048036036020811015610eb957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c01565b005b348015610ef357600080fd5b50610fea60048036036080811015610f0a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610f5157600080fd5b820183602082011115610f6357600080fd5b80359060200191846001830284011164010000000083111715610f8557600080fd5b909192939192939080359060200190640100000000811115610fa657600080fd5b820183602082011115610fb857600080fd5b80359060200191846001830284011164010000000083111715610fda57600080fd5b9091929391929390505050612db4565b005b348015610ff857600080fd5b5061107a6004803603604081101561100f57600080fd5b81019080803590602001909291908035906020019064010000000081111561103657600080fd5b82018360208201111561104857600080fd5b8035906020019184600183028401116401000000008311171561106a57600080fd5b9091929391929390505050612ffe565b005b6060600780548060200260200160405190810160405280929190818152602001828054801561110057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116110b6575b5050505050905090565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111a25780601f10611177576101008083540402835291602001916111a2565b820191906000526020600020905b81548152906001019060200180831161118557829003601f168201915b5050505050905090565b6000803390506111bd81858561316d565b600191505092915050565b60006111e7670de0b6b3a764000060025461332390919063ffffffff16565b905090565b6000600d60009054906101000a900460ff16151515611273576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61127b611f8e565b15156112ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f546f6b656e3a207472616e7366657261626c65206d757374206265207472756581525060200191505060405180910390fd5b6112fa8484846133b6565b90509392505050565b600d60009054906101000a900460ff16151515611388576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611475576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f546f6b656e3a20726576656e75652061646472657373206d757374206e6f742081526020017f6265207a65726f0000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6114a0600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613683565b50565b6114ab611f36565b151561151f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611528816139b9565b50565b6000600660009054906101000a900460ff16905090565b6000600354905090565b6000611579600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613a2a565b905090565b611586611f36565b15156115fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600d60009054906101000a900460ff16151561167e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600d60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa60405160405180910390a2565b6116e6611f36565b151561175a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111515611874576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001807f546f6b656e3a2074686520616c6c6f77616e636573206f66206163636f756e7481526020017f206d757374206265206c61726765207468616e207a65726f000000000000000081525060400191505060405180910390fd5b80600d60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f27b897754d1deeb07d290d26a64625918a5bc4185daca6a3c569cd4331571baf60405160405180910390a250565b60006001905090565b6000600d60009054906101000a900460ff16905090565b600d60019054906101000a900460ff16151561199f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f7472616e7366657261626c65206d75737420626520747275650000000000000081525060200191505060405180910390fd5b600d60009054906101000a900460ff16151515611a24576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611a2e3388612702565b1515611ac8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f81526020017f7220666f7220686f6c646572000000000000000000000000000000000000000081525060400191505060405180910390fd5b611b603388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506001613a5a565b50505050505050565b6000611b7482613a2a565b9050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001807f4f776e61626c653a206d73672e73656e646572206973206e6f7420746865207381526020017f616d65206173206e65774f776e6572000000000000000000000000000000000081525060400191505060405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611db3611f36565b1515611e27576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600d60009054906101000a900460ff16151515611eac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25860405160405180910390a2565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6000600d60019054906101000a900460ff16905090565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415151561206f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f4552433737373a20617574686f72697a696e672073656c66206173206f70657281526020017f61746f720000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f960405160405180910390a350565b606060058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f95780601f106121ce576101008083540402835291602001916121f9565b820191906000526020600020905b8154815290600101906020018083116121dc57829003601f168201915b5050505050905090565b61220b611f36565b151561227f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61228881613bfe565b50565b600d60019054906101000a900460ff16151561230f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f7472616e7366657261626c65206d75737420626520747275650000000000000081525060200191505060405180910390fd5b600d60009054906101000a900460ff16151515612394576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6123f83333868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505060206040519081016040528060008152506001613a5a565b50505050565b6000600d60009054906101000a900460ff16151515612485576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b600d60019054906101000a900460ff161515612509576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f7472616e7366657261626c65206d75737420626520747275650000000000000081525060200191505060405180910390fd5b6125138383613c6f565b905092915050565b600061253182600c613dd790919063ffffffff16565b9050919050565b612540611f36565b15156125b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600d60019054906101000a900460ff161515612638576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f7472616e7366657261626c65206d75737420626520747275650000000000000081525060200191505060405180910390fd5b6000600d60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167fb982dae7b403c8420da5251b5cce66f0975c48bd3d6fe1ae31eb19f5106b3ce360405160405180910390a2565b6000600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006126f782613efa565b600001519050919050565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806127c45750600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b905092915050565b6127d53361251b565b151561286f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f4d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766581526020017f20746865204d696e74657220726f6c650000000000000000000000000000000081525060400191505060405180910390fd5b600d60009054906101000a900460ff161515156128f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61298933878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613ff1565b505050505050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612a20611f36565b1515612a94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600d60019054906101000a900460ff16151515612b19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f7472616e7366657261626c65206d757374206e6f74206265207472756500000081525060200191505060405180910390fd5b6001600d60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f5285f0ad5858236d5f2ce2ec9ff0b2d3aa04320499b71f022e64d9c7549a325c60405160405180910390a2565b612b81611f36565b1515612bf5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612bfe81614298565b50565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612ccb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4552433737373a207265766f6b696e672073656c66206173206f70657261746f81526020017f720000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690553373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa160405160405180910390a350565b600d60019054906101000a900460ff161515612e38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f7472616e7366657261626c65206d75737420626520747275650000000000000081525060200191505060405180910390fd5b600d60009054906101000a900460ff16151515612ebd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612ec73387612702565b1515612f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f81526020017f7220666f7220686f6c646572000000000000000000000000000000000000000081525060400191505060405180910390fd5b612ff633878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050614493565b505050505050565b600d60019054906101000a900460ff161515613082576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f7472616e7366657261626c65206d75737420626520747275650000000000000081525060200191505060405180910390fd5b600d60009054906101000a900460ff16151515613107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61316833338585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506020604051908101604052806000815250614493565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613238576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f4552433737373a20617070726f766520746f20746865207a65726f206164647281526020017f657373000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000808211151561339c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b600082848115156133a957fe5b0490508091505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515613482576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f4552433737373a207472616e7366657220746f20746865207a65726f2061646481526020017f726573730000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561354d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4552433737373a207472616e736665722066726f6d20746865207a65726f206181526020017f646472657373000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000339050613580818686866020604051908101604052806000815250602060405190810160405280600081525061475e565b6135ae8186868660206040519081016040528060008152506020604051908101604052806000815250614abf565b613647858261364286600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614cb690919063ffffffff16565b61316d565b61367781868686602060405190810160405280600081525060206040519081016040528060008152506000614d41565b60019150509392505050565b60008061368f83613efa565b600001519050600081111515613733576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001807f546f6b656e3a2074686520726576656e75652062616c616e6365206d7573742081526020017f6265206c61726765207468616e207a65726f000000000000000000000000000081525060400191505060405180910390fd5b806002541115156137d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f546f6b656e3a20746f74616c20737570706c79206d757374206265206c61726781526020017f65207468616e20726576656e756500000000000000000000000000000000000081525060400191505060405180910390fd5b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090555050613895670de0b6b3a764000061388761387661384b85600254614cb690919063ffffffff16565b613868670de0b6b3a764000060025461518e90919063ffffffff16565b61332390919063ffffffff16565b60035461518e90919063ffffffff16565b61332390919063ffffffff16565b600381905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef613906670de0b6b3a76400008561332390919063ffffffff16565b6040518082815260200191505060405180910390a38273ffffffffffffffffffffffffffffffffffffffff167f615e44f94de69b66b60b6cdd78b2056d4ebbd39a1338646e5cf21328ead50d23600354613971670de0b6b3a76400008561332390919063ffffffff16565b61398c670de0b6b3a76400008661525b90919063ffffffff16565b60405180848152602001838152602001828152602001935050505060405180910390a26001915050919050565b6139cd81600c6152e990919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4b5ef9a786cf64a7d82ebcf2d5132667edc9faef4ac36260d9a9e52c526b623260405160405180910390a350565b6000613a53670de0b6b3a7640000613a4184613efa565b6000015161332390919063ffffffff16565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515613b25576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4552433737373a2073656e642066726f6d20746865207a65726f20616464726581526020017f737300000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614151515613bca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433737373a2073656e6420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b613bd887878787878761475e565b613be6878787878787614abf565b613bf587878787878787614d41565b50505050505050565b613c1281600c6153eb90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3c091dafb1d99e4a4c333024492eac3b2cd8bf921a3dd547c937db33be307bb860405160405180910390a350565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515613d3b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f4552433737373a207472616e7366657220746f20746865207a65726f2061646481526020017f726573730000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000339050613d6e818286866020604051908101604052806000815250602060405190810160405280600081525061475e565b613d9c8182868660206040519081016040528060008152506020604051908101604052806000815250614abf565b613dcc81828686602060405190810160405280600081525060206040519081016040528060008152506000614d41565b600191505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613ea3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f526f6c65733a206163636f756e7420697320746865207a65726f20616464726581526020017f737300000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b613f02615683565b613f0a615683565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604080519081016040529081600082015481526020016001820154815250509050600081600001511415613f93576000816000018181525050600354816020018181525050613fe8565b6003548160200151141515613fe757613fd18160200151613fc3600354846000015161518e90919063ffffffff16565b61332390919063ffffffff16565b8160000181815250506003548160200181815250505b5b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515614096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433737373a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b6140a7856000868686866000614d41565b60006140c4670de0b6b3a76400008561518e90919063ffffffff16565b90506140db816002546154c890919063ffffffff16565b6002819055506140eb8582615552565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d868686604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561418757808201518184015260208101905061416c565b50505050905090810190601f1680156141b45780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156141ed5780820151818401526020810190506141d2565b50505050905090810190601f16801561421a5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a38473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a3505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515614363576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526020017f646472657373000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561444f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f4f776e61626c653a206e6577206f776e6572206973207468652073616d65206181526020017f732070726576696f7573206f776e65720000000000000000000000000000000081525060400191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561455e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4552433737373a206275726e2066726f6d20746865207a65726f20616464726581526020017f737300000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61456d8585600086868661475e565b600061458a670de0b6b3a76400008561518e90919063ffffffff16565b90506145a181600254614cb690919063ffffffff16565b6002819055506145b185826155e1565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098868686604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561464d578082015181840152602081019050614632565b50505050905090810190601f16801561467a5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156146b3578082015181840152602081019050614698565b50505050905090810190601f1680156146e05780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a3505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956001026040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561484557600080fd5b505afa158015614859573d6000803e3d6000fd5b505050506040513d602081101561486f57600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515614ab6578073ffffffffffffffffffffffffffffffffffffffff166375ab97828888888888886040518763ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156149e55780820151818401526020810190506149ca565b50505050905090810190601f168015614a125780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015614a4b578082015181840152602081019050614a30565b50505050905090810190601f168015614a785780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b158015614a9d57600080fd5b505af1158015614ab1573d6000803e3d6000fd5b505050505b50505050505050565b6000614adc670de0b6b3a76400008561518e90919063ffffffff16565b9050614ae886826155e1565b614af28582615552565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987878787604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015614ba5578082015181840152602081019050614b8a565b50505050905090810190601f168015614bd25780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015614c0b578082015181840152602081019050614bf0565b50505050905090810190601f168015614c385780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a48473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a350505050505050565b6000828211151515614d30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b600082840390508091505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6001026040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b158015614e2857600080fd5b505afa158015614e3c573d6000803e3d6000fd5b505050506040513d6020811015614e5257600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561509c578073ffffffffffffffffffffffffffffffffffffffff166223de298989898989896040518763ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015614fc7578082015181840152602081019050614fac565b50505050905090810190601f168015614ff45780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b8381101561502d578082015181840152602081019050615012565b50505050905090810190601f16801561505a5780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b15801561507f57600080fd5b505af1158015615093573d6000803e3d6000fd5b50505050615184565b8115615183576150c18673ffffffffffffffffffffffffffffffffffffffff16615670565b151515615182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604d8152602001807f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637481526020017f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f81526020017f6b656e73526563697069656e740000000000000000000000000000000000000081525060600191505060405180910390fd5b5b5b5050505050505050565b6000808314156151a15760009050615255565b600082840290508284828115156151b457fe5b04141515615250576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81526020017f770000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b809150505b92915050565b60008082141515156152d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f536166654d6174683a206d6f64756c6f206279207a65726f000000000000000081525060200191505060405180910390fd5b81838115156152e057fe5b06905092915050565b6152f38282613dd7565b151561538d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c81526020017f650000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6153f58282613dd7565b15151561546a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000808284019050838110151515615548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b61555a615683565b61556383613efa565b905061557c8282600001516154c890919063ffffffff16565b81600001818152505080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155905050505050565b6155e9615683565b6155f283613efa565b905061560b828260000151614cb690919063ffffffff16565b81600001818152505080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155905050505050565b600080823b905060008111915050919050565b60408051908101604052806000815260200160008152509056fea165627a7a7230582014a1ffdbe46054ad16a0f14292981e1e42c6b1845e892779ddcf21a37e3b7ea60029
Deployed Bytecode Sourcemap
46465:2764:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27088:117;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27088:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;27088:117:0;;;;;;;;;;;;;;;;;23355:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23355:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;23355:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28637:184;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28637:184:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28637:184:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24145:112;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24145:112:0;;;;;;;;;;;;;;;;;;;;;;;48226:252;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48226:252:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;48226:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49029:197;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49029:197:0;;;;;;43050:99;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43050:99:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43050:99:0;;;;;;;;;;;;;;;;;;;;;;23790:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23790:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;38456:95;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38456:95:0;;;;;;;;;;;;;;;;;;;;;;;48864:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48864:102:0;;;;;;;;;;;;;;;;;;;;;;;45351:117;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45351:117:0;;;;;;48485:268;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48485:268:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;48485:268:0;;;;;;;;;;;;;;;;;;;;;;23997:82;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23997:82:0;;;;;;;;;;;;;;;;;;;;;;;44561:78;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44561:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;47221:411;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47221:411:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;47221:411:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;47221:411:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;47221:411:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;47221:411:0;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;47221:411:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;47221:411:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;47221:411:0;;;;;;;;;;;;;;;24362:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24362:105:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24362:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42036:257;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42036:257:0;;;;;;45141:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45141:115:0;;;;;;40604:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40604:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;41145:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41145:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;46026:90;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46026:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26450:253;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26450:253:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26450:253:0;;;;;;;;;;;;;;;;;;;;;;23501:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23501:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;23501:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42948:93;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42948:93:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42948:93:0;;;;;;;;;;;;;;;;;;;;;;46843:199;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46843:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;46843:199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;46843:199:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46843:199:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;46843:199:0;;;;;;;;;;;;;;;46667:168;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46667:168:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;46667:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42828:111;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42828:111:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42828:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46277:145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46277:145:0;;;;;;48760:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48760:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;40772:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40772:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;24615:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24615:121:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24615:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26165:213;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26165:213:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26165:213:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47983:235;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47983:235:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;47983:235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;47983:235:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;47983:235:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;47983:235:0;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;47983:235:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;47983:235:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;47983:235:0;;;;;;;;;;;;;;;28354:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28354:138:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28354:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46124:145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46124:145:0;;;;;;41392:107;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41392:107:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41392:107:0;;;;;;;;;;;;;;;;;;;;;;26772:245;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26772:245:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26772:245:0;;;;;;;;;;;;;;;;;;;;;;47640:335;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47640:335:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;47640:335:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;47640:335:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;47640:335:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;47640:335:0;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;47640:335:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;47640:335:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;47640:335:0;;;;;;;;;;;;;;;47050:163;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47050:163:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;47050:163:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;47050:163:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;47050:163:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;47050:163:0;;;;;;;;;;;;;;;27088:117;27139:16;27175:22;27168:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27088:117;:::o;23355:85::-;23394:13;23427:5;23420:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23355:85;:::o;28637:184::-;28704:4;28721:14;28738:10;28721:27;;28759:32;28768:6;28776:7;28785:5;28759:8;:32::i;:::-;28809:4;28802:11;;;28637:184;;;;:::o;24145:112::-;24191:7;24218:31;21488:6;24218:12;;:16;;:31;;;;:::i;:::-;24211:38;;24145:112;:::o;48226:252::-;48331:4;44798:7;;;;;;;;;;;44797:8;44789:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48356:14;:12;:14::i;:::-;48348:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48425:46;48445:6;48453:9;48464:6;48425:19;:46::i;:::-;48418:53;;48226:252;;;;;:::o;49029:197::-;44798:7;;;;;;;;;;;44797:8;44789:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49126:1;49099:29;;:15;;;;;;;;;;;:29;;;;49091:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49184:35;49203:15;;;;;;;;;;;49184:18;:35::i;:::-;;49029:197::o;43050:99::-;40991:9;:7;:9::i;:::-;40983:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43118:22;43132:7;43118:13;:22::i;:::-;43050:99;:::o;23790:85::-;23833:5;23858:9;;;;;;;;;;;23851:16;;23790:85;:::o;38456:95::-;38503:7;38530:13;;38523:20;;38456:95;:::o;48864:102::-;48906:7;48932:27;48943:15;;;;;;;;;;;48932:10;:27::i;:::-;48925:34;;48864:102;:::o;45351:117::-;40991:9;:7;:9::i;:::-;40983:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44997:7;;;;;;;;;;;44989:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45419:5;45409:7;;:15;;;;;;;;;;;;;;;;;;45449:10;45440:20;;;;;;;;;;;;45351:117::o;48485:268::-;40991:9;:7;:9::i;:::-;40983:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48604:1;48566:11;:20;48578:7;48566:20;;;;;;;;;;;;;;;:35;48595:4;48566:35;;;;;;;;;;;;;;;;:39;48558:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48696:7;48678:15;;:25;;;;;;;;;;;;;;;;;;48738:7;48720:26;;;;;;;;;;;;48485:268;:::o;23997:82::-;24043:7;24070:1;24063:8;;23997:82;:::o;44561:78::-;44600:4;44624:7;;;;;;;;;;;44617:14;;44561:78;:::o;47221:411::-;45829:13;;;;;;;;;;;45821:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44798:7;;;;;;;;;;;44797:8;44789:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47455:33;47469:10;47481:6;47455:13;:33::i;:::-;47447:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47548:76;47560:10;47572:6;47580:9;47591:6;47599:4;;47548:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;47548:76:0;;;;;;47605:12;;47548:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;47548:76:0;;;;;;47619:4;47548:11;:76::i;:::-;47221:411;;;;;;;:::o;24362:105::-;24417:7;24444:15;24455:3;24444:10;:15::i;:::-;24437:22;;24362:105;;;:::o;42036:257::-;42103:9;;;;;;;;;;;42089:23;;:10;:23;;;42081:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42211:9;;;;;;;;;;;42182:39;;42203:6;;;;;;;;;;;42182:39;;;;;;;;;;;;42243:9;;;;;;;;;;;42234:6;;:18;;;;;;;;;;;;;;;;;;42283:1;42263:9;;:22;;;;;;;;;;;;;;;;;;42036:257::o;45141:115::-;40991:9;:7;:9::i;:::-;40983:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44798:7;;;;;;;;;;;44797:8;44789:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45210:4;45200:7;;:14;;;;;;;;;;;;;;;;;;45237:10;45230:18;;;;;;;;;;;;45141:115::o;40604:79::-;40642:7;40669:6;;;;;;;;;;;40662:13;;40604:79;:::o;41145:92::-;41185:4;41223:6;;;;;;;;;;;41209:20;;:10;:20;;;41202:27;;41145:92;:::o;46026:90::-;46071:4;46095:13;;;;;;;;;;;46088:20;;46026:90;:::o;26450:253::-;26537:8;26523:22;;:10;:22;;;;26515:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26633:4;26598:10;:22;26609:10;26598:22;;;;;;;;;;;;;;;:32;26621:8;26598:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;26684:10;26655:40;;26674:8;26655:40;;;;;;;;;;;;26450:253;:::o;23501:89::-;23542:13;23575:7;23568:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23501:89;:::o;42948:93::-;40991:9;:7;:9::i;:::-;40983:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43013:19;43024:7;43013:10;:19::i;:::-;42948:93;:::o;46843:199::-;45829:13;;;;;;;;;;;45821:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44798:7;;;;;;;;;;;44797:8;44789:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46964:70;46976:10;46988;47000:9;47011:6;47019:4;;46964:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;46964:70:0;;;;;;;;;;;;;;;;;;;47029:4;46964:11;:70::i;:::-;46843:199;;;;:::o;46667:168::-;46769:4;44798:7;;;;;;;;;;;44797:8;44789:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45829:13;;;;;;;;;;;45821:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46793:34;46809:9;46820:6;46793:15;:34::i;:::-;46786:41;;46667:168;;;;:::o;42828:111::-;42884:4;42909:21;42922:7;42909:8;:12;;:21;;;;:::i;:::-;42902:28;;42828:111;;;:::o;46277:145::-;40991:9;:7;:9::i;:::-;40983:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45829:13;;;;;;;;;;;45821:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46365:5;46349:13;;:21;;;;;;;;;;;;;;;;;;46403:10;46386:28;;;;;;;;;;;;46277:145::o;48760:97::-;48809:7;48835:15;;;;;;;;;;;48828:22;;48760:97;:::o;40772:86::-;40813:7;40840:9;;;;;;;;;;;40833:16;;40772:86;:::o;24615:121::-;24678:7;24705:16;24717:3;24705:11;:16::i;:::-;:22;;;24698:29;;24615:121;;;:::o;26165:213::-;26273:4;26309:11;26297:23;;:8;:23;;;:73;;;;26337:10;:23;26348:11;26337:23;;;;;;;;;;;;;;;:33;26361:8;26337:33;;;;;;;;;;;;;;;;;;;;;;;;;26297:73;26290:80;;26165:213;;;;:::o;47983:235::-;42724:20;42733:10;42724:8;:20::i;:::-;42716:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44798:7;;;;;;;;;;;44797:8;44789:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48144:66;48156:10;48168:9;48179:6;48187:8;;48144:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;48144:66:0;;;;;;48197:12;;48144:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;48144:66:0;;;;;;:11;:66::i;:::-;47983:235;;;;;;:::o;28354:138::-;28429:7;28456:11;:19;28468:6;28456:19;;;;;;;;;;;;;;;:28;28476:7;28456:28;;;;;;;;;;;;;;;;28449:35;;28354:138;;;;:::o;46124:145::-;40991:9;:7;:9::i;:::-;40983:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45951:13;;;;;;;;;;;45950:14;45942:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46214:4;46198:13;;:20;;;;;;;;;;;;;;;;;;46250:10;46234:27;;;;;;;;;;;;46124:145::o;41392:107::-;40991:9;:7;:9::i;:::-;40983:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41464:27;41483:7;41464:18;:27::i;:::-;41392:107;:::o;26772:245::-;26854:10;26842:22;;:8;:22;;;;26834:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26922:10;:22;26933:10;26922:22;;;;;;;;;;;;;;;:32;26945:8;26922:32;;;;;;;;;;;;;;;;26915:39;;;;;;;;;;;26998:10;26972:37;;26988:8;26972:37;;;;;;;;;;;;26772:245;:::o;47640:335::-;45829:13;;;;;;;;;;;45821:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44798:7;;;;;;;;;;;44797:8;44789:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47813:34;47827:10;47839:7;47813:13;:34::i;:::-;47805:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47907:60;47919:10;47931:7;47940:6;47948:4;;47907:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;47907:60:0;;;;;;47954:12;;47907:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;47907:60:0;;;;;;:11;:60::i;:::-;47640:335;;;;;;:::o;47050:163::-;45829:13;;;;;;;;;;;45821:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44798:7;;;;;;;;;;;44797:8;44789:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47152:53;47164:10;47176;47188:6;47196:4;;47152:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;47152:53:0;;;;;;;;;;;;;;;;;;;:11;:53::i;:::-;47050:163;;;:::o;34898:500::-;35251:1;35232:21;;:7;:21;;;;35224:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35337:5;35306:11;:19;35318:6;35306:19;;;;;;;;;;;;;;;:28;35326:7;35306:28;;;;;;;;;;;;;;;:36;;;;35375:7;35358:32;;35367:6;35358:32;;;35384:5;35358:32;;;;;;;;;;;;;;;;;;34898:500;;;:::o;14273:333::-;14331:7;14430:1;14426;:5;14418:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14473:9;14489:1;14485;:5;;;;;;;;14473:17;;14597:1;14590:8;;;14273:333;;;;:::o;29342:635::-;29434:4;29480:1;29459:23;;:9;:23;;;;29451:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29560:1;29542:20;;:6;:20;;;;29534:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29618:15;29636:10;29618:28;;29659:61;29677:7;29686:6;29694:9;29705:6;29659:61;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:61::i;:::-;29733:49;29739:7;29748:6;29756:9;29767:6;29733:49;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:49::i;:::-;29795:67;29804:6;29812:7;29821:40;29854:6;29821:11;:19;29833:6;29821:19;;;;;;;;;;;;;;;:28;29841:7;29821:28;;;;;;;;;;;;;;;;:32;;:40;;;;:::i;:::-;29795:8;:67::i;:::-;29875:70;29895:7;29904:6;29912:9;29923:6;29875:70;;;;;;;;;;;;;;;;;;;;;;;;;;29939:5;29875:19;:70::i;:::-;29965:4;29958:11;;;29342:635;;;;;:::o;37777:671::-;37840:4;37857:13;37873:20;37885:7;37873:11;:20::i;:::-;:26;;;37857:42;;37928:1;37920:5;:9;37912:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38018:5;38003:12;;:20;37995:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38094:9;:18;38104:7;38094:18;;;;;;;;;;;;;;;;38087:25;;;;;;;;;;;;;;38141:92;21442:6;38141:76;38159:57;38192:23;38209:5;38192:12;;:16;;:23;;;;:::i;:::-;38159:28;21442:6;38159:12;;:16;;:28;;;;:::i;:::-;:32;;:57;;;;:::i;:::-;38141:13;;:17;;:76;;;;:::i;:::-;:80;;:92;;;;:::i;:::-;38125:13;:108;;;;38277:1;38251:55;;38260:7;38251:55;;;38281:24;21488:6;38281:5;:9;;:24;;;;:::i;:::-;38251:55;;;;;;;;;;;;;;;;;;38341:7;38322:94;;;38350:13;;38365:24;21488:6;38365:5;:9;;:24;;;;:::i;:::-;38391;21488:6;38391:5;:9;;:24;;;;:::i;:::-;38322:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38436:4;38429:11;;;37777:671;;;:::o;43304:145::-;43365:24;43381:7;43365:8;:15;;:24;;;;:::i;:::-;43432:7;43406:34;;43420:10;43406:34;;;;;;;;;;;;43304:145;:::o;24475:132::-;24531:7;24558:41;21488:6;24558:16;24570:3;24558:11;:16::i;:::-;:22;;;:26;;:41;;;;:::i;:::-;24551:48;;24475:132;;;:::o;32744:657::-;33023:1;33007:18;;:4;:18;;;;32999:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33097:1;33083:16;;:2;:16;;;;33075:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33149:69;33167:8;33177:4;33183:2;33187:6;33195:8;33205:12;33149:17;:69::i;:::-;33231:57;33237:8;33247:4;33253:2;33257:6;33265:8;33275:12;33231:5;:57::i;:::-;33301:92;33321:8;33331:4;33337:2;33341:6;33349:8;33359:12;33373:19;33301;:92::i;:::-;32744:657;;;;;;;:::o;43158:137::-;43216:21;43229:7;43216:8;:12;;:21;;;;:::i;:::-;43278:7;43254:32;;43266:10;43254:32;;;;;;;;;;;;43158:137;:::o;25406:435::-;25478:4;25524:1;25503:23;;:9;:23;;;;25495:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25580:12;25595:10;25580:25;;25618:56;25636:4;25642;25648:9;25659:6;25618:56;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:56::i;:::-;25687:44;25693:4;25699;25705:9;25716:6;25687:44;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:44::i;:::-;25744:65;25764:4;25770;25776:9;25787:6;25744:65;;;;;;;;;;;;;;;;;;;;;;;;;;25803:5;25744:19;:65::i;:::-;25829:4;25822:11;;;25406:435;;;;:::o;39518:203::-;39590:4;39634:1;39615:21;;:7;:21;;;;39607:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39693:4;:11;;:20;39705:7;39693:20;;;;;;;;;;;;;;;;;;;;;;;;;39686:27;;39518:203;;;;:::o;31225:507::-;31286:14;;:::i;:::-;31313:22;;:::i;:::-;31338:9;:18;31348:7;31338:18;;;;;;;;;;;;;;;31313:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;31398:1;31373:7;:13;;;:27;31369:329;;;31433:1;31417:7;:13;;:17;;;;;31472:13;;31449:7;:20;;:36;;;;;31369:329;;;31531:13;;31507:7;:20;;;:37;;31503:195;;;31577:58;31614:7;:20;;;31577:32;31595:13;;31577:7;:13;;;:17;;:32;;;;:::i;:::-;:36;;:58;;;;:::i;:::-;31561:7;:13;;:74;;;;;31673:13;;31650:7;:20;;:36;;;;;31503:195;31369:329;31717:7;31710:14;;;31225:507;;;:::o;30556:661::-;30781:1;30762:21;;:7;:21;;;;30754:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30833:89;30853:8;30871:1;30875:7;30884:6;30892:8;30902:12;30916:5;30833:19;:89::i;:::-;30935:19;30957:25;21488:6;30957;:10;;:25;;;;:::i;:::-;30935:47;;31008:29;31025:11;31008:12;;:16;;:29;;;;:::i;:::-;30993:12;:44;;;;31048:33;31060:7;31069:11;31048;:33::i;:::-;31116:7;31099:57;;31106:8;31099:57;;;31125:6;31133:8;31143:12;31099:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;31099:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;31099:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31193:7;31172:37;;31189:1;31172:37;;;31202:6;31172:37;;;;;;;;;;;;;;;;;;30556:661;;;;;;:::o;41605:269::-;41697:1;41678:21;;:7;:21;;;;41670:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41772:9;;;;;;;;;;;41761:20;;:7;:20;;;;41753:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41859:7;41847:9;;:19;;;;;;;;;;;;;;;;;;41605:269;:::o;33781:630::-;34000:1;33984:18;;:4;:18;;;;33976:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34054:73;34072:8;34082:4;34096:1;34100:6;34108:4;34114:12;34054:17;:73::i;:::-;34140:19;34162:25;21488:6;34162;:10;;:25;;;;:::i;:::-;34140:47;;34215:29;34232:11;34215:12;;:16;;:29;;;;:::i;:::-;34200:12;:44;;;;34255:30;34267:4;34273:11;34255;:30::i;:::-;34320:4;34303:50;;34310:8;34303:50;;;34326:6;34334:4;34340:12;34303:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;34303:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;34303:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34392:1;34369:34;;34378:4;34369:34;;;34396:6;34369:34;;;;;;;;;;;;;;;;;;33781:630;;;;;;:::o;35882:489::-;36114:19;36136:8;;;;;;;;;;;:32;;;36169:4;22108:66;36175:28;;36136:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36136:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36136:68:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36136:68:0;;;;;;;;;;;;;;;;36114:90;;36242:1;36219:25;;:11;:25;;;;36215:149;;;36275:11;36261:39;;;36301:8;36311:4;36317:2;36321:6;36329:8;36339:12;36261:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;36261:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;36261:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36261:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36261:91:0;;;;36215:149;35882:489;;;;;;;:::o;34419:471::-;34639:19;34661:25;21488:6;34661;:10;;:25;;;;:::i;:::-;34639:47;;34699:29;34711:4;34716:11;34699;:29::i;:::-;34739:27;34751:2;34754:11;34739;:27::i;:::-;34805:2;34784:56;;34799:4;34784:56;;34789:8;34784:56;;;34809:6;34817:8;34827:12;34784:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;34784:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;34784:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34871:2;34856:26;;34865:4;34856:26;;;34875:6;34856:26;;;;;;;;;;;;;;;;;;34419:471;;;;;;;:::o;12900:184::-;12958:7;12991:1;12986;:6;;12978:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13038:9;13054:1;13050;:5;13038:17;;13075:1;13068:8;;;12900:184;;;;:::o;37073:696::-;37342:19;37364:8;;;;;;;;;;;:32;;;37397:2;22295:66;37401:31;;37364:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37364:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37364:69:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37364:69:0;;;;;;;;;;;;;;;;37342:91;;37471:1;37448:25;;:11;:25;;;;37444:318;;;37507:11;37490:44;;;37535:8;37545:4;37551:2;37555:6;37563:8;37573:12;37490:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;37490:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;37490:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37490:96:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37490:96:0;;;;37444:318;;;37608:19;37604:158;;;37653:15;:2;:13;;;:15::i;:::-;37652:16;37644:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37604:158;37444:318;37073:696;;;;;;;;:::o;13335:470::-;13393:7;13642:1;13637;:6;13633:47;;;13667:1;13660:8;;;;13633:47;13692:9;13708:1;13704;:5;13692:17;;13737:1;13732;13728;:5;;;;;;;;:10;13720:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13796:1;13789:8;;;13335:470;;;;;:::o;15063:152::-;15121:7;15154:1;15149;:6;;15141:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15206:1;15202;:5;;;;;;;;15195:12;;15063:152;;;;:::o;39240:183::-;39320:18;39324:4;39330:7;39320:3;:18::i;:::-;39312:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39410:5;39387:4;:11;;:20;39399:7;39387:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;39240:183;;:::o;38982:178::-;39060:18;39064:4;39070:7;39060:3;:18::i;:::-;39059:19;39051:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39148:4;39125;:11;;:20;39137:7;39125:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;38982:178;;:::o;12444:181::-;12502:7;12522:9;12538:1;12534;:5;12522:17;;12563:1;12558;:6;;12550:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12616:1;12609:8;;;12444:181;;;;:::o;31740:222::-;31814:22;;:::i;:::-;31839:20;31851:7;31839:11;:20::i;:::-;31814:45;;31888:25;31906:6;31888:7;:13;;;:17;;:25;;;;:::i;:::-;31872:7;:13;;:41;;;;;31947:7;31926:9;:18;31936:7;31926:18;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;;31740:222;;;:::o;31970:::-;32044:22;;:::i;:::-;32069:20;32081:7;32069:11;:20::i;:::-;32044:45;;32118:25;32136:6;32118:7;:13;;;:17;;:25;;;;:::i;:::-;32102:7;:13;;:41;;;;;32177:7;32156:9;:18;32166:7;32156:18;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;;31970:222;;;:::o;15817:422::-;15877:4;16085:12;16196:7;16184:20;16176:28;;16230:1;16223:4;:8;16216:15;;;15817:422;;;:::o;46465:2764::-;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://14a1ffdbe46054ad16a0f14292981e1e42c6b1845e892779ddcf21a37e3b7ea6
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.