Contract Overview
Balance:
88.9 AVAX
AVAX Value:
$2,593.21 (@ $29.17/AVAX)
[ Download CSV Export ]
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0xd155845e54e8571d60d80fe7021c3bb3827a0de287fb0051e89b64bd9c8e58db | 14702629 | 7 days 8 hrs ago | 0x5a22b66650b3a11e6d2b78337db764bd1e25bd63 | 0xfed3445457f57a3fe4d50b3ecbfb523a049045a0 | 0.1 AVAX |
[ Download CSV Export ]
Contract Name:
SpaceHoe
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2022-05-14 */ // 0x78483B2Adf05EdF3210E90d911A5D1E3ab57D15c // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.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 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) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @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"); (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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.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. */ abstract 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() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual 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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.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); } // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol) pragma solidity ^0.8.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 Contracts guidelines: functions revert * instead 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, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override 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 this function is * overridden; * * 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 virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual 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); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } 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] + 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) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This 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); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(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: * * - `account` 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 += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(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); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This 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 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 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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` 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 tokenId ) internal virtual {} } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } pragma solidity ^0.8.4; contract SpaceHoe is ERC721Enumerable, Ownable, Pausable { using SafeERC20 for IERC20; using Strings for uint256; struct HoeInfo { uint256 tokenId; } // CONSTANTS uint256 public constant HOE_PRICE_WHITELIST = 1 ether; uint256 public constant HOE_PRICE_AVAX = 1.2 ether; uint256 public constant WHITELIST_HOES = 2000; uint256 public constant NUM_HOES = 6969; // metadata URI string public BASE_URI; // mint tracking uint256 public hoesMintedWithAVAX; uint256 public hoesMintedWhitelist; uint256 public hoesMinted = 0; // mint control timestamps uint256 public startTimeWhitelist; uint256 public startTimeAVAX; address payable public DAO; // whitelist mapping(address => bool) public whitelist; mapping(address => uint256) public whitelistClaimed; // EVENTS event onHoeCreated(uint256 tokenId); constructor(address payable _DAO) ERC721("Space Hoes", "SPACE-HOE") { DAO = _DAO; } // VIEWS // minting status function mintingStartedWhitelist() public view returns (bool) { return startTimeWhitelist != 0 && block.timestamp >= startTimeWhitelist; } function mintingStartedAVAX() public view returns (bool) { return startTimeAVAX != 0 && block.timestamp >= startTimeAVAX; } // metadata function _baseURI() internal view virtual override returns (string memory) { return BASE_URI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require (_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return string(abi.encodePacked(_baseURI(), "/", tokenId.toString(), ".json")); } // ADMIN function setStartTimeWhitelist(uint256 _startTime) external onlyOwner { require (_startTime >= block.timestamp, "startTime cannot be in the past"); startTimeWhitelist = _startTime; } function setStartTimeAVAX(uint256 _startTime) external onlyOwner { require (_startTime >= block.timestamp, "startTime cannot be in the past"); startTimeAVAX = _startTime; } function setBaseURI(string calldata _BASE_URI) external onlyOwner { BASE_URI = _BASE_URI; } /** * @dev allows owner to send ERC20s held by this contract to target */ function forwardERC20s(IERC20 _token, uint256 _amount, address target) external onlyOwner { _token.safeTransfer(target, _amount); } /** * @dev allows owner to withdraw AVAX */ function withdrawAVAX(uint256 _amount) external { require(address(this).balance >= _amount, "not enough AVAX"); (bool sent, ) = DAO.call{value: _amount}(""); require(sent, "Failed to send AVAX"); } // MINTING function _createHoe(address to, uint256 tokenId) internal { require (hoesMinted <= NUM_HOES, "cannot mint anymore hoes"); _safeMint(to, tokenId); emit onHoeCreated(tokenId); } function _createHoes(uint256 qty, address to) internal { for (uint256 i = 0; i < qty; i++) { hoesMinted += 1; _createHoe(to, hoesMinted); } } /** * @dev Whitelist minting * We implement a hard limit on the whitelist hoes. */ function mintWhitelist(uint256 qty) external payable whenNotPaused { // check most basic requirements require(mintingStartedWhitelist(), "cannot mint right now"); require (!mintingStartedAVAX(), "whitelist minting is closed"); // check if address belongs in whitelist require(whitelist[_msgSender()]==true, "this address does not have permission"); // check more advanced requirements require((hoesMintedWhitelist + qty) <= WHITELIST_HOES, "you can't mint that many right now"); // check price require(msg.value >= HOE_PRICE_WHITELIST * qty, "not enough AVAX"); hoesMintedWhitelist += qty; whitelistClaimed[_msgSender()] += qty; // mint hoes _createHoes(qty, _msgSender()); } /** * @dev minting */ function mintHoeWithAVAX(uint256 qty) external payable whenNotPaused { require (mintingStartedAVAX(), "cannot mint right now"); require ((hoesMintedWithAVAX + qty) <= (NUM_HOES - hoesMintedWhitelist), "you can't mint that many right now"); // calculate the transaction cost uint256 transactionCost = HOE_PRICE_AVAX * qty; require (msg.value >= transactionCost, "not enough AVAX"); hoesMintedWithAVAX += qty; // mint hoes _createHoes(qty, _msgSender()); } // Returns information for multiples hoes function batchedHoesOfOwner(address _owner, uint256 _offset, uint256 _maxSize) public view returns (HoeInfo[] memory) { if (_offset >= balanceOf(_owner)) { return new HoeInfo[](0); } uint256 outputSize = _maxSize; if (_offset + _maxSize >= balanceOf(_owner)) { outputSize = balanceOf(_owner) - _offset; } HoeInfo[] memory hoes = new HoeInfo[](outputSize); for (uint256 i = 0; i < outputSize; i++) { uint256 tokenId = tokenOfOwnerByIndex(_owner, _offset + i); // tokenOfOwnerByIndex comes from IERC721Enumerable hoes[i] = HoeInfo({ tokenId: tokenId }); } return hoes; } function addWhitelist( address[] memory list) external onlyOwner { for ( uint i = 0; i < list.length ; i ++ ){ whitelist[list[i]] = true; } } function removeWhitelist( address[] memory list) external onlyOwner { for ( uint i = 0; i < list.length ; i ++ ){ whitelist[list[i]] = false; } } }
[{"inputs":[{"internalType":"address payable","name":"_DAO","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"onHoeCreated","type":"event"},{"inputs":[],"name":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAO","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOE_PRICE_AVAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOE_PRICE_WHITELIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NUM_HOES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_HOES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"list","type":"address[]"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_maxSize","type":"uint256"}],"name":"batchedHoesOfOwner","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct SpaceHoe.HoeInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"target","type":"address"}],"name":"forwardERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hoesMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hoesMintedWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hoesMintedWithAVAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mintHoeWithAVAX","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingStartedAVAX","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingStartedWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"list","type":"address[]"}],"name":"removeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_BASE_URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"setStartTimeAVAX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"setStartTimeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimeAVAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTimeWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawAVAX","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600e553480156200001657600080fd5b5060405162005a6738038062005a6783398181016040528101906200003c9190620002f4565b6040518060400160405280600a81526020017f537061636520486f6573000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f53504143452d484f4500000000000000000000000000000000000000000000008152508160009080519060200190620000c09291906200022d565b508060019080519060200190620000d99291906200022d565b505050620000fc620000f06200015f60201b60201c565b6200016760201b60201c565b6000600a60146101000a81548160ff02191690831515021790555080601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620003de565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200023b906200035a565b90600052602060002090601f0160209004810192826200025f5760008555620002ab565b82601f106200027a57805160ff1916838001178555620002ab565b82800160010185558215620002ab579182015b82811115620002aa5782518255916020019190600101906200028d565b5b509050620002ba9190620002be565b5090565b5b80821115620002d9576000816000905550600101620002bf565b5090565b600081519050620002ee81620003c4565b92915050565b6000602082840312156200030d576200030c620003bf565b5b60006200031d84828501620002dd565b91505092915050565b600062000333826200033a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200037357607f821691505b602082108114156200038a576200038962000390565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b620003cf8162000326565b8114620003db57600080fd5b50565b61567980620003ee6000396000f3fe6080604052600436106102725760003560e01c80637d26407a1161014f578063aeb5cd5e116100c1578063e985e9c51161007a578063e985e9c514610981578063eb41903a146109be578063eb464c4c146109e7578063edac985b14610a03578063efe0d7ce14610a2c578063f2fde38b14610a5757610272565b8063aeb5cd5e1461085f578063b88d4fde14610888578063c1e20cdd146108b1578063c87b56dd146108dc578063db4bec4414610919578063dbddb26a1461095657610272565b806395d89b411161011357806395d89b411461074d57806398fabd3a146107785780639b19251a146107a3578063a22cb465146107e0578063a377d7ef14610809578063a682f8621461083457610272565b80637d26407a146106645780637d85cbc61461068f5780638268bd8a146106cc578063854f7b1d146106f75780638da5cb5b1461072257610272565b806342842e0e116101e85780635c975abb116101ac5780635c975abb146105525780636352211e1461057d57806369eac28c146105ba57806370a08231146105e5578063715018a614610622578063734566c21461063957610272565b806342842e0e1461047e57806343f37b98146104a75780634618163e146104d05780634f6ccce7146104ec57806355f804b31461052957610272565b80631be20ded1161023a5780631be20ded14610370578063232452161461039b57806323b872dd146103c45780632476703e146103ed5780632f745c59146104185780633c1d4de71461045557610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c57806318160ddd14610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613c3d565b610a80565b6040516102ab91906144cb565b60405180910390f35b3480156102c057600080fd5b506102c9610afa565b6040516102d691906144e6565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613d37565b610b8c565b60405161031391906143fe565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613b34565b610c11565b005b34801561035157600080fd5b5061035a610d29565b60405161036791906148c8565b60405180910390f35b34801561037c57600080fd5b50610385610d36565b60405161039291906148c8565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd9190613bc7565b610d3c565b005b3480156103d057600080fd5b506103eb60048036038101906103e69190613a1e565b610e4d565b005b3480156103f957600080fd5b50610402610ead565b60405161040f91906148c8565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190613b34565b610eb3565b60405161044c91906148c8565b60405180910390f35b34801561046157600080fd5b5061047c60048036038101906104779190613d37565b610f58565b005b34801561048a57600080fd5b506104a560048036038101906104a09190613a1e565b611021565b005b3480156104b357600080fd5b506104ce60048036038101906104c99190613c97565b611041565b005b6104ea60048036038101906104e59190613d37565b6110ed565b005b3480156104f857600080fd5b50610513600480360381019061050e9190613d37565b611390565b60405161052091906148c8565b60405180910390f35b34801561053557600080fd5b50610550600480360381019061054b9190613cea565b611401565b005b34801561055e57600080fd5b50610567611493565b60405161057491906144cb565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f9190613d37565b6114aa565b6040516105b191906143fe565b60405180910390f35b3480156105c657600080fd5b506105cf61155c565b6040516105dc91906148c8565b60405180910390f35b3480156105f157600080fd5b5061060c600480360381019061060791906139b1565b611562565b60405161061991906148c8565b60405180910390f35b34801561062e57600080fd5b5061063761161a565b005b34801561064557600080fd5b5061064e6116a2565b60405161065b91906148c8565b60405180910390f35b34801561067057600080fd5b506106796116ae565b60405161068691906148c8565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b19190613b74565b6116b4565b6040516106c391906144a9565b60405180910390f35b3480156106d857600080fd5b506106e1611822565b6040516106ee91906148c8565b60405180910390f35b34801561070357600080fd5b5061070c61182e565b60405161071991906148c8565b60405180910390f35b34801561072e57600080fd5b50610737611834565b60405161074491906143fe565b60405180910390f35b34801561075957600080fd5b5061076261185e565b60405161076f91906144e6565b60405180910390f35b34801561078457600080fd5b5061078d6118f0565b60405161079a9190614419565b60405180910390f35b3480156107af57600080fd5b506107ca60048036038101906107c591906139b1565b611916565b6040516107d791906144cb565b60405180910390f35b3480156107ec57600080fd5b5061080760048036038101906108029190613af4565b611936565b005b34801561081557600080fd5b5061081e61194c565b60405161082b91906144cb565b60405180910390f35b34801561084057600080fd5b50610849611967565b60405161085691906148c8565b60405180910390f35b34801561086b57600080fd5b5061088660048036038101906108819190613d37565b61196d565b005b34801561089457600080fd5b506108af60048036038101906108aa9190613a71565b611a82565b005b3480156108bd57600080fd5b506108c6611ae4565b6040516108d391906148c8565b60405180910390f35b3480156108e857600080fd5b5061090360048036038101906108fe9190613d37565b611aea565b60405161091091906144e6565b60405180910390f35b34801561092557600080fd5b50610940600480360381019061093b91906139b1565b611b6c565b60405161094d91906148c8565b60405180910390f35b34801561096257600080fd5b5061096b611b84565b60405161097891906144e6565b60405180910390f35b34801561098d57600080fd5b506109a860048036038101906109a391906139de565b611c12565b6040516109b591906144cb565b60405180910390f35b3480156109ca57600080fd5b506109e560048036038101906109e09190613d37565b611ca6565b005b610a0160048036038101906109fc9190613d37565b611d6f565b005b348015610a0f57600080fd5b50610a2a6004803603810190610a259190613bc7565b611ee6565b005b348015610a3857600080fd5b50610a41611ff7565b604051610a4e91906144cb565b60405180910390f35b348015610a6357600080fd5b50610a7e6004803603810190610a7991906139b1565b612012565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610af35750610af28261210a565b5b9050919050565b606060008054610b0990614bdb565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3590614bdb565b8015610b825780601f10610b5757610100808354040283529160200191610b82565b820191906000526020600020905b815481529060010190602001808311610b6557829003601f168201915b5050505050905090565b6000610b97826121ec565b610bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcd90614768565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c1c826114aa565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8490614808565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cac612258565b73ffffffffffffffffffffffffffffffffffffffff161480610cdb5750610cda81610cd5612258565b611c12565b5b610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d11906146a8565b60405180910390fd5b610d248383612260565b505050565b6000600880549050905090565b600c5481565b610d44612258565b73ffffffffffffffffffffffffffffffffffffffff16610d62611834565b73ffffffffffffffffffffffffffffffffffffffff1614610db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daf90614788565b60405180910390fd5b60005b8151811015610e4957600060126000848481518110610ddd57610ddc614d74565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610e4190614c3e565b915050610dbb565b5050565b610e5e610e58612258565b82612319565b610e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9490614828565b60405180910390fd5b610ea88383836123f7565b505050565b600f5481565b6000610ebe83611562565b8210610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef690614568565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610f60612258565b73ffffffffffffffffffffffffffffffffffffffff16610f7e611834565b73ffffffffffffffffffffffffffffffffffffffff1614610fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcb90614788565b60405180910390fd5b42811015611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e906146c8565b60405180910390fd5b8060108190555050565b61103c83838360405180602001604052806000815250611a82565b505050565b611049612258565b73ffffffffffffffffffffffffffffffffffffffff16611067611834565b73ffffffffffffffffffffffffffffffffffffffff16146110bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b490614788565b60405180910390fd5b6110e881838573ffffffffffffffffffffffffffffffffffffffff166126539092919063ffffffff16565b505050565b6110f5611493565b15611135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112c90614688565b60405180910390fd5b61113d611ff7565b61117c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611173906145e8565b60405180910390fd5b61118461194c565b156111c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bb90614508565b60405180910390fd5b60011515601260006111d4612258565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461125e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611255906148a8565b60405180910390fd5b6107d081600d5461126f91906149ec565b11156112b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a790614548565b60405180910390fd5b80670de0b6b3a76400006112c49190614a73565b341015611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd90614528565b60405180910390fd5b80600d600082825461131891906149ec565b92505081905550806013600061132c612258565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461137591906149ec565b9250508190555061138d81611388612258565b6126d9565b50565b600061139a610d29565b82106113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d290614868565b60405180910390fd5b600882815481106113ef576113ee614d74565b5b90600052602060002001549050919050565b611409612258565b73ffffffffffffffffffffffffffffffffffffffff16611427611834565b73ffffffffffffffffffffffffffffffffffffffff161461147d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147490614788565b60405180910390fd5b8181600b919061148e929190613704565b505050565b6000600a60149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154a90614708565b60405180910390fd5b80915050919050565b611b3981565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ca906146e8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611622612258565b73ffffffffffffffffffffffffffffffffffffffff16611640611834565b73ffffffffffffffffffffffffffffffffffffffff1614611696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168d90614788565b60405180910390fd5b6116a06000612722565b565b670de0b6b3a764000081565b600e5481565b60606116bf84611562565b831061172157600067ffffffffffffffff8111156116e0576116df614da3565b5b60405190808252806020026020018201604052801561171957816020015b61170661378a565b8152602001906001900390816116fe5790505b50905061181b565b600082905061172f85611562565b838561173b91906149ec565b10611757578361174a86611562565b6117549190614acd565b90505b60008167ffffffffffffffff81111561177357611772614da3565b5b6040519080825280602002602001820160405280156117ac57816020015b61179961378a565b8152602001906001900390816117915790505b50905060005b828110156118145760006117d18883896117cc91906149ec565b610eb3565b90506040518060200160405280828152508383815181106117f5576117f4614d74565b5b602002602001018190525050808061180c90614c3e565b9150506117b2565b5080925050505b9392505050565b6710a741a46278000081565b600d5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461186d90614bdb565b80601f016020809104026020016040519081016040528092919081815260200182805461189990614bdb565b80156118e65780601f106118bb576101008083540402835291602001916118e6565b820191906000526020600020905b8154815290600101906020018083116118c957829003601f168201915b5050505050905090565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60126020528060005260406000206000915054906101000a900460ff1681565b611948611941612258565b83836127e8565b5050565b6000806010541415801561196257506010544210155b905090565b60105481565b804710156119b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a790614528565b60405180910390fd5b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516119f8906143e9565b60006040518083038185875af1925050503d8060008114611a35576040519150601f19603f3d011682016040523d82523d6000602084013e611a3a565b606091505b5050905080611a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7590614728565b60405180910390fd5b5050565b611a93611a8d612258565b83612319565b611ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac990614828565b60405180910390fd5b611ade84848484612955565b50505050565b6107d081565b6060611af5826121ec565b611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b906147e8565b60405180910390fd5b611b3c6129b1565b611b4583612a43565b604051602001611b569291906143af565b6040516020818303038152906040529050919050565b60136020528060005260406000206000915090505481565b600b8054611b9190614bdb565b80601f0160208091040260200160405190810160405280929190818152602001828054611bbd90614bdb565b8015611c0a5780601f10611bdf57610100808354040283529160200191611c0a565b820191906000526020600020905b815481529060010190602001808311611bed57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611cae612258565b73ffffffffffffffffffffffffffffffffffffffff16611ccc611834565b73ffffffffffffffffffffffffffffffffffffffff1614611d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1990614788565b60405180910390fd5b42811015611d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5c906146c8565b60405180910390fd5b80600f8190555050565b611d77611493565b15611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae90614688565b60405180910390fd5b611dbf61194c565b611dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df5906145e8565b60405180910390fd5b600d54611b39611e0e9190614acd565b81600c54611e1c91906149ec565b1115611e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5490614548565b60405180910390fd5b6000816710a741a462780000611e739190614a73565b905080341015611eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaf90614528565b60405180910390fd5b81600c6000828254611eca91906149ec565b92505081905550611ee282611edd612258565b6126d9565b5050565b611eee612258565b73ffffffffffffffffffffffffffffffffffffffff16611f0c611834565b73ffffffffffffffffffffffffffffffffffffffff1614611f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5990614788565b60405180910390fd5b60005b8151811015611ff357600160126000848481518110611f8757611f86614d74565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611feb90614c3e565b915050611f65565b5050565b600080600f541415801561200d5750600f544210155b905090565b61201a612258565b73ffffffffffffffffffffffffffffffffffffffff16612038611834565b73ffffffffffffffffffffffffffffffffffffffff161461208e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208590614788565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f5906145a8565b60405180910390fd5b61210781612722565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121d557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121e557506121e482612ba4565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122d3836114aa565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612324826121ec565b612363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235a90614668565b60405180910390fd5b600061236e836114aa565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123dd57508373ffffffffffffffffffffffffffffffffffffffff166123c584610b8c565b73ffffffffffffffffffffffffffffffffffffffff16145b806123ee57506123ed8185611c12565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612417826114aa565b73ffffffffffffffffffffffffffffffffffffffff161461246d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612464906147c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d490614608565b60405180910390fd5b6124e8838383612c0e565b6124f3600082612260565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125439190614acd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461259a91906149ec565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6126d48363a9059cbb60e01b8484604051602401612672929190614480565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612d22565b505050565b60005b8281101561271d576001600e60008282546126f791906149ec565b9250508190555061270a82600e54612de9565b808061271590614c3e565b9150506126dc565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284e90614628565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161294891906144cb565b60405180910390a3505050565b6129608484846123f7565b61296c84848484612e75565b6129ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a290614588565b60405180910390fd5b50505050565b6060600b80546129c090614bdb565b80601f01602080910402602001604051908101604052809291908181526020018280546129ec90614bdb565b8015612a395780601f10612a0e57610100808354040283529160200191612a39565b820191906000526020600020905b815481529060010190602001808311612a1c57829003601f168201915b5050505050905090565b60606000821415612a8b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b9f565b600082905060005b60008214612abd578080612aa690614c3e565b915050600a82612ab69190614a42565b9150612a93565b60008167ffffffffffffffff811115612ad957612ad8614da3565b5b6040519080825280601f01601f191660200182016040528015612b0b5781602001600182028036833780820191505090505b5090505b60008514612b9857600182612b249190614acd565b9150600a85612b339190614c87565b6030612b3f91906149ec565b60f81b818381518110612b5557612b54614d74565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b919190614a42565b9450612b0f565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612c1983838361300c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c5c57612c5781613011565b612c9b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612c9a57612c99838261305a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cde57612cd9816131c7565b612d1d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612d1c57612d1b8282613298565b5b5b505050565b6000612d84826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166133179092919063ffffffff16565b9050600081511115612de45780806020019051810190612da49190613c10565b612de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dda90614888565b60405180910390fd5b5b505050565b611b39600e541115612e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e27906147a8565b60405180910390fd5b612e3a828261332f565b7fcd49fe78c956bbd23729648935727fbc93719b63039433ede7e6a21a2d157eb681604051612e6991906148c8565b60405180910390a15050565b6000612e968473ffffffffffffffffffffffffffffffffffffffff1661334d565b15612fff578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ebf612258565b8786866040518563ffffffff1660e01b8152600401612ee19493929190614434565b602060405180830381600087803b158015612efb57600080fd5b505af1925050508015612f2c57506040513d601f19601f82011682018060405250810190612f299190613c6a565b60015b612faf573d8060008114612f5c576040519150601f19603f3d011682016040523d82523d6000602084013e612f61565b606091505b50600081511415612fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9e90614588565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613004565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161306784611562565b6130719190614acd565b9050600060076000848152602001908152602001600020549050818114613156576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506131db9190614acd565b905060006009600084815260200190815260200160002054905060006008838154811061320b5761320a614d74565b5b90600052602060002001549050806008838154811061322d5761322c614d74565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061327c5761327b614d45565b5b6001900381819060005260206000200160009055905550505050565b60006132a383611562565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60606133268484600085613360565b90509392505050565b613349828260405180602001604052806000815250613474565b5050565b600080823b905060008111915050919050565b6060824710156133a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339c90614648565b60405180910390fd5b6133ae8561334d565b6133ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e490614848565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516134169190614398565b60006040518083038185875af1925050503d8060008114613453576040519150601f19603f3d011682016040523d82523d6000602084013e613458565b606091505b50915091506134688282866134cf565b92505050949350505050565b61347e8383613536565b61348b6000848484612e75565b6134ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c190614588565b60405180910390fd5b505050565b606083156134df5782905061352f565b6000835111156134f25782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352691906144e6565b60405180910390fd5b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359d90614748565b60405180910390fd5b6135af816121ec565b156135ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e6906145c8565b60405180910390fd5b6135fb60008383612c0e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461364b91906149ec565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461371090614bdb565b90600052602060002090601f0160209004810192826137325760008555613779565b82601f1061374b57803560ff1916838001178555613779565b82800160010185558215613779579182015b8281111561377857823582559160200191906001019061375d565b5b509050613786919061379d565b5090565b6040518060200160405280600081525090565b5b808211156137b657600081600090555060010161379e565b5090565b60006137cd6137c884614908565b6148e3565b905080838252602082019050828560208602820111156137f0576137ef614ddc565b5b60005b858110156138205781613806888261386c565b8452602084019350602083019250506001810190506137f3565b5050509392505050565b600061383d61383884614934565b6148e3565b90508281526020810184848401111561385957613858614de1565b5b613864848285614b99565b509392505050565b60008135905061387b816155d0565b92915050565b600082601f83011261389657613895614dd7565b5b81356138a68482602086016137ba565b91505092915050565b6000813590506138be816155e7565b92915050565b6000815190506138d3816155e7565b92915050565b6000813590506138e8816155fe565b92915050565b6000815190506138fd816155fe565b92915050565b600082601f83011261391857613917614dd7565b5b813561392884826020860161382a565b91505092915050565b60008135905061394081615615565b92915050565b60008083601f84011261395c5761395b614dd7565b5b8235905067ffffffffffffffff81111561397957613978614dd2565b5b60208301915083600182028301111561399557613994614ddc565b5b9250929050565b6000813590506139ab8161562c565b92915050565b6000602082840312156139c7576139c6614deb565b5b60006139d58482850161386c565b91505092915050565b600080604083850312156139f5576139f4614deb565b5b6000613a038582860161386c565b9250506020613a148582860161386c565b9150509250929050565b600080600060608486031215613a3757613a36614deb565b5b6000613a458682870161386c565b9350506020613a568682870161386c565b9250506040613a678682870161399c565b9150509250925092565b60008060008060808587031215613a8b57613a8a614deb565b5b6000613a998782880161386c565b9450506020613aaa8782880161386c565b9350506040613abb8782880161399c565b925050606085013567ffffffffffffffff811115613adc57613adb614de6565b5b613ae887828801613903565b91505092959194509250565b60008060408385031215613b0b57613b0a614deb565b5b6000613b198582860161386c565b9250506020613b2a858286016138af565b9150509250929050565b60008060408385031215613b4b57613b4a614deb565b5b6000613b598582860161386c565b9250506020613b6a8582860161399c565b9150509250929050565b600080600060608486031215613b8d57613b8c614deb565b5b6000613b9b8682870161386c565b9350506020613bac8682870161399c565b9250506040613bbd8682870161399c565b9150509250925092565b600060208284031215613bdd57613bdc614deb565b5b600082013567ffffffffffffffff811115613bfb57613bfa614de6565b5b613c0784828501613881565b91505092915050565b600060208284031215613c2657613c25614deb565b5b6000613c34848285016138c4565b91505092915050565b600060208284031215613c5357613c52614deb565b5b6000613c61848285016138d9565b91505092915050565b600060208284031215613c8057613c7f614deb565b5b6000613c8e848285016138ee565b91505092915050565b600080600060608486031215613cb057613caf614deb565b5b6000613cbe86828701613931565b9350506020613ccf8682870161399c565b9250506040613ce08682870161386c565b9150509250925092565b60008060208385031215613d0157613d00614deb565b5b600083013567ffffffffffffffff811115613d1f57613d1e614de6565b5b613d2b85828601613946565b92509250509250929050565b600060208284031215613d4d57613d4c614deb565b5b6000613d5b8482850161399c565b91505092915050565b6000613d70838361435e565b60208301905092915050565b613d8581614b13565b82525050565b613d9481614b01565b82525050565b6000613da582614975565b613daf81856149a3565b9350613dba83614965565b8060005b83811015613deb578151613dd28882613d64565b9750613ddd83614996565b925050600181019050613dbe565b5085935050505092915050565b613e0181614b25565b82525050565b6000613e1282614980565b613e1c81856149b4565b9350613e2c818560208601614ba8565b613e3581614df0565b840191505092915050565b6000613e4b82614980565b613e5581856149c5565b9350613e65818560208601614ba8565b80840191505092915050565b6000613e7c8261498b565b613e8681856149d0565b9350613e96818560208601614ba8565b613e9f81614df0565b840191505092915050565b6000613eb58261498b565b613ebf81856149e1565b9350613ecf818560208601614ba8565b80840191505092915050565b6000613ee8601b836149d0565b9150613ef382614e01565b602082019050919050565b6000613f0b600f836149d0565b9150613f1682614e2a565b602082019050919050565b6000613f2e6022836149d0565b9150613f3982614e53565b604082019050919050565b6000613f51602b836149d0565b9150613f5c82614ea2565b604082019050919050565b6000613f746032836149d0565b9150613f7f82614ef1565b604082019050919050565b6000613f976026836149d0565b9150613fa282614f40565b604082019050919050565b6000613fba601c836149d0565b9150613fc582614f8f565b602082019050919050565b6000613fdd6015836149d0565b9150613fe882614fb8565b602082019050919050565b60006140006024836149d0565b915061400b82614fe1565b604082019050919050565b60006140236019836149d0565b915061402e82615030565b602082019050919050565b60006140466026836149d0565b915061405182615059565b604082019050919050565b6000614069602c836149d0565b9150614074826150a8565b604082019050919050565b600061408c6010836149d0565b9150614097826150f7565b602082019050919050565b60006140af6038836149d0565b91506140ba82615120565b604082019050919050565b60006140d2601f836149d0565b91506140dd8261516f565b602082019050919050565b60006140f5602a836149d0565b915061410082615198565b604082019050919050565b60006141186029836149d0565b9150614123826151e7565b604082019050919050565b600061413b6013836149d0565b915061414682615236565b602082019050919050565b600061415e6020836149d0565b91506141698261525f565b602082019050919050565b6000614181602c836149d0565b915061418c82615288565b604082019050919050565b60006141a46005836149e1565b91506141af826152d7565b600582019050919050565b60006141c76020836149d0565b91506141d282615300565b602082019050919050565b60006141ea6018836149d0565b91506141f582615329565b602082019050919050565b600061420d6029836149d0565b915061421882615352565b604082019050919050565b6000614230602f836149d0565b915061423b826153a1565b604082019050919050565b60006142536021836149d0565b915061425e826153f0565b604082019050919050565b60006142766000836149c5565b91506142818261543f565b600082019050919050565b60006142996031836149d0565b91506142a482615442565b604082019050919050565b60006142bc601d836149d0565b91506142c782615491565b602082019050919050565b60006142df602c836149d0565b91506142ea826154ba565b604082019050919050565b6000614302602a836149d0565b915061430d82615509565b604082019050919050565b60006143256025836149d0565b915061433082615558565b604082019050919050565b60006143486001836149e1565b9150614353826155a7565b600182019050919050565b602082016000820151614374600085018261437a565b50505050565b61438381614b8f565b82525050565b61439281614b8f565b82525050565b60006143a48284613e40565b915081905092915050565b60006143bb8285613eaa565b91506143c68261433b565b91506143d28284613eaa565b91506143dd82614197565b91508190509392505050565b60006143f482614269565b9150819050919050565b60006020820190506144136000830184613d8b565b92915050565b600060208201905061442e6000830184613d7c565b92915050565b60006080820190506144496000830187613d8b565b6144566020830186613d8b565b6144636040830185614389565b81810360608301526144758184613e07565b905095945050505050565b60006040820190506144956000830185613d8b565b6144a26020830184614389565b9392505050565b600060208201905081810360008301526144c38184613d9a565b905092915050565b60006020820190506144e06000830184613df8565b92915050565b600060208201905081810360008301526145008184613e71565b905092915050565b6000602082019050818103600083015261452181613edb565b9050919050565b6000602082019050818103600083015261454181613efe565b9050919050565b6000602082019050818103600083015261456181613f21565b9050919050565b6000602082019050818103600083015261458181613f44565b9050919050565b600060208201905081810360008301526145a181613f67565b9050919050565b600060208201905081810360008301526145c181613f8a565b9050919050565b600060208201905081810360008301526145e181613fad565b9050919050565b6000602082019050818103600083015261460181613fd0565b9050919050565b6000602082019050818103600083015261462181613ff3565b9050919050565b6000602082019050818103600083015261464181614016565b9050919050565b6000602082019050818103600083015261466181614039565b9050919050565b600060208201905081810360008301526146818161405c565b9050919050565b600060208201905081810360008301526146a18161407f565b9050919050565b600060208201905081810360008301526146c1816140a2565b9050919050565b600060208201905081810360008301526146e1816140c5565b9050919050565b60006020820190508181036000830152614701816140e8565b9050919050565b600060208201905081810360008301526147218161410b565b9050919050565b600060208201905081810360008301526147418161412e565b9050919050565b6000602082019050818103600083015261476181614151565b9050919050565b6000602082019050818103600083015261478181614174565b9050919050565b600060208201905081810360008301526147a1816141ba565b9050919050565b600060208201905081810360008301526147c1816141dd565b9050919050565b600060208201905081810360008301526147e181614200565b9050919050565b6000602082019050818103600083015261480181614223565b9050919050565b6000602082019050818103600083015261482181614246565b9050919050565b600060208201905081810360008301526148418161428c565b9050919050565b60006020820190508181036000830152614861816142af565b9050919050565b60006020820190508181036000830152614881816142d2565b9050919050565b600060208201905081810360008301526148a1816142f5565b9050919050565b600060208201905081810360008301526148c181614318565b9050919050565b60006020820190506148dd6000830184614389565b92915050565b60006148ed6148fe565b90506148f98282614c0d565b919050565b6000604051905090565b600067ffffffffffffffff82111561492357614922614da3565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561494f5761494e614da3565b5b61495882614df0565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006149f782614b8f565b9150614a0283614b8f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a3757614a36614cb8565b5b828201905092915050565b6000614a4d82614b8f565b9150614a5883614b8f565b925082614a6857614a67614ce7565b5b828204905092915050565b6000614a7e82614b8f565b9150614a8983614b8f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ac257614ac1614cb8565b5b828202905092915050565b6000614ad882614b8f565b9150614ae383614b8f565b925082821015614af657614af5614cb8565b5b828203905092915050565b6000614b0c82614b6f565b9050919050565b6000614b1e82614b6f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614b6882614b01565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614bc6578082015181840152602081019050614bab565b83811115614bd5576000848401525b50505050565b60006002820490506001821680614bf357607f821691505b60208210811415614c0757614c06614d16565b5b50919050565b614c1682614df0565b810181811067ffffffffffffffff82111715614c3557614c34614da3565b5b80604052505050565b6000614c4982614b8f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c7c57614c7b614cb8565b5b600182019050919050565b6000614c9282614b8f565b9150614c9d83614b8f565b925082614cad57614cac614ce7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f77686974656c697374206d696e74696e6720697320636c6f7365640000000000600082015250565b7f6e6f7420656e6f75676820415641580000000000000000000000000000000000600082015250565b7f796f752063616e2774206d696e742074686174206d616e79207269676874206e60008201527f6f77000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f63616e6e6f74206d696e74207269676874206e6f770000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f737461727454696d652063616e6e6f7420626520696e20746865207061737400600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e64204156415800000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f63616e6e6f74206d696e7420616e796d6f726520686f65730000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f74686973206164647265737320646f6573206e6f742068617665207065726d6960008201527f7373696f6e000000000000000000000000000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6155d981614b01565b81146155e457600080fd5b50565b6155f081614b25565b81146155fb57600080fd5b50565b61560781614b31565b811461561257600080fd5b50565b61561e81614b5d565b811461562957600080fd5b50565b61563581614b8f565b811461564057600080fd5b5056fea2646970667358221220ce16310f82c5fc5aa86b64f2b970bf8694403e24de86c1a3b614407e30d1dcec64736f6c63430008070033000000000000000000000000fed3445457f57a3fe4d50b3ecbfb523a049045a0
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000fed3445457f57a3fe4d50b3ecbfb523a049045a0
-----Decoded View---------------
Arg [0] : _DAO (address): 0xfed3445457f57a3fe4d50b3ecbfb523a049045a0
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000fed3445457f57a3fe4d50b3ecbfb523a049045a0
Deployed ByteCode Sourcemap
65375:6012:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59200:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46781:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48340:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47863:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59840:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65879:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71203:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49090:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66030:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59508:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67425:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49500:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67832:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68820:807;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60030:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67628:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16472:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46475:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65757:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46205:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14585:103;;;;;;;;;;;;;:::i;:::-;;65583:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65960:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70266:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65643:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65919:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13934:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46950:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66107:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66160:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48633:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66635:137;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66070:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68046:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49756:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65702:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66916:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66208:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65826:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48859:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67212:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69674:537;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71018:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66475:152;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14843:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59200:224;59302:4;59341:35;59326:50;;;:11;:50;;;;:90;;;;59380:36;59404:11;59380:23;:36::i;:::-;59326:90;59319:97;;59200:224;;;:::o;46781:100::-;46835:13;46868:5;46861:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46781:100;:::o;48340:221::-;48416:7;48444:16;48452:7;48444;:16::i;:::-;48436:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48529:15;:24;48545:7;48529:24;;;;;;;;;;;;;;;;;;;;;48522:31;;48340:221;;;:::o;47863:411::-;47944:13;47960:23;47975:7;47960:14;:23::i;:::-;47944:39;;48008:5;48002:11;;:2;:11;;;;47994:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;48102:5;48086:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;48111:37;48128:5;48135:12;:10;:12::i;:::-;48111:16;:37::i;:::-;48086:62;48064:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;48245:21;48254:2;48258:7;48245:8;:21::i;:::-;47933:341;47863:411;;:::o;59840:113::-;59901:7;59928:10;:17;;;;59921:24;;59840:113;:::o;65879:33::-;;;;:::o;71203:181::-;14165:12;:10;:12::i;:::-;14154:23;;:7;:5;:7::i;:::-;:23;;;14146:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71288:6:::1;71282:95;71304:4;:11;71300:1;:15;71282:95;;;71360:5;71339:9;:18;71349:4;71354:1;71349:7;;;;;;;;:::i;:::-;;;;;;;;71339:18;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;71318:4;;;;;:::i;:::-;;;;71282:95;;;;71203:181:::0;:::o;49090:339::-;49285:41;49304:12;:10;:12::i;:::-;49318:7;49285:18;:41::i;:::-;49277:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;49393:28;49403:4;49409:2;49413:7;49393:9;:28::i;:::-;49090:339;;;:::o;66030:33::-;;;;:::o;59508:256::-;59605:7;59641:23;59658:5;59641:16;:23::i;:::-;59633:5;:31;59625:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;59730:12;:19;59743:5;59730:19;;;;;;;;;;;;;;;:26;59750:5;59730:26;;;;;;;;;;;;59723:33;;59508:256;;;;:::o;67425:195::-;14165:12;:10;:12::i;:::-;14154:23;;:7;:5;:7::i;:::-;:23;;;14146:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67524:15:::1;67510:10;:29;;67501:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;67602:10;67586:13;:26;;;;67425:195:::0;:::o;49500:185::-;49638:39;49655:4;49661:2;49665:7;49638:39;;;;;;;;;;;;:16;:39::i;:::-;49500:185;;;:::o;67832:145::-;14165:12;:10;:12::i;:::-;14154:23;;:7;:5;:7::i;:::-;:23;;;14146:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67933:36:::1;67953:6;67961:7;67933:6;:19;;;;:36;;;;;:::i;:::-;67832:145:::0;;;:::o;68820:807::-;16798:8;:6;:8::i;:::-;16797:9;16789:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;68948:25:::1;:23;:25::i;:::-;68940:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;69020:20;:18;:20::i;:::-;69019:21;69010:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;69168:4;69143:29;;:9;:23;69153:12;:10;:12::i;:::-;69143:23;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;69135:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;65743:4;69303:3;69281:19;;:25;;;;:::i;:::-;69280:45;;69272:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;69444:3;65629:7;69422:25;;;;:::i;:::-;69409:9;:38;;69401:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;69503:3;69480:19;;:26;;;;;;;:::i;:::-;;;;;;;;69551:3;69517:16;:30;69534:12;:10;:12::i;:::-;69517:30;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;69589:30;69601:3;69606:12;:10;:12::i;:::-;69589:11;:30::i;:::-;68820:807:::0;:::o;60030:233::-;60105:7;60141:30;:28;:30::i;:::-;60133:5;:38;60125:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;60238:10;60249:5;60238:17;;;;;;;;:::i;:::-;;;;;;;;;;60231:24;;60030:233;;;:::o;67628:105::-;14165:12;:10;:12::i;:::-;14154:23;;:7;:5;:7::i;:::-;:23;;;14146:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67716:9:::1;;67705:8;:20;;;;;;;:::i;:::-;;67628:105:::0;;:::o;16472:86::-;16519:4;16543:7;;;;;;;;;;;16536:14;;16472:86;:::o;46475:239::-;46547:7;46567:13;46583:7;:16;46591:7;46583:16;;;;;;;;;;;;;;;;;;;;;46567:32;;46635:1;46618:19;;:5;:19;;;;46610:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46701:5;46694:12;;;46475:239;;;:::o;65757:39::-;65792:4;65757:39;:::o;46205:208::-;46277:7;46322:1;46305:19;;:5;:19;;;;46297:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46389:9;:16;46399:5;46389:16;;;;;;;;;;;;;;;;46382:23;;46205:208;;;:::o;14585:103::-;14165:12;:10;:12::i;:::-;14154:23;;:7;:5;:7::i;:::-;:23;;;14146:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14650:30:::1;14677:1;14650:18;:30::i;:::-;14585:103::o:0;65583:53::-;65629:7;65583:53;:::o;65960:29::-;;;;:::o;70266:744::-;70366:16;70410:17;70420:6;70410:9;:17::i;:::-;70399:7;:28;70395:84;;70465:1;70451:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;70444:23;;;;70395:84;70491:18;70512:8;70491:29;;70557:17;70567:6;70557:9;:17::i;:::-;70545:8;70535:7;:18;;;;:::i;:::-;:39;70531:112;;70624:7;70604:17;70614:6;70604:9;:17::i;:::-;:27;;;;:::i;:::-;70591:40;;70531:112;70653:21;70691:10;70677:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;70653:49;;70720:9;70715:264;70739:10;70735:1;:14;70715:264;;;70771:15;70789:40;70809:6;70827:1;70817:7;:11;;;;:::i;:::-;70789:19;:40::i;:::-;70771:58;;70908:59;;;;;;;;70944:7;70908:59;;;70898:4;70903:1;70898:7;;;;;;;;:::i;:::-;;;;;;;:69;;;;70756:223;70751:3;;;;;:::i;:::-;;;;70715:264;;;;70998:4;70991:11;;;;70266:744;;;;;;:::o;65643:50::-;65684:9;65643:50;:::o;65919:34::-;;;;:::o;13934:87::-;13980:7;14007:6;;;;;;;;;;;14000:13;;13934:87;:::o;46950:104::-;47006:13;47039:7;47032:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46950:104;:::o;66107:26::-;;;;;;;;;;;;;:::o;66160:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;48633:155::-;48728:52;48747:12;:10;:12::i;:::-;48761:8;48771;48728:18;:52::i;:::-;48633:155;;:::o;66635:137::-;66686:4;66727:1;66710:13;;:18;;:54;;;;;66751:13;;66732:15;:32;;66710:54;66703:61;;66635:137;:::o;66070:28::-;;;;:::o;68046:229::-;68138:7;68113:21;:32;;68105:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;68177:9;68192:3;;;;;;;;;;;:8;;68208:7;68192:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68176:44;;;68239:4;68231:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;68094:181;68046:229;:::o;49756:328::-;49931:41;49950:12;:10;:12::i;:::-;49964:7;49931:18;:41::i;:::-;49923:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;50037:39;50051:4;50057:2;50061:7;50070:5;50037:13;:39::i;:::-;49756:328;;;;:::o;65702:45::-;65743:4;65702:45;:::o;66916:272::-;66989:13;67024:16;67032:7;67024;:16::i;:::-;67015:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;67134:10;:8;:10::i;:::-;67151:18;:7;:16;:18::i;:::-;67117:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67103:77;;66916:272;;;:::o;66208:51::-;;;;;;;;;;;;;;;;;:::o;65826:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48859:164::-;48956:4;48980:18;:25;48999:5;48980:25;;;;;;;;;;;;;;;:35;49006:8;48980:35;;;;;;;;;;;;;;;;;;;;;;;;;48973:42;;48859:164;;;;:::o;67212:205::-;14165:12;:10;:12::i;:::-;14154:23;;:7;:5;:7::i;:::-;:23;;;14146:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67316:15:::1;67302:10;:29;;67293:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;67399:10;67378:18;:31;;;;67212:205:::0;:::o;69674:537::-;16798:8;:6;:8::i;:::-;16797:9;16789:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;69763:20:::1;:18;:20::i;:::-;69754:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;69871:19;;65792:4;69860:30;;;;:::i;:::-;69851:3;69830:18;;:24;;;;:::i;:::-;69829:62;;69820:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;69986:23;70029:3;65684:9;70012:20;;;;:::i;:::-;69986:46;;70065:15;70052:9;:28;;70043:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;70135:3;70113:18;;:25;;;;;;;:::i;:::-;;;;;;;;70173:30;70185:3;70190:12;:10;:12::i;:::-;70173:11;:30::i;:::-;69743:468;69674:537:::0;:::o;71018:177::-;14165:12;:10;:12::i;:::-;14154:23;;:7;:5;:7::i;:::-;:23;;;14146:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71100:6:::1;71094:94;71116:4;:11;71112:1;:15;71094:94;;;71172:4;71151:9;:18;71161:4;71166:1;71161:7;;;;;;;;:::i;:::-;;;;;;;;71151:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;71130:4;;;;;:::i;:::-;;;;71094:94;;;;71018:177:::0;:::o;66475:152::-;66531:4;66577:1;66555:18;;:23;;:64;;;;;66601:18;;66582:15;:37;;66555:64;66548:71;;66475:152;:::o;14843:201::-;14165:12;:10;:12::i;:::-;14154:23;;:7;:5;:7::i;:::-;:23;;;14146:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14952:1:::1;14932:22;;:8;:22;;;;14924:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15008:28;15027:8;15008:18;:28::i;:::-;14843:201:::0;:::o;45836:305::-;45938:4;45990:25;45975:40;;;:11;:40;;;;:105;;;;46047:33;46032:48;;;:11;:48;;;;45975:105;:158;;;;46097:36;46121:11;46097:23;:36::i;:::-;45975:158;45955:178;;45836:305;;;:::o;51594:127::-;51659:4;51711:1;51683:30;;:7;:16;51691:7;51683:16;;;;;;;;;;;;;;;;;;;;;:30;;;;51676:37;;51594:127;;;:::o;703:98::-;756:7;783:10;776:17;;703:98;:::o;55576:174::-;55678:2;55651:15;:24;55667:7;55651:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55734:7;55730:2;55696:46;;55705:23;55720:7;55705:14;:23::i;:::-;55696:46;;;;;;;;;;;;55576:174;;:::o;51888:348::-;51981:4;52006:16;52014:7;52006;:16::i;:::-;51998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52082:13;52098:23;52113:7;52098:14;:23::i;:::-;52082:39;;52151:5;52140:16;;:7;:16;;;:51;;;;52184:7;52160:31;;:20;52172:7;52160:11;:20::i;:::-;:31;;;52140:51;:87;;;;52195:32;52212:5;52219:7;52195:16;:32::i;:::-;52140:87;52132:96;;;51888:348;;;;:::o;54880:578::-;55039:4;55012:31;;:23;55027:7;55012:14;:23::i;:::-;:31;;;55004:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;55122:1;55108:16;;:2;:16;;;;55100:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;55178:39;55199:4;55205:2;55209:7;55178:20;:39::i;:::-;55282:29;55299:1;55303:7;55282:8;:29::i;:::-;55343:1;55324:9;:15;55334:4;55324:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;55372:1;55355:9;:13;55365:2;55355:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;55403:2;55384:7;:16;55392:7;55384:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;55442:7;55438:2;55423:27;;55432:4;55423:27;;;;;;;;;;;;54880:578;;;:::o;9637:211::-;9754:86;9774:5;9804:23;;;9829:2;9833:5;9781:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9754:19;:86::i;:::-;9637:211;;;:::o;68518:190::-;68589:9;68584:117;68608:3;68604:1;:7;68584:117;;;68647:1;68633:10;;:15;;;;;;;:::i;:::-;;;;;;;;68663:26;68674:2;68678:10;;68663;:26::i;:::-;68613:3;;;;;:::i;:::-;;;;68584:117;;;;68518:190;;:::o;15204:191::-;15278:16;15297:6;;;;;;;;;;;15278:25;;15323:8;15314:6;;:17;;;;;;;;;;;;;;;;;;15378:8;15347:40;;15368:8;15347:40;;;;;;;;;;;;15267:128;15204:191;:::o;55892:315::-;56047:8;56038:17;;:5;:17;;;;56030:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;56134:8;56096:18;:25;56115:5;56096:25;;;;;;;;;;;;;;;:35;56122:8;56096:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;56180:8;56158:41;;56173:5;56158:41;;;56190:8;56158:41;;;;;;:::i;:::-;;;;;;;;55892:315;;;:::o;50966:::-;51123:28;51133:4;51139:2;51143:7;51123:9;:28::i;:::-;51170:48;51193:4;51199:2;51203:7;51212:5;51170:22;:48::i;:::-;51162:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;50966:315;;;;:::o;66799:109::-;66859:13;66892:8;66885:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66799:109;:::o;17967:723::-;18023:13;18253:1;18244:5;:10;18240:53;;;18271:10;;;;;;;;;;;;;;;;;;;;;18240:53;18303:12;18318:5;18303:20;;18334:14;18359:78;18374:1;18366:4;:9;18359:78;;18392:8;;;;;:::i;:::-;;;;18423:2;18415:10;;;;;:::i;:::-;;;18359:78;;;18447:19;18479:6;18469:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18447:39;;18497:154;18513:1;18504:5;:10;18497:154;;18541:1;18531:11;;;;;:::i;:::-;;;18608:2;18600:5;:10;;;;:::i;:::-;18587:2;:24;;;;:::i;:::-;18574:39;;18557:6;18564;18557:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18637:2;18628:11;;;;;:::i;:::-;;;18497:154;;;18675:6;18661:21;;;;;17967:723;;;;:::o;37843:157::-;37928:4;37967:25;37952:40;;;:11;:40;;;;37945:47;;37843:157;;;:::o;60876:589::-;61020:45;61047:4;61053:2;61057:7;61020:26;:45::i;:::-;61098:1;61082:18;;:4;:18;;;61078:187;;;61117:40;61149:7;61117:31;:40::i;:::-;61078:187;;;61187:2;61179:10;;:4;:10;;;61175:90;;61206:47;61239:4;61245:7;61206:32;:47::i;:::-;61175:90;61078:187;61293:1;61279:16;;:2;:16;;;61275:183;;;61312:45;61349:7;61312:36;:45::i;:::-;61275:183;;;61385:4;61379:10;;:2;:10;;;61375:83;;61406:40;61434:2;61438:7;61406:27;:40::i;:::-;61375:83;61275:183;60876:589;;;:::o;12210:716::-;12634:23;12660:69;12688:4;12660:69;;;;;;;;;;;;;;;;;12668:5;12660:27;;;;:69;;;;;:::i;:::-;12634:95;;12764:1;12744:10;:17;:21;12740:179;;;12841:10;12830:30;;;;;;;;;;;;:::i;:::-;12822:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;12740:179;12280:646;12210:716;;:::o;68301:209::-;65792:4;68379:10;;:22;;68370:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;68441:22;68451:2;68455:7;68441:9;:22::i;:::-;68481:21;68494:7;68481:21;;;;;;:::i;:::-;;;;;;;;68301:209;;:::o;56772:799::-;56927:4;56948:15;:2;:13;;;:15::i;:::-;56944:620;;;57000:2;56984:36;;;57021:12;:10;:12::i;:::-;57035:4;57041:7;57050:5;56984:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56980:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57243:1;57226:6;:13;:18;57222:272;;;57269:60;;;;;;;;;;:::i;:::-;;;;;;;;57222:272;57444:6;57438:13;57429:6;57425:2;57421:15;57414:38;56980:529;57117:41;;;57107:51;;;:6;:51;;;;57100:58;;;;;56944:620;57548:4;57541:11;;56772:799;;;;;;;:::o;58143:126::-;;;;:::o;62188:164::-;62292:10;:17;;;;62265:15;:24;62281:7;62265:24;;;;;;;;;;;:44;;;;62320:10;62336:7;62320:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62188:164;:::o;62979:988::-;63245:22;63295:1;63270:22;63287:4;63270:16;:22::i;:::-;:26;;;;:::i;:::-;63245:51;;63307:18;63328:17;:26;63346:7;63328:26;;;;;;;;;;;;63307:47;;63475:14;63461:10;:28;63457:328;;63506:19;63528:12;:18;63541:4;63528:18;;;;;;;;;;;;;;;:34;63547:14;63528:34;;;;;;;;;;;;63506:56;;63612:11;63579:12;:18;63592:4;63579:18;;;;;;;;;;;;;;;:30;63598:10;63579:30;;;;;;;;;;;:44;;;;63729:10;63696:17;:30;63714:11;63696:30;;;;;;;;;;;:43;;;;63491:294;63457:328;63881:17;:26;63899:7;63881:26;;;;;;;;;;;63874:33;;;63925:12;:18;63938:4;63925:18;;;;;;;;;;;;;;;:34;63944:14;63925:34;;;;;;;;;;;63918:41;;;63060:907;;62979:988;;:::o;64262:1079::-;64515:22;64560:1;64540:10;:17;;;;:21;;;;:::i;:::-;64515:46;;64572:18;64593:15;:24;64609:7;64593:24;;;;;;;;;;;;64572:45;;64944:19;64966:10;64977:14;64966:26;;;;;;;;:::i;:::-;;;;;;;;;;64944:48;;65030:11;65005:10;65016;65005:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;65141:10;65110:15;:28;65126:11;65110:28;;;;;;;;;;;:41;;;;65282:15;:24;65298:7;65282:24;;;;;;;;;;;65275:31;;;65317:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;64333:1008;;;64262:1079;:::o;61766:221::-;61851:14;61868:20;61885:2;61868:16;:20::i;:::-;61851:37;;61926:7;61899:12;:16;61912:2;61899:16;;;;;;;;;;;;;;;:24;61916:6;61899:24;;;;;;;;;;;:34;;;;61973:6;61944:17;:26;61962:7;61944:26;;;;;;;;;;;:35;;;;61840:147;61766:221;;:::o;4487:229::-;4624:12;4656:52;4678:6;4686:4;4692:1;4695:12;4656:21;:52::i;:::-;4649:59;;4487:229;;;;;:::o;52578:110::-;52654:26;52664:2;52668:7;52654:26;;;;;;;;;;;;:9;:26::i;:::-;52578:110;;:::o;1681:387::-;1741:4;1949:12;2016:7;2004:20;1996:28;;2059:1;2052:4;:8;2045:15;;;1681:387;;;:::o;5607:510::-;5777:12;5835:5;5810:21;:30;;5802:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;5902:18;5913:6;5902:10;:18::i;:::-;5894:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5968:12;5982:23;6009:6;:11;;6028:5;6035:4;6009:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5967:73;;;;6058:51;6075:7;6084:10;6096:12;6058:16;:51::i;:::-;6051:58;;;;5607:510;;;;;;:::o;52915:321::-;53045:18;53051:2;53055:7;53045:5;:18::i;:::-;53096:54;53127:1;53131:2;53135:7;53144:5;53096:22;:54::i;:::-;53074:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;52915:321;;;:::o;8293:712::-;8443:12;8472:7;8468:530;;;8503:10;8496:17;;;;8468:530;8637:1;8617:10;:17;:21;8613:374;;;8815:10;8809:17;8876:15;8863:10;8859:2;8855:19;8848:44;8613:374;8958:12;8951:20;;;;;;;;;;;:::i;:::-;;;;;;;;8293:712;;;;;;:::o;53572:382::-;53666:1;53652:16;;:2;:16;;;;53644:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;53725:16;53733:7;53725;:16::i;:::-;53724:17;53716:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53787:45;53816:1;53820:2;53824:7;53787:20;:45::i;:::-;53862:1;53845:9;:13;53855:2;53845:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;53893:2;53874:7;:16;53882:7;53874:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;53938:7;53934:2;53913:33;;53930:1;53913:33;;;;;;;;;;;;53572:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:139::-;1214:5;1252:6;1239:20;1230:29;;1268:33;1295:5;1268:33;:::i;:::-;1168:139;;;;:::o;1330:370::-;1401:5;1450:3;1443:4;1435:6;1431:17;1427:27;1417:122;;1458:79;;:::i;:::-;1417:122;1575:6;1562:20;1600:94;1690:3;1682:6;1675:4;1667:6;1663:17;1600:94;:::i;:::-;1591:103;;1407:293;1330:370;;;;:::o;1706:133::-;1749:5;1787:6;1774:20;1765:29;;1803:30;1827:5;1803:30;:::i;:::-;1706:133;;;;:::o;1845:137::-;1899:5;1930:6;1924:13;1915:22;;1946:30;1970:5;1946:30;:::i;:::-;1845:137;;;;:::o;1988:::-;2033:5;2071:6;2058:20;2049:29;;2087:32;2113:5;2087:32;:::i;:::-;1988:137;;;;:::o;2131:141::-;2187:5;2218:6;2212:13;2203:22;;2234:32;2260:5;2234:32;:::i;:::-;2131:141;;;;:::o;2291:338::-;2346:5;2395:3;2388:4;2380:6;2376:17;2372:27;2362:122;;2403:79;;:::i;:::-;2362:122;2520:6;2507:20;2545:78;2619:3;2611:6;2604:4;2596:6;2592:17;2545:78;:::i;:::-;2536:87;;2352:277;2291:338;;;;:::o;2635:169::-;2696:5;2734:6;2721:20;2712:29;;2750:48;2792:5;2750:48;:::i;:::-;2635:169;;;;:::o;2824:553::-;2882:8;2892:6;2942:3;2935:4;2927:6;2923:17;2919:27;2909:122;;2950:79;;:::i;:::-;2909:122;3063:6;3050:20;3040:30;;3093:18;3085:6;3082:30;3079:117;;;3115:79;;:::i;:::-;3079:117;3229:4;3221:6;3217:17;3205:29;;3283:3;3275:4;3267:6;3263:17;3253:8;3249:32;3246:41;3243:128;;;3290:79;;:::i;:::-;3243:128;2824:553;;;;;:::o;3383:139::-;3429:5;3467:6;3454:20;3445:29;;3483:33;3510:5;3483:33;:::i;:::-;3383:139;;;;:::o;3528:329::-;3587:6;3636:2;3624:9;3615:7;3611:23;3607:32;3604:119;;;3642:79;;:::i;:::-;3604:119;3762:1;3787:53;3832:7;3823:6;3812:9;3808:22;3787:53;:::i;:::-;3777:63;;3733:117;3528:329;;;;:::o;3863:474::-;3931:6;3939;3988:2;3976:9;3967:7;3963:23;3959:32;3956:119;;;3994:79;;:::i;:::-;3956:119;4114:1;4139:53;4184:7;4175:6;4164:9;4160:22;4139:53;:::i;:::-;4129:63;;4085:117;4241:2;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4212:118;3863:474;;;;;:::o;4343:619::-;4420:6;4428;4436;4485:2;4473:9;4464:7;4460:23;4456:32;4453:119;;;4491:79;;:::i;:::-;4453:119;4611:1;4636:53;4681:7;4672:6;4661:9;4657:22;4636:53;:::i;:::-;4626:63;;4582:117;4738:2;4764:53;4809:7;4800:6;4789:9;4785:22;4764:53;:::i;:::-;4754:63;;4709:118;4866:2;4892:53;4937:7;4928:6;4917:9;4913:22;4892:53;:::i;:::-;4882:63;;4837:118;4343:619;;;;;:::o;4968:943::-;5063:6;5071;5079;5087;5136:3;5124:9;5115:7;5111:23;5107:33;5104:120;;;5143:79;;:::i;:::-;5104:120;5263:1;5288:53;5333:7;5324:6;5313:9;5309:22;5288:53;:::i;:::-;5278:63;;5234:117;5390:2;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5361:118;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5674:2;5663:9;5659:18;5646:32;5705:18;5697:6;5694:30;5691:117;;;5727:79;;:::i;:::-;5691:117;5832:62;5886:7;5877:6;5866:9;5862:22;5832:62;:::i;:::-;5822:72;;5617:287;4968:943;;;;;;;:::o;5917:468::-;5982:6;5990;6039:2;6027:9;6018:7;6014:23;6010:32;6007:119;;;6045:79;;:::i;:::-;6007:119;6165:1;6190:53;6235:7;6226:6;6215:9;6211:22;6190:53;:::i;:::-;6180:63;;6136:117;6292:2;6318:50;6360:7;6351:6;6340:9;6336:22;6318:50;:::i;:::-;6308:60;;6263:115;5917:468;;;;;:::o;6391:474::-;6459:6;6467;6516:2;6504:9;6495:7;6491:23;6487:32;6484:119;;;6522:79;;:::i;:::-;6484:119;6642:1;6667:53;6712:7;6703:6;6692:9;6688:22;6667:53;:::i;:::-;6657:63;;6613:117;6769:2;6795:53;6840:7;6831:6;6820:9;6816:22;6795:53;:::i;:::-;6785:63;;6740:118;6391:474;;;;;:::o;6871:619::-;6948:6;6956;6964;7013:2;7001:9;6992:7;6988:23;6984:32;6981:119;;;7019:79;;:::i;:::-;6981:119;7139:1;7164:53;7209:7;7200:6;7189:9;7185:22;7164:53;:::i;:::-;7154:63;;7110:117;7266:2;7292:53;7337:7;7328:6;7317:9;7313:22;7292:53;:::i;:::-;7282:63;;7237:118;7394:2;7420:53;7465:7;7456:6;7445:9;7441:22;7420:53;:::i;:::-;7410:63;;7365:118;6871:619;;;;;:::o;7496:539::-;7580:6;7629:2;7617:9;7608:7;7604:23;7600:32;7597:119;;;7635:79;;:::i;:::-;7597:119;7783:1;7772:9;7768:17;7755:31;7813:18;7805:6;7802:30;7799:117;;;7835:79;;:::i;:::-;7799:117;7940:78;8010:7;8001:6;7990:9;7986:22;7940:78;:::i;:::-;7930:88;;7726:302;7496:539;;;;:::o;8041:345::-;8108:6;8157:2;8145:9;8136:7;8132:23;8128:32;8125:119;;;8163:79;;:::i;:::-;8125:119;8283:1;8308:61;8361:7;8352:6;8341:9;8337:22;8308:61;:::i;:::-;8298:71;;8254:125;8041:345;;;;:::o;8392:327::-;8450:6;8499:2;8487:9;8478:7;8474:23;8470:32;8467:119;;;8505:79;;:::i;:::-;8467:119;8625:1;8650:52;8694:7;8685:6;8674:9;8670:22;8650:52;:::i;:::-;8640:62;;8596:116;8392:327;;;;:::o;8725:349::-;8794:6;8843:2;8831:9;8822:7;8818:23;8814:32;8811:119;;;8849:79;;:::i;:::-;8811:119;8969:1;8994:63;9049:7;9040:6;9029:9;9025:22;8994:63;:::i;:::-;8984:73;;8940:127;8725:349;;;;:::o;9080:649::-;9172:6;9180;9188;9237:2;9225:9;9216:7;9212:23;9208:32;9205:119;;;9243:79;;:::i;:::-;9205:119;9363:1;9388:68;9448:7;9439:6;9428:9;9424:22;9388:68;:::i;:::-;9378:78;;9334:132;9505:2;9531:53;9576:7;9567:6;9556:9;9552:22;9531:53;:::i;:::-;9521:63;;9476:118;9633:2;9659:53;9704:7;9695:6;9684:9;9680:22;9659:53;:::i;:::-;9649:63;;9604:118;9080:649;;;;;:::o;9735:529::-;9806:6;9814;9863:2;9851:9;9842:7;9838:23;9834:32;9831:119;;;9869:79;;:::i;:::-;9831:119;10017:1;10006:9;10002:17;9989:31;10047:18;10039:6;10036:30;10033:117;;;10069:79;;:::i;:::-;10033:117;10182:65;10239:7;10230:6;10219:9;10215:22;10182:65;:::i;:::-;10164:83;;;;9960:297;9735:529;;;;;:::o;10270:329::-;10329:6;10378:2;10366:9;10357:7;10353:23;10349:32;10346:119;;;10384:79;;:::i;:::-;10346:119;10504:1;10529:53;10574:7;10565:6;10554:9;10550:22;10529:53;:::i;:::-;10519:63;;10475:117;10270:329;;;;:::o;10605:279::-;10724:10;10745:96;10837:3;10829:6;10745:96;:::i;:::-;10873:4;10868:3;10864:14;10850:28;;10605:279;;;;:::o;10890:142::-;10993:32;11019:5;10993:32;:::i;:::-;10988:3;10981:45;10890:142;;:::o;11038:118::-;11125:24;11143:5;11125:24;:::i;:::-;11120:3;11113:37;11038:118;;:::o;11224:932::-;11393:3;11422:79;11495:5;11422:79;:::i;:::-;11517:111;11621:6;11616:3;11517:111;:::i;:::-;11510:118;;11652:81;11727:5;11652:81;:::i;:::-;11756:7;11787:1;11772:359;11797:6;11794:1;11791:13;11772:359;;;11873:6;11867:13;11900:113;12009:3;11994:13;11900:113;:::i;:::-;11893:120;;12036:85;12114:6;12036:85;:::i;:::-;12026:95;;11832:299;11819:1;11816;11812:9;11807:14;;11772:359;;;11776:14;12147:3;12140:10;;11398:758;;;11224:932;;;;:::o;12162:109::-;12243:21;12258:5;12243:21;:::i;:::-;12238:3;12231:34;12162:109;;:::o;12277:360::-;12363:3;12391:38;12423:5;12391:38;:::i;:::-;12445:70;12508:6;12503:3;12445:70;:::i;:::-;12438:77;;12524:52;12569:6;12564:3;12557:4;12550:5;12546:16;12524:52;:::i;:::-;12601:29;12623:6;12601:29;:::i;:::-;12596:3;12592:39;12585:46;;12367:270;12277:360;;;;:::o;12643:373::-;12747:3;12775:38;12807:5;12775:38;:::i;:::-;12829:88;12910:6;12905:3;12829:88;:::i;:::-;12822:95;;12926:52;12971:6;12966:3;12959:4;12952:5;12948:16;12926:52;:::i;:::-;13003:6;12998:3;12994:16;12987:23;;12751:265;12643:373;;;;:::o;13022:364::-;13110:3;13138:39;13171:5;13138:39;:::i;:::-;13193:71;13257:6;13252:3;13193:71;:::i;:::-;13186:78;;13273:52;13318:6;13313:3;13306:4;13299:5;13295:16;13273:52;:::i;:::-;13350:29;13372:6;13350:29;:::i;:::-;13345:3;13341:39;13334:46;;13114:272;13022:364;;;;:::o;13392:377::-;13498:3;13526:39;13559:5;13526:39;:::i;:::-;13581:89;13663:6;13658:3;13581:89;:::i;:::-;13574:96;;13679:52;13724:6;13719:3;13712:4;13705:5;13701:16;13679:52;:::i;:::-;13756:6;13751:3;13747:16;13740:23;;13502:267;13392:377;;;;:::o;13775:366::-;13917:3;13938:67;14002:2;13997:3;13938:67;:::i;:::-;13931:74;;14014:93;14103:3;14014:93;:::i;:::-;14132:2;14127:3;14123:12;14116:19;;13775:366;;;:::o;14147:::-;14289:3;14310:67;14374:2;14369:3;14310:67;:::i;:::-;14303:74;;14386:93;14475:3;14386:93;:::i;:::-;14504:2;14499:3;14495:12;14488:19;;14147:366;;;:::o;14519:::-;14661:3;14682:67;14746:2;14741:3;14682:67;:::i;:::-;14675:74;;14758:93;14847:3;14758:93;:::i;:::-;14876:2;14871:3;14867:12;14860:19;;14519:366;;;:::o;14891:::-;15033:3;15054:67;15118:2;15113:3;15054:67;:::i;:::-;15047:74;;15130:93;15219:3;15130:93;:::i;:::-;15248:2;15243:3;15239:12;15232:19;;14891:366;;;:::o;15263:::-;15405:3;15426:67;15490:2;15485:3;15426:67;:::i;:::-;15419:74;;15502:93;15591:3;15502:93;:::i;:::-;15620:2;15615:3;15611:12;15604:19;;15263:366;;;:::o;15635:::-;15777:3;15798:67;15862:2;15857:3;15798:67;:::i;:::-;15791:74;;15874:93;15963:3;15874:93;:::i;:::-;15992:2;15987:3;15983:12;15976:19;;15635:366;;;:::o;16007:::-;16149:3;16170:67;16234:2;16229:3;16170:67;:::i;:::-;16163:74;;16246:93;16335:3;16246:93;:::i;:::-;16364:2;16359:3;16355:12;16348:19;;16007:366;;;:::o;16379:::-;16521:3;16542:67;16606:2;16601:3;16542:67;:::i;:::-;16535:74;;16618:93;16707:3;16618:93;:::i;:::-;16736:2;16731:3;16727:12;16720:19;;16379:366;;;:::o;16751:::-;16893:3;16914:67;16978:2;16973:3;16914:67;:::i;:::-;16907:74;;16990:93;17079:3;16990:93;:::i;:::-;17108:2;17103:3;17099:12;17092:19;;16751:366;;;:::o;17123:::-;17265:3;17286:67;17350:2;17345:3;17286:67;:::i;:::-;17279:74;;17362:93;17451:3;17362:93;:::i;:::-;17480:2;17475:3;17471:12;17464:19;;17123:366;;;:::o;17495:::-;17637:3;17658:67;17722:2;17717:3;17658:67;:::i;:::-;17651:74;;17734:93;17823:3;17734:93;:::i;:::-;17852:2;17847:3;17843:12;17836:19;;17495:366;;;:::o;17867:::-;18009:3;18030:67;18094:2;18089:3;18030:67;:::i;:::-;18023:74;;18106:93;18195:3;18106:93;:::i;:::-;18224:2;18219:3;18215:12;18208:19;;17867:366;;;:::o;18239:::-;18381:3;18402:67;18466:2;18461:3;18402:67;:::i;:::-;18395:74;;18478:93;18567:3;18478:93;:::i;:::-;18596:2;18591:3;18587:12;18580:19;;18239:366;;;:::o;18611:::-;18753:3;18774:67;18838:2;18833:3;18774:67;:::i;:::-;18767:74;;18850:93;18939:3;18850:93;:::i;:::-;18968:2;18963:3;18959:12;18952:19;;18611:366;;;:::o;18983:::-;19125:3;19146:67;19210:2;19205:3;19146:67;:::i;:::-;19139:74;;19222:93;19311:3;19222:93;:::i;:::-;19340:2;19335:3;19331:12;19324:19;;18983:366;;;:::o;19355:::-;19497:3;19518:67;19582:2;19577:3;19518:67;:::i;:::-;19511:74;;19594:93;19683:3;19594:93;:::i;:::-;19712:2;19707:3;19703:12;19696:19;;19355:366;;;:::o;19727:::-;19869:3;19890:67;19954:2;19949:3;19890:67;:::i;:::-;19883:74;;19966:93;20055:3;19966:93;:::i;:::-;20084:2;20079:3;20075:12;20068:19;;19727:366;;;:::o;20099:::-;20241:3;20262:67;20326:2;20321:3;20262:67;:::i;:::-;20255:74;;20338:93;20427:3;20338:93;:::i;:::-;20456:2;20451:3;20447:12;20440:19;;20099:366;;;:::o;20471:::-;20613:3;20634:67;20698:2;20693:3;20634:67;:::i;:::-;20627:74;;20710:93;20799:3;20710:93;:::i;:::-;20828:2;20823:3;20819:12;20812:19;;20471:366;;;:::o;20843:::-;20985:3;21006:67;21070:2;21065:3;21006:67;:::i;:::-;20999:74;;21082:93;21171:3;21082:93;:::i;:::-;21200:2;21195:3;21191:12;21184:19;;20843:366;;;:::o;21215:400::-;21375:3;21396:84;21478:1;21473:3;21396:84;:::i;:::-;21389:91;;21489:93;21578:3;21489:93;:::i;:::-;21607:1;21602:3;21598:11;21591:18;;21215:400;;;:::o;21621:366::-;21763:3;21784:67;21848:2;21843:3;21784:67;:::i;:::-;21777:74;;21860:93;21949:3;21860:93;:::i;:::-;21978:2;21973:3;21969:12;21962:19;;21621:366;;;:::o;21993:::-;22135:3;22156:67;22220:2;22215:3;22156:67;:::i;:::-;22149:74;;22232:93;22321:3;22232:93;:::i;:::-;22350:2;22345:3;22341:12;22334:19;;21993:366;;;:::o;22365:::-;22507:3;22528:67;22592:2;22587:3;22528:67;:::i;:::-;22521:74;;22604:93;22693:3;22604:93;:::i;:::-;22722:2;22717:3;22713:12;22706:19;;22365:366;;;:::o;22737:::-;22879:3;22900:67;22964:2;22959:3;22900:67;:::i;:::-;22893:74;;22976:93;23065:3;22976:93;:::i;:::-;23094:2;23089:3;23085:12;23078:19;;22737:366;;;:::o;23109:::-;23251:3;23272:67;23336:2;23331:3;23272:67;:::i;:::-;23265:74;;23348:93;23437:3;23348:93;:::i;:::-;23466:2;23461:3;23457:12;23450:19;;23109:366;;;:::o;23481:398::-;23640:3;23661:83;23742:1;23737:3;23661:83;:::i;:::-;23654:90;;23753:93;23842:3;23753:93;:::i;:::-;23871:1;23866:3;23862:11;23855:18;;23481:398;;;:::o;23885:366::-;24027:3;24048:67;24112:2;24107:3;24048:67;:::i;:::-;24041:74;;24124:93;24213:3;24124:93;:::i;:::-;24242:2;24237:3;24233:12;24226:19;;23885:366;;;:::o;24257:::-;24399:3;24420:67;24484:2;24479:3;24420:67;:::i;:::-;24413:74;;24496:93;24585:3;24496:93;:::i;:::-;24614:2;24609:3;24605:12;24598:19;;24257:366;;;:::o;24629:::-;24771:3;24792:67;24856:2;24851:3;24792:67;:::i;:::-;24785:74;;24868:93;24957:3;24868:93;:::i;:::-;24986:2;24981:3;24977:12;24970:19;;24629:366;;;:::o;25001:::-;25143:3;25164:67;25228:2;25223:3;25164:67;:::i;:::-;25157:74;;25240:93;25329:3;25240:93;:::i;:::-;25358:2;25353:3;25349:12;25342:19;;25001:366;;;:::o;25373:::-;25515:3;25536:67;25600:2;25595:3;25536:67;:::i;:::-;25529:74;;25612:93;25701:3;25612:93;:::i;:::-;25730:2;25725:3;25721:12;25714:19;;25373:366;;;:::o;25745:400::-;25905:3;25926:84;26008:1;26003:3;25926:84;:::i;:::-;25919:91;;26019:93;26108:3;26019:93;:::i;:::-;26137:1;26132:3;26128:11;26121:18;;25745:400;;;:::o;26209:326::-;26346:4;26341:3;26337:14;26436:4;26429:5;26425:16;26419:23;26455:63;26512:4;26507:3;26503:14;26489:12;26455:63;:::i;:::-;26361:167;26315:220;26209:326;;:::o;26541:108::-;26618:24;26636:5;26618:24;:::i;:::-;26613:3;26606:37;26541:108;;:::o;26655:118::-;26742:24;26760:5;26742:24;:::i;:::-;26737:3;26730:37;26655:118;;:::o;26779:271::-;26909:3;26931:93;27020:3;27011:6;26931:93;:::i;:::-;26924:100;;27041:3;27034:10;;26779:271;;;;:::o;27056:967::-;27438:3;27460:95;27551:3;27542:6;27460:95;:::i;:::-;27453:102;;27572:148;27716:3;27572:148;:::i;:::-;27565:155;;27737:95;27828:3;27819:6;27737:95;:::i;:::-;27730:102;;27849:148;27993:3;27849:148;:::i;:::-;27842:155;;28014:3;28007:10;;27056:967;;;;;:::o;28029:379::-;28213:3;28235:147;28378:3;28235:147;:::i;:::-;28228:154;;28399:3;28392:10;;28029:379;;;:::o;28414:222::-;28507:4;28545:2;28534:9;28530:18;28522:26;;28558:71;28626:1;28615:9;28611:17;28602:6;28558:71;:::i;:::-;28414:222;;;;:::o;28642:254::-;28751:4;28789:2;28778:9;28774:18;28766:26;;28802:87;28886:1;28875:9;28871:17;28862:6;28802:87;:::i;:::-;28642:254;;;;:::o;28902:640::-;29097:4;29135:3;29124:9;29120:19;29112:27;;29149:71;29217:1;29206:9;29202:17;29193:6;29149:71;:::i;:::-;29230:72;29298:2;29287:9;29283:18;29274:6;29230:72;:::i;:::-;29312;29380:2;29369:9;29365:18;29356:6;29312:72;:::i;:::-;29431:9;29425:4;29421:20;29416:2;29405:9;29401:18;29394:48;29459:76;29530:4;29521:6;29459:76;:::i;:::-;29451:84;;28902:640;;;;;;;:::o;29548:332::-;29669:4;29707:2;29696:9;29692:18;29684:26;;29720:71;29788:1;29777:9;29773:17;29764:6;29720:71;:::i;:::-;29801:72;29869:2;29858:9;29854:18;29845:6;29801:72;:::i;:::-;29548:332;;;;;:::o;29886:473::-;30079:4;30117:2;30106:9;30102:18;30094:26;;30166:9;30160:4;30156:20;30152:1;30141:9;30137:17;30130:47;30194:158;30347:4;30338:6;30194:158;:::i;:::-;30186:166;;29886:473;;;;:::o;30365:210::-;30452:4;30490:2;30479:9;30475:18;30467:26;;30503:65;30565:1;30554:9;30550:17;30541:6;30503:65;:::i;:::-;30365:210;;;;:::o;30581:313::-;30694:4;30732:2;30721:9;30717:18;30709:26;;30781:9;30775:4;30771:20;30767:1;30756:9;30752:17;30745:47;30809:78;30882:4;30873:6;30809:78;:::i;:::-;30801:86;;30581:313;;;;:::o;30900:419::-;31066:4;31104:2;31093:9;31089:18;31081:26;;31153:9;31147:4;31143:20;31139:1;31128:9;31124:17;31117:47;31181:131;31307:4;31181:131;:::i;:::-;31173:139;;30900:419;;;:::o;31325:::-;31491:4;31529:2;31518:9;31514:18;31506:26;;31578:9;31572:4;31568:20;31564:1;31553:9;31549:17;31542:47;31606:131;31732:4;31606:131;:::i;:::-;31598:139;;31325:419;;;:::o;31750:::-;31916:4;31954:2;31943:9;31939:18;31931:26;;32003:9;31997:4;31993:20;31989:1;31978:9;31974:17;31967:47;32031:131;32157:4;32031:131;:::i;:::-;32023:139;;31750:419;;;:::o;32175:::-;32341:4;32379:2;32368:9;32364:18;32356:26;;32428:9;32422:4;32418:20;32414:1;32403:9;32399:17;32392:47;32456:131;32582:4;32456:131;:::i;:::-;32448:139;;32175:419;;;:::o;32600:::-;32766:4;32804:2;32793:9;32789:18;32781:26;;32853:9;32847:4;32843:20;32839:1;32828:9;32824:17;32817:47;32881:131;33007:4;32881:131;:::i;:::-;32873:139;;32600:419;;;:::o;33025:::-;33191:4;33229:2;33218:9;33214:18;33206:26;;33278:9;33272:4;33268:20;33264:1;33253:9;33249:17;33242:47;33306:131;33432:4;33306:131;:::i;:::-;33298:139;;33025:419;;;:::o;33450:::-;33616:4;33654:2;33643:9;33639:18;33631:26;;33703:9;33697:4;33693:20;33689:1;33678:9;33674:17;33667:47;33731:131;33857:4;33731:131;:::i;:::-;33723:139;;33450:419;;;:::o;33875:::-;34041:4;34079:2;34068:9;34064:18;34056:26;;34128:9;34122:4;34118:20;34114:1;34103:9;34099:17;34092:47;34156:131;34282:4;34156:131;:::i;:::-;34148:139;;33875:419;;;:::o;34300:::-;34466:4;34504:2;34493:9;34489:18;34481:26;;34553:9;34547:4;34543:20;34539:1;34528:9;34524:17;34517:47;34581:131;34707:4;34581:131;:::i;:::-;34573:139;;34300:419;;;:::o;34725:::-;34891:4;34929:2;34918:9;34914:18;34906:26;;34978:9;34972:4;34968:20;34964:1;34953:9;34949:17;34942:47;35006:131;35132:4;35006:131;:::i;:::-;34998:139;;34725:419;;;:::o;35150:::-;35316:4;35354:2;35343:9;35339:18;35331:26;;35403:9;35397:4;35393:20;35389:1;35378:9;35374:17;35367:47;35431:131;35557:4;35431:131;:::i;:::-;35423:139;;35150:419;;;:::o;35575:::-;35741:4;35779:2;35768:9;35764:18;35756:26;;35828:9;35822:4;35818:20;35814:1;35803:9;35799:17;35792:47;35856:131;35982:4;35856:131;:::i;:::-;35848:139;;35575:419;;;:::o;36000:::-;36166:4;36204:2;36193:9;36189:18;36181:26;;36253:9;36247:4;36243:20;36239:1;36228:9;36224:17;36217:47;36281:131;36407:4;36281:131;:::i;:::-;36273:139;;36000:419;;;:::o;36425:::-;36591:4;36629:2;36618:9;36614:18;36606:26;;36678:9;36672:4;36668:20;36664:1;36653:9;36649:17;36642:47;36706:131;36832:4;36706:131;:::i;:::-;36698:139;;36425:419;;;:::o;36850:::-;37016:4;37054:2;37043:9;37039:18;37031:26;;37103:9;37097:4;37093:20;37089:1;37078:9;37074:17;37067:47;37131:131;37257:4;37131:131;:::i;:::-;37123:139;;36850:419;;;:::o;37275:::-;37441:4;37479:2;37468:9;37464:18;37456:26;;37528:9;37522:4;37518:20;37514:1;37503:9;37499:17;37492:47;37556:131;37682:4;37556:131;:::i;:::-;37548:139;;37275:419;;;:::o;37700:::-;37866:4;37904:2;37893:9;37889:18;37881:26;;37953:9;37947:4;37943:20;37939:1;37928:9;37924:17;37917:47;37981:131;38107:4;37981:131;:::i;:::-;37973:139;;37700:419;;;:::o;38125:::-;38291:4;38329:2;38318:9;38314:18;38306:26;;38378:9;38372:4;38368:20;38364:1;38353:9;38349:17;38342:47;38406:131;38532:4;38406:131;:::i;:::-;38398:139;;38125:419;;;:::o;38550:::-;38716:4;38754:2;38743:9;38739:18;38731:26;;38803:9;38797:4;38793:20;38789:1;38778:9;38774:17;38767:47;38831:131;38957:4;38831:131;:::i;:::-;38823:139;;38550:419;;;:::o;38975:::-;39141:4;39179:2;39168:9;39164:18;39156:26;;39228:9;39222:4;39218:20;39214:1;39203:9;39199:17;39192:47;39256:131;39382:4;39256:131;:::i;:::-;39248:139;;38975:419;;;:::o;39400:::-;39566:4;39604:2;39593:9;39589:18;39581:26;;39653:9;39647:4;39643:20;39639:1;39628:9;39624:17;39617:47;39681:131;39807:4;39681:131;:::i;:::-;39673:139;;39400:419;;;:::o;39825:::-;39991:4;40029:2;40018:9;40014:18;40006:26;;40078:9;40072:4;40068:20;40064:1;40053:9;40049:17;40042:47;40106:131;40232:4;40106:131;:::i;:::-;40098:139;;39825:419;;;:::o;40250:::-;40416:4;40454:2;40443:9;40439:18;40431:26;;40503:9;40497:4;40493:20;40489:1;40478:9;40474:17;40467:47;40531:131;40657:4;40531:131;:::i;:::-;40523:139;;40250:419;;;:::o;40675:::-;40841:4;40879:2;40868:9;40864:18;40856:26;;40928:9;40922:4;40918:20;40914:1;40903:9;40899:17;40892:47;40956:131;41082:4;40956:131;:::i;:::-;40948:139;;40675:419;;;:::o;41100:::-;41266:4;41304:2;41293:9;41289:18;41281:26;;41353:9;41347:4;41343:20;41339:1;41328:9;41324:17;41317:47;41381:131;41507:4;41381:131;:::i;:::-;41373:139;;41100:419;;;:::o;41525:::-;41691:4;41729:2;41718:9;41714:18;41706:26;;41778:9;41772:4;41768:20;41764:1;41753:9;41749:17;41742:47;41806:131;41932:4;41806:131;:::i;:::-;41798:139;;41525:419;;;:::o;41950:::-;42116:4;42154:2;42143:9;42139:18;42131:26;;42203:9;42197:4;42193:20;42189:1;42178:9;42174:17;42167:47;42231:131;42357:4;42231:131;:::i;:::-;42223:139;;41950:419;;;:::o;42375:::-;42541:4;42579:2;42568:9;42564:18;42556:26;;42628:9;42622:4;42618:20;42614:1;42603:9;42599:17;42592:47;42656:131;42782:4;42656:131;:::i;:::-;42648:139;;42375:419;;;:::o;42800:::-;42966:4;43004:2;42993:9;42989:18;42981:26;;43053:9;43047:4;43043:20;43039:1;43028:9;43024:17;43017:47;43081:131;43207:4;43081:131;:::i;:::-;43073:139;;42800:419;;;:::o;43225:::-;43391:4;43429:2;43418:9;43414:18;43406:26;;43478:9;43472:4;43468:20;43464:1;43453:9;43449:17;43442:47;43506:131;43632:4;43506:131;:::i;:::-;43498:139;;43225:419;;;:::o;43650:222::-;43743:4;43781:2;43770:9;43766:18;43758:26;;43794:71;43862:1;43851:9;43847:17;43838:6;43794:71;:::i;:::-;43650:222;;;;:::o;43878:129::-;43912:6;43939:20;;:::i;:::-;43929:30;;43968:33;43996:4;43988:6;43968:33;:::i;:::-;43878:129;;;:::o;44013:75::-;44046:6;44079:2;44073:9;44063:19;;44013:75;:::o;44094:311::-;44171:4;44261:18;44253:6;44250:30;44247:56;;;44283:18;;:::i;:::-;44247:56;44333:4;44325:6;44321:17;44313:25;;44393:4;44387;44383:15;44375:23;;44094:311;;;:::o;44411:307::-;44472:4;44562:18;44554:6;44551:30;44548:56;;;44584:18;;:::i;:::-;44548:56;44622:29;44644:6;44622:29;:::i;:::-;44614:37;;44706:4;44700;44696:15;44688:23;;44411:307;;;:::o;44724:157::-;44816:4;44839:3;44831:11;;44869:4;44864:3;44860:14;44852:22;;44724:157;;;:::o;44887:139::-;44979:6;45013:5;45007:12;44997:22;;44887:139;;;:::o;45032:98::-;45083:6;45117:5;45111:12;45101:22;;45032:98;;;:::o;45136:99::-;45188:6;45222:5;45216:12;45206:22;;45136:99;;;:::o;45241:138::-;45336:4;45368;45363:3;45359:14;45351:22;;45241:138;;;:::o;45385:209::-;45509:11;45543:6;45538:3;45531:19;45583:4;45578:3;45574:14;45559:29;;45385:209;;;;:::o;45600:168::-;45683:11;45717:6;45712:3;45705:19;45757:4;45752:3;45748:14;45733:29;;45600:168;;;;:::o;45774:147::-;45875:11;45912:3;45897:18;;45774:147;;;;:::o;45927:169::-;46011:11;46045:6;46040:3;46033:19;46085:4;46080:3;46076:14;46061:29;;45927:169;;;;:::o;46102:148::-;46204:11;46241:3;46226:18;;46102:148;;;;:::o;46256:305::-;46296:3;46315:20;46333:1;46315:20;:::i;:::-;46310:25;;46349:20;46367:1;46349:20;:::i;:::-;46344:25;;46503:1;46435:66;46431:74;46428:1;46425:81;46422:107;;;46509:18;;:::i;:::-;46422:107;46553:1;46550;46546:9;46539:16;;46256:305;;;;:::o;46567:185::-;46607:1;46624:20;46642:1;46624:20;:::i;:::-;46619:25;;46658:20;46676:1;46658:20;:::i;:::-;46653:25;;46697:1;46687:35;;46702:18;;:::i;:::-;46687:35;46744:1;46741;46737:9;46732:14;;46567:185;;;;:::o;46758:348::-;46798:7;46821:20;46839:1;46821:20;:::i;:::-;46816:25;;46855:20;46873:1;46855:20;:::i;:::-;46850:25;;47043:1;46975:66;46971:74;46968:1;46965:81;46960:1;46953:9;46946:17;46942:105;46939:131;;;47050:18;;:::i;:::-;46939:131;47098:1;47095;47091:9;47080:20;;46758:348;;;;:::o;47112:191::-;47152:4;47172:20;47190:1;47172:20;:::i;:::-;47167:25;;47206:20;47224:1;47206:20;:::i;:::-;47201:25;;47245:1;47242;47239:8;47236:34;;;47250:18;;:::i;:::-;47236:34;47295:1;47292;47288:9;47280:17;;47112:191;;;;:::o;47309:96::-;47346:7;47375:24;47393:5;47375:24;:::i;:::-;47364:35;;47309:96;;;:::o;47411:104::-;47456:7;47485:24;47503:5;47485:24;:::i;:::-;47474:35;;47411:104;;;:::o;47521:90::-;47555:7;47598:5;47591:13;47584:21;47573:32;;47521:90;;;:::o;47617:149::-;47653:7;47693:66;47686:5;47682:78;47671:89;;47617:149;;;:::o;47772:111::-;47824:7;47853:24;47871:5;47853:24;:::i;:::-;47842:35;;47772:111;;;:::o;47889:126::-;47926:7;47966:42;47959:5;47955:54;47944:65;;47889:126;;;:::o;48021:77::-;48058:7;48087:5;48076:16;;48021:77;;;:::o;48104:154::-;48188:6;48183:3;48178;48165:30;48250:1;48241:6;48236:3;48232:16;48225:27;48104:154;;;:::o;48264:307::-;48332:1;48342:113;48356:6;48353:1;48350:13;48342:113;;;48441:1;48436:3;48432:11;48426:18;48422:1;48417:3;48413:11;48406:39;48378:2;48375:1;48371:10;48366:15;;48342:113;;;48473:6;48470:1;48467:13;48464:101;;;48553:1;48544:6;48539:3;48535:16;48528:27;48464:101;48313:258;48264:307;;;:::o;48577:320::-;48621:6;48658:1;48652:4;48648:12;48638:22;;48705:1;48699:4;48695:12;48726:18;48716:81;;48782:4;48774:6;48770:17;48760:27;;48716:81;48844:2;48836:6;48833:14;48813:18;48810:38;48807:84;;;48863:18;;:::i;:::-;48807:84;48628:269;48577:320;;;:::o;48903:281::-;48986:27;49008:4;48986:27;:::i;:::-;48978:6;48974:40;49116:6;49104:10;49101:22;49080:18;49068:10;49065:34;49062:62;49059:88;;;49127:18;;:::i;:::-;49059:88;49167:10;49163:2;49156:22;48946:238;48903:281;;:::o;49190:233::-;49229:3;49252:24;49270:5;49252:24;:::i;:::-;49243:33;;49298:66;49291:5;49288:77;49285:103;;;49368:18;;:::i;:::-;49285:103;49415:1;49408:5;49404:13;49397:20;;49190:233;;;:::o;49429:176::-;49461:1;49478:20;49496:1;49478:20;:::i;:::-;49473:25;;49512:20;49530:1;49512:20;:::i;:::-;49507:25;;49551:1;49541:35;;49556:18;;:::i;:::-;49541:35;49597:1;49594;49590:9;49585:14;;49429:176;;;;:::o;49611:180::-;49659:77;49656:1;49649:88;49756:4;49753:1;49746:15;49780:4;49777:1;49770:15;49797:180;49845:77;49842:1;49835:88;49942:4;49939:1;49932:15;49966:4;49963:1;49956:15;49983:180;50031:77;50028:1;50021:88;50128:4;50125:1;50118:15;50152:4;50149:1;50142:15;50169:180;50217:77;50214:1;50207:88;50314:4;50311:1;50304:15;50338:4;50335:1;50328:15;50355:180;50403:77;50400:1;50393:88;50500:4;50497:1;50490:15;50524:4;50521:1;50514:15;50541:180;50589:77;50586:1;50579:88;50686:4;50683:1;50676:15;50710:4;50707:1;50700:15;50727:117;50836:1;50833;50826:12;50850:117;50959:1;50956;50949:12;50973:117;51082:1;51079;51072:12;51096:117;51205:1;51202;51195:12;51219:117;51328:1;51325;51318:12;51342:117;51451:1;51448;51441:12;51465:102;51506:6;51557:2;51553:7;51548:2;51541:5;51537:14;51533:28;51523:38;;51465:102;;;:::o;51573:177::-;51713:29;51709:1;51701:6;51697:14;51690:53;51573:177;:::o;51756:165::-;51896:17;51892:1;51884:6;51880:14;51873:41;51756:165;:::o;51927:221::-;52067:34;52063:1;52055:6;52051:14;52044:58;52136:4;52131:2;52123:6;52119:15;52112:29;51927:221;:::o;52154:230::-;52294:34;52290:1;52282:6;52278:14;52271:58;52363:13;52358:2;52350:6;52346:15;52339:38;52154:230;:::o;52390:237::-;52530:34;52526:1;52518:6;52514:14;52507:58;52599:20;52594:2;52586:6;52582:15;52575:45;52390:237;:::o;52633:225::-;52773:34;52769:1;52761:6;52757:14;52750:58;52842:8;52837:2;52829:6;52825:15;52818:33;52633:225;:::o;52864:178::-;53004:30;53000:1;52992:6;52988:14;52981:54;52864:178;:::o;53048:171::-;53188:23;53184:1;53176:6;53172:14;53165:47;53048:171;:::o;53225:223::-;53365:34;53361:1;53353:6;53349:14;53342:58;53434:6;53429:2;53421:6;53417:15;53410:31;53225:223;:::o;53454:175::-;53594:27;53590:1;53582:6;53578:14;53571:51;53454:175;:::o;53635:225::-;53775:34;53771:1;53763:6;53759:14;53752:58;53844:8;53839:2;53831:6;53827:15;53820:33;53635:225;:::o;53866:231::-;54006:34;54002:1;53994:6;53990:14;53983:58;54075:14;54070:2;54062:6;54058:15;54051:39;53866:231;:::o;54103:166::-;54243:18;54239:1;54231:6;54227:14;54220:42;54103:166;:::o;54275:243::-;54415:34;54411:1;54403:6;54399:14;54392:58;54484:26;54479:2;54471:6;54467:15;54460:51;54275:243;:::o;54524:181::-;54664:33;54660:1;54652:6;54648:14;54641:57;54524:181;:::o;54711:229::-;54851:34;54847:1;54839:6;54835:14;54828:58;54920:12;54915:2;54907:6;54903:15;54896:37;54711:229;:::o;54946:228::-;55086:34;55082:1;55074:6;55070:14;55063:58;55155:11;55150:2;55142:6;55138:15;55131:36;54946:228;:::o;55180:169::-;55320:21;55316:1;55308:6;55304:14;55297:45;55180:169;:::o;55355:182::-;55495:34;55491:1;55483:6;55479:14;55472:58;55355:182;:::o;55543:231::-;55683:34;55679:1;55671:6;55667:14;55660:58;55752:14;55747:2;55739:6;55735:15;55728:39;55543:231;:::o;55780:155::-;55920:7;55916:1;55908:6;55904:14;55897:31;55780:155;:::o;55941:182::-;56081:34;56077:1;56069:6;56065:14;56058:58;55941:182;:::o;56129:174::-;56269:26;56265:1;56257:6;56253:14;56246:50;56129:174;:::o;56309:228::-;56449:34;56445:1;56437:6;56433:14;56426:58;56518:11;56513:2;56505:6;56501:15;56494:36;56309:228;:::o;56543:234::-;56683:34;56679:1;56671:6;56667:14;56660:58;56752:17;56747:2;56739:6;56735:15;56728:42;56543:234;:::o;56783:220::-;56923:34;56919:1;56911:6;56907:14;56900:58;56992:3;56987:2;56979:6;56975:15;56968:28;56783:220;:::o;57009:114::-;;:::o;57129:236::-;57269:34;57265:1;57257:6;57253:14;57246:58;57338:19;57333:2;57325:6;57321:15;57314:44;57129:236;:::o;57371:179::-;57511:31;57507:1;57499:6;57495:14;57488:55;57371:179;:::o;57556:231::-;57696:34;57692:1;57684:6;57680:14;57673:58;57765:14;57760:2;57752:6;57748:15;57741:39;57556:231;:::o;57793:229::-;57933:34;57929:1;57921:6;57917:14;57910:58;58002:12;57997:2;57989:6;57985:15;57978:37;57793:229;:::o;58028:224::-;58168:34;58164:1;58156:6;58152:14;58145:58;58237:7;58232:2;58224:6;58220:15;58213:32;58028:224;:::o;58258:151::-;58398:3;58394:1;58386:6;58382:14;58375:27;58258:151;:::o;58415:122::-;58488:24;58506:5;58488:24;:::i;:::-;58481:5;58478:35;58468:63;;58527:1;58524;58517:12;58468:63;58415:122;:::o;58543:116::-;58613:21;58628:5;58613:21;:::i;:::-;58606:5;58603:32;58593:60;;58649:1;58646;58639:12;58593:60;58543:116;:::o;58665:120::-;58737:23;58754:5;58737:23;:::i;:::-;58730:5;58727:34;58717:62;;58775:1;58772;58765:12;58717:62;58665:120;:::o;58791:152::-;58879:39;58912:5;58879:39;:::i;:::-;58872:5;58869:50;58859:78;;58933:1;58930;58923:12;58859:78;58791:152;:::o;58949:122::-;59022:24;59040:5;59022:24;:::i;:::-;59015:5;59012:35;59002:63;;59061:1;59058;59051:12;59002:63;58949:122;:::o
Swarm Source
ipfs://ce16310f82c5fc5aa86b64f2b970bf8694403e24de86c1a3b614407e30d1dcec
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.