ERC-20
Overview
Max Total Supply
8,150 ANT
Holders
2,166
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AntNetworkToken
Compiler Version
v0.6.6+commit.6c089d02
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-22 */ /** *Submitted for verification at Etherscan.io on 2020-09-21 */ // File: @openzeppelin/contracts/utils/EnumerableSet.sol pragma solidity ^0.6.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) {// Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @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. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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. * * IMPORTANT: 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/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @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) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); 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-contracts/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) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); 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) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly {codehash := extcodehash(account)} return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success,) = recipient.call{value : amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value : weiValue}(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol pragma solidity ^0.6.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; using Address for address; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} } // File: @openzeppelin/contracts/token/ERC20/ERC20Burnable.sol pragma solidity ^0.6.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance"); _approve(account, _msgSender(), decreasedAllowance); _burn(account, amount); } } // File: contracts/governance.sol pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; abstract contract DeligateERC20 is ERC20Burnable { /// @notice A record of each accounts delegate mapping(address => address) internal _delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @notice A record of votes checkpoints for each account, by index mapping(address => mapping(uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping(address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); /// @notice A record of states for signing / validating signatures mapping(address => uint) public nonces; // support delegates mint function _mint(address account, uint256 amount) internal override virtual { super._mint(account, amount); // add delegates to the minter _moveDelegates(address(0), _delegates[account], amount); } function _transfer(address sender, address recipient, uint256 amount) internal override virtual { super._transfer(sender, recipient, amount); _moveDelegates(_delegates[sender], _delegates[recipient], amount); } // support delegates burn function burn(uint256 amount) public override virtual { super.burn(amount); // del delegates to backhole _moveDelegates(_delegates[_msgSender()], address(0), amount); } function burnFrom(address account, uint256 amount) public override virtual { super.burnFrom(account, amount); // del delegates to the backhole _moveDelegates(_delegates[account], address(0), amount); } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode( DELEGATION_TYPEHASH, delegatee, nonce, expiry ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeparator, structHash ) ); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "Governance::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "Governance::delegateBySig: invalid nonce"); require(now <= expiry, "Governance::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint blockNumber) external view returns (uint256) { require(blockNumber < block.number, "Governance::getPriorVotes: not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); // balance of underlying balances (not scaled); _delegates[delegator] = delegatee; _moveDelegates(currentDelegate, delegatee, delegatorBalance); emit DelegateChanged(delegator, currentDelegate, delegatee); } function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld.sub(amount); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld.add(amount); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint32 blockNumber = safe32(block.number, "Governance::_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2 ** 32, errorMessage); return uint32(n); } function getChainId() internal pure returns (uint) { uint256 chainId; assembly {chainId := chainid()} return chainId; } /// @notice An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); } // SPDX-License-Identifier: AntNetwork /** * @author AntNetwork * * @dev Contract for AntNetwork token with burn support */ pragma solidity ^0.6.0; // AntNetwork erc20 Token Contract. contract AntNetworkToken is DeligateERC20, Ownable { uint256 private constant maxSupply = 21000 * 1e18; // the total supply // for minters using EnumerableSet for EnumerableSet.AddressSet; EnumerableSet.AddressSet private _minters; constructor() public ERC20("AntNetwork", "ANT") {} // mint with max supply function mint(address _to, uint256 _amount) public onlyMinter returns (bool) { if (_amount.add(totalSupply()) > maxSupply) { return false; } _mint(_to, _amount); return true; } function addMinter(address _addMinter) public onlyOwner returns (bool) { require(_addMinter != address(0), "AntNetwork: _addMinter is the zero address"); return EnumerableSet.add(_minters, _addMinter); } function delMinter(address _delMinter) public onlyOwner returns (bool) { require(_delMinter != address(0), "AntNetwork: _delMinter is the zero address"); return EnumerableSet.remove(_minters, _delMinter); } function getMinterLength() public view returns (uint256) { return EnumerableSet.length(_minters); } function isMinter(address account) public view returns (bool) { return EnumerableSet.contains(_minters, account); } // modifier for mint function modifier onlyMinter() { require(isMinter(msg.sender), "AntNetwork: caller is not the minter"); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addMinter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delMinter","type":"address"}],"name":"delMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinterLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600a81526020017f416e744e6574776f726b000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f414e5400000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000969291906200018d565b508060049080519060200190620000af9291906200018d565b506012600560006101000a81548160ff021916908360ff16021790555050506000620000e06200018560201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200023c565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001d057805160ff191683800117855562000201565b8280016001018555821562000201579182015b8281111562000200578251825591602001919060010190620001e3565b5b50905062000210919062000214565b5090565b6200023991905b80821115620002355760008160009055506001016200021b565b5090565b90565b613ea6806200024c6000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c8063782d6fe111610104578063a9059cbb116100a2578063dd62ed3e11610071578063dd62ed3e146105cb578063e7a324dc146105fb578063f1127ed814610619578063f2fde38b1461064a576101da565b8063a9059cbb1461051f578063aa271e1a1461054f578063b4b5ea571461057f578063c3cda520146105af576101da565b80638da5cb5b116100de5780638da5cb5b1461048357806395d89b41146104a1578063983b2d56146104bf578063a457c2d7146104ef576101da565b8063782d6fe11461040757806379cc6790146104375780637ecebe0014610453576101da565b8063313ce5671161017c5780635c19a95c1161014b5780635c19a95c146103815780636fcfff451461039d57806370a08231146103cd578063715018a6146103fd576101da565b8063313ce567146102e7578063395093511461030557806340c10f191461033557806342966c6814610365576101da565b806318160ddd116101b857806318160ddd1461024b57806320606b701461026957806323338b881461028757806323b872dd146102b7576101da565b80630323aac7146101df57806306fdde03146101fd578063095ea7b31461021b575b600080fd5b6101e7610666565b6040516101f49190613b83565b60405180910390f35b610205610677565b6040516102129190613961565b60405180910390f35b61023560048036038101906102309190612eec565b610719565b604051610242919061385c565b60405180910390f35b610253610737565b6040516102609190613b83565b60405180910390f35b610271610741565b60405161027e9190613877565b60405180910390f35b6102a1600480360381019061029c9190612e38565b610758565b6040516102ae919061385c565b60405180910390f35b6102d160048036038101906102cc9190612e9d565b610873565b6040516102de919061385c565b60405180910390f35b6102ef61094c565b6040516102fc9190613c0b565b60405180910390f35b61031f600480360381019061031a9190612eec565b610963565b60405161032c919061385c565b60405180910390f35b61034f600480360381019061034a9190612eec565b610a16565b60405161035c919061385c565b60405180910390f35b61037f600480360381019061037a9190612fed565b610aa9565b005b61039b60048036038101906103969190612e38565b610b27565b005b6103b760048036038101906103b29190612e38565b610b34565b6040516103c49190613bc7565b60405180910390f35b6103e760048036038101906103e29190612e38565b610b57565b6040516103f49190613b83565b60405180910390f35b610405610b9f565b005b610421600480360381019061041c9190612eec565b610cf7565b60405161042e9190613b83565b60405180910390f35b610451600480360381019061044c9190612eec565b6110a6565b005b61046d60048036038101906104689190612e38565b61111f565b60405161047a9190613b83565b60405180910390f35b61048b611137565b6040516104989190613841565b60405180910390f35b6104a9611161565b6040516104b69190613961565b60405180910390f35b6104d960048036038101906104d49190612e38565b611203565b6040516104e6919061385c565b60405180910390f35b61050960048036038101906105049190612eec565b61131e565b604051610516919061385c565b60405180910390f35b61053960048036038101906105349190612eec565b6113eb565b604051610546919061385c565b60405180910390f35b61056960048036038101906105649190612e38565b611409565b604051610576919061385c565b60405180910390f35b61059960048036038101906105949190612e38565b61141d565b6040516105a69190613b83565b60405180910390f35b6105c960048036038101906105c49190612f28565b6114f3565b005b6105e560048036038101906105e09190612e61565b611768565b6040516105f29190613b83565b60405180910390f35b6106036117ef565b6040516106109190613877565b60405180910390f35b610633600480360381019061062e9190612fb1565b611806565b604051610641929190613be2565b60405180910390f35b610664600480360381019061065f9190612e38565b611847565b005b6000610672600b611a0e565b905090565b606060038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561070f5780601f106106e45761010080835404028352916020019161070f565b820191906000526020600020905b8154815290600101906020018083116106f257829003601f168201915b5050505050905090565b600061072d610726611a23565b8484611a2b565b6001905092915050565b6000600254905090565b60405161074d90613817565b604051809103902081565b6000610762611a23565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146107f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e890613a43565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085890613a63565b60405180910390fd5b61086c600b83611bf6565b9050919050565b6000610880848484611c26565b6109418461088c611a23565b61093c85604051806060016040528060288152602001613e0060289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006108f2611a23565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cff9092919063ffffffff16565b611a2b565b600190509392505050565b6000600560009054906101000a900460ff16905090565b6000610a0c610970611a23565b84610a078560016000610981611a23565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d5a90919063ffffffff16565b611a2b565b6001905092915050565b6000610a2133611409565b610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5790613a03565b60405180910390fd5b690472698b413b43200000610a85610a76610737565b84611d5a90919063ffffffff16565b1115610a945760009050610aa3565b610a9e8383611daf565b600190505b92915050565b610ab281611e28565b610b2460066000610ac1611a23565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600083611e3c565b50565b610b3133826120d9565b50565b60086020528060005260406000206000915054906101000a900463ffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ba7611a23565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2d90613a43565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000438210610d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3290613983565b60405180910390fd5b6000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161415610da85760009150506110a0565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611610e9257600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101549150506110a0565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161115610f135760009150506110a0565b600080905060006001830390505b8163ffffffff168163ffffffff16111561103a576000600283830363ffffffff1681610f4957fe5b0482039050610f56612daf565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff161415611012578060200151955050505050506110a0565b86816000015163ffffffff16101561102c57819350611033565b6001820392505b5050610f21565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b6110b0828261224a565b61111b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600083611e3c565b5050565b60096020528060005260406000206000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111f95780601f106111ce576101008083540402835291602001916111f9565b820191906000526020600020905b8154815290600101906020018083116111dc57829003601f168201915b5050505050905090565b600061120d611a23565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461129c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129390613a43565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130390613b03565b60405180910390fd5b611317600b836122ac565b9050919050565b60006113e161132b611a23565b846113dc85604051806060016040528060258152602001613e4c6025913960016000611355611a23565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cff9092919063ffffffff16565b611a2b565b6001905092915050565b60006113ff6113f8611a23565b8484611c26565b6001905092915050565b6000611416600b836122dc565b9050919050565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16116114875760006114eb565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b600060405161150190613817565b6040518091039020611511610677565b8051906020012061152061230c565b3060405160200161153494939291906138d7565b604051602081830303815290604052805190602001209050600060405161155a9061382c565b60405180910390208888886040516020016115789493929190613892565b604051602081830303815290604052805190602001209050600082826040516020016115a59291906137e0565b6040516020818303038152906040528051906020012090506000600182888888604051600081526020016040526040516115e2949392919061391c565b6020604051602081039080840390855afa158015611604573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167790613ae3565b60405180910390fd5b600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919060010191905055891461170f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170690613b23565b60405180910390fd5b87421115611752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174990613b63565b60405180910390fd5b61175c818b6120d9565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6040516117fb9061382c565b604051809103902081565b6007602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b61184f611a23565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d590613a43565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561194e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611945906139c3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611a1c82600001612319565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9290613ac3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b02906139e3565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611be99190613b83565b60405180910390a3505050565b6000611c1e836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61232a565b905092915050565b611c31838383612412565b611cfa600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611e3c565b505050565b6000838311158290611d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3e9190613961565b60405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015611da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9c90613a23565b60405180910390fd5b8091505092915050565b611db982826126a7565b611e246000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611e3c565b5050565b611e39611e33611a23565b8261283b565b50565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611e785750600081115b156120d457600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611fa8576000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611611f1b576000611f7f565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b90506000611f9684836129e990919063ffffffff16565b9050611fa486848484612a33565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120d3576000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116120465760006120aa565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b905060006120c18483611d5a90919063ffffffff16565b90506120cf85848484612a33565b5050505b5b505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600061214884610b57565b905082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506121d3828483611e3c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a450505050565b600061228982604051806060016040528060248152602001613e286024913961227a86612275611a23565b611768565b611cff9092919063ffffffff16565b905061229d83612297611a23565b83611a2b565b6122a7838361283b565b505050565b60006122d4836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612cc1565b905092915050565b6000612304836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612d31565b905092915050565b6000804690508091505090565b600081600001805490509050919050565b60008083600101600084815260200190815260200160002054905060008114612406576000600182039050600060018660000180549050039050600086600001828154811061237557fe5b906000526020600020015490508087600001848154811061239257fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806123ca57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061240c565b60009150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247990613aa3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e9906139a3565b60405180910390fd5b6124fd838383612d54565b61256881604051806060016040528060268152602001613da0602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cff9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506125fb816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d5a90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161269a9190613b83565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270e90613b43565b60405180910390fd5b61272360008383612d54565b61273881600254611d5a90919063ffffffff16565b60028190555061278f816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d5a90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161282f9190613b83565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a290613a83565b60405180910390fd5b6128b782600083612d54565b61292281604051806060016040528060228152602001613d7e602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cff9092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612979816002546129e990919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516129dd9190613b83565b60405180910390a35050565b6000612a2b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611cff565b905092915050565b6000612a57436040518060600160405280603a8152602001613dc6603a9139612d59565b905060008463ffffffff16118015612aec57508063ffffffff16600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b15612b5d5781600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060010181905550612c6a565b60405180604001604052808263ffffffff16815260200183815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff1602179055506020820151816001015590505060018401600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051612cb2929190613b9e565b60405180910390a25050505050565b6000612ccd8383612d31565b612d26578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612d2b565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b600064010000000083108290612da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9c9190613961565b60405180910390fd5b5082905092915050565b6040518060400160405280600063ffffffff168152602001600081525090565b600081359050612dde81613d0a565b92915050565b600081359050612df381613d21565b92915050565b600081359050612e0881613d38565b92915050565b600081359050612e1d81613d4f565b92915050565b600081359050612e3281613d66565b92915050565b600060208284031215612e4a57600080fd5b6000612e5884828501612dcf565b91505092915050565b60008060408385031215612e7457600080fd5b6000612e8285828601612dcf565b9250506020612e9385828601612dcf565b9150509250929050565b600080600060608486031215612eb257600080fd5b6000612ec086828701612dcf565b9350506020612ed186828701612dcf565b9250506040612ee286828701612df9565b9150509250925092565b60008060408385031215612eff57600080fd5b6000612f0d85828601612dcf565b9250506020612f1e85828601612df9565b9150509250929050565b60008060008060008060c08789031215612f4157600080fd5b6000612f4f89828a01612dcf565b9650506020612f6089828a01612df9565b9550506040612f7189828a01612df9565b9450506060612f8289828a01612e23565b9350506080612f9389828a01612de4565b92505060a0612fa489828a01612de4565b9150509295509295509295565b60008060408385031215612fc457600080fd5b6000612fd285828601612dcf565b9250506020612fe385828601612e0e565b9150509250929050565b600060208284031215612fff57600080fd5b600061300d84828501612df9565b91505092915050565b61301f81613c4d565b82525050565b61302e81613c5f565b82525050565b61303d81613c6b565b82525050565b61305461304f82613c6b565b613cef565b82525050565b600061306582613c26565b61306f8185613c31565b935061307f818560208601613cbc565b61308881613cf9565b840191505092915050565b60006130a0602d83613c31565b91507f476f7665726e616e63653a3a6765745072696f72566f7465733a206e6f74207960008301527f65742064657465726d696e6564000000000000000000000000000000000000006020830152604082019050919050565b6000613106602383613c31565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061316c602683613c31565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131d2602283613c31565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613238602483613c31565b91507f416e744e6574776f726b3a2063616c6c6572206973206e6f7420746865206d6960008301527f6e746572000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061329e600283613c42565b91507f19010000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006132de601b83613c31565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061331e604383613c42565b91507f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353660008301527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208301527f63742900000000000000000000000000000000000000000000000000000000006040830152604382019050919050565b60006133aa602083613c31565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006133ea602a83613c31565b91507f416e744e6574776f726b3a205f64656c4d696e74657220697320746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613450602183613c31565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134b6602583613c31565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061351c602483613c31565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613582602c83613c31565b91507f476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c60008301527f6964207369676e617475726500000000000000000000000000000000000000006020830152604082019050919050565b60006135e8603a83613c42565b91507f44656c65676174696f6e28616464726573732064656c6567617465652c75696e60008301527f74323536206e6f6e63652c75696e7432353620657870697279290000000000006020830152603a82019050919050565b600061364e602a83613c31565b91507f416e744e6574776f726b3a205f6164644d696e74657220697320746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006136b4602883613c31565b91507f476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c60008301527f6964206e6f6e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b600061371a601f83613c31565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b600061375a602c83613c31565b91507f476f7665726e616e63653a3a64656c656761746542795369673a207369676e6160008301527f74757265206578706972656400000000000000000000000000000000000000006020830152604082019050919050565b6137bc81613c95565b82525050565b6137cb81613c9f565b82525050565b6137da81613caf565b82525050565b60006137eb82613291565b91506137f78285613043565b6020820191506138078284613043565b6020820191508190509392505050565b600061382282613311565b9150819050919050565b6000613837826135db565b9150819050919050565b60006020820190506138566000830184613016565b92915050565b60006020820190506138716000830184613025565b92915050565b600060208201905061388c6000830184613034565b92915050565b60006080820190506138a76000830187613034565b6138b46020830186613016565b6138c160408301856137b3565b6138ce60608301846137b3565b95945050505050565b60006080820190506138ec6000830187613034565b6138f96020830186613034565b61390660408301856137b3565b6139136060830184613016565b95945050505050565b60006080820190506139316000830187613034565b61393e60208301866137d1565b61394b6040830185613034565b6139586060830184613034565b95945050505050565b6000602082019050818103600083015261397b818461305a565b905092915050565b6000602082019050818103600083015261399c81613093565b9050919050565b600060208201905081810360008301526139bc816130f9565b9050919050565b600060208201905081810360008301526139dc8161315f565b9050919050565b600060208201905081810360008301526139fc816131c5565b9050919050565b60006020820190508181036000830152613a1c8161322b565b9050919050565b60006020820190508181036000830152613a3c816132d1565b9050919050565b60006020820190508181036000830152613a5c8161339d565b9050919050565b60006020820190508181036000830152613a7c816133dd565b9050919050565b60006020820190508181036000830152613a9c81613443565b9050919050565b60006020820190508181036000830152613abc816134a9565b9050919050565b60006020820190508181036000830152613adc8161350f565b9050919050565b60006020820190508181036000830152613afc81613575565b9050919050565b60006020820190508181036000830152613b1c81613641565b9050919050565b60006020820190508181036000830152613b3c816136a7565b9050919050565b60006020820190508181036000830152613b5c8161370d565b9050919050565b60006020820190508181036000830152613b7c8161374d565b9050919050565b6000602082019050613b9860008301846137b3565b92915050565b6000604082019050613bb360008301856137b3565b613bc060208301846137b3565b9392505050565b6000602082019050613bdc60008301846137c2565b92915050565b6000604082019050613bf760008301856137c2565b613c0460208301846137b3565b9392505050565b6000602082019050613c2060008301846137d1565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000613c5882613c75565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60005b83811015613cda578082015181840152602081019050613cbf565b83811115613ce9576000848401525b50505050565b6000819050919050565b6000601f19601f8301169050919050565b613d1381613c4d565b8114613d1e57600080fd5b50565b613d2a81613c6b565b8114613d3557600080fd5b50565b613d4181613c95565b8114613d4c57600080fd5b50565b613d5881613c9f565b8114613d6357600080fd5b50565b613d6f81613caf565b8114613d7a57600080fd5b5056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365476f7665726e616e63653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747345524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122083665a0eeb0e74d445c5a8f8429a7a3c0c2729e51beeef4449859b593d276d0e64736f6c63430006060033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c8063782d6fe111610104578063a9059cbb116100a2578063dd62ed3e11610071578063dd62ed3e146105cb578063e7a324dc146105fb578063f1127ed814610619578063f2fde38b1461064a576101da565b8063a9059cbb1461051f578063aa271e1a1461054f578063b4b5ea571461057f578063c3cda520146105af576101da565b80638da5cb5b116100de5780638da5cb5b1461048357806395d89b41146104a1578063983b2d56146104bf578063a457c2d7146104ef576101da565b8063782d6fe11461040757806379cc6790146104375780637ecebe0014610453576101da565b8063313ce5671161017c5780635c19a95c1161014b5780635c19a95c146103815780636fcfff451461039d57806370a08231146103cd578063715018a6146103fd576101da565b8063313ce567146102e7578063395093511461030557806340c10f191461033557806342966c6814610365576101da565b806318160ddd116101b857806318160ddd1461024b57806320606b701461026957806323338b881461028757806323b872dd146102b7576101da565b80630323aac7146101df57806306fdde03146101fd578063095ea7b31461021b575b600080fd5b6101e7610666565b6040516101f49190613b83565b60405180910390f35b610205610677565b6040516102129190613961565b60405180910390f35b61023560048036038101906102309190612eec565b610719565b604051610242919061385c565b60405180910390f35b610253610737565b6040516102609190613b83565b60405180910390f35b610271610741565b60405161027e9190613877565b60405180910390f35b6102a1600480360381019061029c9190612e38565b610758565b6040516102ae919061385c565b60405180910390f35b6102d160048036038101906102cc9190612e9d565b610873565b6040516102de919061385c565b60405180910390f35b6102ef61094c565b6040516102fc9190613c0b565b60405180910390f35b61031f600480360381019061031a9190612eec565b610963565b60405161032c919061385c565b60405180910390f35b61034f600480360381019061034a9190612eec565b610a16565b60405161035c919061385c565b60405180910390f35b61037f600480360381019061037a9190612fed565b610aa9565b005b61039b60048036038101906103969190612e38565b610b27565b005b6103b760048036038101906103b29190612e38565b610b34565b6040516103c49190613bc7565b60405180910390f35b6103e760048036038101906103e29190612e38565b610b57565b6040516103f49190613b83565b60405180910390f35b610405610b9f565b005b610421600480360381019061041c9190612eec565b610cf7565b60405161042e9190613b83565b60405180910390f35b610451600480360381019061044c9190612eec565b6110a6565b005b61046d60048036038101906104689190612e38565b61111f565b60405161047a9190613b83565b60405180910390f35b61048b611137565b6040516104989190613841565b60405180910390f35b6104a9611161565b6040516104b69190613961565b60405180910390f35b6104d960048036038101906104d49190612e38565b611203565b6040516104e6919061385c565b60405180910390f35b61050960048036038101906105049190612eec565b61131e565b604051610516919061385c565b60405180910390f35b61053960048036038101906105349190612eec565b6113eb565b604051610546919061385c565b60405180910390f35b61056960048036038101906105649190612e38565b611409565b604051610576919061385c565b60405180910390f35b61059960048036038101906105949190612e38565b61141d565b6040516105a69190613b83565b60405180910390f35b6105c960048036038101906105c49190612f28565b6114f3565b005b6105e560048036038101906105e09190612e61565b611768565b6040516105f29190613b83565b60405180910390f35b6106036117ef565b6040516106109190613877565b60405180910390f35b610633600480360381019061062e9190612fb1565b611806565b604051610641929190613be2565b60405180910390f35b610664600480360381019061065f9190612e38565b611847565b005b6000610672600b611a0e565b905090565b606060038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561070f5780601f106106e45761010080835404028352916020019161070f565b820191906000526020600020905b8154815290600101906020018083116106f257829003601f168201915b5050505050905090565b600061072d610726611a23565b8484611a2b565b6001905092915050565b6000600254905090565b60405161074d90613817565b604051809103902081565b6000610762611a23565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146107f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e890613a43565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085890613a63565b60405180910390fd5b61086c600b83611bf6565b9050919050565b6000610880848484611c26565b6109418461088c611a23565b61093c85604051806060016040528060288152602001613e0060289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006108f2611a23565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cff9092919063ffffffff16565b611a2b565b600190509392505050565b6000600560009054906101000a900460ff16905090565b6000610a0c610970611a23565b84610a078560016000610981611a23565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d5a90919063ffffffff16565b611a2b565b6001905092915050565b6000610a2133611409565b610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5790613a03565b60405180910390fd5b690472698b413b43200000610a85610a76610737565b84611d5a90919063ffffffff16565b1115610a945760009050610aa3565b610a9e8383611daf565b600190505b92915050565b610ab281611e28565b610b2460066000610ac1611a23565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600083611e3c565b50565b610b3133826120d9565b50565b60086020528060005260406000206000915054906101000a900463ffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ba7611a23565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2d90613a43565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000438210610d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3290613983565b60405180910390fd5b6000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161415610da85760009150506110a0565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611610e9257600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101549150506110a0565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161115610f135760009150506110a0565b600080905060006001830390505b8163ffffffff168163ffffffff16111561103a576000600283830363ffffffff1681610f4957fe5b0482039050610f56612daf565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff161415611012578060200151955050505050506110a0565b86816000015163ffffffff16101561102c57819350611033565b6001820392505b5050610f21565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b6110b0828261224a565b61111b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600083611e3c565b5050565b60096020528060005260406000206000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111f95780601f106111ce576101008083540402835291602001916111f9565b820191906000526020600020905b8154815290600101906020018083116111dc57829003601f168201915b5050505050905090565b600061120d611a23565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461129c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129390613a43565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130390613b03565b60405180910390fd5b611317600b836122ac565b9050919050565b60006113e161132b611a23565b846113dc85604051806060016040528060258152602001613e4c6025913960016000611355611a23565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cff9092919063ffffffff16565b611a2b565b6001905092915050565b60006113ff6113f8611a23565b8484611c26565b6001905092915050565b6000611416600b836122dc565b9050919050565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16116114875760006114eb565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b600060405161150190613817565b6040518091039020611511610677565b8051906020012061152061230c565b3060405160200161153494939291906138d7565b604051602081830303815290604052805190602001209050600060405161155a9061382c565b60405180910390208888886040516020016115789493929190613892565b604051602081830303815290604052805190602001209050600082826040516020016115a59291906137e0565b6040516020818303038152906040528051906020012090506000600182888888604051600081526020016040526040516115e2949392919061391c565b6020604051602081039080840390855afa158015611604573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167790613ae3565b60405180910390fd5b600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919060010191905055891461170f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170690613b23565b60405180910390fd5b87421115611752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174990613b63565b60405180910390fd5b61175c818b6120d9565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6040516117fb9061382c565b604051809103902081565b6007602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b61184f611a23565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d590613a43565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561194e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611945906139c3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611a1c82600001612319565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9290613ac3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b02906139e3565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611be99190613b83565b60405180910390a3505050565b6000611c1e836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61232a565b905092915050565b611c31838383612412565b611cfa600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611e3c565b505050565b6000838311158290611d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3e9190613961565b60405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015611da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9c90613a23565b60405180910390fd5b8091505092915050565b611db982826126a7565b611e246000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611e3c565b5050565b611e39611e33611a23565b8261283b565b50565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611e785750600081115b156120d457600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611fa8576000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611611f1b576000611f7f565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b90506000611f9684836129e990919063ffffffff16565b9050611fa486848484612a33565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120d3576000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116120465760006120aa565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b905060006120c18483611d5a90919063ffffffff16565b90506120cf85848484612a33565b5050505b5b505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600061214884610b57565b905082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506121d3828483611e3c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a450505050565b600061228982604051806060016040528060248152602001613e286024913961227a86612275611a23565b611768565b611cff9092919063ffffffff16565b905061229d83612297611a23565b83611a2b565b6122a7838361283b565b505050565b60006122d4836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612cc1565b905092915050565b6000612304836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612d31565b905092915050565b6000804690508091505090565b600081600001805490509050919050565b60008083600101600084815260200190815260200160002054905060008114612406576000600182039050600060018660000180549050039050600086600001828154811061237557fe5b906000526020600020015490508087600001848154811061239257fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806123ca57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061240c565b60009150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247990613aa3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e9906139a3565b60405180910390fd5b6124fd838383612d54565b61256881604051806060016040528060268152602001613da0602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cff9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506125fb816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d5a90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161269a9190613b83565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270e90613b43565b60405180910390fd5b61272360008383612d54565b61273881600254611d5a90919063ffffffff16565b60028190555061278f816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d5a90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161282f9190613b83565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a290613a83565b60405180910390fd5b6128b782600083612d54565b61292281604051806060016040528060228152602001613d7e602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cff9092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612979816002546129e990919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516129dd9190613b83565b60405180910390a35050565b6000612a2b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611cff565b905092915050565b6000612a57436040518060600160405280603a8152602001613dc6603a9139612d59565b905060008463ffffffff16118015612aec57508063ffffffff16600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b15612b5d5781600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060010181905550612c6a565b60405180604001604052808263ffffffff16815260200183815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff1602179055506020820151816001015590505060018401600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051612cb2929190613b9e565b60405180910390a25050505050565b6000612ccd8383612d31565b612d26578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612d2b565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b600064010000000083108290612da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9c9190613961565b60405180910390fd5b5082905092915050565b6040518060400160405280600063ffffffff168152602001600081525090565b600081359050612dde81613d0a565b92915050565b600081359050612df381613d21565b92915050565b600081359050612e0881613d38565b92915050565b600081359050612e1d81613d4f565b92915050565b600081359050612e3281613d66565b92915050565b600060208284031215612e4a57600080fd5b6000612e5884828501612dcf565b91505092915050565b60008060408385031215612e7457600080fd5b6000612e8285828601612dcf565b9250506020612e9385828601612dcf565b9150509250929050565b600080600060608486031215612eb257600080fd5b6000612ec086828701612dcf565b9350506020612ed186828701612dcf565b9250506040612ee286828701612df9565b9150509250925092565b60008060408385031215612eff57600080fd5b6000612f0d85828601612dcf565b9250506020612f1e85828601612df9565b9150509250929050565b60008060008060008060c08789031215612f4157600080fd5b6000612f4f89828a01612dcf565b9650506020612f6089828a01612df9565b9550506040612f7189828a01612df9565b9450506060612f8289828a01612e23565b9350506080612f9389828a01612de4565b92505060a0612fa489828a01612de4565b9150509295509295509295565b60008060408385031215612fc457600080fd5b6000612fd285828601612dcf565b9250506020612fe385828601612e0e565b9150509250929050565b600060208284031215612fff57600080fd5b600061300d84828501612df9565b91505092915050565b61301f81613c4d565b82525050565b61302e81613c5f565b82525050565b61303d81613c6b565b82525050565b61305461304f82613c6b565b613cef565b82525050565b600061306582613c26565b61306f8185613c31565b935061307f818560208601613cbc565b61308881613cf9565b840191505092915050565b60006130a0602d83613c31565b91507f476f7665726e616e63653a3a6765745072696f72566f7465733a206e6f74207960008301527f65742064657465726d696e6564000000000000000000000000000000000000006020830152604082019050919050565b6000613106602383613c31565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061316c602683613c31565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131d2602283613c31565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613238602483613c31565b91507f416e744e6574776f726b3a2063616c6c6572206973206e6f7420746865206d6960008301527f6e746572000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061329e600283613c42565b91507f19010000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006132de601b83613c31565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061331e604383613c42565b91507f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353660008301527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208301527f63742900000000000000000000000000000000000000000000000000000000006040830152604382019050919050565b60006133aa602083613c31565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006133ea602a83613c31565b91507f416e744e6574776f726b3a205f64656c4d696e74657220697320746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613450602183613c31565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134b6602583613c31565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061351c602483613c31565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613582602c83613c31565b91507f476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c60008301527f6964207369676e617475726500000000000000000000000000000000000000006020830152604082019050919050565b60006135e8603a83613c42565b91507f44656c65676174696f6e28616464726573732064656c6567617465652c75696e60008301527f74323536206e6f6e63652c75696e7432353620657870697279290000000000006020830152603a82019050919050565b600061364e602a83613c31565b91507f416e744e6574776f726b3a205f6164644d696e74657220697320746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006136b4602883613c31565b91507f476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c60008301527f6964206e6f6e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b600061371a601f83613c31565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b600061375a602c83613c31565b91507f476f7665726e616e63653a3a64656c656761746542795369673a207369676e6160008301527f74757265206578706972656400000000000000000000000000000000000000006020830152604082019050919050565b6137bc81613c95565b82525050565b6137cb81613c9f565b82525050565b6137da81613caf565b82525050565b60006137eb82613291565b91506137f78285613043565b6020820191506138078284613043565b6020820191508190509392505050565b600061382282613311565b9150819050919050565b6000613837826135db565b9150819050919050565b60006020820190506138566000830184613016565b92915050565b60006020820190506138716000830184613025565b92915050565b600060208201905061388c6000830184613034565b92915050565b60006080820190506138a76000830187613034565b6138b46020830186613016565b6138c160408301856137b3565b6138ce60608301846137b3565b95945050505050565b60006080820190506138ec6000830187613034565b6138f96020830186613034565b61390660408301856137b3565b6139136060830184613016565b95945050505050565b60006080820190506139316000830187613034565b61393e60208301866137d1565b61394b6040830185613034565b6139586060830184613034565b95945050505050565b6000602082019050818103600083015261397b818461305a565b905092915050565b6000602082019050818103600083015261399c81613093565b9050919050565b600060208201905081810360008301526139bc816130f9565b9050919050565b600060208201905081810360008301526139dc8161315f565b9050919050565b600060208201905081810360008301526139fc816131c5565b9050919050565b60006020820190508181036000830152613a1c8161322b565b9050919050565b60006020820190508181036000830152613a3c816132d1565b9050919050565b60006020820190508181036000830152613a5c8161339d565b9050919050565b60006020820190508181036000830152613a7c816133dd565b9050919050565b60006020820190508181036000830152613a9c81613443565b9050919050565b60006020820190508181036000830152613abc816134a9565b9050919050565b60006020820190508181036000830152613adc8161350f565b9050919050565b60006020820190508181036000830152613afc81613575565b9050919050565b60006020820190508181036000830152613b1c81613641565b9050919050565b60006020820190508181036000830152613b3c816136a7565b9050919050565b60006020820190508181036000830152613b5c8161370d565b9050919050565b60006020820190508181036000830152613b7c8161374d565b9050919050565b6000602082019050613b9860008301846137b3565b92915050565b6000604082019050613bb360008301856137b3565b613bc060208301846137b3565b9392505050565b6000602082019050613bdc60008301846137c2565b92915050565b6000604082019050613bf760008301856137c2565b613c0460208301846137b3565b9392505050565b6000602082019050613c2060008301846137d1565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000613c5882613c75565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60005b83811015613cda578082015181840152602081019050613cbf565b83811115613ce9576000848401525b50505050565b6000819050919050565b6000601f19601f8301169050919050565b613d1381613c4d565b8114613d1e57600080fd5b50565b613d2a81613c6b565b8114613d3557600080fd5b50565b613d4181613c95565b8114613d4c57600080fd5b50565b613d5881613c9f565b8114613d6357600080fd5b50565b613d6f81613caf565b8114613d7a57600080fd5b5056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365476f7665726e616e63653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747345524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122083665a0eeb0e74d445c5a8f8429a7a3c0c2729e51beeef4449859b593d276d0e64736f6c63430006060033
Deployed Bytecode Sourcemap
47357:1491:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;47357:1491:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;48430:113:0;;;:::i;:::-;;;;;;;;;;;;;;;;28068:83;;;:::i;:::-;;;;;;;;;;;;;;;;30174:169;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;29143:100;;;:::i;:::-;;;;;;;;;;;;;;;;38835:122;;;:::i;:::-;;;;;;;;;;;;;;;;48191:231;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;30817:321;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28995:83;;;:::i;:::-;;;;;;;;;;;;;;;;31547:218;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;47713:232;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39840:202;;;;;;;;;;;;;;;;:::i;:::-;;40430:104;;;;;;;;;;;;;;;;:::i;:::-;;38714:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;29306:119;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;10898:148;;;:::i;:::-;;43035:1260;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;40050:235;;;;;;;;;;;;;;;;:::i;:::-;;39249:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;10256:79;;;:::i;:::-;;;;;;;;;;;;;;;;28270:87;;;:::i;:::-;;;;;;;;;;;;;;;;47955:228;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;32268:269;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;29638:175;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;48551:129;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;42361:243;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;40968:1192;;;;;;;;;;;;;;;;:::i;:::-;;29876:151;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39051:117;;;:::i;:::-;;;;;;;;;;;;;;;;38577:68;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;11201:244;;;;;;;;;;;;;;;;:::i;:::-;;48430:113;48478:7;48505:30;48526:8;48505:20;:30::i;:::-;48498:37;;48430:113;:::o;28068:83::-;28105:13;28138:5;28131:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28068:83;:::o;30174:169::-;30257:4;30274:39;30283:12;:10;:12::i;:::-;30297:7;30306:6;30274:8;:39::i;:::-;30331:4;30324:11;;30174:169;;;;:::o;29143:100::-;29196:7;29223:12;;29216:19;;29143:100;:::o;38835:122::-;38877:80;;;;;;;;;;;;;;38835:122;:::o;48191:231::-;48256:4;10478:12;:10;:12::i;:::-;10468:22;;:6;;;;;;;;;;;:22;;;10460:67;;;;;;;;;;;;;;;;;;;;;;48303:1:::1;48281:24;;:10;:24;;;;48273:79;;;;;;;;;;;;;;;;;;;;;;48372:42;48393:8;48403:10;48372:20;:42::i;:::-;48365:49;;48191:231:::0;;;:::o;30817:321::-;30923:4;30940:36;30950:6;30958:9;30969:6;30940:9;:36::i;:::-;30987:121;30996:6;31004:12;:10;:12::i;:::-;31018:89;31056:6;31018:89;;;;;;;;;;;;;;;;;:11;:19;31030:6;31018:19;;;;;;;;;;;;;;;:33;31038:12;:10;:12::i;:::-;31018:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;30987:8;:121::i;:::-;31126:4;31119:11;;30817:321;;;;;:::o;28995:83::-;29036:5;29061:9;;;;;;;;;;;29054:16;;28995:83;:::o;31547:218::-;31635:4;31652:83;31661:12;:10;:12::i;:::-;31675:7;31684:50;31723:10;31684:11;:25;31696:12;:10;:12::i;:::-;31684:25;;;;;;;;;;;;;;;:34;31710:7;31684:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;31652:8;:83::i;:::-;31753:4;31746:11;;31547:218;;;;:::o;47713:232::-;47784:4;48764:20;48773:10;48764:8;:20::i;:::-;48756:69;;;;;;;;;;;;;;;;;;;;;;47452:12:::1;47805:26;47817:13;:11;:13::i;:::-;47805:7;:11;;:26;;;;:::i;:::-;:38;47801:83;;;47867:5;47860:12;;;;47801:83;47896:19;47902:3;47907:7;47896:5;:19::i;:::-;47933:4;47926:11;;48836:1;47713:232:::0;;;;:::o;39840:202::-;39905:18;39916:6;39905:10;:18::i;:::-;39974:60;39989:10;:24;40000:12;:10;:12::i;:::-;39989:24;;;;;;;;;;;;;;;;;;;;;;;;;40023:1;40027:6;39974:14;:60::i;:::-;39840:202;:::o;40430:104::-;40494:32;40504:10;40516:9;40494;:32::i;:::-;40430:104;:::o;38714:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;29306:119::-;29372:7;29399:9;:18;29409:7;29399:18;;;;;;;;;;;;;;;;29392:25;;29306:119;;;:::o;10898:148::-;10478:12;:10;:12::i;:::-;10468:22;;:6;;;;;;;;;;;:22;;;10460:67;;;;;;;;;;;;;;;;;;;;;;11005:1:::1;10968:40;;10989:6;;;;;;;;;;;10968:40;;;;;;;;;;;;11036:1;11019:6;;:19;;;;;;;;;;;;;;;;;;10898:148::o:0;43035:1260::-;43131:7;43178:12;43164:11;:26;43156:84;;;;;;;;;;;;;;;;;;;;;;43253:19;43275:14;:23;43290:7;43275:23;;;;;;;;;;;;;;;;;;;;;;;;;43253:45;;43329:1;43313:12;:17;;;43309:58;;;43354:1;43347:8;;;;;43309:58;43479:11;43427;:20;43439:7;43427:20;;;;;;;;;;;;;;;:38;43463:1;43448:12;:16;43427:38;;;;;;;;;;;;;;;:48;;;;;;;;;;;;:63;;;43423:147;;43514:11;:20;43526:7;43514:20;;;;;;;;;;;;;;;:38;43550:1;43535:12;:16;43514:38;;;;;;;;;;;;;;;:44;;;43507:51;;;;;43423:147;43667:11;43631;:20;43643:7;43631:20;;;;;;;;;;;;;;;:23;43652:1;43631:23;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;43627:88;;;43702:1;43695:8;;;;;43627:88;43727:12;43742:1;43727:16;;43754:12;43784:1;43769:12;:16;43754:31;;43796:441;43811:5;43803:13;;:5;:13;;;43796:441;;;43833:13;43875:1;43866:5;43858;:13;43857:19;;;;;;;;43849:5;:27;43833:43;;43931:20;;:::i;:::-;43954:11;:20;43966:7;43954:20;;;;;;;;;;;;;;;:28;43975:6;43954:28;;;;;;;;;;;;;;;43931:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44017:11;44001:2;:12;;;:27;;;43997:229;;;44056:2;:8;;;44049:15;;;;;;;;;43997:229;44105:11;44090:2;:12;;;:26;;;44086:140;;;44145:6;44137:14;;44086:140;;;44209:1;44200:6;:10;44192:18;;44086:140;43796:441;;;;;44254:11;:20;44266:7;44254:20;;;;;;;;;;;;;;;:27;44275:5;44254:27;;;;;;;;;;;;;;;:33;;;44247:40;;;;;43035:1260;;;;;:::o;40050:235::-;40136:31;40151:7;40160:6;40136:14;:31::i;:::-;40222:55;40237:10;:19;40248:7;40237:19;;;;;;;;;;;;;;;;;;;;;;;;;40266:1;40270:6;40222:14;:55::i;:::-;40050:235;;:::o;39249:38::-;;;;;;;;;;;;;;;;;:::o;10256:79::-;10294:7;10321:6;;;;;;;;;;;10314:13;;10256:79;:::o;28270:87::-;28309:13;28342:7;28335:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28270:87;:::o;47955:228::-;48020:4;10478:12;:10;:12::i;:::-;10468:22;;:6;;;;;;;;;;;:22;;;10460:67;;;;;;;;;;;;;;;;;;;;;;48067:1:::1;48045:24;;:10;:24;;;;48037:79;;;;;;;;;;;;;;;;;;;;;;48136:39;48154:8;48164:10;48136:17;:39::i;:::-;48129:46;;47955:228:::0;;;:::o;32268:269::-;32361:4;32378:129;32387:12;:10;:12::i;:::-;32401:7;32410:96;32449:15;32410:96;;;;;;;;;;;;;;;;;:11;:25;32422:12;:10;:12::i;:::-;32410:25;;;;;;;;;;;;;;;:34;32436:7;32410:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;32378:8;:129::i;:::-;32525:4;32518:11;;32268:269;;;;:::o;29638:175::-;29724:4;29741:42;29751:12;:10;:12::i;:::-;29765:9;29776:6;29741:9;:42::i;:::-;29801:4;29794:11;;29638:175;;;;:::o;48551:129::-;48607:4;48631:41;48654:8;48664:7;48631:22;:41::i;:::-;48624:48;;48551:129;;;:::o;42361:243::-;42441:7;42466:19;42488:14;:23;42503:7;42488:23;;;;;;;;;;;;;;;;;;;;;;;;;42466:45;;42544:1;42529:12;:16;;;:67;;42595:1;42529:67;;;42548:11;:20;42560:7;42548:20;;;;;;;;;;;;;;;:38;42584:1;42569:12;:16;42548:38;;;;;;;;;;;;;;;:44;;;42529:67;42522:74;;;42361:243;;;:::o;40968:1192::-;41157:23;38877:80;;;;;;;;;;;;;;41286:6;:4;:6::i;:::-;41270:24;;;;;;41313:12;:10;:12::i;:::-;41352:4;41207:165;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;41207:165:0;;;41183:200;;;;;;41157:226;;41396:18;39097:71;;;;;;;;;;;;;;41508:9;41536:5;41560:6;41441:140;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;41441:140:0;;;41417:175;;;;;;41396:196;;41605:14;41710:15;41744:10;41646:123;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;41646:123:0;;;41622:158;;;;;;41605:175;;41793:17;41813:26;41823:6;41831:1;41834;41837;41813:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41813:26:0;;;;;;;;41793:46;;41879:1;41858:23;;:9;:23;;;;41850:80;;;;;;;;;;;;;;;;;;;;;;41958:6;:17;41965:9;41958:17;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;41949:5;:28;41941:81;;;;;;;;;;;;;;;;;;;;;;42048:6;42041:3;:13;;42033:70;;;;;;;;;;;;;;;;;;;;;;42121:31;42131:9;42142;42121;:31::i;:::-;42114:38;;;;40968:1192;;;;;;:::o;29876:151::-;29965:7;29992:11;:18;30004:5;29992:18;;;;;;;;;;;;;;;:27;30011:7;29992:27;;;;;;;;;;;;;;;;29985:34;;29876:151;;;;:::o;39051:117::-;39097:71;;;;;;;;;;;;;;39051:117;:::o;38577:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11201:244::-;10478:12;:10;:12::i;:::-;10468:22;;:6;;;;;;;;;;;:22;;;10460:67;;;;;;;;;;;;;;;;;;;;;;11310:1:::1;11290:22;;:8;:22;;;;11282:73;;;;;;;;;;;;;;;;;;;;;;11400:8;11371:38;;11392:6;;;;;;;;;;;11371:38;;;;;;;;;;;;11429:8;11420:6;;:17;;;;;;;;;;;;;;;;;;11201:244:::0;:::o;5929:117::-;5992:7;6019:19;6027:3;:10;;6019:7;:19::i;:::-;6012:26;;5929:117;;;:::o;8799:106::-;8852:15;8887:10;8880:17;;8799:106;:::o;35415:346::-;35534:1;35517:19;;:5;:19;;;;35509:68;;;;;;;;;;;;;;;;;;;;;;35615:1;35596:21;;:7;:21;;;;35588:68;;;;;;;;;;;;;;;;;;;;;;35699:6;35669:11;:18;35681:5;35669:18;;;;;;;;;;;;;;;:27;35688:7;35669:27;;;;;;;;;;;;;;;:36;;;;35737:7;35721:32;;35730:5;35721:32;;;35746:6;35721:32;;;;;;;;;;;;;;;35415:346;;;:::o;5450:149::-;5523:4;5547:44;5555:3;:10;;5583:5;5575:14;;5567:23;;5547:7;:44::i;:::-;5540:51;;5450:149;;;;:::o;39566:233::-;39673:42;39689:6;39697:9;39708:6;39673:15;:42::i;:::-;39726:65;39741:10;:18;39752:6;39741:18;;;;;;;;;;;;;;;;;;;;;;;;;39761:10;:21;39772:9;39761:21;;;;;;;;;;;;;;;;;;;;;;;;;39784:6;39726:14;:65::i;:::-;39566:233;;;:::o;16083:192::-;16169:7;16202:1;16197;:6;;16205:12;16189:29;;;;;;;;;;;;;;;;;;;;;;;;;16229:9;16245:1;16241;:5;16229:17;;16266:1;16259:8;;;16083:192;;;;;:::o;15180:181::-;15238:7;15258:9;15274:1;15270;:5;15258:17;;15299:1;15294;:6;;15286:46;;;;;;;;;;;;;;;;;;;;;;15352:1;15345:8;;;15180:181;;;;:::o;39329:229::-;39414:28;39426:7;39435:6;39414:11;:28::i;:::-;39495:55;39518:1;39522:10;:19;39533:7;39522:19;;;;;;;;;;;;;;;;;;;;;;;;;39543:6;39495:14;:55::i;:::-;39329:229;;:::o;37364:91::-;37420:27;37426:12;:10;:12::i;:::-;37440:6;37420:5;:27::i;:::-;37364:91;:::o;44757:947::-;44863:6;44853:16;;:6;:16;;;;:30;;;;;44882:1;44873:6;:10;44853:30;44849:848;;;44922:1;44904:20;;:6;:20;;;44900:385;;44993:16;45012:14;:22;45027:6;45012:22;;;;;;;;;;;;;;;;;;;;;;;;;44993:41;;45053:17;45085:1;45073:9;:13;;;:60;;45132:1;45073:60;;;45089:11;:19;45101:6;45089:19;;;;;;;;;;;;;;;:34;45121:1;45109:9;:13;45089:34;;;;;;;;;;;;;;;:40;;;45073:60;45053:80;;45152:17;45172:21;45186:6;45172:9;:13;;:21;;;;:::i;:::-;45152:41;;45212:57;45229:6;45237:9;45248;45259;45212:16;:57::i;:::-;44900:385;;;;45323:1;45305:20;;:6;:20;;;45301:385;;45394:16;45413:14;:22;45428:6;45413:22;;;;;;;;;;;;;;;;;;;;;;;;;45394:41;;45454:17;45486:1;45474:9;:13;;;:60;;45533:1;45474:60;;;45490:11;:19;45502:6;45490:19;;;;;;;;;;;;;;;:34;45522:1;45510:9;:13;45490:34;;;;;;;;;;;;;;;:40;;;45474:60;45454:80;;45553:17;45573:21;45587:6;45573:9;:13;;:21;;;;:::i;:::-;45553:41;;45613:57;45630:6;45638:9;45649;45660;45613:16;:57::i;:::-;45301:385;;;;44849:848;44757:947;;;:::o;44303:446::-;44390:23;44416:10;:21;44427:9;44416:21;;;;;;;;;;;;;;;;;;;;;;;;;44390:47;;44448:24;44475:20;44485:9;44475;:20::i;:::-;44448:47;;44587:9;44563:10;:21;44574:9;44563:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;44609:60;44624:15;44641:9;44652:16;44609:14;:60::i;:::-;44731:9;44687:54;;44714:15;44687:54;;44703:9;44687:54;;;;;;;;;;;;44303:446;;;;:::o;37774:295::-;37851:26;37880:84;37917:6;37880:84;;;;;;;;;;;;;;;;;:32;37890:7;37899:12;:10;:12::i;:::-;37880:9;:32::i;:::-;:36;;:84;;;;;:::i;:::-;37851:113;;37977:51;37986:7;37995:12;:10;:12::i;:::-;38009:18;37977:8;:51::i;:::-;38039:22;38045:7;38054:6;38039:5;:22::i;:::-;37774:295;;;:::o;5131:143::-;5201:4;5225:41;5230:3;:10;;5258:5;5250:14;;5242:23;;5225:4;:41::i;:::-;5218:48;;5131:143;;;;:::o;5685:158::-;5765:4;5789:46;5799:3;:10;;5827:5;5819:14;;5811:23;;5789:9;:46::i;:::-;5782:53;;5685:158;;;;:::o;46597:153::-;46642:4;46659:15;46706:9;46695:20;;46735:7;46728:14;;;46597:153;:::o;4210:109::-;4266:7;4293:3;:11;;:18;;;;4286:25;;4210:109;;;:::o;2353:1556::-;2419:4;2537:18;2558:3;:12;;:19;2571:5;2558:19;;;;;;;;;;;;2537:40;;2608:1;2594:10;:15;2590:1312;;2955:21;2992:1;2979:10;:14;2955:38;;3008:17;3049:1;3028:3;:11;;:18;;;;:22;3008:42;;3295:17;3315:3;:11;;3327:9;3315:22;;;;;;;;;;;;;;;;3295:42;;3461:9;3432:3;:11;;3444:13;3432:26;;;;;;;;;;;;;;;:38;;;;3580:1;3564:13;:17;3538:3;:12;;:23;3551:9;3538:23;;;;;;;;;;;:43;;;;3703:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;3798:3;:12;;:19;3811:5;3798:19;;;;;;;;;;;3791:26;;;3841:4;3834:11;;;;;;;;2590:1312;3885:5;3878:12;;;2353:1556;;;;;:::o;33027:539::-;33151:1;33133:20;;:6;:20;;;;33125:70;;;;;;;;;;;;;;;;;;;;;;33235:1;33214:23;;:9;:23;;;;33206:71;;;;;;;;;;;;;;;;;;;;;;33290:47;33311:6;33319:9;33330:6;33290:20;:47::i;:::-;33370:71;33392:6;33370:71;;;;;;;;;;;;;;;;;:9;:17;33380:6;33370:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;33350:9;:17;33360:6;33350:17;;;;;;;;;;;;;;;:91;;;;33475:32;33500:6;33475:9;:20;33485:9;33475:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;33452:9;:20;33462:9;33452:20;;;;;;;;;;;;;;;:55;;;;33540:9;33523:35;;33532:6;33523:35;;;33551:6;33523:35;;;;;;;;;;;;;;;33027:539;;;:::o;33847:378::-;33950:1;33931:21;;:7;:21;;;;33923:65;;;;;;;;;;;;;;;;;;;;;;34001:49;34030:1;34034:7;34043:6;34001:20;:49::i;:::-;34078:24;34095:6;34078:12;;:16;;:24;;;;:::i;:::-;34063:12;:39;;;;34134:30;34157:6;34134:9;:18;34144:7;34134:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;34113:9;:18;34123:7;34113:18;;;;;;;;;;;;;;;:51;;;;34201:7;34180:37;;34197:1;34180:37;;;34210:6;34180:37;;;;;;;;;;;;;;;33847:378;;:::o;34557:418::-;34660:1;34641:21;;:7;:21;;;;34633:67;;;;;;;;;;;;;;;;;;;;;;34713:49;34734:7;34751:1;34755:6;34713:20;:49::i;:::-;34796:68;34819:6;34796:68;;;;;;;;;;;;;;;;;:9;:18;34806:7;34796:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;34775:9;:18;34785:7;34775:18;;;;;;;;;;;;;;;:89;;;;34890:24;34907:6;34890:12;;:16;;:24;;;;:::i;:::-;34875:12;:39;;;;34956:1;34930:37;;34939:7;34930:37;;;34960:6;34930:37;;;;;;;;;;;;;;;34557:418;;:::o;15644:136::-;15702:7;15729:43;15733:1;15736;15729:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;15722:50;;15644:136;;;;:::o;45712:706::-;45887:18;45908:82;45915:12;45908:82;;;;;;;;;;;;;;;;;:6;:82::i;:::-;45887:103;;46022:1;46007:12;:16;;;:85;;;;;46081:11;46027:65;;:11;:22;46039:9;46027:22;;;;;;;;;;;;;;;:40;46065:1;46050:12;:16;46027:40;;;;;;;;;;;;;;;:50;;;;;;;;;;;;:65;;;46007:85;46003:339;;;46158:8;46109:11;:22;46121:9;46109:22;;;;;;;;;;;;;;;:40;46147:1;46132:12;:16;46109:40;;;;;;;;;;;;;;;:46;;:57;;;;46003:339;;;46238:33;;;;;;;;46249:11;46238:33;;;;;;46262:8;46238:33;;;46199:11;:22;46211:9;46199:22;;;;;;;;;;;;;;;:36;46222:12;46199:36;;;;;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46329:1;46314:12;:16;46286:14;:25;46301:9;46286:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;46003:339;46380:9;46359:51;;;46391:8;46401;46359:51;;;;;;;;;;;;;;;;45712:706;;;;;:::o;1763:414::-;1826:4;1848:21;1858:3;1863:5;1848:9;:21::i;:::-;1843:327;;1886:3;:11;;1903:5;1886:23;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;1886:23:0;;;;;;;;;;;;;;;;;;;2069:3;:11;;:18;;;;2047:3;:12;;:19;2060:5;2047:19;;;;;;;;;;;:40;;;;2109:4;2102:11;;;;1843:327;2153:5;2146:12;;1763:414;;;;;:::o;3995:129::-;4068:4;4115:1;4092:3;:12;;:19;4105:5;4092:19;;;;;;;;;;;;:24;;4085:31;;3995:129;;;;:::o;36786:91::-;;;;:::o;46426:163::-;46501:6;46532:7;46528:1;:11;46541:12;46520:34;;;;;;;;;;;;;;;;;;;;;;;;;46579:1;46565:16;;46426:163;;;;:::o;47357:1491::-;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;142:130;;222:6;209:20;200:29;;234:33;261:5;234:33;;;194:78;;;;;279:130;;359:6;346:20;337:29;;371:33;398:5;371:33;;;331:78;;;;;416:128;;495:6;482:20;473:29;;507:32;533:5;507:32;;;467:77;;;;;551:126;;629:6;616:20;607:29;;641:31;666:5;641:31;;;601:76;;;;;684:241;;788:2;776:9;767:7;763:23;759:32;756:2;;;804:1;801;794:12;756:2;839:1;856:53;901:7;892:6;881:9;877:22;856:53;;;846:63;;818:97;750:175;;;;;932:366;;;1053:2;1041:9;1032:7;1028:23;1024:32;1021:2;;;1069:1;1066;1059:12;1021:2;1104:1;1121:53;1166:7;1157:6;1146:9;1142:22;1121:53;;;1111:63;;1083:97;1211:2;1229:53;1274:7;1265:6;1254:9;1250:22;1229:53;;;1219:63;;1190:98;1015:283;;;;;;1305:491;;;;1443:2;1431:9;1422:7;1418:23;1414:32;1411:2;;;1459:1;1456;1449:12;1411:2;1494:1;1511:53;1556:7;1547:6;1536:9;1532:22;1511:53;;;1501:63;;1473:97;1601:2;1619:53;1664:7;1655:6;1644:9;1640:22;1619:53;;;1609:63;;1580:98;1709:2;1727:53;1772:7;1763:6;1752:9;1748:22;1727:53;;;1717:63;;1688:98;1405:391;;;;;;1803:366;;;1924:2;1912:9;1903:7;1899:23;1895:32;1892:2;;;1940:1;1937;1930:12;1892:2;1975:1;1992:53;2037:7;2028:6;2017:9;2013:22;1992:53;;;1982:63;;1954:97;2082:2;2100:53;2145:7;2136:6;2125:9;2121:22;2100:53;;;2090:63;;2061:98;1886:283;;;;;;2176:865;;;;;;;2363:3;2351:9;2342:7;2338:23;2334:33;2331:2;;;2380:1;2377;2370:12;2331:2;2415:1;2432:53;2477:7;2468:6;2457:9;2453:22;2432:53;;;2422:63;;2394:97;2522:2;2540:53;2585:7;2576:6;2565:9;2561:22;2540:53;;;2530:63;;2501:98;2630:2;2648:53;2693:7;2684:6;2673:9;2669:22;2648:53;;;2638:63;;2609:98;2738:2;2756:51;2799:7;2790:6;2779:9;2775:22;2756:51;;;2746:61;;2717:96;2844:3;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;;;2853:63;;2823:99;2953:3;2972:53;3017:7;3008:6;2997:9;2993:22;2972:53;;;2962:63;;2932:99;2325:716;;;;;;;;;3048:364;;;3168:2;3156:9;3147:7;3143:23;3139:32;3136:2;;;3184:1;3181;3174:12;3136:2;3219:1;3236:53;3281:7;3272:6;3261:9;3257:22;3236:53;;;3226:63;;3198:97;3326:2;3344:52;3388:7;3379:6;3368:9;3364:22;3344:52;;;3334:62;;3305:97;3130:282;;;;;;3419:241;;3523:2;3511:9;3502:7;3498:23;3494:32;3491:2;;;3539:1;3536;3529:12;3491:2;3574:1;3591:53;3636:7;3627:6;3616:9;3612:22;3591:53;;;3581:63;;3553:97;3485:175;;;;;3667:113;3750:24;3768:5;3750:24;;;3745:3;3738:37;3732:48;;;3787:104;3864:21;3879:5;3864:21;;;3859:3;3852:34;3846:45;;;3898:113;3981:24;3999:5;3981:24;;;3976:3;3969:37;3963:48;;;4018:152;4119:45;4139:24;4157:5;4139:24;;;4119:45;;;4114:3;4107:58;4101:69;;;4177:347;;4289:39;4322:5;4289:39;;;4340:71;4404:6;4399:3;4340:71;;;4333:78;;4416:52;4461:6;4456:3;4449:4;4442:5;4438:16;4416:52;;;4489:29;4511:6;4489:29;;;4484:3;4480:39;4473:46;;4269:255;;;;;;4532:382;;4692:67;4756:2;4751:3;4692:67;;;4685:74;;4792:34;4788:1;4783:3;4779:11;4772:55;4861:15;4856:2;4851:3;4847:12;4840:37;4905:2;4900:3;4896:12;4889:19;;4678:236;;;;4923:372;;5083:67;5147:2;5142:3;5083:67;;;5076:74;;5183:34;5179:1;5174:3;5170:11;5163:55;5252:5;5247:2;5242:3;5238:12;5231:27;5286:2;5281:3;5277:12;5270:19;;5069:226;;;;5304:375;;5464:67;5528:2;5523:3;5464:67;;;5457:74;;5564:34;5560:1;5555:3;5551:11;5544:55;5633:8;5628:2;5623:3;5619:12;5612:30;5670:2;5665:3;5661:12;5654:19;;5450:229;;;;5688:371;;5848:67;5912:2;5907:3;5848:67;;;5841:74;;5948:34;5944:1;5939:3;5935:11;5928:55;6017:4;6012:2;6007:3;6003:12;5996:26;6050:2;6045:3;6041:12;6034:19;;5834:225;;;;6068:373;;6228:67;6292:2;6287:3;6228:67;;;6221:74;;6328:34;6324:1;6319:3;6315:11;6308:55;6397:6;6392:2;6387:3;6383:12;6376:28;6432:2;6427:3;6423:12;6416:19;;6214:227;;;;6450:398;;6628:84;6710:1;6705:3;6628:84;;;6621:91;;6745:66;6741:1;6736:3;6732:11;6725:87;6840:1;6835:3;6831:11;6824:18;;6614:234;;;;6857:327;;7017:67;7081:2;7076:3;7017:67;;;7010:74;;7117:29;7113:1;7108:3;7104:11;7097:50;7175:2;7170:3;7166:12;7159:19;;7003:181;;;;7193:477;;7371:85;7453:2;7448:3;7371:85;;;7364:92;;7489:34;7485:1;7480:3;7476:11;7469:55;7558:34;7553:2;7548:3;7544:12;7537:56;7627:5;7622:2;7617:3;7613:12;7606:27;7661:2;7656:3;7652:12;7645:19;;7357:313;;;;7679:332;;7839:67;7903:2;7898:3;7839:67;;;7832:74;;7939:34;7935:1;7930:3;7926:11;7919:55;8002:2;7997:3;7993:12;7986:19;;7825:186;;;;8020:379;;8180:67;8244:2;8239:3;8180:67;;;8173:74;;8280:34;8276:1;8271:3;8267:11;8260:55;8349:12;8344:2;8339:3;8335:12;8328:34;8390:2;8385:3;8381:12;8374:19;;8166:233;;;;8408:370;;8568:67;8632:2;8627:3;8568:67;;;8561:74;;8668:34;8664:1;8659:3;8655:11;8648:55;8737:3;8732:2;8727:3;8723:12;8716:25;8769:2;8764:3;8760:12;8753:19;;8554:224;;;;8787:374;;8947:67;9011:2;9006:3;8947:67;;;8940:74;;9047:34;9043:1;9038:3;9034:11;9027:55;9116:7;9111:2;9106:3;9102:12;9095:29;9152:2;9147:3;9143:12;9136:19;;8933:228;;;;9170:373;;9330:67;9394:2;9389:3;9330:67;;;9323:74;;9430:34;9426:1;9421:3;9417:11;9410:55;9499:6;9494:2;9489:3;9485:12;9478:28;9534:2;9529:3;9525:12;9518:19;;9316:227;;;;9552:381;;9712:67;9776:2;9771:3;9712:67;;;9705:74;;9812:34;9808:1;9803:3;9799:11;9792:55;9881:14;9876:2;9871:3;9867:12;9860:36;9924:2;9919:3;9915:12;9908:19;;9698:235;;;;9942:431;;10120:85;10202:2;10197:3;10120:85;;;10113:92;;10238:34;10234:1;10229:3;10225:11;10218:55;10307:28;10302:2;10297:3;10293:12;10286:50;10364:2;10359:3;10355:12;10348:19;;10106:267;;;;10382:379;;10542:67;10606:2;10601:3;10542:67;;;10535:74;;10642:34;10638:1;10633:3;10629:11;10622:55;10711:12;10706:2;10701:3;10697:12;10690:34;10752:2;10747:3;10743:12;10736:19;;10528:233;;;;10770:377;;10930:67;10994:2;10989:3;10930:67;;;10923:74;;11030:34;11026:1;11021:3;11017:11;11010:55;11099:10;11094:2;11089:3;11085:12;11078:32;11138:2;11133:3;11129:12;11122:19;;10916:231;;;;11156:331;;11316:67;11380:2;11375:3;11316:67;;;11309:74;;11416:33;11412:1;11407:3;11403:11;11396:54;11478:2;11473:3;11469:12;11462:19;;11302:185;;;;11496:381;;11656:67;11720:2;11715:3;11656:67;;;11649:74;;11756:34;11752:1;11747:3;11743:11;11736:55;11825:14;11820:2;11815:3;11811:12;11804:36;11868:2;11863:3;11859:12;11852:19;;11642:235;;;;11885:113;11968:24;11986:5;11968:24;;;11963:3;11956:37;11950:48;;;12005:110;12086:23;12103:5;12086:23;;;12081:3;12074:36;12068:47;;;12122:107;12201:22;12217:5;12201:22;;;12196:3;12189:35;12183:46;;;12236:650;;12491:148;12635:3;12491:148;;;12484:155;;12650:75;12721:3;12712:6;12650:75;;;12747:2;12742:3;12738:12;12731:19;;12761:75;12832:3;12823:6;12761:75;;;12858:2;12853:3;12849:12;12842:19;;12878:3;12871:10;;12472:414;;;;;;12893:372;;13092:148;13236:3;13092:148;;;13085:155;;13257:3;13250:10;;13073:192;;;;13272:372;;13471:148;13615:3;13471:148;;;13464:155;;13636:3;13629:10;;13452:192;;;;13651:213;;13769:2;13758:9;13754:18;13746:26;;13783:71;13851:1;13840:9;13836:17;13827:6;13783:71;;;13740:124;;;;;13871:201;;13983:2;13972:9;13968:18;13960:26;;13997:65;14059:1;14048:9;14044:17;14035:6;13997:65;;;13954:118;;;;;14079:213;;14197:2;14186:9;14182:18;14174:26;;14211:71;14279:1;14268:9;14264:17;14255:6;14211:71;;;14168:124;;;;;14299:547;;14501:3;14490:9;14486:19;14478:27;;14516:71;14584:1;14573:9;14569:17;14560:6;14516:71;;;14598:72;14666:2;14655:9;14651:18;14642:6;14598:72;;;14681;14749:2;14738:9;14734:18;14725:6;14681:72;;;14764;14832:2;14821:9;14817:18;14808:6;14764:72;;;14472:374;;;;;;;;14853:547;;15055:3;15044:9;15040:19;15032:27;;15070:71;15138:1;15127:9;15123:17;15114:6;15070:71;;;15152:72;15220:2;15209:9;15205:18;15196:6;15152:72;;;15235;15303:2;15292:9;15288:18;15279:6;15235:72;;;15318;15386:2;15375:9;15371:18;15362:6;15318:72;;;15026:374;;;;;;;;15407:539;;15605:3;15594:9;15590:19;15582:27;;15620:71;15688:1;15677:9;15673:17;15664:6;15620:71;;;15702:68;15766:2;15755:9;15751:18;15742:6;15702:68;;;15781:72;15849:2;15838:9;15834:18;15825:6;15781:72;;;15864;15932:2;15921:9;15917:18;15908:6;15864:72;;;15576:370;;;;;;;;15953:301;;16091:2;16080:9;16076:18;16068:26;;16141:9;16135:4;16131:20;16127:1;16116:9;16112:17;16105:47;16166:78;16239:4;16230:6;16166:78;;;16158:86;;16062:192;;;;;16261:407;;16452:2;16441:9;16437:18;16429:26;;16502:9;16496:4;16492:20;16488:1;16477:9;16473:17;16466:47;16527:131;16653:4;16527:131;;;16519:139;;16423:245;;;;16675:407;;16866:2;16855:9;16851:18;16843:26;;16916:9;16910:4;16906:20;16902:1;16891:9;16887:17;16880:47;16941:131;17067:4;16941:131;;;16933:139;;16837:245;;;;17089:407;;17280:2;17269:9;17265:18;17257:26;;17330:9;17324:4;17320:20;17316:1;17305:9;17301:17;17294:47;17355:131;17481:4;17355:131;;;17347:139;;17251:245;;;;17503:407;;17694:2;17683:9;17679:18;17671:26;;17744:9;17738:4;17734:20;17730:1;17719:9;17715:17;17708:47;17769:131;17895:4;17769:131;;;17761:139;;17665:245;;;;17917:407;;18108:2;18097:9;18093:18;18085:26;;18158:9;18152:4;18148:20;18144:1;18133:9;18129:17;18122:47;18183:131;18309:4;18183:131;;;18175:139;;18079:245;;;;18331:407;;18522:2;18511:9;18507:18;18499:26;;18572:9;18566:4;18562:20;18558:1;18547:9;18543:17;18536:47;18597:131;18723:4;18597:131;;;18589:139;;18493:245;;;;18745:407;;18936:2;18925:9;18921:18;18913:26;;18986:9;18980:4;18976:20;18972:1;18961:9;18957:17;18950:47;19011:131;19137:4;19011:131;;;19003:139;;18907:245;;;;19159:407;;19350:2;19339:9;19335:18;19327:26;;19400:9;19394:4;19390:20;19386:1;19375:9;19371:17;19364:47;19425:131;19551:4;19425:131;;;19417:139;;19321:245;;;;19573:407;;19764:2;19753:9;19749:18;19741:26;;19814:9;19808:4;19804:20;19800:1;19789:9;19785:17;19778:47;19839:131;19965:4;19839:131;;;19831:139;;19735:245;;;;19987:407;;20178:2;20167:9;20163:18;20155:26;;20228:9;20222:4;20218:20;20214:1;20203:9;20199:17;20192:47;20253:131;20379:4;20253:131;;;20245:139;;20149:245;;;;20401:407;;20592:2;20581:9;20577:18;20569:26;;20642:9;20636:4;20632:20;20628:1;20617:9;20613:17;20606:47;20667:131;20793:4;20667:131;;;20659:139;;20563:245;;;;20815:407;;21006:2;20995:9;20991:18;20983:26;;21056:9;21050:4;21046:20;21042:1;21031:9;21027:17;21020:47;21081:131;21207:4;21081:131;;;21073:139;;20977:245;;;;21229:407;;21420:2;21409:9;21405:18;21397:26;;21470:9;21464:4;21460:20;21456:1;21445:9;21441:17;21434:47;21495:131;21621:4;21495:131;;;21487:139;;21391:245;;;;21643:407;;21834:2;21823:9;21819:18;21811:26;;21884:9;21878:4;21874:20;21870:1;21859:9;21855:17;21848:47;21909:131;22035:4;21909:131;;;21901:139;;21805:245;;;;22057:407;;22248:2;22237:9;22233:18;22225:26;;22298:9;22292:4;22288:20;22284:1;22273:9;22269:17;22262:47;22323:131;22449:4;22323:131;;;22315:139;;22219:245;;;;22471:407;;22662:2;22651:9;22647:18;22639:26;;22712:9;22706:4;22702:20;22698:1;22687:9;22683:17;22676:47;22737:131;22863:4;22737:131;;;22729:139;;22633:245;;;;22885:213;;23003:2;22992:9;22988:18;22980:26;;23017:71;23085:1;23074:9;23070:17;23061:6;23017:71;;;22974:124;;;;;23105:324;;23251:2;23240:9;23236:18;23228:26;;23265:71;23333:1;23322:9;23318:17;23309:6;23265:71;;;23347:72;23415:2;23404:9;23400:18;23391:6;23347:72;;;23222:207;;;;;;23436:209;;23552:2;23541:9;23537:18;23529:26;;23566:69;23632:1;23621:9;23617:17;23608:6;23566:69;;;23523:122;;;;;23652:320;;23796:2;23785:9;23781:18;23773:26;;23810:69;23876:1;23865:9;23861:17;23852:6;23810:69;;;23890:72;23958:2;23947:9;23943:18;23934:6;23890:72;;;23767:205;;;;;;23979;;24093:2;24082:9;24078:18;24070:26;;24107:67;24171:1;24160:9;24156:17;24147:6;24107:67;;;24064:120;;;;;24191:122;;24285:5;24279:12;24269:22;;24250:63;;;;24321:163;;24436:6;24431:3;24424:19;24473:4;24468:3;24464:14;24449:29;;24417:67;;;;;24493:145;;24629:3;24614:18;;24607:31;;;;;24646:91;;24708:24;24726:5;24708:24;;;24697:35;;24691:46;;;;24744:85;;24817:5;24810:13;24803:21;24792:32;;24786:43;;;;24836:72;;24898:5;24887:16;;24881:27;;;;24915:121;;24988:42;24981:5;24977:54;24966:65;;24960:76;;;;25043:72;;25105:5;25094:16;;25088:27;;;;25122:88;;25194:10;25187:5;25183:22;25172:33;;25166:44;;;;25217:81;;25288:4;25281:5;25277:16;25266:27;;25260:38;;;;25306:268;25371:1;25378:101;25392:6;25389:1;25386:13;25378:101;;;25468:1;25463:3;25459:11;25453:18;25449:1;25444:3;25440:11;25433:39;25414:2;25411:1;25407:10;25402:15;;25378:101;;;25494:6;25491:1;25488:13;25485:2;;;25559:1;25550:6;25545:3;25541:16;25534:27;25485:2;25355:219;;;;;25582:74;;25646:5;25635:16;;25629:27;;;;25663:97;;25751:2;25747:7;25742:2;25735:5;25731:14;25727:28;25717:38;;25711:49;;;;25768:117;25837:24;25855:5;25837:24;;;25830:5;25827:35;25817:2;;25876:1;25873;25866:12;25817:2;25811:74;;25892:117;25961:24;25979:5;25961:24;;;25954:5;25951:35;25941:2;;26000:1;25997;25990:12;25941:2;25935:74;;26016:117;26085:24;26103:5;26085:24;;;26078:5;26075:35;26065:2;;26124:1;26121;26114:12;26065:2;26059:74;;26140:115;26208:23;26225:5;26208:23;;;26201:5;26198:34;26188:2;;26246:1;26243;26236:12;26188:2;26182:73;;26262:113;26329:22;26345:5;26329:22;;;26322:5;26319:33;26309:2;;26366:1;26363;26356:12;26309:2;26303:72;
Swarm Source
ipfs://83665a0eeb0e74d445c5a8f8429a7a3c0c2729e51beeef4449859b593d276d0e
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.