Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MartinToken
Compiler Version
v0.8.22+commit.4fc1097e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-11-29 */ // File: https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/v4.7.1/contracts/token/ERC20/IERC20Upgradeable.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/v4.7.1/contracts/token/ERC20/extensions/IERC20MetadataUpgradeable.sol // 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 IERC20MetadataUpgradeable is IERC20Upgradeable { /** * @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); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/v4.7.1/contracts/utils/AddressUpgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/v4.7.1/contracts/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/v4.7.1/contracts/utils/ContextUpgradeable.sol // 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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/v4.7.1/contracts/token/ERC20/ERC20Upgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (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 ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable { 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. */ function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _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: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, 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}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, 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}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, 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) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, 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) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * 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: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, 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 Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - 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 {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[45] private __gap; } // File: https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/v4.7.1/contracts/access/OwnableUpgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File: contracts/Token.sol pragma solidity ^0.8.22; contract MartinToken is ERC20Upgradeable, OwnableUpgradeable { uint256 public cap; function initialize( string memory name, string memory symbol, uint256 _cap, address initialOwner ) public initializer { __ERC20_init(name, symbol); __Ownable_init(); cap = _cap; transferOwnership(initialOwner); } function mint(address to, uint256 amount) public onlyOwner { require(totalSupply() + amount <= cap, "MartinToken: cap exceeded"); _mint(to, amount); } function burn(uint256 amount) public { _burn(msg.sender, amount); } }
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"_cap","type":"uint256"},{"internalType":"address","name":"initialOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561000f575f80fd5b506124ac8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610114575f3560e01c806370a08231116100a0578063a457c2d71161006f578063a457c2d7146102ce578063a9059cbb146102fe578063bd3a13f61461032e578063dd62ed3e1461034a578063f2fde38b1461037a57610114565b806370a0823114610258578063715018a6146102885780638da5cb5b1461029257806395d89b41146102b057610114565b8063313ce567116100e7578063313ce567146101b4578063355274ea146101d257806339509351146101f057806340c10f191461022057806342966c681461023c57610114565b806306fdde0314610118578063095ea7b31461013657806318160ddd1461016657806323b872dd14610184575b5f80fd5b610120610396565b60405161012d91906114af565b60405180910390f35b610150600480360381019061014b919061156d565b610426565b60405161015d91906115c5565b60405180910390f35b61016e610448565b60405161017b91906115ed565b60405180910390f35b61019e60048036038101906101999190611606565b610451565b6040516101ab91906115c5565b60405180910390f35b6101bc61047f565b6040516101c99190611671565b60405180910390f35b6101da610487565b6040516101e791906115ed565b60405180910390f35b61020a6004803603810190610205919061156d565b61048d565b60405161021791906115c5565b60405180910390f35b61023a6004803603810190610235919061156d565b6104c3565b005b6102566004803603810190610251919061168a565b610530565b005b610272600480360381019061026d91906116b5565b61053d565b60405161027f91906115ed565b60405180910390f35b610290610583565b005b61029a610596565b6040516102a791906116ef565b60405180910390f35b6102b86105be565b6040516102c591906114af565b60405180910390f35b6102e860048036038101906102e3919061156d565b61064e565b6040516102f591906115c5565b60405180910390f35b6103186004803603810190610313919061156d565b6106c3565b60405161032591906115c5565b60405180910390f35b61034860048036038101906103439190611834565b6106e5565b005b610364600480360381019061035f91906118d0565b61083b565b60405161037191906115ed565b60405180910390f35b610394600480360381019061038f91906116b5565b6108bd565b005b6060603680546103a59061193b565b80601f01602080910402602001604051908101604052809291908181526020018280546103d19061193b565b801561041c5780601f106103f35761010080835404028352916020019161041c565b820191905f5260205f20905b8154815290600101906020018083116103ff57829003601f168201915b5050505050905090565b5f8061043061093f565b905061043d818585610946565b600191505092915050565b5f603554905090565b5f8061045b61093f565b9050610468858285610b09565b610473858585610b94565b60019150509392505050565b5f6012905090565b60975481565b5f8061049761093f565b90506104b88185856104a9858961083b565b6104b39190611998565b610946565b600191505092915050565b6104cb610e0c565b609754816104d7610448565b6104e19190611998565b1115610522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051990611a15565b60405180910390fd5b61052c8282610e8a565b5050565b61053a3382610fe2565b50565b5f60335f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61058b610e0c565b6105945f6111b0565b565b5f60655f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060603780546105cd9061193b565b80601f01602080910402602001604051908101604052809291908181526020018280546105f99061193b565b80156106445780601f1061061b57610100808354040283529160200191610644565b820191905f5260205f20905b81548152906001019060200180831161062757829003601f168201915b5050505050905090565b5f8061065861093f565b90505f610665828661083b565b9050838110156106aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a190611aa3565b60405180910390fd5b6106b78286868403610946565b60019250505092915050565b5f806106cd61093f565b90506106da818585610b94565b600191505092915050565b5f8060019054906101000a900460ff16159050808015610714575060015f8054906101000a900460ff1660ff16105b80610740575061072330611273565b15801561073f575060015f8054906101000a900460ff1660ff16145b5b61077f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077690611b31565b60405180910390fd5b60015f806101000a81548160ff021916908360ff16021790555080156107ba5760015f60016101000a81548160ff0219169083151502179055505b6107c48585611295565b6107cc6112f1565b826097819055506107dc826108bd565b8015610834575f8060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161082b9190611b91565b60405180910390a15b5050505050565b5f60345f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6108c5610e0c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a90611c1a565b60405180910390fd5b61093c816111b0565b50565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ab90611ca8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1990611d36565b60405180910390fd5b8060345f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610afc91906115ed565b60405180910390a3505050565b5f610b14848461083b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610b8e5781811015610b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7790611d9e565b60405180910390fd5b610b8d8484848403610946565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf990611e2c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6790611eba565b60405180910390fd5b610c7b838383611349565b5f60335f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf690611f48565b60405180910390fd5b81810360335f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160335f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d8f9190611998565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610df391906115ed565b60405180910390a3610e0684848461134e565b50505050565b610e1461093f565b73ffffffffffffffffffffffffffffffffffffffff16610e32610596565b73ffffffffffffffffffffffffffffffffffffffff1614610e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7f90611fb0565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eef90612018565b60405180910390fd5b610f035f8383611349565b8060355f828254610f149190611998565b925050819055508060335f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610f679190611998565b925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610fcb91906115ed565b60405180910390a3610fde5f838361134e565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611050576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611047906120a6565b60405180910390fd5b61105b825f83611349565b5f60335f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d690612134565b60405180910390fd5b81810360335f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160355f8282546111349190612152565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161119891906115ed565b60405180910390a36111ab835f8461134e565b505050565b5f60655f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160655f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f60019054906101000a900460ff166112e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112da906121f5565b60405180910390fd5b6112ed8282611353565b5050565b5f60019054906101000a900460ff1661133f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611336906121f5565b60405180910390fd5b6113476113c5565b565b505050565b505050565b5f60019054906101000a900460ff166113a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611398906121f5565b60405180910390fd5b81603690816113b091906123a7565b5080603790816113c091906123a7565b505050565b5f60019054906101000a900460ff16611413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140a906121f5565b60405180910390fd5b61142361141e61093f565b6111b0565b565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561145c578082015181840152602081019050611441565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61148182611425565b61148b818561142f565b935061149b81856020860161143f565b6114a481611467565b840191505092915050565b5f6020820190508181035f8301526114c78184611477565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611509826114e0565b9050919050565b611519816114ff565b8114611523575f80fd5b50565b5f8135905061153481611510565b92915050565b5f819050919050565b61154c8161153a565b8114611556575f80fd5b50565b5f8135905061156781611543565b92915050565b5f8060408385031215611583576115826114d8565b5b5f61159085828601611526565b92505060206115a185828601611559565b9150509250929050565b5f8115159050919050565b6115bf816115ab565b82525050565b5f6020820190506115d85f8301846115b6565b92915050565b6115e78161153a565b82525050565b5f6020820190506116005f8301846115de565b92915050565b5f805f6060848603121561161d5761161c6114d8565b5b5f61162a86828701611526565b935050602061163b86828701611526565b925050604061164c86828701611559565b9150509250925092565b5f60ff82169050919050565b61166b81611656565b82525050565b5f6020820190506116845f830184611662565b92915050565b5f6020828403121561169f5761169e6114d8565b5b5f6116ac84828501611559565b91505092915050565b5f602082840312156116ca576116c96114d8565b5b5f6116d784828501611526565b91505092915050565b6116e9816114ff565b82525050565b5f6020820190506117025f8301846116e0565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61174682611467565b810181811067ffffffffffffffff8211171561176557611764611710565b5b80604052505050565b5f6117776114cf565b9050611783828261173d565b919050565b5f67ffffffffffffffff8211156117a2576117a1611710565b5b6117ab82611467565b9050602081019050919050565b828183375f83830152505050565b5f6117d86117d384611788565b61176e565b9050828152602081018484840111156117f4576117f361170c565b5b6117ff8482856117b8565b509392505050565b5f82601f83011261181b5761181a611708565b5b813561182b8482602086016117c6565b91505092915050565b5f805f806080858703121561184c5761184b6114d8565b5b5f85013567ffffffffffffffff811115611869576118686114dc565b5b61187587828801611807565b945050602085013567ffffffffffffffff811115611896576118956114dc565b5b6118a287828801611807565b93505060406118b387828801611559565b92505060606118c487828801611526565b91505092959194509250565b5f80604083850312156118e6576118e56114d8565b5b5f6118f385828601611526565b925050602061190485828601611526565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061195257607f821691505b6020821081036119655761196461190e565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6119a28261153a565b91506119ad8361153a565b92508282019050808211156119c5576119c461196b565b5b92915050565b7f4d617274696e546f6b656e3a20636170206578636565646564000000000000005f82015250565b5f6119ff60198361142f565b9150611a0a826119cb565b602082019050919050565b5f6020820190508181035f830152611a2c816119f3565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f611a8d60258361142f565b9150611a9882611a33565b604082019050919050565b5f6020820190508181035f830152611aba81611a81565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c7265615f8201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b5f611b1b602e8361142f565b9150611b2682611ac1565b604082019050919050565b5f6020820190508181035f830152611b4881611b0f565b9050919050565b5f819050919050565b5f819050919050565b5f611b7b611b76611b7184611b4f565b611b58565b611656565b9050919050565b611b8b81611b61565b82525050565b5f602082019050611ba45f830184611b82565b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f611c0460268361142f565b9150611c0f82611baa565b604082019050919050565b5f6020820190508181035f830152611c3181611bf8565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f611c9260248361142f565b9150611c9d82611c38565b604082019050919050565b5f6020820190508181035f830152611cbf81611c86565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611d2060228361142f565b9150611d2b82611cc6565b604082019050919050565b5f6020820190508181035f830152611d4d81611d14565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f611d88601d8361142f565b9150611d9382611d54565b602082019050919050565b5f6020820190508181035f830152611db581611d7c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f611e1660258361142f565b9150611e2182611dbc565b604082019050919050565b5f6020820190508181035f830152611e4381611e0a565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f611ea460238361142f565b9150611eaf82611e4a565b604082019050919050565b5f6020820190508181035f830152611ed181611e98565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f611f3260268361142f565b9150611f3d82611ed8565b604082019050919050565b5f6020820190508181035f830152611f5f81611f26565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f611f9a60208361142f565b9150611fa582611f66565b602082019050919050565b5f6020820190508181035f830152611fc781611f8e565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f612002601f8361142f565b915061200d82611fce565b602082019050919050565b5f6020820190508181035f83015261202f81611ff6565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f61209060218361142f565b915061209b82612036565b604082019050919050565b5f6020820190508181035f8301526120bd81612084565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f61211e60228361142f565b9150612129826120c4565b604082019050919050565b5f6020820190508181035f83015261214b81612112565b9050919050565b5f61215c8261153a565b91506121678361153a565b925082820390508181111561217f5761217e61196b565b5b92915050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420695f8201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b5f6121df602b8361142f565b91506121ea82612185565b604082019050919050565b5f6020820190508181035f83015261220c816121d3565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261226f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612234565b6122798683612234565b95508019841693508086168417925050509392505050565b5f6122ab6122a66122a18461153a565b611b58565b61153a565b9050919050565b5f819050919050565b6122c483612291565b6122d86122d0826122b2565b848454612240565b825550505050565b5f90565b6122ec6122e0565b6122f78184846122bb565b505050565b5b8181101561231a5761230f5f826122e4565b6001810190506122fd565b5050565b601f82111561235f5761233081612213565b61233984612225565b81016020851015612348578190505b61235c61235485612225565b8301826122fc565b50505b505050565b5f82821c905092915050565b5f61237f5f1984600802612364565b1980831691505092915050565b5f6123978383612370565b9150826002028217905092915050565b6123b082611425565b67ffffffffffffffff8111156123c9576123c8611710565b5b6123d3825461193b565b6123de82828561231e565b5f60209050601f83116001811461240f575f84156123fd578287015190505b612407858261238c565b86555061246e565b601f19841661241d86612213565b5f5b828110156124445784890151825560018201915060208501945060208101905061241f565b86831015612461578489015161245d601f891682612370565b8355505b6001600288020188555050505b50505050505056fea2646970667358221220886b6d88d37cc198055dae7e61541804823c56b21748f3414d8658f91282b56164736f6c63430008160033
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610114575f3560e01c806370a08231116100a0578063a457c2d71161006f578063a457c2d7146102ce578063a9059cbb146102fe578063bd3a13f61461032e578063dd62ed3e1461034a578063f2fde38b1461037a57610114565b806370a0823114610258578063715018a6146102885780638da5cb5b1461029257806395d89b41146102b057610114565b8063313ce567116100e7578063313ce567146101b4578063355274ea146101d257806339509351146101f057806340c10f191461022057806342966c681461023c57610114565b806306fdde0314610118578063095ea7b31461013657806318160ddd1461016657806323b872dd14610184575b5f80fd5b610120610396565b60405161012d91906114af565b60405180910390f35b610150600480360381019061014b919061156d565b610426565b60405161015d91906115c5565b60405180910390f35b61016e610448565b60405161017b91906115ed565b60405180910390f35b61019e60048036038101906101999190611606565b610451565b6040516101ab91906115c5565b60405180910390f35b6101bc61047f565b6040516101c99190611671565b60405180910390f35b6101da610487565b6040516101e791906115ed565b60405180910390f35b61020a6004803603810190610205919061156d565b61048d565b60405161021791906115c5565b60405180910390f35b61023a6004803603810190610235919061156d565b6104c3565b005b6102566004803603810190610251919061168a565b610530565b005b610272600480360381019061026d91906116b5565b61053d565b60405161027f91906115ed565b60405180910390f35b610290610583565b005b61029a610596565b6040516102a791906116ef565b60405180910390f35b6102b86105be565b6040516102c591906114af565b60405180910390f35b6102e860048036038101906102e3919061156d565b61064e565b6040516102f591906115c5565b60405180910390f35b6103186004803603810190610313919061156d565b6106c3565b60405161032591906115c5565b60405180910390f35b61034860048036038101906103439190611834565b6106e5565b005b610364600480360381019061035f91906118d0565b61083b565b60405161037191906115ed565b60405180910390f35b610394600480360381019061038f91906116b5565b6108bd565b005b6060603680546103a59061193b565b80601f01602080910402602001604051908101604052809291908181526020018280546103d19061193b565b801561041c5780601f106103f35761010080835404028352916020019161041c565b820191905f5260205f20905b8154815290600101906020018083116103ff57829003601f168201915b5050505050905090565b5f8061043061093f565b905061043d818585610946565b600191505092915050565b5f603554905090565b5f8061045b61093f565b9050610468858285610b09565b610473858585610b94565b60019150509392505050565b5f6012905090565b60975481565b5f8061049761093f565b90506104b88185856104a9858961083b565b6104b39190611998565b610946565b600191505092915050565b6104cb610e0c565b609754816104d7610448565b6104e19190611998565b1115610522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051990611a15565b60405180910390fd5b61052c8282610e8a565b5050565b61053a3382610fe2565b50565b5f60335f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61058b610e0c565b6105945f6111b0565b565b5f60655f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060603780546105cd9061193b565b80601f01602080910402602001604051908101604052809291908181526020018280546105f99061193b565b80156106445780601f1061061b57610100808354040283529160200191610644565b820191905f5260205f20905b81548152906001019060200180831161062757829003601f168201915b5050505050905090565b5f8061065861093f565b90505f610665828661083b565b9050838110156106aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a190611aa3565b60405180910390fd5b6106b78286868403610946565b60019250505092915050565b5f806106cd61093f565b90506106da818585610b94565b600191505092915050565b5f8060019054906101000a900460ff16159050808015610714575060015f8054906101000a900460ff1660ff16105b80610740575061072330611273565b15801561073f575060015f8054906101000a900460ff1660ff16145b5b61077f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077690611b31565b60405180910390fd5b60015f806101000a81548160ff021916908360ff16021790555080156107ba5760015f60016101000a81548160ff0219169083151502179055505b6107c48585611295565b6107cc6112f1565b826097819055506107dc826108bd565b8015610834575f8060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161082b9190611b91565b60405180910390a15b5050505050565b5f60345f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6108c5610e0c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a90611c1a565b60405180910390fd5b61093c816111b0565b50565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ab90611ca8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1990611d36565b60405180910390fd5b8060345f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610afc91906115ed565b60405180910390a3505050565b5f610b14848461083b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610b8e5781811015610b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7790611d9e565b60405180910390fd5b610b8d8484848403610946565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf990611e2c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6790611eba565b60405180910390fd5b610c7b838383611349565b5f60335f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf690611f48565b60405180910390fd5b81810360335f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160335f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d8f9190611998565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610df391906115ed565b60405180910390a3610e0684848461134e565b50505050565b610e1461093f565b73ffffffffffffffffffffffffffffffffffffffff16610e32610596565b73ffffffffffffffffffffffffffffffffffffffff1614610e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7f90611fb0565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eef90612018565b60405180910390fd5b610f035f8383611349565b8060355f828254610f149190611998565b925050819055508060335f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610f679190611998565b925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610fcb91906115ed565b60405180910390a3610fde5f838361134e565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611050576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611047906120a6565b60405180910390fd5b61105b825f83611349565b5f60335f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d690612134565b60405180910390fd5b81810360335f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160355f8282546111349190612152565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161119891906115ed565b60405180910390a36111ab835f8461134e565b505050565b5f60655f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160655f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f60019054906101000a900460ff166112e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112da906121f5565b60405180910390fd5b6112ed8282611353565b5050565b5f60019054906101000a900460ff1661133f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611336906121f5565b60405180910390fd5b6113476113c5565b565b505050565b505050565b5f60019054906101000a900460ff166113a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611398906121f5565b60405180910390fd5b81603690816113b091906123a7565b5080603790816113c091906123a7565b505050565b5f60019054906101000a900460ff16611413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140a906121f5565b60405180910390fd5b61142361141e61093f565b6111b0565b565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561145c578082015181840152602081019050611441565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61148182611425565b61148b818561142f565b935061149b81856020860161143f565b6114a481611467565b840191505092915050565b5f6020820190508181035f8301526114c78184611477565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611509826114e0565b9050919050565b611519816114ff565b8114611523575f80fd5b50565b5f8135905061153481611510565b92915050565b5f819050919050565b61154c8161153a565b8114611556575f80fd5b50565b5f8135905061156781611543565b92915050565b5f8060408385031215611583576115826114d8565b5b5f61159085828601611526565b92505060206115a185828601611559565b9150509250929050565b5f8115159050919050565b6115bf816115ab565b82525050565b5f6020820190506115d85f8301846115b6565b92915050565b6115e78161153a565b82525050565b5f6020820190506116005f8301846115de565b92915050565b5f805f6060848603121561161d5761161c6114d8565b5b5f61162a86828701611526565b935050602061163b86828701611526565b925050604061164c86828701611559565b9150509250925092565b5f60ff82169050919050565b61166b81611656565b82525050565b5f6020820190506116845f830184611662565b92915050565b5f6020828403121561169f5761169e6114d8565b5b5f6116ac84828501611559565b91505092915050565b5f602082840312156116ca576116c96114d8565b5b5f6116d784828501611526565b91505092915050565b6116e9816114ff565b82525050565b5f6020820190506117025f8301846116e0565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61174682611467565b810181811067ffffffffffffffff8211171561176557611764611710565b5b80604052505050565b5f6117776114cf565b9050611783828261173d565b919050565b5f67ffffffffffffffff8211156117a2576117a1611710565b5b6117ab82611467565b9050602081019050919050565b828183375f83830152505050565b5f6117d86117d384611788565b61176e565b9050828152602081018484840111156117f4576117f361170c565b5b6117ff8482856117b8565b509392505050565b5f82601f83011261181b5761181a611708565b5b813561182b8482602086016117c6565b91505092915050565b5f805f806080858703121561184c5761184b6114d8565b5b5f85013567ffffffffffffffff811115611869576118686114dc565b5b61187587828801611807565b945050602085013567ffffffffffffffff811115611896576118956114dc565b5b6118a287828801611807565b93505060406118b387828801611559565b92505060606118c487828801611526565b91505092959194509250565b5f80604083850312156118e6576118e56114d8565b5b5f6118f385828601611526565b925050602061190485828601611526565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061195257607f821691505b6020821081036119655761196461190e565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6119a28261153a565b91506119ad8361153a565b92508282019050808211156119c5576119c461196b565b5b92915050565b7f4d617274696e546f6b656e3a20636170206578636565646564000000000000005f82015250565b5f6119ff60198361142f565b9150611a0a826119cb565b602082019050919050565b5f6020820190508181035f830152611a2c816119f3565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f611a8d60258361142f565b9150611a9882611a33565b604082019050919050565b5f6020820190508181035f830152611aba81611a81565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c7265615f8201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b5f611b1b602e8361142f565b9150611b2682611ac1565b604082019050919050565b5f6020820190508181035f830152611b4881611b0f565b9050919050565b5f819050919050565b5f819050919050565b5f611b7b611b76611b7184611b4f565b611b58565b611656565b9050919050565b611b8b81611b61565b82525050565b5f602082019050611ba45f830184611b82565b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f611c0460268361142f565b9150611c0f82611baa565b604082019050919050565b5f6020820190508181035f830152611c3181611bf8565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f611c9260248361142f565b9150611c9d82611c38565b604082019050919050565b5f6020820190508181035f830152611cbf81611c86565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611d2060228361142f565b9150611d2b82611cc6565b604082019050919050565b5f6020820190508181035f830152611d4d81611d14565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f611d88601d8361142f565b9150611d9382611d54565b602082019050919050565b5f6020820190508181035f830152611db581611d7c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f611e1660258361142f565b9150611e2182611dbc565b604082019050919050565b5f6020820190508181035f830152611e4381611e0a565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f611ea460238361142f565b9150611eaf82611e4a565b604082019050919050565b5f6020820190508181035f830152611ed181611e98565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f611f3260268361142f565b9150611f3d82611ed8565b604082019050919050565b5f6020820190508181035f830152611f5f81611f26565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f611f9a60208361142f565b9150611fa582611f66565b602082019050919050565b5f6020820190508181035f830152611fc781611f8e565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f612002601f8361142f565b915061200d82611fce565b602082019050919050565b5f6020820190508181035f83015261202f81611ff6565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f61209060218361142f565b915061209b82612036565b604082019050919050565b5f6020820190508181035f8301526120bd81612084565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f61211e60228361142f565b9150612129826120c4565b604082019050919050565b5f6020820190508181035f83015261214b81612112565b9050919050565b5f61215c8261153a565b91506121678361153a565b925082820390508181111561217f5761217e61196b565b5b92915050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420695f8201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b5f6121df602b8361142f565b91506121ea82612185565b604082019050919050565b5f6020820190508181035f83015261220c816121d3565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261226f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612234565b6122798683612234565b95508019841693508086168417925050509392505050565b5f6122ab6122a66122a18461153a565b611b58565b61153a565b9050919050565b5f819050919050565b6122c483612291565b6122d86122d0826122b2565b848454612240565b825550505050565b5f90565b6122ec6122e0565b6122f78184846122bb565b505050565b5b8181101561231a5761230f5f826122e4565b6001810190506122fd565b5050565b601f82111561235f5761233081612213565b61233984612225565b81016020851015612348578190505b61235c61235485612225565b8301826122fc565b50505b505050565b5f82821c905092915050565b5f61237f5f1984600802612364565b1980831691505092915050565b5f6123978383612370565b9150826002028217905092915050565b6123b082611425565b67ffffffffffffffff8111156123c9576123c8611710565b5b6123d3825461193b565b6123de82828561231e565b5f60209050601f83116001811461240f575f84156123fd578287015190505b612407858261238c565b86555061246e565b601f19841661241d86612213565b5f5b828110156124445784890151825560018201915060208501945060208101905061241f565b86831015612461578489015161245d601f891682612370565b8355505b6001600288020188555050505b50505050505056fea2646970667358221220886b6d88d37cc198055dae7e61541804823c56b21748f3414d8658f91282b56164736f6c63430008160033
Deployed Bytecode Sourcemap
35669:663:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21253:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23604:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22373:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24385:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22215:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35737:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25089:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36067:173;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36248:81;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22544:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34488:103;;;:::i;:::-;;33840:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21472:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25830:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22877:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35764:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23133:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34746:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21253:100;21307:13;21340:5;21333:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21253:100;:::o;23604:201::-;23687:4;23704:13;23720:12;:10;:12::i;:::-;23704:28;;23743:32;23752:5;23759:7;23768:6;23743:8;:32::i;:::-;23793:4;23786:11;;;23604:201;;;;:::o;22373:108::-;22434:7;22461:12;;22454:19;;22373:108;:::o;24385:295::-;24516:4;24533:15;24551:12;:10;:12::i;:::-;24533:30;;24574:38;24590:4;24596:7;24605:6;24574:15;:38::i;:::-;24623:27;24633:4;24639:2;24643:6;24623:9;:27::i;:::-;24668:4;24661:11;;;24385:295;;;;;:::o;22215:93::-;22273:5;22298:2;22291:9;;22215:93;:::o;35737:18::-;;;;:::o;25089:238::-;25177:4;25194:13;25210:12;:10;:12::i;:::-;25194:28;;25233:64;25242:5;25249:7;25286:10;25258:25;25268:5;25275:7;25258:9;:25::i;:::-;:38;;;;:::i;:::-;25233:8;:64::i;:::-;25315:4;25308:11;;;25089:238;;;;:::o;36067:173::-;33726:13;:11;:13::i;:::-;36171:3:::1;;36161:6;36145:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:29;;36137:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36215:17;36221:2;36225:6;36215:5;:17::i;:::-;36067:173:::0;;:::o;36248:81::-;36296:25;36302:10;36314:6;36296:5;:25::i;:::-;36248:81;:::o;22544:127::-;22618:7;22645:9;:18;22655:7;22645:18;;;;;;;;;;;;;;;;22638:25;;22544:127;;;:::o;34488:103::-;33726:13;:11;:13::i;:::-;34553:30:::1;34580:1;34553:18;:30::i;:::-;34488:103::o:0;33840:87::-;33886:7;33913:6;;;;;;;;;;;33906:13;;33840:87;:::o;21472:104::-;21528:13;21561:7;21554:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21472:104;:::o;25830:436::-;25923:4;25940:13;25956:12;:10;:12::i;:::-;25940:28;;25979:24;26006:25;26016:5;26023:7;26006:9;:25::i;:::-;25979:52;;26070:15;26050:16;:35;;26042:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;26163:60;26172:5;26179:7;26207:15;26188:16;:34;26163:8;:60::i;:::-;26254:4;26247:11;;;;25830:436;;;;:::o;22877:193::-;22956:4;22973:13;22989:12;:10;:12::i;:::-;22973:28;;23012;23022:5;23029:2;23033:6;23012:9;:28::i;:::-;23058:4;23051:11;;;22877:193;;;;:::o;35764:295::-;14705:19;14728:13;;;;;;;;;;;14727:14;14705:36;;14775:14;:34;;;;;14808:1;14793:12;;;;;;;;;;:16;;;14775:34;14774:108;;;;14816:44;14854:4;14816:29;:44::i;:::-;14815:45;:66;;;;;14880:1;14864:12;;;;;;;;;;:17;;;14815:66;14774:108;14752:204;;;;;;;;;;;;:::i;:::-;;;;;;;;;14982:1;14967:12;;:16;;;;;;;;;;;;;;;;;;14998:14;14994:67;;;15045:4;15029:13;;:20;;;;;;;;;;;;;;;;;;14994:67;35935:26:::1;35948:4;35954:6;35935:12;:26::i;:::-;35972:16;:14;:16::i;:::-;36005:4;35999:3;:10;;;;36020:31;36038:12;36020:17;:31::i;:::-;15087:14:::0;15083:102;;;15134:5;15118:13;;:21;;;;;;;;;;;;;;;;;;15159:14;15171:1;15159:14;;;;;;:::i;:::-;;;;;;;;15083:102;14694:498;35764:295;;;;:::o;23133:151::-;23222:7;23249:11;:18;23261:5;23249:18;;;;;;;;;;;;;;;:27;23268:7;23249:27;;;;;;;;;;;;;;;;23242:34;;23133:151;;;;:::o;34746:201::-;33726:13;:11;:13::i;:::-;34855:1:::1;34835:22;;:8;:22;;::::0;34827:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;34911:28;34930:8;34911:18;:28::i;:::-;34746:201:::0;:::o;18255:98::-;18308:7;18335:10;18328:17;;18255:98;:::o;29455:380::-;29608:1;29591:19;;:5;:19;;;29583:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29689:1;29670:21;;:7;:21;;;29662:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29773:6;29743:11;:18;29755:5;29743:18;;;;;;;;;;;;;;;:27;29762:7;29743:27;;;;;;;;;;;;;;;:36;;;;29811:7;29795:32;;29804:5;29795:32;;;29820:6;29795:32;;;;;;:::i;:::-;;;;;;;;29455:380;;;:::o;30126:453::-;30261:24;30288:25;30298:5;30305:7;30288:9;:25::i;:::-;30261:52;;30348:17;30328:16;:37;30324:248;;30410:6;30390:16;:26;;30382:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30494:51;30503:5;30510:7;30538:6;30519:16;:25;30494:8;:51::i;:::-;30324:248;30250:329;30126:453;;;:::o;26736:671::-;26883:1;26867:18;;:4;:18;;;26859:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26960:1;26946:16;;:2;:16;;;26938:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;27015:38;27036:4;27042:2;27046:6;27015:20;:38::i;:::-;27066:19;27088:9;:15;27098:4;27088:15;;;;;;;;;;;;;;;;27066:37;;27137:6;27122:11;:21;;27114:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;27254:6;27240:11;:20;27222:9;:15;27232:4;27222:15;;;;;;;;;;;;;;;:38;;;;27299:6;27282:9;:13;27292:2;27282:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;27338:2;27323:26;;27332:4;27323:26;;;27342:6;27323:26;;;;;;:::i;:::-;;;;;;;;27362:37;27382:4;27388:2;27392:6;27362:19;:37::i;:::-;26848:559;26736:671;;;:::o;34005:132::-;34080:12;:10;:12::i;:::-;34069:23;;:7;:5;:7::i;:::-;:23;;;34061:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34005:132::o;27694:399::-;27797:1;27778:21;;:7;:21;;;27770:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;27848:49;27877:1;27881:7;27890:6;27848:20;:49::i;:::-;27926:6;27910:12;;:22;;;;;;;:::i;:::-;;;;;;;;27965:6;27943:9;:18;27953:7;27943:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;28008:7;27987:37;;28004:1;27987:37;;;28017:6;27987:37;;;;;;:::i;:::-;;;;;;;;28037:48;28065:1;28069:7;28078:6;28037:19;:48::i;:::-;27694:399;;:::o;28426:591::-;28529:1;28510:21;;:7;:21;;;28502:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28582:49;28603:7;28620:1;28624:6;28582:20;:49::i;:::-;28644:22;28669:9;:18;28679:7;28669:18;;;;;;;;;;;;;;;;28644:43;;28724:6;28706:14;:24;;28698:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;28843:6;28826:14;:23;28805:9;:18;28815:7;28805:18;;;;;;;;;;;;;;;:44;;;;28887:6;28871:12;;:22;;;;;;;:::i;:::-;;;;;;;;28937:1;28911:37;;28920:7;28911:37;;;28941:6;28911:37;;;;;;:::i;:::-;;;;;;;;28961:48;28981:7;28998:1;29002:6;28961:19;:48::i;:::-;28491:526;28426:591;;:::o;35107:191::-;35181:16;35200:6;;;;;;;;;;;35181:25;;35226:8;35217:6;;:17;;;;;;;;;;;;;;;;;;35281:8;35250:40;;35271:8;35250:40;;;;;;;;;;;;35170:128;35107:191;:::o;5119:326::-;5179:4;5436:1;5414:7;:19;;;:23;5407:30;;5119:326;;;:::o;20864:149::-;16546:13;;;;;;;;;;;16538:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;20967:38:::1;20990:5;20997:7;20967:22;:38::i;:::-;20864:149:::0;;:::o;33383:97::-;16546:13;;;;;;;;;;;16538:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;33446:26:::1;:24;:26::i;:::-;33383:97::o:0;31179:125::-;;;;:::o;31908:124::-;;;;:::o;21021:162::-;16546:13;;;;;;;;;;;16538:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;21142:5:::1;21134;:13;;;;;;:::i;:::-;;21168:7;21158;:17;;;;;;:::i;:::-;;21021:162:::0;;:::o;33488:113::-;16546:13;;;;;;;;;;;16538:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;33561:32:::1;33580:12;:10;:12::i;:::-;33561:18;:32::i;:::-;33488:113::o:0;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:86::-;4458:7;4498:4;4491:5;4487:16;4476:27;;4423:86;;;:::o;4515:112::-;4598:22;4614:5;4598:22;:::i;:::-;4593:3;4586:35;4515:112;;:::o;4633:214::-;4722:4;4760:2;4749:9;4745:18;4737:26;;4773:67;4837:1;4826:9;4822:17;4813:6;4773:67;:::i;:::-;4633:214;;;;:::o;4853:329::-;4912:6;4961:2;4949:9;4940:7;4936:23;4932:32;4929:119;;;4967:79;;:::i;:::-;4929:119;5087:1;5112:53;5157:7;5148:6;5137:9;5133:22;5112:53;:::i;:::-;5102:63;;5058:117;4853:329;;;;:::o;5188:::-;5247:6;5296:2;5284:9;5275:7;5271:23;5267:32;5264:119;;;5302:79;;:::i;:::-;5264:119;5422:1;5447:53;5492:7;5483:6;5472:9;5468:22;5447:53;:::i;:::-;5437:63;;5393:117;5188:329;;;;:::o;5523:118::-;5610:24;5628:5;5610:24;:::i;:::-;5605:3;5598:37;5523:118;;:::o;5647:222::-;5740:4;5778:2;5767:9;5763:18;5755:26;;5791:71;5859:1;5848:9;5844:17;5835:6;5791:71;:::i;:::-;5647:222;;;;:::o;5875:117::-;5984:1;5981;5974:12;5998:117;6107:1;6104;6097:12;6121:180;6169:77;6166:1;6159:88;6266:4;6263:1;6256:15;6290:4;6287:1;6280:15;6307:281;6390:27;6412:4;6390:27;:::i;:::-;6382:6;6378:40;6520:6;6508:10;6505:22;6484:18;6472:10;6469:34;6466:62;6463:88;;;6531:18;;:::i;:::-;6463:88;6571:10;6567:2;6560:22;6350:238;6307:281;;:::o;6594:129::-;6628:6;6655:20;;:::i;:::-;6645:30;;6684:33;6712:4;6704:6;6684:33;:::i;:::-;6594:129;;;:::o;6729:308::-;6791:4;6881:18;6873:6;6870:30;6867:56;;;6903:18;;:::i;:::-;6867:56;6941:29;6963:6;6941:29;:::i;:::-;6933:37;;7025:4;7019;7015:15;7007:23;;6729:308;;;:::o;7043:146::-;7140:6;7135:3;7130;7117:30;7181:1;7172:6;7167:3;7163:16;7156:27;7043:146;;;:::o;7195:425::-;7273:5;7298:66;7314:49;7356:6;7314:49;:::i;:::-;7298:66;:::i;:::-;7289:75;;7387:6;7380:5;7373:21;7425:4;7418:5;7414:16;7463:3;7454:6;7449:3;7445:16;7442:25;7439:112;;;7470:79;;:::i;:::-;7439:112;7560:54;7607:6;7602:3;7597;7560:54;:::i;:::-;7279:341;7195:425;;;;;:::o;7640:340::-;7696:5;7745:3;7738:4;7730:6;7726:17;7722:27;7712:122;;7753:79;;:::i;:::-;7712:122;7870:6;7857:20;7895:79;7970:3;7962:6;7955:4;7947:6;7943:17;7895:79;:::i;:::-;7886:88;;7702:278;7640:340;;;;:::o;7986:1125::-;8092:6;8100;8108;8116;8165:3;8153:9;8144:7;8140:23;8136:33;8133:120;;;8172:79;;:::i;:::-;8133:120;8320:1;8309:9;8305:17;8292:31;8350:18;8342:6;8339:30;8336:117;;;8372:79;;:::i;:::-;8336:117;8477:63;8532:7;8523:6;8512:9;8508:22;8477:63;:::i;:::-;8467:73;;8263:287;8617:2;8606:9;8602:18;8589:32;8648:18;8640:6;8637:30;8634:117;;;8670:79;;:::i;:::-;8634:117;8775:63;8830:7;8821:6;8810:9;8806:22;8775:63;:::i;:::-;8765:73;;8560:288;8887:2;8913:53;8958:7;8949:6;8938:9;8934:22;8913:53;:::i;:::-;8903:63;;8858:118;9015:2;9041:53;9086:7;9077:6;9066:9;9062:22;9041:53;:::i;:::-;9031:63;;8986:118;7986:1125;;;;;;;:::o;9117:474::-;9185:6;9193;9242:2;9230:9;9221:7;9217:23;9213:32;9210:119;;;9248:79;;:::i;:::-;9210:119;9368:1;9393:53;9438:7;9429:6;9418:9;9414:22;9393:53;:::i;:::-;9383:63;;9339:117;9495:2;9521:53;9566:7;9557:6;9546:9;9542:22;9521:53;:::i;:::-;9511:63;;9466:118;9117:474;;;;;:::o;9597:180::-;9645:77;9642:1;9635:88;9742:4;9739:1;9732:15;9766:4;9763:1;9756:15;9783:320;9827:6;9864:1;9858:4;9854:12;9844:22;;9911:1;9905:4;9901:12;9932:18;9922:81;;9988:4;9980:6;9976:17;9966:27;;9922:81;10050:2;10042:6;10039:14;10019:18;10016:38;10013:84;;10069:18;;:::i;:::-;10013:84;9834:269;9783:320;;;:::o;10109:180::-;10157:77;10154:1;10147:88;10254:4;10251:1;10244:15;10278:4;10275:1;10268:15;10295:191;10335:3;10354:20;10372:1;10354:20;:::i;:::-;10349:25;;10388:20;10406:1;10388:20;:::i;:::-;10383:25;;10431:1;10428;10424:9;10417:16;;10452:3;10449:1;10446:10;10443:36;;;10459:18;;:::i;:::-;10443:36;10295:191;;;;:::o;10492:175::-;10632:27;10628:1;10620:6;10616:14;10609:51;10492:175;:::o;10673:366::-;10815:3;10836:67;10900:2;10895:3;10836:67;:::i;:::-;10829:74;;10912:93;11001:3;10912:93;:::i;:::-;11030:2;11025:3;11021:12;11014:19;;10673:366;;;:::o;11045:419::-;11211:4;11249:2;11238:9;11234:18;11226:26;;11298:9;11292:4;11288:20;11284:1;11273:9;11269:17;11262:47;11326:131;11452:4;11326:131;:::i;:::-;11318:139;;11045:419;;;:::o;11470:224::-;11610:34;11606:1;11598:6;11594:14;11587:58;11679:7;11674:2;11666:6;11662:15;11655:32;11470:224;:::o;11700:366::-;11842:3;11863:67;11927:2;11922:3;11863:67;:::i;:::-;11856:74;;11939:93;12028:3;11939:93;:::i;:::-;12057:2;12052:3;12048:12;12041:19;;11700:366;;;:::o;12072:419::-;12238:4;12276:2;12265:9;12261:18;12253:26;;12325:9;12319:4;12315:20;12311:1;12300:9;12296:17;12289:47;12353:131;12479:4;12353:131;:::i;:::-;12345:139;;12072:419;;;:::o;12497:233::-;12637:34;12633:1;12625:6;12621:14;12614:58;12706:16;12701:2;12693:6;12689:15;12682:41;12497:233;:::o;12736:366::-;12878:3;12899:67;12963:2;12958:3;12899:67;:::i;:::-;12892:74;;12975:93;13064:3;12975:93;:::i;:::-;13093:2;13088:3;13084:12;13077:19;;12736:366;;;:::o;13108:419::-;13274:4;13312:2;13301:9;13297:18;13289:26;;13361:9;13355:4;13351:20;13347:1;13336:9;13332:17;13325:47;13389:131;13515:4;13389:131;:::i;:::-;13381:139;;13108:419;;;:::o;13533:85::-;13578:7;13607:5;13596:16;;13533:85;;;:::o;13624:60::-;13652:3;13673:5;13666:12;;13624:60;;;:::o;13690:154::-;13746:9;13779:59;13795:42;13804:32;13830:5;13804:32;:::i;:::-;13795:42;:::i;:::-;13779:59;:::i;:::-;13766:72;;13690:154;;;:::o;13850:143::-;13943:43;13980:5;13943:43;:::i;:::-;13938:3;13931:56;13850:143;;:::o;13999:234::-;14098:4;14136:2;14125:9;14121:18;14113:26;;14149:77;14223:1;14212:9;14208:17;14199:6;14149:77;:::i;:::-;13999:234;;;;:::o;14239:225::-;14379:34;14375:1;14367:6;14363:14;14356:58;14448:8;14443:2;14435:6;14431:15;14424:33;14239:225;:::o;14470:366::-;14612:3;14633:67;14697:2;14692:3;14633:67;:::i;:::-;14626:74;;14709:93;14798:3;14709:93;:::i;:::-;14827:2;14822:3;14818:12;14811:19;;14470:366;;;:::o;14842:419::-;15008:4;15046:2;15035:9;15031:18;15023:26;;15095:9;15089:4;15085:20;15081:1;15070:9;15066:17;15059:47;15123:131;15249:4;15123:131;:::i;:::-;15115:139;;14842:419;;;:::o;15267:223::-;15407:34;15403:1;15395:6;15391:14;15384:58;15476:6;15471:2;15463:6;15459:15;15452:31;15267:223;:::o;15496:366::-;15638:3;15659:67;15723:2;15718:3;15659:67;:::i;:::-;15652:74;;15735:93;15824:3;15735:93;:::i;:::-;15853:2;15848:3;15844:12;15837:19;;15496:366;;;:::o;15868:419::-;16034:4;16072:2;16061:9;16057:18;16049:26;;16121:9;16115:4;16111:20;16107:1;16096:9;16092:17;16085:47;16149:131;16275:4;16149:131;:::i;:::-;16141:139;;15868:419;;;:::o;16293:221::-;16433:34;16429:1;16421:6;16417:14;16410:58;16502:4;16497:2;16489:6;16485:15;16478:29;16293:221;:::o;16520:366::-;16662:3;16683:67;16747:2;16742:3;16683:67;:::i;:::-;16676:74;;16759:93;16848:3;16759:93;:::i;:::-;16877:2;16872:3;16868:12;16861:19;;16520:366;;;:::o;16892:419::-;17058:4;17096:2;17085:9;17081:18;17073:26;;17145:9;17139:4;17135:20;17131:1;17120:9;17116:17;17109:47;17173:131;17299:4;17173:131;:::i;:::-;17165:139;;16892:419;;;:::o;17317:179::-;17457:31;17453:1;17445:6;17441:14;17434:55;17317:179;:::o;17502:366::-;17644:3;17665:67;17729:2;17724:3;17665:67;:::i;:::-;17658:74;;17741:93;17830:3;17741:93;:::i;:::-;17859:2;17854:3;17850:12;17843:19;;17502:366;;;:::o;17874:419::-;18040:4;18078:2;18067:9;18063:18;18055:26;;18127:9;18121:4;18117:20;18113:1;18102:9;18098:17;18091:47;18155:131;18281:4;18155:131;:::i;:::-;18147:139;;17874:419;;;:::o;18299:224::-;18439:34;18435:1;18427:6;18423:14;18416:58;18508:7;18503:2;18495:6;18491:15;18484:32;18299:224;:::o;18529:366::-;18671:3;18692:67;18756:2;18751:3;18692:67;:::i;:::-;18685:74;;18768:93;18857:3;18768:93;:::i;:::-;18886:2;18881:3;18877:12;18870:19;;18529:366;;;:::o;18901:419::-;19067:4;19105:2;19094:9;19090:18;19082:26;;19154:9;19148:4;19144:20;19140:1;19129:9;19125:17;19118:47;19182:131;19308:4;19182:131;:::i;:::-;19174:139;;18901:419;;;:::o;19326:222::-;19466:34;19462:1;19454:6;19450:14;19443:58;19535:5;19530:2;19522:6;19518:15;19511:30;19326:222;:::o;19554:366::-;19696:3;19717:67;19781:2;19776:3;19717:67;:::i;:::-;19710:74;;19793:93;19882:3;19793:93;:::i;:::-;19911:2;19906:3;19902:12;19895:19;;19554:366;;;:::o;19926:419::-;20092:4;20130:2;20119:9;20115:18;20107:26;;20179:9;20173:4;20169:20;20165:1;20154:9;20150:17;20143:47;20207:131;20333:4;20207:131;:::i;:::-;20199:139;;19926:419;;;:::o;20351:225::-;20491:34;20487:1;20479:6;20475:14;20468:58;20560:8;20555:2;20547:6;20543:15;20536:33;20351:225;:::o;20582:366::-;20724:3;20745:67;20809:2;20804:3;20745:67;:::i;:::-;20738:74;;20821:93;20910:3;20821:93;:::i;:::-;20939:2;20934:3;20930:12;20923:19;;20582:366;;;:::o;20954:419::-;21120:4;21158:2;21147:9;21143:18;21135:26;;21207:9;21201:4;21197:20;21193:1;21182:9;21178:17;21171:47;21235:131;21361:4;21235:131;:::i;:::-;21227:139;;20954:419;;;:::o;21379:182::-;21519:34;21515:1;21507:6;21503:14;21496:58;21379:182;:::o;21567:366::-;21709:3;21730:67;21794:2;21789:3;21730:67;:::i;:::-;21723:74;;21806:93;21895:3;21806:93;:::i;:::-;21924:2;21919:3;21915:12;21908:19;;21567:366;;;:::o;21939:419::-;22105:4;22143:2;22132:9;22128:18;22120:26;;22192:9;22186:4;22182:20;22178:1;22167:9;22163:17;22156:47;22220:131;22346:4;22220:131;:::i;:::-;22212:139;;21939:419;;;:::o;22364:181::-;22504:33;22500:1;22492:6;22488:14;22481:57;22364:181;:::o;22551:366::-;22693:3;22714:67;22778:2;22773:3;22714:67;:::i;:::-;22707:74;;22790:93;22879:3;22790:93;:::i;:::-;22908:2;22903:3;22899:12;22892:19;;22551:366;;;:::o;22923:419::-;23089:4;23127:2;23116:9;23112:18;23104:26;;23176:9;23170:4;23166:20;23162:1;23151:9;23147:17;23140:47;23204:131;23330:4;23204:131;:::i;:::-;23196:139;;22923:419;;;:::o;23348:220::-;23488:34;23484:1;23476:6;23472:14;23465:58;23557:3;23552:2;23544:6;23540:15;23533:28;23348:220;:::o;23574:366::-;23716:3;23737:67;23801:2;23796:3;23737:67;:::i;:::-;23730:74;;23813:93;23902:3;23813:93;:::i;:::-;23931:2;23926:3;23922:12;23915:19;;23574:366;;;:::o;23946:419::-;24112:4;24150:2;24139:9;24135:18;24127:26;;24199:9;24193:4;24189:20;24185:1;24174:9;24170:17;24163:47;24227:131;24353:4;24227:131;:::i;:::-;24219:139;;23946:419;;;:::o;24371:221::-;24511:34;24507:1;24499:6;24495:14;24488:58;24580:4;24575:2;24567:6;24563:15;24556:29;24371:221;:::o;24598:366::-;24740:3;24761:67;24825:2;24820:3;24761:67;:::i;:::-;24754:74;;24837:93;24926:3;24837:93;:::i;:::-;24955:2;24950:3;24946:12;24939:19;;24598:366;;;:::o;24970:419::-;25136:4;25174:2;25163:9;25159:18;25151:26;;25223:9;25217:4;25213:20;25209:1;25198:9;25194:17;25187:47;25251:131;25377:4;25251:131;:::i;:::-;25243:139;;24970:419;;;:::o;25395:194::-;25435:4;25455:20;25473:1;25455:20;:::i;:::-;25450:25;;25489:20;25507:1;25489:20;:::i;:::-;25484:25;;25533:1;25530;25526:9;25518:17;;25557:1;25551:4;25548:11;25545:37;;;25562:18;;:::i;:::-;25545:37;25395:194;;;;:::o;25595:230::-;25735:34;25731:1;25723:6;25719:14;25712:58;25804:13;25799:2;25791:6;25787:15;25780:38;25595:230;:::o;25831:366::-;25973:3;25994:67;26058:2;26053:3;25994:67;:::i;:::-;25987:74;;26070:93;26159:3;26070:93;:::i;:::-;26188:2;26183:3;26179:12;26172:19;;25831:366;;;:::o;26203:419::-;26369:4;26407:2;26396:9;26392:18;26384:26;;26456:9;26450:4;26446:20;26442:1;26431:9;26427:17;26420:47;26484:131;26610:4;26484:131;:::i;:::-;26476:139;;26203:419;;;:::o;26628:141::-;26677:4;26700:3;26692:11;;26723:3;26720:1;26713:14;26757:4;26754:1;26744:18;26736:26;;26628:141;;;:::o;26775:93::-;26812:6;26859:2;26854;26847:5;26843:14;26839:23;26829:33;;26775:93;;;:::o;26874:107::-;26918:8;26968:5;26962:4;26958:16;26937:37;;26874:107;;;;:::o;26987:393::-;27056:6;27106:1;27094:10;27090:18;27129:97;27159:66;27148:9;27129:97;:::i;:::-;27247:39;27277:8;27266:9;27247:39;:::i;:::-;27235:51;;27319:4;27315:9;27308:5;27304:21;27295:30;;27368:4;27358:8;27354:19;27347:5;27344:30;27334:40;;27063:317;;26987:393;;;;;:::o;27386:142::-;27436:9;27469:53;27487:34;27496:24;27514:5;27496:24;:::i;:::-;27487:34;:::i;:::-;27469:53;:::i;:::-;27456:66;;27386:142;;;:::o;27534:75::-;27577:3;27598:5;27591:12;;27534:75;;;:::o;27615:269::-;27725:39;27756:7;27725:39;:::i;:::-;27786:91;27835:41;27859:16;27835:41;:::i;:::-;27827:6;27820:4;27814:11;27786:91;:::i;:::-;27780:4;27773:105;27691:193;27615:269;;;:::o;27890:73::-;27935:3;27890:73;:::o;27969:189::-;28046:32;;:::i;:::-;28087:65;28145:6;28137;28131:4;28087:65;:::i;:::-;28022:136;27969:189;;:::o;28164:186::-;28224:120;28241:3;28234:5;28231:14;28224:120;;;28295:39;28332:1;28325:5;28295:39;:::i;:::-;28268:1;28261:5;28257:13;28248:22;;28224:120;;;28164:186;;:::o;28356:543::-;28457:2;28452:3;28449:11;28446:446;;;28491:38;28523:5;28491:38;:::i;:::-;28575:29;28593:10;28575:29;:::i;:::-;28565:8;28561:44;28758:2;28746:10;28743:18;28740:49;;;28779:8;28764:23;;28740:49;28802:80;28858:22;28876:3;28858:22;:::i;:::-;28848:8;28844:37;28831:11;28802:80;:::i;:::-;28461:431;;28446:446;28356:543;;;:::o;28905:117::-;28959:8;29009:5;29003:4;28999:16;28978:37;;28905:117;;;;:::o;29028:169::-;29072:6;29105:51;29153:1;29149:6;29141:5;29138:1;29134:13;29105:51;:::i;:::-;29101:56;29186:4;29180;29176:15;29166:25;;29079:118;29028:169;;;;:::o;29202:295::-;29278:4;29424:29;29449:3;29443:4;29424:29;:::i;:::-;29416:37;;29486:3;29483:1;29479:11;29473:4;29470:21;29462:29;;29202:295;;;;:::o;29502:1395::-;29619:37;29652:3;29619:37;:::i;:::-;29721:18;29713:6;29710:30;29707:56;;;29743:18;;:::i;:::-;29707:56;29787:38;29819:4;29813:11;29787:38;:::i;:::-;29872:67;29932:6;29924;29918:4;29872:67;:::i;:::-;29966:1;29990:4;29977:17;;30022:2;30014:6;30011:14;30039:1;30034:618;;;;30696:1;30713:6;30710:77;;;30762:9;30757:3;30753:19;30747:26;30738:35;;30710:77;30813:67;30873:6;30866:5;30813:67;:::i;:::-;30807:4;30800:81;30669:222;30004:887;;30034:618;30086:4;30082:9;30074:6;30070:22;30120:37;30152:4;30120:37;:::i;:::-;30179:1;30193:208;30207:7;30204:1;30201:14;30193:208;;;30286:9;30281:3;30277:19;30271:26;30263:6;30256:42;30337:1;30329:6;30325:14;30315:24;;30384:2;30373:9;30369:18;30356:31;;30230:4;30227:1;30223:12;30218:17;;30193:208;;;30429:6;30420:7;30417:19;30414:179;;;30487:9;30482:3;30478:19;30472:26;30530:48;30572:4;30564:6;30560:17;30549:9;30530:48;:::i;:::-;30522:6;30515:64;30437:156;30414:179;30639:1;30635;30627:6;30623:14;30619:22;30613:4;30606:36;30041:611;;;30004:887;;29594:1303;;;29502:1395;;:::o
Swarm Source
ipfs://886b6d88d37cc198055dae7e61541804823c56b21748f3414d8658f91282b561
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.