Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 14928993 | 843 days ago | IN | 0 ETH | 0.3352191 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NFTXVaultUpgradeable
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-08 */ // Sources flattened with hardhat v2.8.2 https://hardhat.org // File contracts/solidity/interface/INFTXEligibility.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface INFTXEligibility { // Read functions. function name() external pure returns (string memory); function finalized() external view returns (bool); function targetAsset() external pure returns (address); function checkAllEligible(uint256[] calldata tokenIds) external view returns (bool); function checkEligible(uint256[] calldata tokenIds) external view returns (bool[] memory); function checkAllIneligible(uint256[] calldata tokenIds) external view returns (bool); function checkIsEligible(uint256 tokenId) external view returns (bool); // Write functions. function __NFTXEligibility_init_bytes(bytes calldata configData) external; function beforeMintHook(uint256[] calldata tokenIds) external; function afterMintHook(uint256[] calldata tokenIds) external; function beforeRedeemHook(uint256[] calldata tokenIds) external; function afterRedeemHook(uint256[] calldata tokenIds) external; } // File contracts/solidity/token/IERC20Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/solidity/proxy/IBeacon.sol pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeacon { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function childImplementation() external view returns (address); function upgradeChildTo(address newImplementation) external; } // File contracts/solidity/interface/INFTXVaultFactory.sol pragma solidity ^0.8.0; interface INFTXVaultFactory is IBeacon { // Read functions. function numVaults() external view returns (uint256); function zapContract() external view returns (address); function feeDistributor() external view returns (address); function eligibilityManager() external view returns (address); function vault(uint256 vaultId) external view returns (address); function allVaults() external view returns (address[] memory); function vaultsForAsset(address asset) external view returns (address[] memory); function isLocked(uint256 id) external view returns (bool); function excludedFromFees(address addr) external view returns (bool); function factoryMintFee() external view returns (uint64); function factoryRandomRedeemFee() external view returns (uint64); function factoryTargetRedeemFee() external view returns (uint64); function factoryRandomSwapFee() external view returns (uint64); function factoryTargetSwapFee() external view returns (uint64); function vaultFees(uint256 vaultId) external view returns (uint256, uint256, uint256, uint256, uint256); event NewFeeDistributor(address oldDistributor, address newDistributor); event NewZapContract(address oldZap, address newZap); event FeeExclusion(address feeExcluded, bool excluded); event NewEligibilityManager(address oldEligManager, address newEligManager); event NewVault(uint256 indexed vaultId, address vaultAddress, address assetAddress); event UpdateVaultFees(uint256 vaultId, uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee); event DisableVaultFees(uint256 vaultId); event UpdateFactoryFees(uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee); // Write functions. function __NFTXVaultFactory_init(address _vaultImpl, address _feeDistributor) external; function createVault( string calldata name, string calldata symbol, address _assetAddress, bool is1155, bool allowAllItems ) external returns (uint256); function setFeeDistributor(address _feeDistributor) external; function setEligibilityManager(address _eligibilityManager) external; function setZapContract(address _zapContract) external; function setFeeExclusion(address _excludedAddr, bool excluded) external; function setFactoryFees( uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee ) external; function setVaultFees( uint256 vaultId, uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee ) external; function disableVaultFees(uint256 vaultId) external; } // File contracts/solidity/interface/INFTXVault.sol pragma solidity ^0.8.0; interface INFTXVault is IERC20Upgradeable { function manager() external view returns (address); function assetAddress() external view returns (address); function vaultFactory() external view returns (INFTXVaultFactory); function eligibilityStorage() external view returns (INFTXEligibility); function is1155() external view returns (bool); function allowAllItems() external view returns (bool); function enableMint() external view returns (bool); function enableRandomRedeem() external view returns (bool); function enableTargetRedeem() external view returns (bool); function enableRandomSwap() external view returns (bool); function enableTargetSwap() external view returns (bool); function vaultId() external view returns (uint256); function nftIdAt(uint256 holdingsIndex) external view returns (uint256); function allHoldings() external view returns (uint256[] memory); function totalHoldings() external view returns (uint256); function mintFee() external view returns (uint256); function randomRedeemFee() external view returns (uint256); function targetRedeemFee() external view returns (uint256); function randomSwapFee() external view returns (uint256); function targetSwapFee() external view returns (uint256); function vaultFees() external view returns (uint256, uint256, uint256, uint256, uint256); event VaultInit( uint256 indexed vaultId, address assetAddress, bool is1155, bool allowAllItems ); event ManagerSet(address manager); event EligibilityDeployed(uint256 moduleIndex, address eligibilityAddr); // event CustomEligibilityDeployed(address eligibilityAddr); event EnableMintUpdated(bool enabled); event EnableRandomRedeemUpdated(bool enabled); event EnableTargetRedeemUpdated(bool enabled); event EnableRandomSwapUpdated(bool enabled); event EnableTargetSwapUpdated(bool enabled); event Minted(uint256[] nftIds, uint256[] amounts, address to); event Redeemed(uint256[] nftIds, uint256[] specificIds, address to); event Swapped( uint256[] nftIds, uint256[] amounts, uint256[] specificIds, uint256[] redeemedIds, address to ); function __NFTXVault_init( string calldata _name, string calldata _symbol, address _assetAddress, bool _is1155, bool _allowAllItems ) external; function finalizeVault() external; function setVaultMetadata( string memory name_, string memory symbol_ ) external; function setVaultFeatures( bool _enableMint, bool _enableRandomRedeem, bool _enableTargetRedeem, bool _enableRandomSwap, bool _enableTargetSwap ) external; function setFees( uint256 _mintFee, uint256 _randomRedeemFee, uint256 _targetRedeemFee, uint256 _randomSwapFee, uint256 _targetSwapFee ) external; function disableVaultFees() external; // This function allows for an easy setup of any eligibility module contract from the EligibilityManager. // It takes in ABI encoded parameters for the desired module. This is to make sure they can all follow // a similar interface. function deployEligibilityStorage( uint256 moduleIndex, bytes calldata initData ) external returns (address); // The manager has control over options like fees and features function setManager(address _manager) external; function mint( uint256[] calldata tokenIds, uint256[] calldata amounts /* ignored for ERC721 vaults */ ) external returns (uint256); function mintTo( uint256[] calldata tokenIds, uint256[] calldata amounts, /* ignored for ERC721 vaults */ address to ) external returns (uint256); function redeem(uint256 amount, uint256[] calldata specificIds) external returns (uint256[] calldata); function redeemTo( uint256 amount, uint256[] calldata specificIds, address to ) external returns (uint256[] calldata); function swap( uint256[] calldata tokenIds, uint256[] calldata amounts, /* ignored for ERC721 vaults */ uint256[] calldata specificIds ) external returns (uint256[] calldata); function swapTo( uint256[] calldata tokenIds, uint256[] calldata amounts, /* ignored for ERC721 vaults */ uint256[] calldata specificIds, address to ) external returns (uint256[] calldata); function allValidNFTs(uint256[] calldata tokenIds) external view returns (bool); } // File contracts/solidity/interface/INFTXEligibilityManager.sol pragma solidity ^0.8.0; interface INFTXEligibilityManager { function nftxVaultFactory() external returns (address); function eligibilityImpl() external returns (address); function deployEligibility(uint256 vaultId, bytes calldata initData) external returns (address); } // File contracts/solidity/interface/INFTXFeeDistributor.sol pragma solidity ^0.8.0; interface INFTXFeeDistributor { struct FeeReceiver { uint256 allocPoint; address receiver; bool isContract; } function nftxVaultFactory() external returns (address); function lpStaking() external returns (address); function treasury() external returns (address); function defaultTreasuryAlloc() external returns (uint256); function defaultLPAlloc() external returns (uint256); function allocTotal(uint256 vaultId) external returns (uint256); function specificTreasuryAlloc(uint256 vaultId) external returns (uint256); // Write functions. function __FeeDistributor__init__(address _lpStaking, address _treasury) external; function rescueTokens(address token) external; function distribute(uint256 vaultId) external; function addReceiver(uint256 _vaultId, uint256 _allocPoint, address _receiver, bool _isContract) external; function initializeVaultReceivers(uint256 _vaultId) external; function changeMultipleReceiverAlloc( uint256[] memory _vaultIds, uint256[] memory _receiverIdxs, uint256[] memory allocPoints ) external; function changeMultipleReceiverAddress( uint256[] memory _vaultIds, uint256[] memory _receiverIdxs, address[] memory addresses, bool[] memory isContracts ) external; function changeReceiverAlloc(uint256 _vaultId, uint256 _idx, uint256 _allocPoint) external; function changeReceiverAddress(uint256 _vaultId, uint256 _idx, address _address, bool _isContract) external; function removeReceiver(uint256 _vaultId, uint256 _receiverIdx) external; // Configuration functions. function setTreasuryAddress(address _treasury) external; function setDefaultTreasuryAlloc(uint256 _allocPoint) external; function setSpecificTreasuryAlloc(uint256 _vaultId, uint256 _allocPoint) external; function setLPStakingAddress(address _lpStaking) external; function setNFTXVaultFactory(address _factory) external; function setDefaultLPAlloc(uint256 _allocPoint) external; } // File contracts/solidity/interface/IERC3156Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC3156 FlashBorrower, as defined in * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156]. */ interface IERC3156FlashBorrowerUpgradeable { /** * @dev Receive a flash loan. * @param initiator The initiator of the loan. * @param token The loan currency. * @param amount The amount of tokens lent. * @param fee The additional amount of tokens to repay. * @param data Arbitrary data structure, intended to contain user-defined parameters. * @return The keccak256 hash of "ERC3156FlashBorrower.onFlashLoan" */ function onFlashLoan( address initiator, address token, uint256 amount, uint256 fee, bytes calldata data ) external returns (bytes32); } /** * @dev Interface of the ERC3156 FlashLender, as defined in * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156]. */ interface IERC3156FlashLenderUpgradeable { /** * @dev The amount of currency available to be lended. * @param token The loan currency. * @return The amount of `token` that can be borrowed. */ function maxFlashLoan( address token ) external view returns (uint256); /** * @dev The fee to be charged for a given loan. * @param token The loan currency. * @param amount The amount of tokens lent. * @return The amount of `token` to be charged for the loan, on top of the returned principal. */ function flashFee( address token, uint256 amount ) external view returns (uint256); /** * @dev Initiate a flash loan. * @param receiver The receiver of the tokens in the loan, and the receiver of the callback. * @param token The loan currency. * @param amount The amount of tokens lent. * @param data Arbitrary data structure, intended to contain user-defined parameters. */ function flashLoan( IERC3156FlashBorrowerUpgradeable receiver, address token, uint256 amount, bytes calldata data ) external returns (bool); } // File contracts/solidity/token/IERC20Metadata.sol pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is 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 contracts/solidity/proxy/Initializable.sol // solhint-disable-next-line compiler-version pragma solidity ^0.8.0; /** * @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 a proxied contract can't have 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. * * 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. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } // File contracts/solidity/util/ContextUpgradeable.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 initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // File contracts/solidity/token/ERC20Upgradeable.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 guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20Metadata { mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer { _name = name_; _symbol = symbol_; } function _setMetadata(string memory name_, string memory symbol_) internal { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); _approve(sender, _msgSender(), currentAllowance - amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); _approve(_msgSender(), spender, currentAllowance - subtractedValue); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); _balances[sender] = senderBalance - amount; _balances[recipient] += amount; emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `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); } /** * @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"); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } uint256[45] private __gap; } // File contracts/solidity/token/ERC20FlashMintUpgradeable.sol pragma solidity ^0.8.0; /** * @dev Implementation of the ERC3156 Flash loans extension, as defined in * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156]. * * Adds the {flashLoan} method, which provides flash loan support at the token * level. By default there is no fee, but this can be changed by overriding {flashFee}. */ abstract contract ERC20FlashMintUpgradeable is Initializable, ERC20Upgradeable, IERC3156FlashLenderUpgradeable { function __ERC20FlashMint_init() internal initializer { __Context_init_unchained(); __ERC20FlashMint_init_unchained(); } function __ERC20FlashMint_init_unchained() internal initializer { } bytes32 constant private RETURN_VALUE = keccak256("ERC3156FlashBorrower.onFlashLoan"); /** * @dev Returns the maximum amount of tokens available for loan. * @param token The address of the token that is requested. * @return The amont of token that can be loaned. */ function maxFlashLoan(address token) public view override returns (uint256) { return token == address(this) ? type(uint256).max - totalSupply() : 0; } /** * @dev Returns the fee applied when doing flash loans. By default this * implementation has 0 fees. This function can be overloaded to make * the flash loan mechanism deflationary. * @param token The token to be flash loaned. * @param amount The amount of tokens to be loaned. * @return The fees applied to the corresponding flash loan. */ function flashFee(address token, uint256 amount) public view virtual override returns (uint256) { require(token == address(this), "ERC20FlashMint: wrong token"); // silence warning about unused variable without the addition of bytecode. amount; return 0; } /** * @dev Performs a flash loan. New tokens are minted and sent to the * `receiver`, who is required to implement the {IERC3156FlashBorrower} * interface. By the end of the flash loan, the receiver is expected to own * amount + fee tokens and have them approved back to the token contract itself so * they can be burned. * @param receiver The receiver of the flash loan. Should implement the * {IERC3156FlashBorrower.onFlashLoan} interface. * @param token The token to be flash loaned. Only `address(this)` is * supported. * @param amount The amount of tokens to be loaned. * @param data An arbitrary datafield that is passed to the receiver. * @return `true` is the flash loan was successfull. */ function flashLoan( IERC3156FlashBorrowerUpgradeable receiver, address token, uint256 amount, bytes memory data ) public virtual override returns (bool) { uint256 fee = flashFee(token, amount); _mint(address(receiver), amount); require(receiver.onFlashLoan(msg.sender, token, amount, fee, data) == RETURN_VALUE, "ERC20FlashMint: invalid return value"); uint256 currentAllowance = allowance(address(receiver), address(this)); require(currentAllowance >= amount + fee, "ERC20FlashMint: allowance does not allow refund"); _approve(address(receiver), address(this), currentAllowance - amount - fee); _burn(address(receiver), amount + fee); return true; } uint256[50] private __gap; } // File contracts/solidity/token/IERC721ReceiverUpgradeable.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721ReceiverUpgradeable { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File contracts/solidity/token/ERC721SafeHolderUpgradeable.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721SafeHolderUpgradeable is IERC721ReceiverUpgradeable { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } } // File contracts/solidity/interface/IERC165Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File contracts/solidity/token/IERC1155ReceiverUpgradeable.sol pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155ReceiverUpgradeable is IERC165Upgradeable { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns(bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns(bytes4); } // File contracts/solidity/util/ERC165Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is IERC165Upgradeable { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } } // File contracts/solidity/token/ERC1155ReceiverUpgradeable.sol pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ abstract contract ERC1155ReceiverUpgradeable is ERC165Upgradeable, IERC1155ReceiverUpgradeable { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC1155ReceiverUpgradeable).interfaceId || super.supportsInterface(interfaceId); } } // File contracts/solidity/token/ERC1155SafeHolderUpgradeable.sol pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ abstract contract ERC1155SafeHolderUpgradeable is ERC1155ReceiverUpgradeable { function onERC1155Received(address operator, address, uint256, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived(address operator, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } } // File contracts/solidity/token/IERC721Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File contracts/solidity/token/IERC1155Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external; } // File contracts/solidity/util/OwnableUpgradeable.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 initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // File contracts/solidity/util/ReentrancyGuardUpgradeable.sol pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal initializer { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal initializer { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } uint256[49] private __gap; } // File contracts/solidity/util/EnumerableSetUpgradeable.sol pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSetUpgradeable { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File contracts/solidity/NFTXVaultUpgradeable.sol pragma solidity ^0.8.0; // Authors: @0xKiwi_ and @alexgausman. contract NFTXVaultUpgradeable is OwnableUpgradeable, ERC20FlashMintUpgradeable, ReentrancyGuardUpgradeable, ERC721SafeHolderUpgradeable, ERC1155SafeHolderUpgradeable, INFTXVault { using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; uint256 constant base = 10**18; uint256 public override vaultId; address public override manager; address public override assetAddress; INFTXVaultFactory public override vaultFactory; INFTXEligibility public override eligibilityStorage; uint256 randNonce; uint256 private UNUSED_FEE1; uint256 private UNUSED_FEE2; uint256 private UNUSED_FEE3; bool public override is1155; bool public override allowAllItems; bool public override enableMint; bool public override enableRandomRedeem; bool public override enableTargetRedeem; EnumerableSetUpgradeable.UintSet holdings; mapping(uint256 => uint256) quantity1155; bool public override enableRandomSwap; bool public override enableTargetSwap; event VaultShutdown(address assetAddress, uint256 numItems, address recipient); event MetaDataChange(string oldName, string oldSymbol, string newName, string newSymbol); function __NFTXVault_init( string memory _name, string memory _symbol, address _assetAddress, bool _is1155, bool _allowAllItems ) public override virtual initializer { __Ownable_init(); __ERC20_init(_name, _symbol); require(_assetAddress != address(0), "Asset != address(0)"); assetAddress = _assetAddress; vaultFactory = INFTXVaultFactory(msg.sender); vaultId = vaultFactory.numVaults(); is1155 = _is1155; allowAllItems = _allowAllItems; emit VaultInit(vaultId, _assetAddress, _is1155, _allowAllItems); setVaultFeatures(true /*enableMint*/, true /*enableRandomRedeem*/, true /*enableTargetRedeem*/, true /*enableRandomSwap*/, true /*enableTargetSwap*/); } function finalizeVault() external override virtual { setManager(address(0)); } // Added in v1.0.3. function setVaultMetadata( string calldata name_, string calldata symbol_ ) external override virtual { onlyPrivileged(); emit MetaDataChange(name(), symbol(), name_, symbol_); _setMetadata(name_, symbol_); } function setVaultFeatures( bool _enableMint, bool _enableRandomRedeem, bool _enableTargetRedeem, bool _enableRandomSwap, bool _enableTargetSwap ) public override virtual { onlyPrivileged(); enableMint = _enableMint; enableRandomRedeem = _enableRandomRedeem; enableTargetRedeem = _enableTargetRedeem; enableRandomSwap = _enableRandomSwap; enableTargetSwap = _enableTargetSwap; emit EnableMintUpdated(_enableMint); emit EnableRandomRedeemUpdated(_enableRandomRedeem); emit EnableTargetRedeemUpdated(_enableTargetRedeem); emit EnableRandomSwapUpdated(_enableRandomSwap); emit EnableTargetSwapUpdated(_enableTargetSwap); } function setFees( uint256 _mintFee, uint256 _randomRedeemFee, uint256 _targetRedeemFee, uint256 _randomSwapFee, uint256 _targetSwapFee ) public override virtual { onlyPrivileged(); vaultFactory.setVaultFees(vaultId, _mintFee, _randomRedeemFee, _targetRedeemFee, _randomSwapFee, _targetSwapFee); } function disableVaultFees() public override virtual { onlyPrivileged(); vaultFactory.disableVaultFees(vaultId); } // This function allows for an easy setup of any eligibility module contract from the EligibilityManager. // It takes in ABI encoded parameters for the desired module. This is to make sure they can all follow // a similar interface. function deployEligibilityStorage( uint256 moduleIndex, bytes calldata initData ) external override virtual returns (address) { onlyPrivileged(); require( address(eligibilityStorage) == address(0), "NFTXVault: eligibility already set" ); INFTXEligibilityManager eligManager = INFTXEligibilityManager( vaultFactory.eligibilityManager() ); address _eligibility = eligManager.deployEligibility( moduleIndex, initData ); eligibilityStorage = INFTXEligibility(_eligibility); // Toggle this to let the contract know to check eligibility now. allowAllItems = false; emit EligibilityDeployed(moduleIndex, _eligibility); return _eligibility; } // // This function allows for the manager to set their own arbitrary eligibility contract. // // Once eligiblity is set, it cannot be unset or changed. // Disabled for launch. // function setEligibilityStorage(address _newEligibility) public virtual { // onlyPrivileged(); // require( // address(eligibilityStorage) == address(0), // "NFTXVault: eligibility already set" // ); // eligibilityStorage = INFTXEligibility(_newEligibility); // // Toggle this to let the contract know to check eligibility now. // allowAllItems = false; // emit CustomEligibilityDeployed(address(_newEligibility)); // } // The manager has control over options like fees and features function setManager(address _manager) public override virtual { onlyPrivileged(); manager = _manager; emit ManagerSet(_manager); } function mint( uint256[] calldata tokenIds, uint256[] calldata amounts /* ignored for ERC721 vaults */ ) external override virtual returns (uint256) { return mintTo(tokenIds, amounts, msg.sender); } function mintTo( uint256[] memory tokenIds, uint256[] memory amounts, /* ignored for ERC721 vaults */ address to ) public override virtual nonReentrant returns (uint256) { onlyOwnerIfPaused(1); require(enableMint, "Minting not enabled"); // Take the NFTs. uint256 count = receiveNFTs(tokenIds, amounts); // Mint to the user. _mint(to, base * count); uint256 totalFee = mintFee() * count; _chargeAndDistributeFees(to, totalFee); emit Minted(tokenIds, amounts, to); return count; } function redeem(uint256 amount, uint256[] calldata specificIds) external override virtual returns (uint256[] memory) { return redeemTo(amount, specificIds, msg.sender); } function redeemTo(uint256 amount, uint256[] memory specificIds, address to) public override virtual nonReentrant returns (uint256[] memory) { onlyOwnerIfPaused(2); require( amount == specificIds.length || enableRandomRedeem, "NFTXVault: Random redeem not enabled" ); require( specificIds.length == 0 || enableTargetRedeem, "NFTXVault: Target redeem not enabled" ); // We burn all from sender and mint to fee receiver to reduce costs. _burn(msg.sender, base * amount); // Pay the tokens + toll. (, uint256 _randomRedeemFee, uint256 _targetRedeemFee, ,) = vaultFees(); uint256 totalFee = (_targetRedeemFee * specificIds.length) + ( _randomRedeemFee * (amount - specificIds.length) ); _chargeAndDistributeFees(msg.sender, totalFee); // Withdraw from vault. uint256[] memory redeemedIds = withdrawNFTsTo(amount, specificIds, to); emit Redeemed(redeemedIds, specificIds, to); return redeemedIds; } function swap( uint256[] calldata tokenIds, uint256[] calldata amounts, /* ignored for ERC721 vaults */ uint256[] calldata specificIds ) external override virtual returns (uint256[] memory) { return swapTo(tokenIds, amounts, specificIds, msg.sender); } function swapTo( uint256[] memory tokenIds, uint256[] memory amounts, /* ignored for ERC721 vaults */ uint256[] memory specificIds, address to ) public override virtual nonReentrant returns (uint256[] memory) { onlyOwnerIfPaused(3); uint256 count; if (is1155) { for (uint256 i; i < tokenIds.length; ++i) { uint256 amount = amounts[i]; require(amount != 0, "NFTXVault: transferring < 1"); count += amount; } } else { count = tokenIds.length; } require( count == specificIds.length || enableRandomSwap, "NFTXVault: Random swap disabled" ); require( specificIds.length == 0 || enableTargetSwap, "NFTXVault: Target swap disabled" ); (, , ,uint256 _randomSwapFee, uint256 _targetSwapFee) = vaultFees(); uint256 totalFee = (_targetSwapFee * specificIds.length) + ( _randomSwapFee * (count - specificIds.length) ); _chargeAndDistributeFees(msg.sender, totalFee); // Give the NFTs first, so the user wont get the same thing back, just to be nice. uint256[] memory ids = withdrawNFTsTo(count, specificIds, to); receiveNFTs(tokenIds, amounts); emit Swapped(tokenIds, amounts, specificIds, ids, to); return ids; } function flashLoan( IERC3156FlashBorrowerUpgradeable receiver, address token, uint256 amount, bytes memory data ) public override virtual returns (bool) { onlyOwnerIfPaused(4); return super.flashLoan(receiver, token, amount, data); } function mintFee() public view override virtual returns (uint256) { (uint256 _mintFee, , , ,) = vaultFactory.vaultFees(vaultId); return _mintFee; } function randomRedeemFee() public view override virtual returns (uint256) { (, uint256 _randomRedeemFee, , ,) = vaultFactory.vaultFees(vaultId); return _randomRedeemFee; } function targetRedeemFee() public view override virtual returns (uint256) { (, , uint256 _targetRedeemFee, ,) = vaultFactory.vaultFees(vaultId); return _targetRedeemFee; } function randomSwapFee() public view override virtual returns (uint256) { (, , , uint256 _randomSwapFee, ) = vaultFactory.vaultFees(vaultId); return _randomSwapFee; } function targetSwapFee() public view override virtual returns (uint256) { (, , , ,uint256 _targetSwapFee) = vaultFactory.vaultFees(vaultId); return _targetSwapFee; } function vaultFees() public view override virtual returns (uint256, uint256, uint256, uint256, uint256) { return vaultFactory.vaultFees(vaultId); } function allValidNFTs(uint256[] memory tokenIds) public view override virtual returns (bool) { if (allowAllItems) { return true; } INFTXEligibility _eligibilityStorage = eligibilityStorage; if (address(_eligibilityStorage) == address(0)) { return false; } return _eligibilityStorage.checkAllEligible(tokenIds); } function nftIdAt(uint256 holdingsIndex) external view override virtual returns (uint256) { return holdings.at(holdingsIndex); } // Added in v1.0.3. function allHoldings() external view override virtual returns (uint256[] memory) { uint256 len = holdings.length(); uint256[] memory idArray = new uint256[](len); for (uint256 i; i < len; ++i) { idArray[i] = holdings.at(i); } return idArray; } // Added in v1.0.3. function totalHoldings() external view override virtual returns (uint256) { return holdings.length(); } // Added in v1.0.3. function version() external pure returns (string memory) { return "v1.0.5"; } // We set a hook to the eligibility module (if it exists) after redeems in case anything needs to be modified. function afterRedeemHook(uint256[] memory tokenIds) internal virtual { INFTXEligibility _eligibilityStorage = eligibilityStorage; if (address(_eligibilityStorage) == address(0)) { return; } _eligibilityStorage.afterRedeemHook(tokenIds); } function receiveNFTs(uint256[] memory tokenIds, uint256[] memory amounts) internal virtual returns (uint256) { require(allValidNFTs(tokenIds), "NFTXVault: not eligible"); uint256 length = tokenIds.length; if (is1155) { // This is technically a check, so placing it before the effect. IERC1155Upgradeable(assetAddress).safeBatchTransferFrom( msg.sender, address(this), tokenIds, amounts, "" ); uint256 count; for (uint256 i; i < length; ++i) { uint256 tokenId = tokenIds[i]; uint256 amount = amounts[i]; require(amount != 0, "NFTXVault: transferring < 1"); if (quantity1155[tokenId] == 0) { holdings.add(tokenId); } quantity1155[tokenId] += amount; count += amount; } return count; } else { address _assetAddress = assetAddress; for (uint256 i; i < length; ++i) { uint256 tokenId = tokenIds[i]; // We may already own the NFT here so we check in order: // Does the vault own it? // - If so, check if its in holdings list // - If so, we reject. This means the NFT has already been claimed for. // - If not, it means we have not yet accounted for this NFT, so we continue. // -If not, we "pull" it from the msg.sender and add to holdings. transferFromERC721(_assetAddress, tokenId); holdings.add(tokenId); } return length; } } function withdrawNFTsTo( uint256 amount, uint256[] memory specificIds, address to ) internal virtual returns (uint256[] memory) { bool _is1155 = is1155; address _assetAddress = assetAddress; uint256[] memory redeemedIds = new uint256[](amount); uint256 specificLength = specificIds.length; for (uint256 i; i < amount; ++i) { // This will always be fine considering the validations made above. uint256 tokenId = i < specificLength ? specificIds[i] : getRandomTokenIdFromVault(); redeemedIds[i] = tokenId; if (_is1155) { quantity1155[tokenId] -= 1; if (quantity1155[tokenId] == 0) { holdings.remove(tokenId); } IERC1155Upgradeable(_assetAddress).safeTransferFrom( address(this), to, tokenId, 1, "" ); } else { holdings.remove(tokenId); transferERC721(_assetAddress, to, tokenId); } } afterRedeemHook(redeemedIds); return redeemedIds; } function _chargeAndDistributeFees(address user, uint256 amount) internal virtual { // Do not charge fees if the zap contract is calling // Added in v1.0.3. Changed to mapping in v1.0.5. INFTXVaultFactory _vaultFactory = vaultFactory; if (_vaultFactory.excludedFromFees(msg.sender)) { return; } // Mint fees directly to the distributor and distribute. if (amount > 0) { address feeDistributor = _vaultFactory.feeDistributor(); // Changed to a _transfer() in v1.0.3. _transfer(user, feeDistributor, amount); INFTXFeeDistributor(feeDistributor).distribute(vaultId); } } function transferERC721(address assetAddr, address to, uint256 tokenId) internal virtual { address kitties = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d; address punks = 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB; bytes memory data; if (assetAddr == kitties) { // Changed in v1.0.4. data = abi.encodeWithSignature("transfer(address,uint256)", to, tokenId); } else if (assetAddr == punks) { // CryptoPunks. data = abi.encodeWithSignature("transferPunk(address,uint256)", to, tokenId); } else { // Default. data = abi.encodeWithSignature("safeTransferFrom(address,address,uint256)", address(this), to, tokenId); } (bool success, bytes memory returnData) = address(assetAddr).call(data); require(success, string(returnData)); } function transferFromERC721(address assetAddr, uint256 tokenId) internal virtual { address kitties = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d; address punks = 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB; bytes memory data; if (assetAddr == kitties) { // Cryptokitties. data = abi.encodeWithSignature("transferFrom(address,address,uint256)", msg.sender, address(this), tokenId); } else if (assetAddr == punks) { // CryptoPunks. // Fix here for frontrun attack. Added in v1.0.2. bytes memory punkIndexToAddress = abi.encodeWithSignature("punkIndexToAddress(uint256)", tokenId); (bool checkSuccess, bytes memory result) = address(assetAddr).staticcall(punkIndexToAddress); (address nftOwner) = abi.decode(result, (address)); require(checkSuccess && nftOwner == msg.sender, "Not the NFT owner"); data = abi.encodeWithSignature("buyPunk(uint256)", tokenId); } else { // Default. // Allow other contracts to "push" into the vault, safely. // If we already have the token requested, make sure we don't have it in the list to prevent duplicate minting. if (IERC721Upgradeable(assetAddress).ownerOf(tokenId) == address(this)) { require(!holdings.contains(tokenId), "Trying to use an owned NFT"); return; } else { data = abi.encodeWithSignature("safeTransferFrom(address,address,uint256)", msg.sender, address(this), tokenId); } } (bool success, bytes memory resultData) = address(assetAddr).call(data); require(success, string(resultData)); } function getRandomTokenIdFromVault() internal virtual returns (uint256) { uint256 randomIndex = uint256( keccak256( abi.encodePacked( blockhash(block.number - 1), randNonce, block.coinbase, block.difficulty, block.timestamp ) ) ) % holdings.length(); ++randNonce; return holdings.at(randomIndex); } function onlyPrivileged() internal view { if (manager == address(0)) { require(msg.sender == owner(), "Not owner"); } else { require(msg.sender == manager, "Not manager"); } } function onlyOwnerIfPaused(uint256 lockId) internal view { require(!vaultFactory.isLocked(lockId) || msg.sender == owner(), "Paused"); } function retrieveTokens(uint256 amount, address from, address to) public onlyOwner { _burn(from, amount); _mint(to, amount); } function shutdown(address recipient) public onlyOwner { uint256 numItems = totalSupply() / base; require(numItems < 4, "too many items"); uint256[] memory specificIds = new uint256[](0); withdrawNFTsTo(numItems, specificIds, recipient); emit VaultShutdown(assetAddress, numItems, recipient); assetAddress = address(0); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":"uint256","name":"moduleIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"eligibilityAddr","type":"address"}],"name":"EligibilityDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableMintUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableRandomRedeemUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableRandomSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableTargetRedeemUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableTargetSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"manager","type":"address"}],"name":"ManagerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"oldName","type":"string"},{"indexed":false,"internalType":"string","name":"oldSymbol","type":"string"},{"indexed":false,"internalType":"string","name":"newName","type":"string"},{"indexed":false,"internalType":"string","name":"newSymbol","type":"string"}],"name":"MetaDataChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"Redeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"redeemedIds","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"Swapped","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"address","name":"assetAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"is1155","type":"bool"},{"indexed":false,"internalType":"bool","name":"allowAllItems","type":"bool"}],"name":"VaultInit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"assetAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"numItems","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"VaultShutdown","type":"event"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_assetAddress","type":"address"},{"internalType":"bool","name":"_is1155","type":"bool"},{"internalType":"bool","name":"_allowAllItems","type":"bool"}],"name":"__NFTXVault_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allHoldings","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"allValidNFTs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowAllItems","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assetAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","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":"uint256","name":"moduleIndex","type":"uint256"},{"internalType":"bytes","name":"initData","type":"bytes"}],"name":"deployEligibilityStorage","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableVaultFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eligibilityStorage","outputs":[{"internalType":"contract INFTXEligibility","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableRandomRedeem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableRandomSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTargetRedeem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTargetSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalizeVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"flashFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC3156FlashBorrowerUpgradeable","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"flashLoan","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":[],"name":"is1155","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"maxFlashLoan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"}],"name":"mintTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"holdingsIndex","type":"uint256"}],"name":"nftIdAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomRedeemFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomSwapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"}],"name":"redeem","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"}],"name":"redeemTo","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"retrieveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintFee","type":"uint256"},{"internalType":"uint256","name":"_randomRedeemFee","type":"uint256"},{"internalType":"uint256","name":"_targetRedeemFee","type":"uint256"},{"internalType":"uint256","name":"_randomSwapFee","type":"uint256"},{"internalType":"uint256","name":"_targetSwapFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enableMint","type":"bool"},{"internalType":"bool","name":"_enableRandomRedeem","type":"bool"},{"internalType":"bool","name":"_enableTargetRedeem","type":"bool"},{"internalType":"bool","name":"_enableRandomSwap","type":"bool"},{"internalType":"bool","name":"_enableTargetSwap","type":"bool"}],"name":"setVaultFeatures","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"name":"setVaultMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"shutdown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"}],"name":"swap","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"}],"name":"swapTo","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetRedeemFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetSwapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalHoldings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultFactory","outputs":[{"internalType":"contract INFTXVaultFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50615023806100206000396000f3fe608060405234801561001057600080fd5b50600436106103a35760003560e01c806379309658116101e9578063d53f62171161010f578063e78458c4116100ad578063f2fde38b1161007c578063f2fde38b1461089e578063f7fce334146108b1578063fcc0e381146108b9578063feb8eba5146108ce57600080fd5b8063e78458c414610838578063e9ec2e991461084b578063f1d20dd414610853578063f23a6e611461086657600080fd5b8063d9d98ce4116100e9578063d9d98ce4146107c6578063dd62ed3e146107d9578063e0a8b97a14610812578063e0b4a79a1461082557600080fd5b8063d53f621714610798578063d6ee4a93146107a0578063d8a06f73146107b357600080fd5b8063a9059cbb11610187578063c4a0db9611610156578063c4a0db961461074c578063c4ff52471461075f578063cce2f3fb14610772578063d0ebdbe71461078557600080fd5b8063a9059cbb146106e6578063b10402ea146106f9578063bc197c811461070c578063c3cb8c141461074457600080fd5b80638f878a43116101c35780638f878a43146106a557806395d89b41146106b85780639d54def6146106c0578063a457c2d7146106d357600080fd5b8063793096581461066b5780638c850814146106815780638da5cb5b1461069457600080fd5b806335dca76c116102ce57806354fd4d501161026c5780636b948a351161023b5780636b948a35146105f757806370a082311461060a578063715018a61461063357806372188e3f1461063b57600080fd5b806354fd4d50146105855780635877aee6146105be5780635cffe9de146105d1578063613255ab146105e457600080fd5b806344b28d59116102a857806344b28d591461053d57806345a0b65214610551578063481c6a75146105645780635035434a1461057757600080fd5b806335dca76c1461050f57806339509351146105175780633d5d190c1461052a57600080fd5b806313966db51161034657806323b872dd1161031557806323b872dd146104cf57806325705d8d146104e2578063313ce567146104f757806333194c0a1461050657600080fd5b806313966db514610436578063150b7a021461044c57806318160ddd1461049c5780631ba46cfd146104a457600080fd5b806306f26dc21161038257806306f26dc2146103ed57806306fdde03146103fb578063095ea7b3146104105780630d636a091461042357600080fd5b8062518161146103a857806301ffc9a7146103b257806304a66b48146103da575b600080fd5b6103b06108d6565b005b6103c56103c036600461494e565b610960565b60405190151581526020015b60405180910390f35b6103b06103e8366004614b67565b6109c9565b610104546103c59060ff1681565b610403610a76565b6040516103d19190614dd6565b6103c561041e366004614641565b610b08565b6103b06104313660046148c6565b610b1e565b61043e610c92565b6040519081526020016103d1565b61048361045a366004614570565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040516001600160e01b031990911681526020016103d1565b60675461043e565b60fd546104b7906001600160a01b031681565b6040516001600160a01b0390911681526020016103d1565b6103c56104dd366004614530565b610d27565b6104ea610df2565b6040516103d19190614d1b565b604051601281526020016103d1565b61043e60fb5481565b61043e610eb1565b6103c5610525366004614641565b610f45565b61043e61053836600461466c565b610f7c565b610104546103c59062010000900460ff1681565b61043e61055f366004614a55565b610ff6565b60fc546104b7906001600160a01b031681565b610108546103c59060ff1681565b60408051808201909152600681527f76312e302e3500000000000000000000000000000000000000000000000000006020820152610403565b6104b76105cc366004614b2a565b611004565b6103c56105df366004614976565b611219565b61043e6105f2366004614416565b611231565b610104546103c590610100900460ff1681565b61043e610618366004614416565b6001600160a01b031660009081526065602052604090205490565b6103b0611259565b6106436112fd565b604080519586526020860194909452928401919091526060830152608082015260a0016103d1565b610104546103c590640100000000900460ff1681565b6104ea61068f366004614813565b611397565b6033546001600160a01b03166104b7565b60ff546104b7906001600160a01b031681565b610403611633565b6104ea6106ce366004614aed565b611642565b6103c56106e1366004614641565b61184b565b6103c56106f4366004614641565b6118fe565b61043e61070736600461479e565b61190b565b61048361071a366004614486565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b6103b0611a5b565b6104ea61075a366004614aa3565b611a67565b610108546103c590610100900460ff1681565b6103b0610780366004614416565b611ab0565b6103b0610793366004614416565b611bf7565b61043e611c53565b6104ea6107ae3660046146d5565b611ce7565b60fe546104b7906001600160a01b031681565b61043e6107d4366004614641565b611d94565b61043e6107e736600461444e565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b6103b061082036600461498b565b611df7565b6103b0610833366004614a6d565b611ec1565b6103b06108463660046149e8565b611f34565b61043e61218a565b6103c561086136600461476b565b61219c565b6104836108743660046145da565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b6103b06108ac366004614416565b61226e565b61043e6123a0565b610104546103c5906301000000900460ff1681565b61043e612435565b6108de6124ca565b60fe5460fb546040517fc182f2b20000000000000000000000000000000000000000000000000000000081526001600160a01b039092169163c182f2b29161092c9160040190815260200190565b600060405180830381600087803b15801561094657600080fd5b505af115801561095a573d6000803e3d6000fd5b50505050565b60006001600160e01b031982167f4e2312e00000000000000000000000000000000000000000000000000000000014806109c357507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6109d16124ca565b60fe5460fb546040517f219962d200000000000000000000000000000000000000000000000000000000815260048101919091526024810187905260448101869052606481018590526084810184905260a481018390526001600160a01b039091169063219962d29060c401600060405180830381600087803b158015610a5757600080fd5b505af1158015610a6b573d6000803e3d6000fd5b505050505050505050565b606060688054610a8590614f1e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab190614f1e565b8015610afe5780601f10610ad357610100808354040283529160200191610afe565b820191906000526020600020905b815481529060010190602001808311610ae157829003601f168201915b5050505050905090565b6000610b1533848461258e565b50600192915050565b610b266124ca565b610104805463ffff000019166201000087151590810263ff0000001916919091176301000000871515021764ff0000000019166401000000008615150217909155610108805461ffff191684151561ff00191617610100841515021790556040519081527fc604be2f834727754dc1ec1225c14d1ecde48e7d12fa7b745dfb137a3db998bd9060200160405180910390a160405184151581527f835d9397f97f5df575f718046bb3e918f911d39d7edfa79aa8d40ddc7d5ce2a59060200160405180910390a160405183151581527f64b60f32742df47d4ccb5b31ca12fee1bc20695467bfe8fa058b00ec446c15639060200160405180910390a160405182151581527f7e8b58aeb3d1d3a1777185c996f374a5d3c46ef3cd25a07ec6eb2569488d50589060200160405180910390a160405181151581527fbfb092a6cb2d49526b6982acab35d64782cf1c05f8c8f0dd88008b288bfa5af59060200160405180910390a15050505050565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b0390911691632206137991610ccc9160040190815260200190565b60a06040518083038186803b158015610ce457600080fd5b505afa158015610cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1c9190614ba1565b509295945050505050565b6000610d348484846126e7565b6001600160a01b038416600090815260666020908152604080832033845290915290205482811015610dd35760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610de78533610de28685614edb565b61258e565b506001949350505050565b60606000610e01610105612908565b905060008167ffffffffffffffff811115610e2c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e55578160200160208202803683370190505b50905060005b82811015610eaa57610e6f61010582612912565b828281518110610e8f57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152610ea381614f59565b9050610e5b565b5092915050565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b0390911691632206137991610eeb9160040190815260200190565b60a06040518083038186803b158015610f0357600080fd5b505afa158015610f17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b9190614ba1565b9695505050505050565b3360008181526066602090815260408083206001600160a01b03871684529091528120549091610b15918590610de2908690614e90565b6000610fed8585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080890282810182019093528882529093508892508791829185019084908082843760009201919091525033925061190b915050565b95945050505050565b60006109c361010583612912565b600061100e6124ca565b60ff546001600160a01b03161561108d5760405162461bcd60e51b815260206004820152602260248201527f4e4654585661756c743a20656c69676962696c69747920616c7265616479207360448201527f65740000000000000000000000000000000000000000000000000000000000006064820152608401610dca565b60fe54604080517f14c77faa00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916314c77faa916004808301926020929190829003018186803b1580156110eb57600080fd5b505afa1580156110ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111239190614432565b90506000816001600160a01b031663576ff9088787876040518463ffffffff1660e01b815260040161115793929190614e45565b602060405180830381600087803b15801561117157600080fd5b505af1158015611185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a99190614432565b60ff80546001600160a01b0319166001600160a01b038316908117909155610104805461ff00191690556040805189815260208101929092529192507fe14c63b3d4272158635bee1d1b95b51bb8de042ee95a15cbfaf2865b4d0af811910160405180910390a195945050505050565b6000611225600461291e565b610fed85858585612a18565b60006001600160a01b038216301461124a5760006109c3565b6067546109c390600019614edb565b6033546001600160a01b031633146112b35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dca565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b60fe5460fb54604051632206137960e01b8152600481019190915260009182918291829182916001600160a01b03169063220613799060240160a06040518083038186803b15801561134e57600080fd5b505afa158015611362573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113869190614ba1565b945094509450945094509091929394565b6060600260c95414156113ec5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610dca565b600260c9556113fb600361291e565b6101045460009060ff16156114b75760005b86518110156114b157600086828151811061143857634e487b7160e01b600052603260045260246000fd5b6020026020010151905080600014156114935760405162461bcd60e51b815260206004820152601b60248201527f4e4654585661756c743a207472616e7366657272696e67203c203100000000006044820152606401610dca565b61149d8184614e90565b925050806114aa90614f59565b905061140d565b506114bb565b5084515b83518114806114cd57506101085460ff165b6115195760405162461bcd60e51b815260206004820152601f60248201527f4e4654585661756c743a2052616e646f6d20737761702064697361626c6564006044820152606401610dca565b8351158061152f575061010854610100900460ff165b61157b5760405162461bcd60e51b815260206004820152601f60248201527f4e4654585661756c743a2054617267657420737761702064697361626c6564006044820152606401610dca565b6000806115866112fd565b94509450505050600086518461159c9190614edb565b6115a69084614ebc565b87516115b29084614ebc565b6115bc9190614e90565b90506115c83382612c3c565b60006115d5858989612ddf565b90506115e18a8a612fed565b507f66982ed4a058811a8004bdcec9adcb3671f2b4f1a788667a3a74959d7c09af3c8a8a8a848b604051611619959493929190614d6d565b60405180910390a1600160c9559998505050505050505050565b606060698054610a8590614f1e565b6060600260c95414156116975760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610dca565b600260c98190556116a79061291e565b82518414806116c05750610104546301000000900460ff165b6117185760405162461bcd60e51b8152602060048201526024808201527f4e4654585661756c743a2052616e646f6d2072656465656d206e6f7420656e61604482015263189b195960e21b6064820152608401610dca565b82511580611731575061010454640100000000900460ff165b6117895760405162461bcd60e51b8152602060048201526024808201527f4e4654585661756c743a205461726765742072656465656d206e6f7420656e61604482015263189b195960e21b6064820152608401610dca565b6117a43361179f86670de0b6b3a7640000614ebc565b61326f565b6000806117af6112fd565b5050925092505060008551876117c59190614edb565b6117cf9084614ebc565b86516117db9084614ebc565b6117e59190614e90565b90506117f13382612c3c565b60006117fe888888612ddf565b90507f63b13f6307f284441e029836b0c22eb91eb62a7ad555670061157930ce884f4e81888860405161183393929190614d2e565b60405180910390a1600160c955979650505050505050565b3360009081526066602090815260408083206001600160a01b0386168452909152812054828110156118e55760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610dca565b6118f43385610de28685614edb565b5060019392505050565b6000610b153384846126e7565b6000600260c95414156119605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610dca565b600260c95561196f600161291e565b6101045462010000900460ff166119c85760405162461bcd60e51b815260206004820152601360248201527f4d696e74696e67206e6f7420656e61626c6564000000000000000000000000006044820152606401610dca565b60006119d48585612fed565b90506119f1836119ec83670de0b6b3a7640000614ebc565b6133f5565b6000816119fc610c92565b611a069190614ebc565b9050611a128482612c3c565b7f1f72ad2a14447fa756b6f5aca53504645af79813493aca2d906b69e4aaeb9492868686604051611a4593929190614d2e565b60405180910390a150600160c955949350505050565b611a656000611bf7565b565b6060611aa884848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250339250611642915050565b949350505050565b6033546001600160a01b03163314611b0a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dca565b6000670de0b6b3a7640000611b1e60675490565b611b289190614ea8565b905060048110611b7a5760405162461bcd60e51b815260206004820152600e60248201527f746f6f206d616e79206974656d730000000000000000000000000000000000006044820152606401610dca565b604080516000815260208101909152611b94828285612ddf565b5060fd54604080516001600160a01b0392831681526020810185905291851682820152517f1f6d756c685d4969a551099165b59f836b4d2cc7e036e623f0248c28bff91db59181900360600190a1505060fd80546001600160a01b031916905550565b611bff6124ca565b60fc80546001600160a01b0319166001600160a01b0383169081179091556040519081527f60a0f5b9f9e81e98216071b85826681c796256fe3d1354ecb675580fba64fa699060200160405180910390a150565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b0390911691632206137991611c8d9160040190815260200190565b60a06040518083038186803b158015611ca557600080fd5b505afa158015611cb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cdd9190614ba1565b5095945050505050565b6060611d8987878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a92508991829185019084908082843760009201919091525050604080516020808a02828101820190935289825290935089925088918291850190849080828437600092019190915250339250611397915050565b979650505050505050565b60006001600160a01b0383163014611dee5760405162461bcd60e51b815260206004820152601b60248201527f4552433230466c6173684d696e743a2077726f6e6720746f6b656e00000000006044820152606401610dca565b50600092915050565b611dff6124ca565b7f1b92808356942344452465ae2648676199ae4c2fe413605353e51ff008e6f2ce611e28610a76565b611e30611633565b86868686604051611e4696959493929190614de9565b60405180910390a161095a84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f880181900481028201810190925286815292508691508590819084018382808284376000920191909152506134d492505050565b6033546001600160a01b03163314611f1b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dca565b611f25828461326f565b611f2f81846133f5565b505050565b600054610100900460ff1680611f4d575060005460ff16155b611fb05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff16158015611fd2576000805461ffff19166101011790555b611fda6134fb565b611fe486866135bd565b6001600160a01b03841661203a5760405162461bcd60e51b815260206004820152601360248201527f417373657420213d2061646472657373283029000000000000000000000000006044820152606401610dca565b60fd80546001600160a01b03199081166001600160a01b0387161790915560fe805433921682179055604080517f264a6208000000000000000000000000000000000000000000000000000000008152905163264a620891600480820192602092909190829003018186803b1580156120b257600080fd5b505afa1580156120c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ea9190614936565b60fb8190556101048054841515610100810261ff001988151590811661ffff199094169390931717909255604080516001600160a01b038916815260208101929092528101919091527f18ecce5c418b882a3d89e5b6cc8100dc3383309b8e78525266fe1283a7f934d69060600160405180910390a26121706001806001806001610b1e565b8015612182576000805461ff00191690555b505050505050565b6000612197610105612908565b905090565b61010454600090610100900460ff16156121b857506001919050565b60ff546001600160a01b0316806121d25750600092915050565b6040517f84ca9f850000000000000000000000000000000000000000000000000000000081526001600160a01b038216906384ca9f8590612217908690600401614d1b565b60206040518083038186803b15801561222f57600080fd5b505afa158015612243573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226791906148aa565b9392505050565b6033546001600160a01b031633146122c85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dca565b6001600160a01b0381166123445760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610dca565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b03909116916322061379916123da9160040190815260200190565b60a06040518083038186803b1580156123f257600080fd5b505afa158015612406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242a9190614ba1565b509195945050505050565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b039091169163220613799161246f9160040190815260200190565b60a06040518083038186803b15801561248757600080fd5b505afa15801561249b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124bf9190614ba1565b509095945050505050565b60fc546001600160a01b0316612534576033546001600160a01b03163314611a655760405162461bcd60e51b815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610dca565b60fc546001600160a01b03163314611a655760405162461bcd60e51b815260206004820152600b60248201527f4e6f74206d616e616765720000000000000000000000000000000000000000006044820152606401610dca565b6001600160a01b0383166126095760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0382166126855760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0383811660008181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166127635760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0382166127df5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0383166000908152606560205260409020548181101561286e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610dca565b6128788282614edb565b6001600160a01b0380861660009081526065602052604080822093909355908516815290812080548492906128ae908490614e90565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128fa91815260200190565b60405180910390a350505050565b60006109c3825490565b60006122678383613683565b60fe546040517ff6aacfb1000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063f6aacfb19060240160206040518083038186803b15801561297b57600080fd5b505afa15801561298f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b391906148aa565b15806129c957506033546001600160a01b031633145b612a155760405162461bcd60e51b815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610dca565b50565b600080612a258585611d94565b9050612a3186856133f5565b6040517f23e30c8b0000000000000000000000000000000000000000000000000000000081527f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9906001600160a01b038816906323e30c8b90612aa09033908a908a9088908b90600401614ce3565b602060405180830381600087803b158015612aba57600080fd5b505af1158015612ace573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af29190614936565b14612b645760405162461bcd60e51b8152602060048201526024808201527f4552433230466c6173684d696e743a20696e76616c69642072657475726e207660448201527f616c7565000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0386166000908152606660209081526040808320308452909152902054612b928286614e90565b811015612c075760405162461bcd60e51b815260206004820152602f60248201527f4552433230466c6173684d696e743a20616c6c6f77616e636520646f6573206e60448201527f6f7420616c6c6f7720726566756e6400000000000000000000000000000000006064820152608401610dca565b612c21873084612c178986614edb565b610de29190614edb565b612c2f8761179f8488614e90565b5060019695505050505050565b60fe546040517fdbe66ca00000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b0390911690819063dbe66ca09060240160206040518083038186803b158015612c9a57600080fd5b505afa158015612cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd291906148aa565b15612cdc57505050565b8115611f2f576000816001600160a01b0316630d43e8ad6040518163ffffffff1660e01b815260040160206040518083038186803b158015612d1d57600080fd5b505afa158015612d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d559190614432565b9050612d628482856126e7565b60fb546040517f91c05b0b00000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b038216906391c05b0b90602401600060405180830381600087803b158015612dc157600080fd5b505af1158015612dd5573d6000803e3d6000fd5b5050505050505050565b6101045460fd5460609160ff16906001600160a01b031660008667ffffffffffffffff811115612e1f57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612e48578160200160208202803683370190505b50865190915060005b88811015612fd8576000828210612e6f57612e6a6136bb565b612e98565b888281518110612e8f57634e487b7160e01b600052603260045260246000fd5b60200260200101515b905080848381518110612ebb57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250508515612faf57600081815261010760205260408120805460019290612eed908490614edb565b909155505060008181526101076020526040902054612f1457612f1261010582613759565b505b6040517ff242432a0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038981166024830152604482018390526001606483015260a06084830152600060a483015286169063f242432a9060c401600060405180830381600087803b158015612f9257600080fd5b505af1158015612fa6573d6000803e3d6000fd5b50505050612fc7565b612fbb61010582613759565b50612fc7858983613765565b50612fd181614f59565b9050612e51565b50612fe282613959565b509695505050505050565b6000612ff88361219c565b6130445760405162461bcd60e51b815260206004820152601760248201527f4e4654585661756c743a206e6f7420656c696769626c650000000000000000006044820152606401610dca565b82516101045460ff16156131f85760fd546040517f2eb2c2d60000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690632eb2c2d6906130a1903390309089908990600401614c8b565b600060405180830381600087803b1580156130bb57600080fd5b505af11580156130cf573d6000803e3d6000fd5b505050506000805b828110156131ee57600086828151811061310157634e487b7160e01b600052603260045260246000fd5b60200260200101519050600086838151811061312d57634e487b7160e01b600052603260045260246000fd5b6020026020010151905080600014156131885760405162461bcd60e51b815260206004820152601b60248201527f4e4654585661756c743a207472616e7366657272696e67203c203100000000006044820152606401610dca565b600082815261010760205260409020546131aa576131a8610105836139e1565b505b60008281526101076020526040812080548392906131c9908490614e90565b909155506131d990508185614e90565b93505050806131e790614f59565b90506130d7565b5091506109c39050565b60fd546001600160a01b031660005b8281101561326457600086828151811061323157634e487b7160e01b600052603260045260246000fd5b6020026020010151905061324583826139ed565b613251610105826139e1565b50508061325d90614f59565b9050613207565b5081925050506109c3565b6001600160a01b0382166132eb5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0382166000908152606560205260409020548181101561337a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6133848282614edb565b6001600160a01b038416600090815260656020526040812091909155606780548492906133b2908490614edb565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016126da565b6001600160a01b03821661344b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610dca565b806067600082825461345d9190614e90565b90915550506001600160a01b0382166000908152606560205260408120805483929061348a908490614e90565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b81516134e7906068906020850190614205565b508051611f2f906069906020840190614205565b600054610100900460ff1680613514575060005460ff16155b6135775760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff16158015613599576000805461ffff19166101011790555b6135a1613e17565b6135a9613ec8565b8015612a15576000805461ff001916905550565b600054610100900460ff16806135d6575060005460ff16155b6136395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff1615801561365b576000805461ffff19166101011790555b613663613e17565b61366d8383613fbd565b8015611f2f576000805461ff0019169055505050565b60008260000182815481106136a857634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6000806136c9610105612908565b6136d4600143614edb565b61010054604080519240602084015282015241606090811b6bffffffffffffffffffffffff19169082015244607482015242609482015260b4016040516020818303038152906040528051906020012060001c6137319190614f74565b90506101006000815461374390614f59565b9091555061375361010582612912565b91505090565b60006122678383614099565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038616831415613808576040516001600160a01b03861660248201526044810185905260640160408051601f198184030181529190526020810180516001600160e01b03167fa9059cbb0000000000000000000000000000000000000000000000000000000017905290506138d7565b816001600160a01b0316866001600160a01b03161415613888576040516001600160a01b03861660248201526044810185905260640160408051601f198184030181529190526020810180516001600160e01b03167f8b72a2ec0000000000000000000000000000000000000000000000000000000017905290506138d7565b6040513060248201526001600160a01b03861660448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b0316632142170760e11b17905290505b600080876001600160a01b0316836040516138f29190614c6f565b6000604051808303816000865af19150503d806000811461392f576040519150601f19603f3d011682016040523d82523d6000602084013e613934565b606091505b5091509150818190610a6b5760405162461bcd60e51b8152600401610dca9190614dd6565b60ff546001600160a01b03168061396e575050565b6040517f5e2f9b520000000000000000000000000000000000000000000000000000000081526001600160a01b03821690635e2f9b52906139b3908590600401614d1b565b600060405180830381600087803b1580156139cd57600080fd5b505af1158015612182573d6000803e3d6000fd5b600061226783836141b6565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038516831415613a8d576040513360248201523060448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b03167f23b872dd000000000000000000000000000000000000000000000000000000001790529050613d95565b816001600160a01b0316856001600160a01b03161415613c3857600084604051602401613abc91815260200190565b60408051601f198184030181529181526020820180516001600160e01b03167f58178168000000000000000000000000000000000000000000000000000000001790525190915060009081906001600160a01b03891690613b1e908590614c6f565b600060405180830381855afa9150503d8060008114613b59576040519150601f19603f3d011682016040523d82523d6000602084013e613b5e565b606091505b5091509150600081806020019051810190613b799190614432565b9050828015613b9057506001600160a01b03811633145b613bdc5760405162461bcd60e51b815260206004820152601160248201527f4e6f7420746865204e4654206f776e65720000000000000000000000000000006044820152606401610dca565b6040516024810189905260440160408051601f198184030181529190526020810180516001600160e01b03167f8264fe98000000000000000000000000000000000000000000000000000000001790529450613d959350505050565b60fd546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810186905230916001600160a01b031690636352211e9060240160206040518083038186803b158015613c9557600080fd5b505afa158015613ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ccd9190614432565b6001600160a01b03161415613d4f57613cfb6101058560008181526001830160205260408120541515612267565b15613d485760405162461bcd60e51b815260206004820152601a60248201527f547279696e6720746f2075736520616e206f776e6564204e46540000000000006044820152606401610dca565b5050505050565b6040513360248201523060448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b0316632142170760e11b17905290505b600080866001600160a01b031683604051613db09190614c6f565b6000604051808303816000865af19150503d8060008114613ded576040519150601f19603f3d011682016040523d82523d6000602084013e613df2565b606091505b5091509150818190612dd55760405162461bcd60e51b8152600401610dca9190614dd6565b600054610100900460ff1680613e30575060005460ff16155b613e935760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff161580156135a9576000805461ffff19166101011790558015612a15576000805461ff001916905550565b600054610100900460ff1680613ee1575060005460ff16155b613f445760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff16158015613f66576000805461ffff19166101011790555b603380546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015612a15576000805461ff001916905550565b600054610100900460ff1680613fd6575060005460ff16155b6140395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff1615801561405b576000805461ffff19166101011790555b825161406e906068906020860190614205565b508151614082906069906020850190614205565b508015611f2f576000805461ff0019169055505050565b600081815260018301602052604081205480156141ac5760006140bd600183614edb565b85549091506000906140d190600190614edb565b90508181146141525760008660000182815481106140ff57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061413057634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b855486908061417157634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506109c3565b60009150506109c3565b60008181526001830160205260408120546141fd575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109c3565b5060006109c3565b82805461421190614f1e565b90600052602060002090601f0160209004810192826142335760008555614279565b82601f1061424c57805160ff1916838001178555614279565b82800160010185558215614279579182015b8281111561427957825182559160200191906001019061425e565b50614285929150614289565b5090565b5b80821115614285576000815560010161428a565b60008083601f8401126142af578182fd5b50813567ffffffffffffffff8111156142c6578182fd5b6020830191508360208260051b85010111156142e157600080fd5b9250929050565b600082601f8301126142f8578081fd5b8135602067ffffffffffffffff82111561431457614314614fb4565b8160051b614323828201614e5f565b83815282810190868401838801850189101561433d578687fd5b8693505b8584101561435f578035835260019390930192918401918401614341565b50979650505050505050565b60008083601f84011261437c578182fd5b50813567ffffffffffffffff811115614393578182fd5b6020830191508360208285010111156142e157600080fd5b600082601f8301126143bb578081fd5b813567ffffffffffffffff8111156143d5576143d5614fb4565b6143e8601f8201601f1916602001614e5f565b8181528460208386010111156143fc578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215614427578081fd5b813561226781614fca565b600060208284031215614443578081fd5b815161226781614fca565b60008060408385031215614460578081fd5b823561446b81614fca565b9150602083013561447b81614fca565b809150509250929050565b600080600080600060a0868803121561449d578081fd5b85356144a881614fca565b945060208601356144b881614fca565b9350604086013567ffffffffffffffff808211156144d4578283fd5b6144e089838a016142e8565b945060608801359150808211156144f5578283fd5b61450189838a016142e8565b93506080880135915080821115614516578283fd5b50614523888289016143ab565b9150509295509295909350565b600080600060608486031215614544578283fd5b833561454f81614fca565b9250602084013561455f81614fca565b929592945050506040919091013590565b60008060008060808587031215614585578384fd5b843561459081614fca565b935060208501356145a081614fca565b925060408501359150606085013567ffffffffffffffff8111156145c2578182fd5b6145ce878288016143ab565b91505092959194509250565b600080600080600060a086880312156145f1578283fd5b85356145fc81614fca565b9450602086013561460c81614fca565b93506040860135925060608601359150608086013567ffffffffffffffff811115614635578182fd5b614523888289016143ab565b60008060408385031215614653578182fd5b823561465e81614fca565b946020939093013593505050565b60008060008060408587031215614681578182fd5b843567ffffffffffffffff80821115614698578384fd5b6146a48883890161429e565b909650945060208701359150808211156146bc578384fd5b506146c98782880161429e565b95989497509550505050565b600080600080600080606087890312156146ed578384fd5b863567ffffffffffffffff80821115614704578586fd5b6147108a838b0161429e565b90985096506020890135915080821115614728578586fd5b6147348a838b0161429e565b9096509450604089013591508082111561474c578283fd5b5061475989828a0161429e565b979a9699509497509295939492505050565b60006020828403121561477c578081fd5b813567ffffffffffffffff811115614792578182fd5b611aa8848285016142e8565b6000806000606084860312156147b2578081fd5b833567ffffffffffffffff808211156147c9578283fd5b6147d5878388016142e8565b945060208601359150808211156147ea578283fd5b506147f7868287016142e8565b925050604084013561480881614fca565b809150509250925092565b60008060008060808587031215614828578182fd5b843567ffffffffffffffff8082111561483f578384fd5b61484b888389016142e8565b95506020870135915080821115614860578384fd5b61486c888389016142e8565b94506040870135915080821115614881578384fd5b5061488e878288016142e8565b925050606085013561489f81614fca565b939692955090935050565b6000602082840312156148bb578081fd5b815161226781614fdf565b600080600080600060a086880312156148dd578283fd5b85356148e881614fdf565b945060208601356148f881614fdf565b9350604086013561490881614fdf565b9250606086013561491881614fdf565b9150608086013561492881614fdf565b809150509295509295909350565b600060208284031215614947578081fd5b5051919050565b60006020828403121561495f578081fd5b81356001600160e01b031981168114612267578182fd5b60008060008060808587031215614585578182fd5b600080600080604085870312156149a0578182fd5b843567ffffffffffffffff808211156149b7578384fd5b6149c38883890161436b565b909650945060208701359150808211156149db578384fd5b506146c98782880161436b565b600080600080600060a086880312156149ff578283fd5b853567ffffffffffffffff80821115614a16578485fd5b614a2289838a016143ab565b96506020880135915080821115614a37578485fd5b50614a44888289016143ab565b945050604086013561490881614fca565b600060208284031215614a66578081fd5b5035919050565b600080600060608486031215614a81578081fd5b833592506020840135614a9381614fca565b9150604084013561480881614fca565b600080600060408486031215614ab7578081fd5b83359250602084013567ffffffffffffffff811115614ad4578182fd5b614ae08682870161429e565b9497909650939450505050565b600080600060608486031215614b01578081fd5b83359250602084013567ffffffffffffffff811115614b1e578182fd5b6147f7868287016142e8565b600080600060408486031215614b3e578081fd5b83359250602084013567ffffffffffffffff811115614b5b578182fd5b614ae08682870161436b565b600080600080600060a08688031215614b7e578283fd5b505083359560208501359550604085013594606081013594506080013592509050565b600080600080600060a08688031215614bb8578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6000815180845260208085019450808401835b83811015614c0f57815187529582019590820190600101614bf3565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008151808452614c5b816020860160208601614ef2565b601f01601f19169290920160200192915050565b60008251614c81818460208701614ef2565b9190910192915050565b60006001600160a01b03808716835280861660208401525060a06040830152614cb760a0830185614be0565b8281036060840152614cc98185614be0565b838103608090940193909352508152602001949350505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152611d8960a0830184614c43565b6020815260006122676020830184614be0565b606081526000614d416060830186614be0565b8281036020840152614d538186614be0565b9150506001600160a01b0383166040830152949350505050565b60a081526000614d8060a0830188614be0565b8281036020840152614d928188614be0565b90508281036040840152614da68187614be0565b90508281036060840152614dba8186614be0565b9150506001600160a01b03831660808301529695505050505050565b6020815260006122676020830184614c43565b608081526000614dfc6080830189614c43565b8281036020840152614e0e8189614c43565b90508281036040840152614e23818789614c1a565b90508281036060840152614e38818587614c1a565b9998505050505050505050565b838152604060208201526000610fed604083018486614c1a565b604051601f8201601f1916810167ffffffffffffffff81118282101715614e8857614e88614fb4565b604052919050565b60008219821115614ea357614ea3614f88565b500190565b600082614eb757614eb7614f9e565b500490565b6000816000190483118215151615614ed657614ed6614f88565b500290565b600082821015614eed57614eed614f88565b500390565b60005b83811015614f0d578181015183820152602001614ef5565b8381111561095a5750506000910152565b600181811c90821680614f3257607f821691505b60208210811415614f5357634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614f6d57614f6d614f88565b5060010190565b600082614f8357614f83614f9e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612a1557600080fd5b8015158114612a1557600080fdfea2646970667358221220fdd9ce0808b0515981293436a69cc47bc2a981bd3970dfda29e0ce79d0397c0864736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103a35760003560e01c806379309658116101e9578063d53f62171161010f578063e78458c4116100ad578063f2fde38b1161007c578063f2fde38b1461089e578063f7fce334146108b1578063fcc0e381146108b9578063feb8eba5146108ce57600080fd5b8063e78458c414610838578063e9ec2e991461084b578063f1d20dd414610853578063f23a6e611461086657600080fd5b8063d9d98ce4116100e9578063d9d98ce4146107c6578063dd62ed3e146107d9578063e0a8b97a14610812578063e0b4a79a1461082557600080fd5b8063d53f621714610798578063d6ee4a93146107a0578063d8a06f73146107b357600080fd5b8063a9059cbb11610187578063c4a0db9611610156578063c4a0db961461074c578063c4ff52471461075f578063cce2f3fb14610772578063d0ebdbe71461078557600080fd5b8063a9059cbb146106e6578063b10402ea146106f9578063bc197c811461070c578063c3cb8c141461074457600080fd5b80638f878a43116101c35780638f878a43146106a557806395d89b41146106b85780639d54def6146106c0578063a457c2d7146106d357600080fd5b8063793096581461066b5780638c850814146106815780638da5cb5b1461069457600080fd5b806335dca76c116102ce57806354fd4d501161026c5780636b948a351161023b5780636b948a35146105f757806370a082311461060a578063715018a61461063357806372188e3f1461063b57600080fd5b806354fd4d50146105855780635877aee6146105be5780635cffe9de146105d1578063613255ab146105e457600080fd5b806344b28d59116102a857806344b28d591461053d57806345a0b65214610551578063481c6a75146105645780635035434a1461057757600080fd5b806335dca76c1461050f57806339509351146105175780633d5d190c1461052a57600080fd5b806313966db51161034657806323b872dd1161031557806323b872dd146104cf57806325705d8d146104e2578063313ce567146104f757806333194c0a1461050657600080fd5b806313966db514610436578063150b7a021461044c57806318160ddd1461049c5780631ba46cfd146104a457600080fd5b806306f26dc21161038257806306f26dc2146103ed57806306fdde03146103fb578063095ea7b3146104105780630d636a091461042357600080fd5b8062518161146103a857806301ffc9a7146103b257806304a66b48146103da575b600080fd5b6103b06108d6565b005b6103c56103c036600461494e565b610960565b60405190151581526020015b60405180910390f35b6103b06103e8366004614b67565b6109c9565b610104546103c59060ff1681565b610403610a76565b6040516103d19190614dd6565b6103c561041e366004614641565b610b08565b6103b06104313660046148c6565b610b1e565b61043e610c92565b6040519081526020016103d1565b61048361045a366004614570565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040516001600160e01b031990911681526020016103d1565b60675461043e565b60fd546104b7906001600160a01b031681565b6040516001600160a01b0390911681526020016103d1565b6103c56104dd366004614530565b610d27565b6104ea610df2565b6040516103d19190614d1b565b604051601281526020016103d1565b61043e60fb5481565b61043e610eb1565b6103c5610525366004614641565b610f45565b61043e61053836600461466c565b610f7c565b610104546103c59062010000900460ff1681565b61043e61055f366004614a55565b610ff6565b60fc546104b7906001600160a01b031681565b610108546103c59060ff1681565b60408051808201909152600681527f76312e302e3500000000000000000000000000000000000000000000000000006020820152610403565b6104b76105cc366004614b2a565b611004565b6103c56105df366004614976565b611219565b61043e6105f2366004614416565b611231565b610104546103c590610100900460ff1681565b61043e610618366004614416565b6001600160a01b031660009081526065602052604090205490565b6103b0611259565b6106436112fd565b604080519586526020860194909452928401919091526060830152608082015260a0016103d1565b610104546103c590640100000000900460ff1681565b6104ea61068f366004614813565b611397565b6033546001600160a01b03166104b7565b60ff546104b7906001600160a01b031681565b610403611633565b6104ea6106ce366004614aed565b611642565b6103c56106e1366004614641565b61184b565b6103c56106f4366004614641565b6118fe565b61043e61070736600461479e565b61190b565b61048361071a366004614486565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b6103b0611a5b565b6104ea61075a366004614aa3565b611a67565b610108546103c590610100900460ff1681565b6103b0610780366004614416565b611ab0565b6103b0610793366004614416565b611bf7565b61043e611c53565b6104ea6107ae3660046146d5565b611ce7565b60fe546104b7906001600160a01b031681565b61043e6107d4366004614641565b611d94565b61043e6107e736600461444e565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b6103b061082036600461498b565b611df7565b6103b0610833366004614a6d565b611ec1565b6103b06108463660046149e8565b611f34565b61043e61218a565b6103c561086136600461476b565b61219c565b6104836108743660046145da565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b6103b06108ac366004614416565b61226e565b61043e6123a0565b610104546103c5906301000000900460ff1681565b61043e612435565b6108de6124ca565b60fe5460fb546040517fc182f2b20000000000000000000000000000000000000000000000000000000081526001600160a01b039092169163c182f2b29161092c9160040190815260200190565b600060405180830381600087803b15801561094657600080fd5b505af115801561095a573d6000803e3d6000fd5b50505050565b60006001600160e01b031982167f4e2312e00000000000000000000000000000000000000000000000000000000014806109c357507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6109d16124ca565b60fe5460fb546040517f219962d200000000000000000000000000000000000000000000000000000000815260048101919091526024810187905260448101869052606481018590526084810184905260a481018390526001600160a01b039091169063219962d29060c401600060405180830381600087803b158015610a5757600080fd5b505af1158015610a6b573d6000803e3d6000fd5b505050505050505050565b606060688054610a8590614f1e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab190614f1e565b8015610afe5780601f10610ad357610100808354040283529160200191610afe565b820191906000526020600020905b815481529060010190602001808311610ae157829003601f168201915b5050505050905090565b6000610b1533848461258e565b50600192915050565b610b266124ca565b610104805463ffff000019166201000087151590810263ff0000001916919091176301000000871515021764ff0000000019166401000000008615150217909155610108805461ffff191684151561ff00191617610100841515021790556040519081527fc604be2f834727754dc1ec1225c14d1ecde48e7d12fa7b745dfb137a3db998bd9060200160405180910390a160405184151581527f835d9397f97f5df575f718046bb3e918f911d39d7edfa79aa8d40ddc7d5ce2a59060200160405180910390a160405183151581527f64b60f32742df47d4ccb5b31ca12fee1bc20695467bfe8fa058b00ec446c15639060200160405180910390a160405182151581527f7e8b58aeb3d1d3a1777185c996f374a5d3c46ef3cd25a07ec6eb2569488d50589060200160405180910390a160405181151581527fbfb092a6cb2d49526b6982acab35d64782cf1c05f8c8f0dd88008b288bfa5af59060200160405180910390a15050505050565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b0390911691632206137991610ccc9160040190815260200190565b60a06040518083038186803b158015610ce457600080fd5b505afa158015610cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1c9190614ba1565b509295945050505050565b6000610d348484846126e7565b6001600160a01b038416600090815260666020908152604080832033845290915290205482811015610dd35760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610de78533610de28685614edb565b61258e565b506001949350505050565b60606000610e01610105612908565b905060008167ffffffffffffffff811115610e2c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e55578160200160208202803683370190505b50905060005b82811015610eaa57610e6f61010582612912565b828281518110610e8f57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152610ea381614f59565b9050610e5b565b5092915050565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b0390911691632206137991610eeb9160040190815260200190565b60a06040518083038186803b158015610f0357600080fd5b505afa158015610f17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b9190614ba1565b9695505050505050565b3360008181526066602090815260408083206001600160a01b03871684529091528120549091610b15918590610de2908690614e90565b6000610fed8585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080890282810182019093528882529093508892508791829185019084908082843760009201919091525033925061190b915050565b95945050505050565b60006109c361010583612912565b600061100e6124ca565b60ff546001600160a01b03161561108d5760405162461bcd60e51b815260206004820152602260248201527f4e4654585661756c743a20656c69676962696c69747920616c7265616479207360448201527f65740000000000000000000000000000000000000000000000000000000000006064820152608401610dca565b60fe54604080517f14c77faa00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916314c77faa916004808301926020929190829003018186803b1580156110eb57600080fd5b505afa1580156110ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111239190614432565b90506000816001600160a01b031663576ff9088787876040518463ffffffff1660e01b815260040161115793929190614e45565b602060405180830381600087803b15801561117157600080fd5b505af1158015611185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a99190614432565b60ff80546001600160a01b0319166001600160a01b038316908117909155610104805461ff00191690556040805189815260208101929092529192507fe14c63b3d4272158635bee1d1b95b51bb8de042ee95a15cbfaf2865b4d0af811910160405180910390a195945050505050565b6000611225600461291e565b610fed85858585612a18565b60006001600160a01b038216301461124a5760006109c3565b6067546109c390600019614edb565b6033546001600160a01b031633146112b35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dca565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b60fe5460fb54604051632206137960e01b8152600481019190915260009182918291829182916001600160a01b03169063220613799060240160a06040518083038186803b15801561134e57600080fd5b505afa158015611362573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113869190614ba1565b945094509450945094509091929394565b6060600260c95414156113ec5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610dca565b600260c9556113fb600361291e565b6101045460009060ff16156114b75760005b86518110156114b157600086828151811061143857634e487b7160e01b600052603260045260246000fd5b6020026020010151905080600014156114935760405162461bcd60e51b815260206004820152601b60248201527f4e4654585661756c743a207472616e7366657272696e67203c203100000000006044820152606401610dca565b61149d8184614e90565b925050806114aa90614f59565b905061140d565b506114bb565b5084515b83518114806114cd57506101085460ff165b6115195760405162461bcd60e51b815260206004820152601f60248201527f4e4654585661756c743a2052616e646f6d20737761702064697361626c6564006044820152606401610dca565b8351158061152f575061010854610100900460ff165b61157b5760405162461bcd60e51b815260206004820152601f60248201527f4e4654585661756c743a2054617267657420737761702064697361626c6564006044820152606401610dca565b6000806115866112fd565b94509450505050600086518461159c9190614edb565b6115a69084614ebc565b87516115b29084614ebc565b6115bc9190614e90565b90506115c83382612c3c565b60006115d5858989612ddf565b90506115e18a8a612fed565b507f66982ed4a058811a8004bdcec9adcb3671f2b4f1a788667a3a74959d7c09af3c8a8a8a848b604051611619959493929190614d6d565b60405180910390a1600160c9559998505050505050505050565b606060698054610a8590614f1e565b6060600260c95414156116975760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610dca565b600260c98190556116a79061291e565b82518414806116c05750610104546301000000900460ff165b6117185760405162461bcd60e51b8152602060048201526024808201527f4e4654585661756c743a2052616e646f6d2072656465656d206e6f7420656e61604482015263189b195960e21b6064820152608401610dca565b82511580611731575061010454640100000000900460ff165b6117895760405162461bcd60e51b8152602060048201526024808201527f4e4654585661756c743a205461726765742072656465656d206e6f7420656e61604482015263189b195960e21b6064820152608401610dca565b6117a43361179f86670de0b6b3a7640000614ebc565b61326f565b6000806117af6112fd565b5050925092505060008551876117c59190614edb565b6117cf9084614ebc565b86516117db9084614ebc565b6117e59190614e90565b90506117f13382612c3c565b60006117fe888888612ddf565b90507f63b13f6307f284441e029836b0c22eb91eb62a7ad555670061157930ce884f4e81888860405161183393929190614d2e565b60405180910390a1600160c955979650505050505050565b3360009081526066602090815260408083206001600160a01b0386168452909152812054828110156118e55760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610dca565b6118f43385610de28685614edb565b5060019392505050565b6000610b153384846126e7565b6000600260c95414156119605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610dca565b600260c95561196f600161291e565b6101045462010000900460ff166119c85760405162461bcd60e51b815260206004820152601360248201527f4d696e74696e67206e6f7420656e61626c6564000000000000000000000000006044820152606401610dca565b60006119d48585612fed565b90506119f1836119ec83670de0b6b3a7640000614ebc565b6133f5565b6000816119fc610c92565b611a069190614ebc565b9050611a128482612c3c565b7f1f72ad2a14447fa756b6f5aca53504645af79813493aca2d906b69e4aaeb9492868686604051611a4593929190614d2e565b60405180910390a150600160c955949350505050565b611a656000611bf7565b565b6060611aa884848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250339250611642915050565b949350505050565b6033546001600160a01b03163314611b0a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dca565b6000670de0b6b3a7640000611b1e60675490565b611b289190614ea8565b905060048110611b7a5760405162461bcd60e51b815260206004820152600e60248201527f746f6f206d616e79206974656d730000000000000000000000000000000000006044820152606401610dca565b604080516000815260208101909152611b94828285612ddf565b5060fd54604080516001600160a01b0392831681526020810185905291851682820152517f1f6d756c685d4969a551099165b59f836b4d2cc7e036e623f0248c28bff91db59181900360600190a1505060fd80546001600160a01b031916905550565b611bff6124ca565b60fc80546001600160a01b0319166001600160a01b0383169081179091556040519081527f60a0f5b9f9e81e98216071b85826681c796256fe3d1354ecb675580fba64fa699060200160405180910390a150565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b0390911691632206137991611c8d9160040190815260200190565b60a06040518083038186803b158015611ca557600080fd5b505afa158015611cb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cdd9190614ba1565b5095945050505050565b6060611d8987878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a92508991829185019084908082843760009201919091525050604080516020808a02828101820190935289825290935089925088918291850190849080828437600092019190915250339250611397915050565b979650505050505050565b60006001600160a01b0383163014611dee5760405162461bcd60e51b815260206004820152601b60248201527f4552433230466c6173684d696e743a2077726f6e6720746f6b656e00000000006044820152606401610dca565b50600092915050565b611dff6124ca565b7f1b92808356942344452465ae2648676199ae4c2fe413605353e51ff008e6f2ce611e28610a76565b611e30611633565b86868686604051611e4696959493929190614de9565b60405180910390a161095a84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f880181900481028201810190925286815292508691508590819084018382808284376000920191909152506134d492505050565b6033546001600160a01b03163314611f1b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dca565b611f25828461326f565b611f2f81846133f5565b505050565b600054610100900460ff1680611f4d575060005460ff16155b611fb05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff16158015611fd2576000805461ffff19166101011790555b611fda6134fb565b611fe486866135bd565b6001600160a01b03841661203a5760405162461bcd60e51b815260206004820152601360248201527f417373657420213d2061646472657373283029000000000000000000000000006044820152606401610dca565b60fd80546001600160a01b03199081166001600160a01b0387161790915560fe805433921682179055604080517f264a6208000000000000000000000000000000000000000000000000000000008152905163264a620891600480820192602092909190829003018186803b1580156120b257600080fd5b505afa1580156120c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ea9190614936565b60fb8190556101048054841515610100810261ff001988151590811661ffff199094169390931717909255604080516001600160a01b038916815260208101929092528101919091527f18ecce5c418b882a3d89e5b6cc8100dc3383309b8e78525266fe1283a7f934d69060600160405180910390a26121706001806001806001610b1e565b8015612182576000805461ff00191690555b505050505050565b6000612197610105612908565b905090565b61010454600090610100900460ff16156121b857506001919050565b60ff546001600160a01b0316806121d25750600092915050565b6040517f84ca9f850000000000000000000000000000000000000000000000000000000081526001600160a01b038216906384ca9f8590612217908690600401614d1b565b60206040518083038186803b15801561222f57600080fd5b505afa158015612243573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226791906148aa565b9392505050565b6033546001600160a01b031633146122c85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dca565b6001600160a01b0381166123445760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610dca565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b03909116916322061379916123da9160040190815260200190565b60a06040518083038186803b1580156123f257600080fd5b505afa158015612406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242a9190614ba1565b509195945050505050565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b039091169163220613799161246f9160040190815260200190565b60a06040518083038186803b15801561248757600080fd5b505afa15801561249b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124bf9190614ba1565b509095945050505050565b60fc546001600160a01b0316612534576033546001600160a01b03163314611a655760405162461bcd60e51b815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610dca565b60fc546001600160a01b03163314611a655760405162461bcd60e51b815260206004820152600b60248201527f4e6f74206d616e616765720000000000000000000000000000000000000000006044820152606401610dca565b6001600160a01b0383166126095760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0382166126855760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0383811660008181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166127635760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0382166127df5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0383166000908152606560205260409020548181101561286e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610dca565b6128788282614edb565b6001600160a01b0380861660009081526065602052604080822093909355908516815290812080548492906128ae908490614e90565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128fa91815260200190565b60405180910390a350505050565b60006109c3825490565b60006122678383613683565b60fe546040517ff6aacfb1000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063f6aacfb19060240160206040518083038186803b15801561297b57600080fd5b505afa15801561298f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b391906148aa565b15806129c957506033546001600160a01b031633145b612a155760405162461bcd60e51b815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610dca565b50565b600080612a258585611d94565b9050612a3186856133f5565b6040517f23e30c8b0000000000000000000000000000000000000000000000000000000081527f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9906001600160a01b038816906323e30c8b90612aa09033908a908a9088908b90600401614ce3565b602060405180830381600087803b158015612aba57600080fd5b505af1158015612ace573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af29190614936565b14612b645760405162461bcd60e51b8152602060048201526024808201527f4552433230466c6173684d696e743a20696e76616c69642072657475726e207660448201527f616c7565000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0386166000908152606660209081526040808320308452909152902054612b928286614e90565b811015612c075760405162461bcd60e51b815260206004820152602f60248201527f4552433230466c6173684d696e743a20616c6c6f77616e636520646f6573206e60448201527f6f7420616c6c6f7720726566756e6400000000000000000000000000000000006064820152608401610dca565b612c21873084612c178986614edb565b610de29190614edb565b612c2f8761179f8488614e90565b5060019695505050505050565b60fe546040517fdbe66ca00000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b0390911690819063dbe66ca09060240160206040518083038186803b158015612c9a57600080fd5b505afa158015612cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd291906148aa565b15612cdc57505050565b8115611f2f576000816001600160a01b0316630d43e8ad6040518163ffffffff1660e01b815260040160206040518083038186803b158015612d1d57600080fd5b505afa158015612d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d559190614432565b9050612d628482856126e7565b60fb546040517f91c05b0b00000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b038216906391c05b0b90602401600060405180830381600087803b158015612dc157600080fd5b505af1158015612dd5573d6000803e3d6000fd5b5050505050505050565b6101045460fd5460609160ff16906001600160a01b031660008667ffffffffffffffff811115612e1f57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612e48578160200160208202803683370190505b50865190915060005b88811015612fd8576000828210612e6f57612e6a6136bb565b612e98565b888281518110612e8f57634e487b7160e01b600052603260045260246000fd5b60200260200101515b905080848381518110612ebb57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250508515612faf57600081815261010760205260408120805460019290612eed908490614edb565b909155505060008181526101076020526040902054612f1457612f1261010582613759565b505b6040517ff242432a0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038981166024830152604482018390526001606483015260a06084830152600060a483015286169063f242432a9060c401600060405180830381600087803b158015612f9257600080fd5b505af1158015612fa6573d6000803e3d6000fd5b50505050612fc7565b612fbb61010582613759565b50612fc7858983613765565b50612fd181614f59565b9050612e51565b50612fe282613959565b509695505050505050565b6000612ff88361219c565b6130445760405162461bcd60e51b815260206004820152601760248201527f4e4654585661756c743a206e6f7420656c696769626c650000000000000000006044820152606401610dca565b82516101045460ff16156131f85760fd546040517f2eb2c2d60000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690632eb2c2d6906130a1903390309089908990600401614c8b565b600060405180830381600087803b1580156130bb57600080fd5b505af11580156130cf573d6000803e3d6000fd5b505050506000805b828110156131ee57600086828151811061310157634e487b7160e01b600052603260045260246000fd5b60200260200101519050600086838151811061312d57634e487b7160e01b600052603260045260246000fd5b6020026020010151905080600014156131885760405162461bcd60e51b815260206004820152601b60248201527f4e4654585661756c743a207472616e7366657272696e67203c203100000000006044820152606401610dca565b600082815261010760205260409020546131aa576131a8610105836139e1565b505b60008281526101076020526040812080548392906131c9908490614e90565b909155506131d990508185614e90565b93505050806131e790614f59565b90506130d7565b5091506109c39050565b60fd546001600160a01b031660005b8281101561326457600086828151811061323157634e487b7160e01b600052603260045260246000fd5b6020026020010151905061324583826139ed565b613251610105826139e1565b50508061325d90614f59565b9050613207565b5081925050506109c3565b6001600160a01b0382166132eb5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0382166000908152606560205260409020548181101561337a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6133848282614edb565b6001600160a01b038416600090815260656020526040812091909155606780548492906133b2908490614edb565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016126da565b6001600160a01b03821661344b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610dca565b806067600082825461345d9190614e90565b90915550506001600160a01b0382166000908152606560205260408120805483929061348a908490614e90565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b81516134e7906068906020850190614205565b508051611f2f906069906020840190614205565b600054610100900460ff1680613514575060005460ff16155b6135775760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff16158015613599576000805461ffff19166101011790555b6135a1613e17565b6135a9613ec8565b8015612a15576000805461ff001916905550565b600054610100900460ff16806135d6575060005460ff16155b6136395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff1615801561365b576000805461ffff19166101011790555b613663613e17565b61366d8383613fbd565b8015611f2f576000805461ff0019169055505050565b60008260000182815481106136a857634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6000806136c9610105612908565b6136d4600143614edb565b61010054604080519240602084015282015241606090811b6bffffffffffffffffffffffff19169082015244607482015242609482015260b4016040516020818303038152906040528051906020012060001c6137319190614f74565b90506101006000815461374390614f59565b9091555061375361010582612912565b91505090565b60006122678383614099565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038616831415613808576040516001600160a01b03861660248201526044810185905260640160408051601f198184030181529190526020810180516001600160e01b03167fa9059cbb0000000000000000000000000000000000000000000000000000000017905290506138d7565b816001600160a01b0316866001600160a01b03161415613888576040516001600160a01b03861660248201526044810185905260640160408051601f198184030181529190526020810180516001600160e01b03167f8b72a2ec0000000000000000000000000000000000000000000000000000000017905290506138d7565b6040513060248201526001600160a01b03861660448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b0316632142170760e11b17905290505b600080876001600160a01b0316836040516138f29190614c6f565b6000604051808303816000865af19150503d806000811461392f576040519150601f19603f3d011682016040523d82523d6000602084013e613934565b606091505b5091509150818190610a6b5760405162461bcd60e51b8152600401610dca9190614dd6565b60ff546001600160a01b03168061396e575050565b6040517f5e2f9b520000000000000000000000000000000000000000000000000000000081526001600160a01b03821690635e2f9b52906139b3908590600401614d1b565b600060405180830381600087803b1580156139cd57600080fd5b505af1158015612182573d6000803e3d6000fd5b600061226783836141b6565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038516831415613a8d576040513360248201523060448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b03167f23b872dd000000000000000000000000000000000000000000000000000000001790529050613d95565b816001600160a01b0316856001600160a01b03161415613c3857600084604051602401613abc91815260200190565b60408051601f198184030181529181526020820180516001600160e01b03167f58178168000000000000000000000000000000000000000000000000000000001790525190915060009081906001600160a01b03891690613b1e908590614c6f565b600060405180830381855afa9150503d8060008114613b59576040519150601f19603f3d011682016040523d82523d6000602084013e613b5e565b606091505b5091509150600081806020019051810190613b799190614432565b9050828015613b9057506001600160a01b03811633145b613bdc5760405162461bcd60e51b815260206004820152601160248201527f4e6f7420746865204e4654206f776e65720000000000000000000000000000006044820152606401610dca565b6040516024810189905260440160408051601f198184030181529190526020810180516001600160e01b03167f8264fe98000000000000000000000000000000000000000000000000000000001790529450613d959350505050565b60fd546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810186905230916001600160a01b031690636352211e9060240160206040518083038186803b158015613c9557600080fd5b505afa158015613ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ccd9190614432565b6001600160a01b03161415613d4f57613cfb6101058560008181526001830160205260408120541515612267565b15613d485760405162461bcd60e51b815260206004820152601a60248201527f547279696e6720746f2075736520616e206f776e6564204e46540000000000006044820152606401610dca565b5050505050565b6040513360248201523060448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b0316632142170760e11b17905290505b600080866001600160a01b031683604051613db09190614c6f565b6000604051808303816000865af19150503d8060008114613ded576040519150601f19603f3d011682016040523d82523d6000602084013e613df2565b606091505b5091509150818190612dd55760405162461bcd60e51b8152600401610dca9190614dd6565b600054610100900460ff1680613e30575060005460ff16155b613e935760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff161580156135a9576000805461ffff19166101011790558015612a15576000805461ff001916905550565b600054610100900460ff1680613ee1575060005460ff16155b613f445760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff16158015613f66576000805461ffff19166101011790555b603380546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015612a15576000805461ff001916905550565b600054610100900460ff1680613fd6575060005460ff16155b6140395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff1615801561405b576000805461ffff19166101011790555b825161406e906068906020860190614205565b508151614082906069906020850190614205565b508015611f2f576000805461ff0019169055505050565b600081815260018301602052604081205480156141ac5760006140bd600183614edb565b85549091506000906140d190600190614edb565b90508181146141525760008660000182815481106140ff57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061413057634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b855486908061417157634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506109c3565b60009150506109c3565b60008181526001830160205260408120546141fd575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109c3565b5060006109c3565b82805461421190614f1e565b90600052602060002090601f0160209004810192826142335760008555614279565b82601f1061424c57805160ff1916838001178555614279565b82800160010185558215614279579182015b8281111561427957825182559160200191906001019061425e565b50614285929150614289565b5090565b5b80821115614285576000815560010161428a565b60008083601f8401126142af578182fd5b50813567ffffffffffffffff8111156142c6578182fd5b6020830191508360208260051b85010111156142e157600080fd5b9250929050565b600082601f8301126142f8578081fd5b8135602067ffffffffffffffff82111561431457614314614fb4565b8160051b614323828201614e5f565b83815282810190868401838801850189101561433d578687fd5b8693505b8584101561435f578035835260019390930192918401918401614341565b50979650505050505050565b60008083601f84011261437c578182fd5b50813567ffffffffffffffff811115614393578182fd5b6020830191508360208285010111156142e157600080fd5b600082601f8301126143bb578081fd5b813567ffffffffffffffff8111156143d5576143d5614fb4565b6143e8601f8201601f1916602001614e5f565b8181528460208386010111156143fc578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215614427578081fd5b813561226781614fca565b600060208284031215614443578081fd5b815161226781614fca565b60008060408385031215614460578081fd5b823561446b81614fca565b9150602083013561447b81614fca565b809150509250929050565b600080600080600060a0868803121561449d578081fd5b85356144a881614fca565b945060208601356144b881614fca565b9350604086013567ffffffffffffffff808211156144d4578283fd5b6144e089838a016142e8565b945060608801359150808211156144f5578283fd5b61450189838a016142e8565b93506080880135915080821115614516578283fd5b50614523888289016143ab565b9150509295509295909350565b600080600060608486031215614544578283fd5b833561454f81614fca565b9250602084013561455f81614fca565b929592945050506040919091013590565b60008060008060808587031215614585578384fd5b843561459081614fca565b935060208501356145a081614fca565b925060408501359150606085013567ffffffffffffffff8111156145c2578182fd5b6145ce878288016143ab565b91505092959194509250565b600080600080600060a086880312156145f1578283fd5b85356145fc81614fca565b9450602086013561460c81614fca565b93506040860135925060608601359150608086013567ffffffffffffffff811115614635578182fd5b614523888289016143ab565b60008060408385031215614653578182fd5b823561465e81614fca565b946020939093013593505050565b60008060008060408587031215614681578182fd5b843567ffffffffffffffff80821115614698578384fd5b6146a48883890161429e565b909650945060208701359150808211156146bc578384fd5b506146c98782880161429e565b95989497509550505050565b600080600080600080606087890312156146ed578384fd5b863567ffffffffffffffff80821115614704578586fd5b6147108a838b0161429e565b90985096506020890135915080821115614728578586fd5b6147348a838b0161429e565b9096509450604089013591508082111561474c578283fd5b5061475989828a0161429e565b979a9699509497509295939492505050565b60006020828403121561477c578081fd5b813567ffffffffffffffff811115614792578182fd5b611aa8848285016142e8565b6000806000606084860312156147b2578081fd5b833567ffffffffffffffff808211156147c9578283fd5b6147d5878388016142e8565b945060208601359150808211156147ea578283fd5b506147f7868287016142e8565b925050604084013561480881614fca565b809150509250925092565b60008060008060808587031215614828578182fd5b843567ffffffffffffffff8082111561483f578384fd5b61484b888389016142e8565b95506020870135915080821115614860578384fd5b61486c888389016142e8565b94506040870135915080821115614881578384fd5b5061488e878288016142e8565b925050606085013561489f81614fca565b939692955090935050565b6000602082840312156148bb578081fd5b815161226781614fdf565b600080600080600060a086880312156148dd578283fd5b85356148e881614fdf565b945060208601356148f881614fdf565b9350604086013561490881614fdf565b9250606086013561491881614fdf565b9150608086013561492881614fdf565b809150509295509295909350565b600060208284031215614947578081fd5b5051919050565b60006020828403121561495f578081fd5b81356001600160e01b031981168114612267578182fd5b60008060008060808587031215614585578182fd5b600080600080604085870312156149a0578182fd5b843567ffffffffffffffff808211156149b7578384fd5b6149c38883890161436b565b909650945060208701359150808211156149db578384fd5b506146c98782880161436b565b600080600080600060a086880312156149ff578283fd5b853567ffffffffffffffff80821115614a16578485fd5b614a2289838a016143ab565b96506020880135915080821115614a37578485fd5b50614a44888289016143ab565b945050604086013561490881614fca565b600060208284031215614a66578081fd5b5035919050565b600080600060608486031215614a81578081fd5b833592506020840135614a9381614fca565b9150604084013561480881614fca565b600080600060408486031215614ab7578081fd5b83359250602084013567ffffffffffffffff811115614ad4578182fd5b614ae08682870161429e565b9497909650939450505050565b600080600060608486031215614b01578081fd5b83359250602084013567ffffffffffffffff811115614b1e578182fd5b6147f7868287016142e8565b600080600060408486031215614b3e578081fd5b83359250602084013567ffffffffffffffff811115614b5b578182fd5b614ae08682870161436b565b600080600080600060a08688031215614b7e578283fd5b505083359560208501359550604085013594606081013594506080013592509050565b600080600080600060a08688031215614bb8578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6000815180845260208085019450808401835b83811015614c0f57815187529582019590820190600101614bf3565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008151808452614c5b816020860160208601614ef2565b601f01601f19169290920160200192915050565b60008251614c81818460208701614ef2565b9190910192915050565b60006001600160a01b03808716835280861660208401525060a06040830152614cb760a0830185614be0565b8281036060840152614cc98185614be0565b838103608090940193909352508152602001949350505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152611d8960a0830184614c43565b6020815260006122676020830184614be0565b606081526000614d416060830186614be0565b8281036020840152614d538186614be0565b9150506001600160a01b0383166040830152949350505050565b60a081526000614d8060a0830188614be0565b8281036020840152614d928188614be0565b90508281036040840152614da68187614be0565b90508281036060840152614dba8186614be0565b9150506001600160a01b03831660808301529695505050505050565b6020815260006122676020830184614c43565b608081526000614dfc6080830189614c43565b8281036020840152614e0e8189614c43565b90508281036040840152614e23818789614c1a565b90508281036060840152614e38818587614c1a565b9998505050505050505050565b838152604060208201526000610fed604083018486614c1a565b604051601f8201601f1916810167ffffffffffffffff81118282101715614e8857614e88614fb4565b604052919050565b60008219821115614ea357614ea3614f88565b500190565b600082614eb757614eb7614f9e565b500490565b6000816000190483118215151615614ed657614ed6614f88565b500290565b600082821015614eed57614eed614f88565b500390565b60005b83811015614f0d578181015183820152602001614ef5565b8381111561095a5750506000910152565b600181811c90821680614f3257607f821691505b60208210811415614f5357634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614f6d57614f6d614f88565b5060010190565b600082614f8357614f83614f9e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612a1557600080fd5b8015158114612a1557600080fdfea2646970667358221220fdd9ce0808b0515981293436a69cc47bc2a981bd3970dfda29e0ce79d0397c0864736f6c63430008040033
Deployed Bytecode Sourcemap
66804:20982:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70436:136;;;:::i;:::-;;42087:269;;;;;;:::i;:::-;;:::i;:::-;;;25913:14:1;;25906:22;25888:41;;25876:2;25861:18;42087:269:0;;;;;;;;70059:369;;;;;;:::i;:::-;;:::i;67495:27::-;;;;;;;;;23382:100;;;:::i;:::-;;;;;;;:::i;25549:169::-;;;;;;:::i;:::-;;:::i;69277:774::-;;;;;;:::i;:::-;;:::i;77003:170::-;;;:::i;:::-;;;39956:25:1;;;39944:2;39929:18;77003:170:0;39911:76:1;37221:216:0;;;;;;:::i;:::-;37399:30;37221:216;;;;;;;;;;-1:-1:-1;;;;;;26102:79:1;;;26084:98;;26072:2;26057:18;37221:216:0;26039:149:1;24502:108:0;24590:12;;24502:108;;67211:36;;;;;-1:-1:-1;;;;;67211:36:0;;;;;;-1:-1:-1;;;;;20149:55:1;;;20131:74;;20119:2;20104:18;67211:36:0;20086:125:1;26200:422:0;;;;;;:::i;:::-;;:::i;78778:306::-;;;:::i;:::-;;;;;;;:::i;24344:93::-;;;24427:2;41764:36:1;;41752:2;41737:18;24344:93:0;41719:87:1;67135:31:0;;;;;;77782:188;;;:::i;27031:215::-;;;;;;:::i;:::-;;:::i;72624:235::-;;;;;;:::i;:::-;;:::i;67570:31::-;;;;;;;;;;;;78604:141;;;;;;:::i;:::-;;:::i;67173:31::-;;;;;-1:-1:-1;;;;;67173:31:0;;;67799:37;;;;;;;;;79267:91;79335:15;;;;;;;;;;;;;;;;;79267:91;;70829:835;;;;;;:::i;:::-;;:::i;76698:297::-;;;;;;:::i;:::-;;:::i;33256:164::-;;;;;;:::i;:::-;;:::i;67529:34::-;;;;;;;;;;;;24673:127;;;;;;:::i;:::-;-1:-1:-1;;;;;24774:18:0;24747:7;24774:18;;;:9;:18;;;;;;;24673:127;53638:148;;;:::i;77978:161::-;;;:::i;:::-;;;;40873:25:1;;;40929:2;40914:18;;40907:34;;;;40957:18;;;40950:34;;;;41015:2;41000:18;;40993:34;41058:3;41043:19;;41036:35;40860:3;40845:19;77978:161:0;40827:250:1;67654:39:0;;;;;;;;;;;;75206:1484;;;;;;:::i;:::-;;:::i;52987:87::-;53060:6;;-1:-1:-1;;;;;53060:6:0;52987:87;;67307:51;;;;;-1:-1:-1;;;;;67307:51:0;;;23601:104;;;:::i;73718:1170::-;;;;;;:::i;:::-;;:::i;27749:377::-;;;;;;:::i;:::-;;:::i;25013:175::-;;;;;;:::i;:::-;;:::i;72867:610::-;;;;;;:::i;:::-;;:::i;42784:212::-;;;;;;:::i;:::-;42952:36;42784:212;;;;;;;;68880:92;;;:::i;73485:225::-;;;;;;:::i;:::-;;:::i;67843:37::-;;;;;;;;;;;;87404:379;;;;;;:::i;:::-;;:::i;72454:162::-;;;;;;:::i;:::-;;:::i;77585:189::-;;;:::i;74900:298::-;;;;;;:::i;:::-;;:::i;67254:46::-;;;;;-1:-1:-1;;;;;67254:46:0;;;33819:297;;;;;;:::i;:::-;;:::i;25251:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;25367:18:0;;;25340:7;25367:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;25251:151;69005:264;;;;;;:::i;:::-;;:::i;87247:149::-;;;;;;:::i;:::-;;:::i;68071:801::-;;;;;;:::i;:::-;;:::i;79117:117::-;;;:::i;78147:449::-;;;;;;:::i;:::-;;:::i;42592:184::-;;;;;;:::i;:::-;42737:31;42592:184;;;;;;;;53941:244;;;;;;:::i;:::-;;:::i;77181:194::-;;;:::i;67608:39::-;;;;;;;;;;;;77383:194;;;:::i;70436:136::-;70499:16;:14;:16::i;:::-;70526:12;;70556:7;;70526:38;;;;;-1:-1:-1;;;;;70526:12:0;;;;:29;;:38;;;;39956:25:1;;;39944:2;39929:18;;39911:76;70526:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70436:136::o;42087:269::-;42211:4;-1:-1:-1;;;;;;42235:60:0;;42250:45;42235:60;;:113;;-1:-1:-1;41725:36:0;-1:-1:-1;;;;;;41710:51:0;;;42312:36;42228:120;42087:269;-1:-1:-1;;42087:269:0:o;70059:369::-;70281:16;:14;:16::i;:::-;70308:12;;70334:7;;70308:112;;;;;;;;41369:25:1;;;;41410:18;;;41403:34;;;41453:18;;;41446:34;;;41496:18;;;41489:34;;;41539:19;;;41532:35;;;41583:19;;;41576:35;;;-1:-1:-1;;;;;70308:12:0;;;;:25;;41341:19:1;;70308:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70059:369;;;;;:::o;23382:100::-;23436:13;23469:5;23462:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23382:100;:::o;25549:169::-;25632:4;25649:39;20595:10;25672:7;25681:6;25649:8;:39::i;:::-;-1:-1:-1;25706:4:0;25549:169;;;;:::o;69277:774::-;69508:16;:14;:16::i;:::-;69535:10;:24;;-1:-1:-1;;69570:40:0;69535:24;;;;;;;-1:-1:-1;;69570:40:0;;;;;;;;;;;-1:-1:-1;;69621:40:0;;;;;;;;;;69672:16;:36;;-1:-1:-1;;69719:36:0;69672;;;-1:-1:-1;;69719:36:0;;69535:24;69719:36;;;;;;;69773:30;;25888:41:1;;;69773:30:0;;25876:2:1;25861:18;69773:30:0;;;;;;;69819:46;;25913:14:1;;25906:22;25888:41;;69819:46:0;;25876:2:1;25861:18;69819:46:0;;;;;;;69881;;25913:14:1;;25906:22;25888:41;;69881:46:0;;25876:2:1;25861:18;69881:46:0;;;;;;;69943:42;;25913:14:1;;25906:22;25888:41;;69943:42:0;;25876:2:1;25861:18;69943:42:0;;;;;;;70001;;25913:14:1;;25906:22;25888:41;;70001:42:0;;25876:2:1;25861:18;70001:42:0;;;;;;;69277:774;;;;;:::o;77003:170::-;77108:12;;77131:7;;77108:31;;-1:-1:-1;;;77108:31:0;;77060:7;;;;-1:-1:-1;;;;;77108:12:0;;;;:22;;:31;;;;39956:25:1;;;39944:2;39929:18;;39911:76;77108:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77080:59:0;;77003:170;-1:-1:-1;;;;;77003:170:0:o;26200:422::-;26306:4;26323:36;26333:6;26341:9;26352:6;26323:9;:36::i;:::-;-1:-1:-1;;;;;26399:19:0;;26372:24;26399:19;;;:11;:19;;;;;;;;20595:10;26399:33;;;;;;;;26451:26;;;;26443:79;;;;-1:-1:-1;;;26443:79:0;;34303:2:1;26443:79:0;;;34285:21:1;34342:2;34322:18;;;34315:30;34381:34;34361:18;;;34354:62;34452:10;34432:18;;;34425:38;34480:19;;26443:79:0;;;;;;;;;26533:57;26542:6;20595:10;26564:25;26583:6;26564:16;:25;:::i;:::-;26533:8;:57::i;:::-;-1:-1:-1;26610:4:0;;26200:422;-1:-1:-1;;;;26200:422:0:o;78778:306::-;78841:16;78870:11;78884:17;:8;:15;:17::i;:::-;78870:31;;78912:24;78953:3;78939:18;;;;;;-1:-1:-1;;;78939:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78939:18:0;;78912:45;;78973:9;78968:84;78988:3;78984:1;:7;78968:84;;;79026:14;:8;79038:1;79026:11;:14::i;:::-;79013:7;79021:1;79013:10;;;;;;-1:-1:-1;;;79013:10:0;;;;;;;;;;;;;;;;;;:27;78993:3;;;:::i;:::-;;;78968:84;;;-1:-1:-1;79069:7:0;78778:306;-1:-1:-1;;78778:306:0:o;77782:188::-;77899:12;;77922:7;;77899:31;;-1:-1:-1;;;77899:31:0;;77845:7;;;;-1:-1:-1;;;;;77899:12:0;;;;:22;;:31;;;;39956:25:1;;;39944:2;39929:18;;39911:76;77899:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77865:65;77782:188;-1:-1:-1;;;;;;77782:188:0:o;27031:215::-;20595:10;27119:4;27168:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;27168:34:0;;;;;;;;;;27119:4;;27136:80;;27159:7;;27168:47;;27205:10;;27168:47;:::i;72624:235::-;72787:7;72814:37;72821:8;;72814:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72814:37:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72831:7:0;;-1:-1:-1;72831:7:0;;;;72814:37;;;72831:7;;72814:37;72831:7;72814:37;;;;;;;;;-1:-1:-1;72840:10:0;;-1:-1:-1;72814:6:0;;-1:-1:-1;;72814:37:0:i;:::-;72807:44;72624:235;-1:-1:-1;;;;;72624:235:0:o;78604:141::-;78684:7;78711:26;:8;78723:13;78711:11;:26::i;70829:835::-;70969:7;70989:16;:14;:16::i;:::-;71046:18;;-1:-1:-1;;;;;71046:18:0;71038:41;71016:125;;;;-1:-1:-1;;;71016:125:0;;33129:2:1;71016:125:0;;;33111:21:1;33168:2;33148:18;;;33141:30;33207:34;33187:18;;;33180:62;33278:4;33258:18;;;33251:32;33300:19;;71016:125:0;33101:224:1;71016:125:0;71228:12;;:33;;;;;;;;71152:35;;-1:-1:-1;;;;;71228:12:0;;:31;;:33;;;;;;;;;;;;;;:12;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71152:120;;71283:20;71306:11;-1:-1:-1;;;;;71306:29:0;;71350:11;71376:8;;71306:89;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71406:18;:51;;-1:-1:-1;;;;;;71406:51:0;-1:-1:-1;;;;;71406:51:0;;;;;;;;71543:13;:21;;-1:-1:-1;;71543:21:0;;;71580:46;;;40166:25:1;;;40222:2;40207:18;;40200:83;;;;71406:51:0;;-1:-1:-1;71580:46:0;;40139:18:1;71580:46:0;;;;;;;71644:12;70829:835;-1:-1:-1;;;;;70829:835:0:o;76698:297::-;76886:4;76903:20;76921:1;76903:17;:20::i;:::-;76941:46;76957:8;76967:5;76974:6;76982:4;76941:15;:46::i;33256:164::-;33323:7;-1:-1:-1;;;;;33350:22:0;;33367:4;33350:22;:62;;33411:1;33350:62;;;24590:12;;33375:33;;-1:-1:-1;;33375:33:0;:::i;53638:148::-;53060:6;;-1:-1:-1;;;;;53060:6:0;20595:10;53207:23;53199:68;;;;-1:-1:-1;;;53199:68:0;;34712:2:1;53199:68:0;;;34694:21:1;;;34731:18;;;34724:30;34790:34;34770:18;;;34763:62;34842:18;;53199:68:0;34684:182:1;53199:68:0;53729:6:::1;::::0;53708:40:::1;::::0;53745:1:::1;::::0;-1:-1:-1;;;;;53729:6:0::1;::::0;53708:40:::1;::::0;53745:1;;53708:40:::1;53759:6;:19:::0;;-1:-1:-1;;;;;;53759:19:0::1;::::0;;53638:148::o;77978:161::-;78100:12;;78123:7;;78100:31;;-1:-1:-1;;;78100:31:0;;;;;39956:25:1;;;;78037:7:0;;;;;;;;;;-1:-1:-1;;;;;78100:12:0;;:22;;39929:18:1;;78100:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78093:38;;;;;;;;;;77978:161;;;;;:::o;75206:1484::-;75438:16;56002:1;56765:7;;:19;;56757:63;;;;-1:-1:-1;;;56757:63:0;;37719:2:1;56757:63:0;;;37701:21:1;37758:2;37738:18;;;37731:30;37797:33;37777:18;;;37770:61;37848:18;;56757:63:0;37691:181:1;56757:63:0;56002:1;56898:7;:18;75467:20:::1;75485:1;75467:17;:20::i;:::-;75526:6;::::0;75498:13:::1;::::0;75526:6:::1;;75522:302;;;75554:9;75549:208;75569:8;:15;75565:1;:19;75549:208;;;75610:14;75627:7;75635:1;75627:10;;;;;;-1:-1:-1::0;;;75627:10:0::1;;;;;;;;;;;;;;;75610:27;;75664:6;75674:1;75664:11;;75656:51;;;::::0;-1:-1:-1;;;75656:51:0;;32008:2:1;75656:51:0::1;::::0;::::1;31990:21:1::0;32047:2;32027:18;;;32020:30;32086:29;32066:18;;;32059:57;32133:18;;75656:51:0::1;31980:177:1::0;75656:51:0::1;75726:15;75735:6:::0;75726:15;::::1;:::i;:::-;;;75549:208;75586:3;;;;:::i;:::-;;;75549:208;;;;75522:302;;;-1:-1:-1::0;75797:15:0;;75522:302:::1;75867:11;:18;75858:5;:27;:47;;;-1:-1:-1::0;75889:16:0::1;::::0;::::1;;75858:47;75836:128;;;::::0;-1:-1:-1;;;75836:128:0;;32769:2:1;75836:128:0::1;::::0;::::1;32751:21:1::0;32808:2;32788:18;;;32781:30;32847:33;32827:18;;;32820:61;32898:18;;75836:128:0::1;32741:181:1::0;75836:128:0::1;75997:18:::0;;:23;;:43:::1;;-1:-1:-1::0;76024:16:0::1;::::0;::::1;::::0;::::1;;;75997:43;75975:124;;;::::0;-1:-1:-1;;;75975:124:0;;30948:2:1;75975:124:0::1;::::0;::::1;30930:21:1::0;30987:2;30967:18;;;30960:30;31026:33;31006:18;;;30999:61;31077:18;;75975:124:0::1;30920:181:1::0;75975:124:0::1;76118:22;76142::::0;76168:11:::1;:9;:11::i;:::-;76112:67;;;;;;;76190:16;76290:11;:18;76282:5;:26;;;;:::i;:::-;76264:45;::::0;:14;:45:::1;:::i;:::-;76227:18:::0;;76210:35:::1;::::0;:14;:35:::1;:::i;:::-;76209:111;;;;:::i;:::-;76190:130;;76331:46;76356:10;76368:8;76331:24;:46::i;:::-;76491:20;76514:38;76529:5;76536:11;76549:2;76514:14;:38::i;:::-;76491:61;;76565:30;76577:8;76587:7;76565:11;:30::i;:::-;;76613:48;76621:8;76631:7;76640:11;76653:3;76658:2;76613:48;;;;;;;;;;:::i;:::-;;;;;;;;55958:1:::0;57077:7;:22;76679:3;75206:1484;-1:-1:-1;;;;;;;;;75206:1484:0:o;23601:104::-;23657:13;23690:7;23683:14;;;;;:::i;73718:1170::-;73885:16;56002:1;56765:7;;:19;;56757:63;;;;-1:-1:-1;;;56757:63:0;;37719:2:1;56757:63:0;;;37701:21:1;37758:2;37738:18;;;37731:30;37797:33;37777:18;;;37770:61;37848:18;;56757:63:0;37691:181:1;56757:63:0;56002:1;56898:7;:18;;;73919:20:::1;::::0;:17:::1;:20::i;:::-;73982:11;:18;73972:6;:28;:50;;;-1:-1:-1::0;74004:18:0::1;::::0;;;::::1;;;73972:50;73950:136;;;::::0;-1:-1:-1;;;73950:136:0;;35823:2:1;73950:136:0::1;::::0;::::1;35805:21:1::0;35862:2;35842:18;;;35835:30;35901:34;35881:18;;;35874:62;-1:-1:-1;;;35952:18:1;;;35945:34;35996:19;;73950:136:0::1;35795:226:1::0;73950:136:0::1;74119:18:::0;;:23;;:45:::1;;-1:-1:-1::0;74146:18:0::1;::::0;;;::::1;;;74119:45;74097:131;;;::::0;-1:-1:-1;;;74097:131:0;;39607:2:1;74097:131:0::1;::::0;::::1;39589:21:1::0;39646:2;39626:18;;;39619:30;39685:34;39665:18;;;39658:62;-1:-1:-1;;;39736:18:1;;;39729:34;39780:19;;74097:131:0::1;39579:226:1::0;74097:131:0::1;74327:32;74333:10;74345:13;74352:6:::0;67120::::1;74345:13;:::i;:::-;74327:5;:32::i;:::-;74410:24;74436::::0;74467:11:::1;:9;:11::i;:::-;74407:71;;;;;;;74489:16;74594:11;:18;74585:6;:27;;;;:::i;:::-;74565:48;::::0;:16;:48:::1;:::i;:::-;74528:18:::0;;74509:37:::1;::::0;:16;:37:::1;:::i;:::-;74508:116;;;;:::i;:::-;74489:135;;74635:46;74660:10;74672:8;74635:24;:46::i;:::-;74727:28;74758:39;74773:6;74781:11;74794:2;74758:14;:39::i;:::-;74727:70;;74813:38;74822:11;74835;74848:2;74813:38;;;;;;;;:::i;:::-;;;;;;;;55958:1:::0;57077:7;:22;74869:11;73718:1170;-1:-1:-1;;;;;;;73718:1170:0:o;27749:377::-;20595:10;27842:4;27886:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;27886:34:0;;;;;;;;;;27939:35;;;;27931:85;;;;-1:-1:-1;;;27931:85:0;;38841:2:1;27931:85:0;;;38823:21:1;38880:2;38860:18;;;38853:30;38919:34;38899:18;;;38892:62;38990:7;38970:18;;;38963:35;39015:19;;27931:85:0;38813:227:1;27931:85:0;28027:67;20595:10;28050:7;28059:34;28078:15;28059:16;:34;:::i;28027:67::-;-1:-1:-1;28114:4:0;;27749:377;-1:-1:-1;;;27749:377:0:o;25013:175::-;25099:4;25116:42;20595:10;25140:9;25151:6;25116:9;:42::i;72867:610::-;73060:7;56002:1;56765:7;;:19;;56757:63;;;;-1:-1:-1;;;56757:63:0;;37719:2:1;56757:63:0;;;37701:21:1;37758:2;37738:18;;;37731:30;37797:33;37777:18;;;37770:61;37848:18;;56757:63:0;37691:181:1;56757:63:0;56002:1;56898:7;:18;73080:20:::1;73098:1;73080:17;:20::i;:::-;73119:10;::::0;;;::::1;;;73111:42;;;::::0;-1:-1:-1;;;73111:42:0;;35073:2:1;73111:42:0::1;::::0;::::1;35055:21:1::0;35112:2;35092:18;;;35085:30;35151:21;35131:18;;;35124:49;35190:18;;73111:42:0::1;35045:169:1::0;73111:42:0::1;73191:13;73207:30;73219:8;73229:7;73207:11;:30::i;:::-;73191:46:::0;-1:-1:-1;73280:23:0::1;73286:2:::0;73290:12:::1;73191:46:::0;67120:6:::1;73290:12;:::i;:::-;73280:5;:23::i;:::-;73314:16;73345:5;73333:9;:7;:9::i;:::-;:17;;;;:::i;:::-;73314:36;;73361:38;73386:2;73390:8;73361:24;:38::i;:::-;73417:29;73424:8;73434:7;73443:2;73417:29;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;55958:1:0;57077:7;:22;73464:5;72867:610;-1:-1:-1;;;;72867:610:0:o;68880:92::-;68942:22;68961:1;68942:10;:22::i;:::-;68880:92::o;73485:225::-;73620:16;73661:41;73670:6;73678:11;;73661:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73691:10:0;;-1:-1:-1;73661:8:0;;-1:-1:-1;;73661:41:0:i;:::-;73654:48;73485:225;-1:-1:-1;;;;73485:225:0:o;87404:379::-;53060:6;;-1:-1:-1;;;;;53060:6:0;20595:10;53207:23;53199:68;;;;-1:-1:-1;;;53199:68:0;;34712:2:1;53199:68:0;;;34694:21:1;;;34731:18;;;34724:30;34790:34;34770:18;;;34763:62;34842:18;;53199:68:0;34684:182:1;53199:68:0;87469:16:::1;67120:6;87488:13;24590:12:::0;;;24502:108;87488:13:::1;:20;;;;:::i;:::-;87469:39;;87538:1;87527:8;:12;87519:39;;;::::0;-1:-1:-1;;;87519:39:0;;37376:2:1;87519:39:0::1;::::0;::::1;37358:21:1::0;37415:2;37395:18;;;37388:30;37454:16;37434:18;;;37427:44;37488:18;;87519:39:0::1;37348:164:1::0;87519:39:0::1;87600:16;::::0;;87569:28:::1;87600:16:::0;;::::1;::::0;::::1;::::0;;;87627:48:::1;87642:8:::0;87600:16;87665:9;87627:14:::1;:48::i;:::-;-1:-1:-1::0;87705:12:0::1;::::0;87691:48:::1;::::0;;-1:-1:-1;;;;;87705:12:0;;::::1;23751:34:1::0;;23816:2;23801:18;;23794:34;;;23864:15;;;23844:18;;;23837:43;87691:48:0;::::1;::::0;;;;23678:2:1;87691:48:0;;::::1;-1:-1:-1::0;;87750:12:0::1;:25:::0;;-1:-1:-1;;;;;;87750:25:0::1;::::0;;-1:-1:-1;87404:379:0:o;72454:162::-;72527:16;:14;:16::i;:::-;72554:7;:18;;-1:-1:-1;;;;;;72554:18:0;-1:-1:-1;;;;;72554:18:0;;;;;;;;72588:20;;20131:74:1;;;72588:20:0;;20119:2:1;20104:18;72588:20:0;;;;;;;72454:162;:::o;77585:189::-;77703:12;;77726:7;;77703:31;;-1:-1:-1;;;77703:31:0;;77648:7;;;;-1:-1:-1;;;;;77703:12:0;;;;:22;;:31;;;;39956:25:1;;;39944:2;39929:18;;39911:76;77703:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77668:66:0;77585:189;-1:-1:-1;;;;;77585:189:0:o;74900:298::-;75104:16;75140:50;75147:8;;75140:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75140:50:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75157:7:0;;-1:-1:-1;75157:7:0;;;;75140:50;;;75157:7;;75140:50;75157:7;75140:50;;;;;;;;;-1:-1:-1;;75140:50:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75166:11:0;;-1:-1:-1;75166:11:0;;;;75140:50;;;75166:11;;75140:50;75166:11;75140:50;;;;;;;;;-1:-1:-1;75179:10:0;;-1:-1:-1;75140:6:0;;-1:-1:-1;;75140:50:0:i;:::-;75133:57;74900:298;-1:-1:-1;;;;;;;74900:298:0:o;33819:297::-;33906:7;-1:-1:-1;;;;;33934:22:0;;33951:4;33934:22;33926:62;;;;-1:-1:-1;;;33926:62:0;;33947:2:1;33926:62:0;;;33929:21:1;33986:2;33966:18;;;33959:30;34025:29;34005:18;;;33998:57;34072:18;;33926:62:0;33919:177:1;33926:62:0;-1:-1:-1;34107:1:0;33819:297;;;;:::o;69005:264::-;69142:16;:14;:16::i;:::-;69174:48;69189:6;:4;:6::i;:::-;69197:8;:6;:8::i;:::-;69207:5;;69214:7;;69174:48;;;;;;;;;;;:::i;:::-;;;;;;;;69233:28;69246:5;;69233:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69233:28:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69253:7:0;;-1:-1:-1;69253:7:0;;;;69233:28;;69253:7;;;;69233:28;;;;;;;;;-1:-1:-1;69233:12:0;;-1:-1:-1;;;69233:28:0:i;87247:149::-;53060:6;;-1:-1:-1;;;;;53060:6:0;20595:10;53207:23;53199:68;;;;-1:-1:-1;;;53199:68:0;;34712:2:1;53199:68:0;;;34694:21:1;;;34731:18;;;34724:30;34790:34;34770:18;;;34763:62;34842:18;;53199:68:0;34684:182:1;53199:68:0;87341:19:::1;87347:4;87353:6;87341:5;:19::i;:::-;87371:17;87377:2;87381:6;87371:5;:17::i;:::-;87247:149:::0;;;:::o;68071:801::-;19336:13;;;;;;;;:30;;-1:-1:-1;19354:12:0;;;;19353:13;19336:30;19328:89;;;;-1:-1:-1;;;19328:89:0;;33532:2:1;19328:89:0;;;33514:21:1;33571:2;33551:18;;;33544:30;33610:34;33590:18;;;33583:62;-1:-1:-1;;;33661:18:1;;;33654:44;33715:19;;19328:89:0;33504:236:1;19328:89:0;19430:19;19453:13;;;;;;19452:14;19477:101;;;;19512:13;:20;;-1:-1:-1;;19547:19:0;;;;;19477:101;68298:16:::1;:14;:16::i;:::-;68325:28;68338:5;68345:7;68325:12;:28::i;:::-;-1:-1:-1::0;;;;;68372:27:0;::::1;68364:59;;;::::0;-1:-1:-1;;;68364:59:0;;31660:2:1;68364:59:0::1;::::0;::::1;31642:21:1::0;31699:2;31679:18;;;31672:30;31738:21;31718:18;;;31711:49;31777:18;;68364:59:0::1;31632:169:1::0;68364:59:0::1;68434:12;:28:::0;;-1:-1:-1;;;;;;68434:28:0;;::::1;-1:-1:-1::0;;;;;68434:28:0;::::1;;::::0;;;68473:12:::1;:44:::0;;68506:10:::1;68473:44:::0;::::1;::::0;::::1;::::0;;68538:24:::1;::::0;;;;;;;:22:::1;::::0;:24:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;68506:10;68538:24;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68528:7;:34:::0;;;68573:6:::1;:16:::0;;68600:30;::::1;;68573:16;68600:30:::0;::::1;-1:-1:-1::0;;68573:16:0;::::1;;68600:30:::0;;;-1:-1:-1;;68600:30:0;;;;;;;::::1;::::0;;;68646:58:::1;::::0;;-1:-1:-1;;;;;23001:55:1;;22983:74;;23088:2;23073:18;;23066:50;;;;23132:18;;23125:50;;;;68646:58:0::1;::::0;22971:2:1;22956:18;68646:58:0::1;;;;;;;68715:149;68732:4;68753::::0;68782::::1;68811::::0;68838::::1;68715:16;:149::i;:::-;19608:14:::0;19604:68;;;19655:5;19639:21;;-1:-1:-1;;19639:21:0;;;19604:68;68071:801;;;;;;:::o;79117:117::-;79182:7;79209:17;:8;:15;:17::i;:::-;79202:24;;79117:117;:::o;78147:449::-;78305:13;;78279:4;;78305:13;;;;;78301:57;;;-1:-1:-1;78342:4:0;;78147:449;-1:-1:-1;78147:449:0:o;78301:57::-;78409:18;;-1:-1:-1;;;;;78409:18:0;78442:42;78438:87;;-1:-1:-1;78508:5:0;;78147:449;-1:-1:-1;;78147:449:0:o;78438:87::-;78542:46;;;;;-1:-1:-1;;;;;78542:36:0;;;;;:46;;78579:8;;78542:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78535:53;78147:449;-1:-1:-1;;;78147:449:0:o;53941:244::-;53060:6;;-1:-1:-1;;;;;53060:6:0;20595:10;53207:23;53199:68;;;;-1:-1:-1;;;53199:68:0;;34712:2:1;53199:68:0;;;34694:21:1;;;34731:18;;;34724:30;34790:34;34770:18;;;34763:62;34842:18;;53199:68:0;34684:182:1;53199:68:0;-1:-1:-1;;;;;54030:22:0;::::1;54022:73;;;::::0;-1:-1:-1;;;54022:73:0;;29731:2:1;54022:73:0::1;::::0;::::1;29713:21:1::0;29770:2;29750:18;;;29743:30;29809:34;29789:18;;;29782:62;29880:8;29860:18;;;29853:36;29906:19;;54022:73:0::1;29703:228:1::0;54022:73:0::1;54132:6;::::0;54111:38:::1;::::0;-1:-1:-1;;;;;54111:38:0;;::::1;::::0;54132:6:::1;::::0;54111:38:::1;::::0;54132:6:::1;::::0;54111:38:::1;54160:6;:17:::0;;-1:-1:-1;;;;;;54160:17:0::1;-1:-1:-1::0;;;;;54160:17:0;;;::::1;::::0;;;::::1;::::0;;53941:244::o;77181:194::-;77302:12;;77325:7;;77302:31;;-1:-1:-1;;;77302:31:0;;77246:7;;;;-1:-1:-1;;;;;77302:12:0;;;;:22;;:31;;;;39956:25:1;;;39944:2;39929:18;;39911:76;77302:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77266:67:0;;77181:194;-1:-1:-1;;;;;77181:194:0:o;77383:::-;77504:12;;77527:7;;77504:31;;-1:-1:-1;;;77504:31:0;;77448:7;;;;-1:-1:-1;;;;;77504:12:0;;;;:22;;:31;;;;39956:25:1;;;39944:2;39929:18;;39911:76;77504:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77468:67:0;;77383:194;-1:-1:-1;;;;;77383:194:0:o;86848:233::-;86903:7;;-1:-1:-1;;;;;86903:7:0;86899:175;;53060:6;;-1:-1:-1;;;;;53060:6:0;86949:10;:21;86941:43;;;;-1:-1:-1;;;86941:43:0;;36634:2:1;86941:43:0;;;36616:21:1;36673:1;36653:18;;;36646:29;36711:11;36691:18;;;36684:39;36740:18;;86941:43:0;36606:158:1;86899:175:0;87039:7;;-1:-1:-1;;;;;87039:7:0;87025:10;:21;87017:45;;;;-1:-1:-1;;;87017:45:0;;28299:2:1;87017:45:0;;;28281:21:1;28338:2;28318:18;;;28311:30;28377:13;28357:18;;;28350:41;28408:18;;87017:45:0;28271:161:1;31110:346:0;-1:-1:-1;;;;;31212:19:0;;31204:68;;;;-1:-1:-1;;;31204:68:0;;36971:2:1;31204:68:0;;;36953:21:1;37010:2;36990:18;;;36983:30;37049:34;37029:18;;;37022:62;37120:6;37100:18;;;37093:34;37144:19;;31204:68:0;36943:226:1;31204:68:0;-1:-1:-1;;;;;31291:21:0;;31283:68;;;;-1:-1:-1;;;31283:68:0;;30138:2:1;31283:68:0;;;30120:21:1;30177:2;30157:18;;;30150:30;30216:34;30196:18;;;30189:62;30287:4;30267:18;;;30260:32;30309:19;;31283:68:0;30110:224:1;31283:68:0;-1:-1:-1;;;;;31364:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;31416:32;;39956:25:1;;;31416:32:0;;39929:18:1;31416:32:0;;;;;;;;31110:346;;;:::o;28616:604::-;-1:-1:-1;;;;;28722:20:0;;28714:70;;;;-1:-1:-1;;;28714:70:0;;36228:2:1;28714:70:0;;;36210:21:1;36267:2;36247:18;;;36240:30;36306:34;36286:18;;;36279:62;36377:7;36357:18;;;36350:35;36402:19;;28714:70:0;36200:227:1;28714:70:0;-1:-1:-1;;;;;28803:23:0;;28795:71;;;;-1:-1:-1;;;28795:71:0;;27895:2:1;28795:71:0;;;27877:21:1;27934:2;27914:18;;;27907:30;27973:34;27953:18;;;27946:62;28044:5;28024:18;;;28017:33;28067:19;;28795:71:0;27867:225:1;28795:71:0;-1:-1:-1;;;;;28963:17:0;;28939:21;28963:17;;;:9;:17;;;;;;28999:23;;;;28991:74;;;;-1:-1:-1;;;28991:74:0;;30541:2:1;28991:74:0;;;30523:21:1;30580:2;30560:18;;;30553:30;30619:34;30599:18;;;30592:62;30690:8;30670:18;;;30663:36;30716:19;;28991:74:0;30513:228:1;28991:74:0;29096:22;29112:6;29096:13;:22;:::i;:::-;-1:-1:-1;;;;;29076:17:0;;;;;;;:9;:17;;;;;;:42;;;;29129:20;;;;;;;;:30;;29153:6;;29076:17;29129:30;;29153:6;;29129:30;:::i;:::-;;;;;;;;29194:9;-1:-1:-1;;;;;29177:35:0;29186:6;-1:-1:-1;;;;;29177:35:0;;29205:6;29177:35;;;;39956:25:1;;39944:2;39929:18;;39911:76;29177:35:0;;;;;;;;28616:604;;;;:::o;66048:114::-;66108:7;66135:19;66143:3;61258:18;;61175:109;66506:137;66577:7;66612:22;66616:3;66628:5;66612:3;:22::i;87089:150::-;87166:12;;:29;;;;;;;;39956:25:1;;;-1:-1:-1;;;;;87166:12:0;;;;:21;;39929:18:1;;87166:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;87165:30;:55;;;-1:-1:-1;53060:6:0;;-1:-1:-1;;;;;53060:6:0;87199:10;:21;87165:55;87157:74;;;;-1:-1:-1;;;87157:74:0;;28639:2:1;87157:74:0;;;28621:21:1;28678:1;28658:18;;;28651:29;28716:8;28696:18;;;28689:36;28742:18;;87157:74:0;28611:155:1;87157:74:0;87089:150;:::o;34906:782::-;35103:4;35125:11;35139:23;35148:5;35155:6;35139:8;:23::i;:::-;35125:37;;35173:32;35187:8;35198:6;35173:5;:32::i;:::-;35224:58;;;;;32994:45;;-1:-1:-1;;;;;35224:20:0;;;;;:58;;35245:10;;35257:5;;35264:6;;35272:3;;35277:4;;35224:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:74;35216:123;;;;-1:-1:-1;;;35216:123:0;;32364:2:1;35216:123:0;;;32346:21:1;32403:2;32383:18;;;32376:30;32442:34;32422:18;;;32415:62;32513:6;32493:18;;;32486:34;32537:19;;35216:123:0;32336:226:1;35216:123:0;-1:-1:-1;;;;;25367:18:0;;35350:24;25367:18;;;:11;:18;;;;;;;;35414:4;25367:27;;;;;;;;35459:12;35468:3;35459:6;:12;:::i;:::-;35439:16;:32;;35431:92;;;;-1:-1:-1;;;35431:92:0;;38079:2:1;35431:92:0;;;38061:21:1;38118:2;38098:18;;;38091:30;38157:34;38137:18;;;38130:62;38228:17;38208:18;;;38201:45;38263:19;;35431:92:0;38051:237:1;35431:92:0;35534:75;35551:8;35570:4;35605:3;35577:25;35596:6;35577:16;:25;:::i;:::-;:31;;;;:::i;35534:75::-;35620:38;35634:8;35645:12;35654:3;35645:6;:12;:::i;35620:38::-;-1:-1:-1;35676:4:0;;34906:782;-1:-1:-1;;;;;;34906:782:0:o;82928:730::-;83185:12;;83214:42;;;;;83245:10;83214:42;;;20131:74:1;-1:-1:-1;;;;;83185:12:0;;;;;;83214:30;;20104:18:1;;83214:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;83210:81;;;83273:7;82928:730;;:::o;83210:81::-;83381:10;;83377:274;;83408:22;83433:13;-1:-1:-1;;;;;83433:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;83408:55;;83530:39;83540:4;83546:14;83562:6;83530:9;:39::i;:::-;83631:7;;83584:55;;;;;;;;39956:25:1;;;;-1:-1:-1;;;;;83584:46:0;;;;;39929:18:1;;83584:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83377:274;82928:730;;;:::o;81632:1288::-;81818:6;;81859:12;;81774:16;;81818:6;;;-1:-1:-1;;;;;81859:12:0;81803;81927:6;81913:21;;;;;;-1:-1:-1;;;81913:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;81913:21:0;-1:-1:-1;81970:18:0;;81882:52;;-1:-1:-1;81945:22:0;81999:846;82019:6;82015:1;:10;81999:846;;;82129:15;82151:14;82147:1;:18;:83;;82203:27;:25;:27::i;:::-;82147:83;;;82186:11;82198:1;82186:14;;;;;;-1:-1:-1;;;82186:14:0;;;;;;;;;;;;;;;82147:83;82129:101;;82262:7;82245:11;82257:1;82245:14;;;;;;-1:-1:-1;;;82245:14:0;;;;;;;;;;;;;;:24;;;;;82290:7;82286:548;;;82318:21;;;;:12;:21;;;;;:26;;82343:1;;82318:21;:26;;82343:1;;82318:26;:::i;:::-;;;;-1:-1:-1;;82367:21:0;;;;:12;:21;;;;;;82363:99;;82418:24;:8;82434:7;82418:15;:24::i;:::-;;82363:99;82482:210;;;;;82564:4;82482:210;;;21903:34:1;-1:-1:-1;;;;;21973:15:1;;;21953:18;;;21946:43;22005:18;;;21998:34;;;82647:1:0;22048:18:1;;;22041:34;22112:3;22091:19;;;22084:32;-1:-1:-1;22132:19:1;;;22125:33;82482:51:0;;;;;22175:19:1;;82482:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82286:548;;;82733:24;:8;82749:7;82733:15;:24::i;:::-;;82776:42;82791:13;82806:2;82810:7;82776:14;:42::i;:::-;-1:-1:-1;82027:3:0;;;:::i;:::-;;;81999:846;;;;82855:28;82871:11;82855:15;:28::i;:::-;-1:-1:-1;82901:11:0;81632:1288;-1:-1:-1;;;;;;81632:1288:0:o;79783:1841::-;79910:7;79943:22;79956:8;79943:12;:22::i;:::-;79935:58;;;;-1:-1:-1;;;79935:58:0;;31308:2:1;79935:58:0;;;31290:21:1;31347:2;31327:18;;;31320:30;31386:25;31366:18;;;31359:53;31429:18;;79935:58:0;31280:173:1;79935:58:0;80021:15;;80051:6;;;;80047:1570;;;80172:12;;80152:205;;;;;-1:-1:-1;;;;;80172:12:0;;;;80152:55;;:205;;80226:10;;80263:4;;80287:8;;80314:7;;80152:205;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80374:13;80407:9;80402:411;80422:6;80418:1;:10;80402:411;;;80454:15;80472:8;80481:1;80472:11;;;;;;-1:-1:-1;;;80472:11:0;;;;;;;;;;;;;;;80454:29;;80502:14;80519:7;80527:1;80519:10;;;;;;-1:-1:-1;;;80519:10:0;;;;;;;;;;;;;;;80502:27;;80556:6;80566:1;80556:11;;80548:51;;;;-1:-1:-1;;;80548:51:0;;32008:2:1;80548:51:0;;;31990:21:1;32047:2;32027:18;;;32020:30;32086:29;32066:18;;;32059:57;32133:18;;80548:51:0;31980:177:1;80548:51:0;80622:21;;;;:12;:21;;;;;;80618:96;;80673:21;:8;80686:7;80673:12;:21::i;:::-;;80618:96;80732:21;;;;:12;:21;;;;;:31;;80757:6;;80732:21;:31;;80757:6;;80732:31;:::i;:::-;;;;-1:-1:-1;80782:15:0;;-1:-1:-1;80791:6:0;80782:15;;:::i;:::-;;;80402:411;;80430:3;;;;:::i;:::-;;;80402:411;;;-1:-1:-1;80834:5:0;-1:-1:-1;80827:12:0;;-1:-1:-1;80827:12:0;80047:1570;80896:12;;-1:-1:-1;;;;;80896:12:0;80872:21;80923:655;80943:6;80939:1;:10;80923:655;;;80975:15;80993:8;81002:1;80993:11;;;;;;-1:-1:-1;;;80993:11:0;;;;;;;;;;;;;;;80975:29;;81480:42;81499:13;81514:7;81480:18;:42::i;:::-;81541:21;:8;81554:7;81541:12;:21::i;:::-;;80923:655;80951:3;;;;:::i;:::-;;;80923:655;;;;81599:6;81592:13;;;;;;30178:494;-1:-1:-1;;;;;30262:21:0;;30254:67;;;;-1:-1:-1;;;30254:67:0;;35421:2:1;30254:67:0;;;35403:21:1;35460:2;35440:18;;;35433:30;35499:34;35479:18;;;35472:62;35570:3;35550:18;;;35543:31;35591:19;;30254:67:0;35393:223:1;30254:67:0;-1:-1:-1;;;;;30421:18:0;;30396:22;30421:18;;;:9;:18;;;;;;30458:24;;;;30450:71;;;;-1:-1:-1;;;30450:71:0;;28973:2:1;30450:71:0;;;28955:21:1;29012:2;28992:18;;;28985:30;29051:34;29031:18;;;29024:62;29122:4;29102:18;;;29095:32;29144:19;;30450:71:0;28945:224:1;30450:71:0;30553:23;30570:6;30553:14;:23;:::i;:::-;-1:-1:-1;;;;;30532:18:0;;;;;;:9;:18;;;;;:44;;;;30587:12;:22;;30603:6;;30532:18;30587:22;;30603:6;;30587:22;:::i;:::-;;;;-1:-1:-1;;30627:37:0;;39956:25:1;;;30653:1:0;;-1:-1:-1;;;;;30627:37:0;;;;;39944:2:1;39929:18;30627:37:0;39911:76:1;29507:338:0;-1:-1:-1;;;;;29591:21:0;;29583:65;;;;-1:-1:-1;;;29583:65:0;;39247:2:1;29583:65:0;;;39229:21:1;39286:2;39266:18;;;39259:30;39325:33;39305:18;;;39298:61;39376:18;;29583:65:0;39219:181:1;29583:65:0;29739:6;29723:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;29756:18:0;;;;;;:9;:18;;;;;:28;;29778:6;;29756:18;:28;;29778:6;;29756:28;:::i;:::-;;;;-1:-1:-1;;29800:37:0;;39956:25:1;;;-1:-1:-1;;;;;29800:37:0;;;29817:1;;29800:37;;39944:2:1;39929:18;29800:37:0;;;;;;;29507:338;;:::o;23177:135::-;23263:13;;;;:5;;:13;;;;;:::i;:::-;-1:-1:-1;23287:17:0;;;;:7;;:17;;;;;:::i;52573:129::-;19336:13;;;;;;;;:30;;-1:-1:-1;19354:12:0;;;;19353:13;19336:30;19328:89;;;;-1:-1:-1;;;19328:89:0;;33532:2:1;19328:89:0;;;33514:21:1;33571:2;33551:18;;;33544:30;33610:34;33590:18;;;33583:62;-1:-1:-1;;;33661:18:1;;;33654:44;33715:19;;19328:89:0;33504:236:1;19328:89:0;19430:19;19453:13;;;;;;19452:14;19477:101;;;;19512:13;:20;;-1:-1:-1;;19547:19:0;;;;;19477:101;52631:26:::1;:24;:26::i;:::-;52668;:24;:26::i;:::-;19608:14:::0;19604:68;;;19655:5;19639:21;;-1:-1:-1;;19639:21:0;;;52573:129;:::o;22823:181::-;19336:13;;;;;;;;:30;;-1:-1:-1;19354:12:0;;;;19353:13;19336:30;19328:89;;;;-1:-1:-1;;;19328:89:0;;33532:2:1;19328:89:0;;;33514:21:1;33571:2;33551:18;;;33544:30;33610:34;33590:18;;;33583:62;-1:-1:-1;;;33661:18:1;;;33654:44;33715:19;;19328:89:0;33504:236:1;19328:89:0;19430:19;19453:13;;;;;;19452:14;19477:101;;;;19512:13;:20;;-1:-1:-1;;19547:19:0;;;;;19477:101;22921:26:::1;:24;:26::i;:::-;22958:38;22981:5;22988:7;22958:22;:38::i;:::-;19608:14:::0;19604:68;;;19655:5;19639:21;;-1:-1:-1;;19639:21:0;;;22823:181;;;:::o;61628:120::-;61695:7;61722:3;:11;;61734:5;61722:18;;;;;;-1:-1:-1;;;61722:18:0;;;;;;;;;;;;;;;;;61715:25;;61628:120;;;;:::o;86335:505::-;86398:7;86418:19;86751:17;:8;:15;:17::i;:::-;86539:16;86554:1;86539:12;:16;:::i;:::-;86580:9;;86490:232;;;86529:27;;86490:232;;;19451:19:1;19486:12;;19479:28;86612:14:0;19545:2:1;19541:15;;;-1:-1:-1;;19537:53:1;19523:12;;;19516:75;86649:16:0;19607:12:1;;;19600:28;86688:15:0;19644:13:1;;;19637:29;19682:13;;86490:232:0;;;;;;;;;;;;86462:275;;;;;;86440:308;;:328;;;;:::i;:::-;86418:350;;86781:9;;86779:11;;;;;:::i;:::-;;;;-1:-1:-1;86808:24:0;:8;86820:11;86808;:24::i;:::-;86801:31;;;86335:505;:::o;65593:137::-;65663:4;65687:35;65695:3;65715:5;65687:7;:35::i;83666:887::-;83784:42;83853;83906:17;-1:-1:-1;;;;;83938:20:0;;;;83934:483;;;84017:65;;-1:-1:-1;;;;;23378:55:1;;84017:65:0;;;23360:74:1;23450:18;;;23443:34;;;23333:18;;84017:65:0;;;-1:-1:-1;;84017:65:0;;;;;;;;;;;;;;-1:-1:-1;;;;;84017:65:0;;;;;;-1:-1:-1;83934:483:0;;;84117:5;-1:-1:-1;;;;;84104:18:0;:9;-1:-1:-1;;;;;84104:18:0;;84100:317;;;84175:69;;-1:-1:-1;;;;;23378:55:1;;84175:69:0;;;23360:74:1;23450:18;;;23443:34;;;23333:18;;84175:69:0;;;-1:-1:-1;;84175:69:0;;;;;;;;;;;;;;-1:-1:-1;;;;;84175:69:0;;;;;;-1:-1:-1;84100:317:0;;;84309:96;;84386:4;84309:96;;;21399:34:1;-1:-1:-1;;;;;21469:15:1;;21449:18;;;21442:43;21501:18;;;21494:34;;;21311:18;;84309:96:0;;;-1:-1:-1;;84309:96:0;;;;;;;;;;;;;;-1:-1:-1;;;;;84309:96:0;-1:-1:-1;;;84309:96:0;;;;-1:-1:-1;84100:317:0;84428:12;84442:23;84477:9;-1:-1:-1;;;;;84469:23:0;84493:4;84469:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84427:71;;;;84517:7;84533:10;84509:36;;;;;-1:-1:-1;;;84509:36:0;;;;;;;;:::i;79483:292::-;79602:18;;-1:-1:-1;;;;;79602:18:0;79635:42;79631:81;;79694:7;79483:292;:::o;79631:81::-;79722:45;;;;;-1:-1:-1;;;;;79722:35:0;;;;;:45;;79758:8;;79722:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65286:131;65353:4;65377:32;65382:3;65402:5;65377:4;:32::i;84561:1766::-;84671:42;84740;84793:17;-1:-1:-1;;;;;84825:20:0;;;;84821:1370;;;84900:100;;84965:10;84900:100;;;21399:34:1;84985:4:0;21449:18:1;;;21442:43;21501:18;;;21494:34;;;21311:18;;84900:100:0;;;-1:-1:-1;;84900:100:0;;;;;;;;;;;;;;-1:-1:-1;;;;;84900:100:0;;;;;;-1:-1:-1;84821:1370:0;;;85035:5;-1:-1:-1;;;;;85022:18:0;:9;-1:-1:-1;;;;;85022:18:0;;85018:1173;;;85149:31;85238:7;85183:63;;;;;;39956:25:1;;39944:2;39929:18;;39911:76;85183:63:0;;;;-1:-1:-1;;85183:63:0;;;;;;;;;;;;;;-1:-1:-1;;;;;85183:63:0;;;;;85304:49;85183:63;;-1:-1:-1;;;;;;;;;;85304:29:0;;;:49;;85183:63;;85304:49;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85261:92;;;;85369:16;85400:6;85389:29;;;;;;;;;;;;:::i;:::-;85368:50;;85441:12;:38;;;;-1:-1:-1;;;;;;85457:22:0;;85469:10;85457:22;85441:38;85433:68;;;;-1:-1:-1;;;85433:68:0;;38495:2:1;85433:68:0;;;38477:21:1;38534:2;38514:18;;;38507:30;38573:19;38553:18;;;38546:47;38610:18;;85433:68:0;38467:167:1;85433:68:0;85523:52;;;;;39956:25:1;;;39929:18;;85523:52:0;;;-1:-1:-1;;85523:52:0;;;;;;;;;;;;;;-1:-1:-1;;;;;85523:52:0;;;;;;-1:-1:-1;85018:1173:0;;-1:-1:-1;;;;85018:1173:0;;85853:12;;85834:49;;;;;;;;39956:25:1;;;85895:4:0;;-1:-1:-1;;;;;85853:12:0;;85834:40;;39929:18:1;;85834:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;85834:66:0;;85830:350;;;85930:26;:8;85948:7;65893:4;61057:19;;;:12;;;:19;;;;;;:24;;65917:37;60960:129;85930:26;85929:27;85921:66;;;;-1:-1:-1;;;85921:66:0;;29376:2:1;85921:66:0;;;29358:21:1;29415:2;29395:18;;;29388:30;29454:28;29434:18;;;29427:56;29500:18;;85921:66:0;29348:176:1;85921:66:0;86006:7;;;84561:1766;;:::o;85830:350::-;86060:104;;86129:10;86060:104;;;21399:34:1;86149:4:0;21449:18:1;;;21442:43;21501:18;;;21494:34;;;21311:18;;86060:104:0;;;-1:-1:-1;;86060:104:0;;;;;;;;;;;;;;-1:-1:-1;;;;;86060:104:0;-1:-1:-1;;;86060:104:0;;;;-1:-1:-1;85830:350:0;86202:12;86216:23;86251:9;-1:-1:-1;;;;;86243:23:0;86267:4;86243:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86201:71;;;;86291:7;86307:10;86283:36;;;;;-1:-1:-1;;;86283:36:0;;;;;;;;:::i;20444:65::-;19336:13;;;;;;;;:30;;-1:-1:-1;19354:12:0;;;;19353:13;19336:30;19328:89;;;;-1:-1:-1;;;19328:89:0;;33532:2:1;19328:89:0;;;33514:21:1;33571:2;33551:18;;;33544:30;33610:34;33590:18;;;33583:62;-1:-1:-1;;;33661:18:1;;;33654:44;33715:19;;19328:89:0;33504:236:1;19328:89:0;19430:19;19453:13;;;;;;19452:14;19477:101;;;;19512:13;:20;;-1:-1:-1;;19547:19:0;;;;;19604:68;;;;19655:5;19639:21;;-1:-1:-1;;19639:21:0;;;20444:65;:::o;52710:196::-;19336:13;;;;;;;;:30;;-1:-1:-1;19354:12:0;;;;19353:13;19336:30;19328:89;;;;-1:-1:-1;;;19328:89:0;;33532:2:1;19328:89:0;;;33514:21:1;33571:2;33551:18;;;33544:30;33610:34;33590:18;;;33583:62;-1:-1:-1;;;33661:18:1;;;33654:44;33715:19;;19328:89:0;33504:236:1;19328:89:0;19430:19;19453:13;;;;;;19452:14;19477:101;;;;19512:13;:20;;-1:-1:-1;;19547:19:0;;;;;19477:101;52821:6:::1;:18:::0;;-1:-1:-1;;;;;;52821:18:0::1;20595:10:::0;52821:18;;::::1;::::0;;;52855:43:::1;::::0;20595:10;;52778:17:::1;::::0;52855:43:::1;::::0;52778:17;;52855:43:::1;19590:1;19608:14:::0;19604:68;;;19655:5;19639:21;;-1:-1:-1;;19639:21:0;;;52710:196;:::o;23012:157::-;19336:13;;;;;;;;:30;;-1:-1:-1;19354:12:0;;;;19353:13;19336:30;19328:89;;;;-1:-1:-1;;;19328:89:0;;33532:2:1;19328:89:0;;;33514:21:1;33571:2;33551:18;;;33544:30;33610:34;33590:18;;;33583:62;-1:-1:-1;;;33661:18:1;;;33654:44;33715:19;;19328:89:0;33504:236:1;19328:89:0;19430:19;19453:13;;;;;;19452:14;19477:101;;;;19512:13;:20;;-1:-1:-1;;19547:19:0;;;;;19477:101;23120:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;23144:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;;19608:14:::0;19604:68;;;19655:5;19639:21;;-1:-1:-1;;19639:21:0;;;23012:157;;;:::o;59467:1407::-;59533:4;59672:19;;;:12;;;:19;;;;;;59708:15;;59704:1163;;60070:21;60094:14;60107:1;60094:10;:14;:::i;:::-;60143:18;;60070:38;;-1:-1:-1;60123:17:0;;60143:22;;60164:1;;60143:22;:::i;:::-;60123:42;;60199:13;60186:9;:26;60182:405;;60233:17;60253:3;:11;;60265:9;60253:22;;;;;;-1:-1:-1;;;60253:22:0;;;;;;;;;;;;;;;;;60233:42;;60407:9;60378:3;:11;;60390:13;60378:26;;;;;;-1:-1:-1;;;60378:26:0;;;;;;;;;;;;;;;;;;;;:38;;;;60492:23;;;:12;;;:23;;;;;:36;;;60182:405;60668:17;;:3;;:17;;;-1:-1:-1;;;60668:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;60763:3;:12;;:19;60776:5;60763:19;;;;;;;;;;;60756:26;;;60806:4;60799:11;;;;;;;59704:1163;60850:5;60843:12;;;;;58877:414;58940:4;61057:19;;;:12;;;:19;;;;;;58957:327;;-1:-1:-1;59000:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;59183:18;;59161:19;;;:12;;;:19;;;;;;:40;;;;59216:11;;58957:327;-1:-1:-1;59267:5:0;59260:12;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:395:1;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:2;;166:8;156;149:26;108:2;-1:-1:-1;196:20:1;;239:18;228:30;;225:2;;;278:8;268;261:26;225:2;322:4;314:6;310:17;298:29;;382:3;375:4;365:6;362:1;358:14;350:6;346:27;342:38;339:47;336:2;;;399:1;396;389:12;336:2;98:311;;;;;:::o;414:743::-;468:5;521:3;514:4;506:6;502:17;498:27;488:2;;543:5;536;529:20;488:2;583:6;570:20;609:4;632:18;628:2;625:26;622:2;;;654:18;;:::i;:::-;700:2;697:1;693:10;723:28;747:2;743;739:11;723:28;:::i;:::-;785:15;;;816:12;;;;848:15;;;882;;;878:24;;875:33;-1:-1:-1;872:2:1;;;925:5;918;911:20;872:2;951:5;942:14;;965:163;979:2;976:1;973:9;965:163;;;1036:17;;1024:30;;997:1;990:9;;;;;1074:12;;;;1106;;965:163;;;-1:-1:-1;1146:5:1;478:679;-1:-1:-1;;;;;;;478:679:1:o;1162:375::-;1213:8;1223:6;1277:3;1270:4;1262:6;1258:17;1254:27;1244:2;;1302:8;1292;1285:26;1244:2;-1:-1:-1;1332:20:1;;1375:18;1364:30;;1361:2;;;1414:8;1404;1397:26;1361:2;1458:4;1450:6;1446:17;1434:29;;1510:3;1503:4;1494:6;1486;1482:19;1478:30;1475:39;1472:2;;;1527:1;1524;1517:12;1542:550;1584:5;1637:3;1630:4;1622:6;1618:17;1614:27;1604:2;;1659:5;1652;1645:20;1604:2;1699:6;1686:20;1725:18;1721:2;1718:26;1715:2;;;1747:18;;:::i;:::-;1791:55;1834:2;1815:13;;-1:-1:-1;;1811:27:1;1840:4;1807:38;1791:55;:::i;:::-;1871:2;1862:7;1855:19;1917:3;1910:4;1905:2;1897:6;1893:15;1889:26;1886:35;1883:2;;;1938:5;1931;1924:20;1883:2;2007;2000:4;1992:6;1988:17;1981:4;1972:7;1968:18;1955:55;2030:16;;;2048:4;2026:27;2019:42;;;;2034:7;1594:498;-1:-1:-1;;1594:498:1:o;2097:257::-;2156:6;2209:2;2197:9;2188:7;2184:23;2180:32;2177:2;;;2230:6;2222;2215:22;2177:2;2274:9;2261:23;2293:31;2318:5;2293:31;:::i;2359:261::-;2429:6;2482:2;2470:9;2461:7;2457:23;2453:32;2450:2;;;2503:6;2495;2488:22;2450:2;2540:9;2534:16;2559:31;2584:5;2559:31;:::i;2899:398::-;2967:6;2975;3028:2;3016:9;3007:7;3003:23;2999:32;2996:2;;;3049:6;3041;3034:22;2996:2;3093:9;3080:23;3112:31;3137:5;3112:31;:::i;:::-;3162:5;-1:-1:-1;3219:2:1;3204:18;;3191:32;3232:33;3191:32;3232:33;:::i;:::-;3284:7;3274:17;;;2986:311;;;;;:::o;3302:1111::-;3456:6;3464;3472;3480;3488;3541:3;3529:9;3520:7;3516:23;3512:33;3509:2;;;3563:6;3555;3548:22;3509:2;3607:9;3594:23;3626:31;3651:5;3626:31;:::i;:::-;3676:5;-1:-1:-1;3733:2:1;3718:18;;3705:32;3746:33;3705:32;3746:33;:::i;:::-;3798:7;-1:-1:-1;3856:2:1;3841:18;;3828:32;3879:18;3909:14;;;3906:2;;;3941:6;3933;3926:22;3906:2;3969:61;4022:7;4013:6;4002:9;3998:22;3969:61;:::i;:::-;3959:71;;4083:2;4072:9;4068:18;4055:32;4039:48;;4112:2;4102:8;4099:16;4096:2;;;4133:6;4125;4118:22;4096:2;4161:63;4216:7;4205:8;4194:9;4190:24;4161:63;:::i;:::-;4151:73;;4277:3;4266:9;4262:19;4249:33;4233:49;;4307:2;4297:8;4294:16;4291:2;;;4328:6;4320;4313:22;4291:2;;4356:51;4399:7;4388:8;4377:9;4373:24;4356:51;:::i;:::-;4346:61;;;3499:914;;;;;;;;:::o;4418:466::-;4495:6;4503;4511;4564:2;4552:9;4543:7;4539:23;4535:32;4532:2;;;4585:6;4577;4570:22;4532:2;4629:9;4616:23;4648:31;4673:5;4648:31;:::i;:::-;4698:5;-1:-1:-1;4755:2:1;4740:18;;4727:32;4768:33;4727:32;4768:33;:::i;:::-;4522:362;;4820:7;;-1:-1:-1;;;4874:2:1;4859:18;;;;4846:32;;4522:362::o;4889:685::-;4984:6;4992;5000;5008;5061:3;5049:9;5040:7;5036:23;5032:33;5029:2;;;5083:6;5075;5068:22;5029:2;5127:9;5114:23;5146:31;5171:5;5146:31;:::i;:::-;5196:5;-1:-1:-1;5253:2:1;5238:18;;5225:32;5266:33;5225:32;5266:33;:::i;:::-;5318:7;-1:-1:-1;5372:2:1;5357:18;;5344:32;;-1:-1:-1;5427:2:1;5412:18;;5399:32;5454:18;5443:30;;5440:2;;;5491:6;5483;5476:22;5440:2;5519:49;5560:7;5551:6;5540:9;5536:22;5519:49;:::i;:::-;5509:59;;;5019:555;;;;;;;:::o;5579:754::-;5683:6;5691;5699;5707;5715;5768:3;5756:9;5747:7;5743:23;5739:33;5736:2;;;5790:6;5782;5775:22;5736:2;5834:9;5821:23;5853:31;5878:5;5853:31;:::i;:::-;5903:5;-1:-1:-1;5960:2:1;5945:18;;5932:32;5973:33;5932:32;5973:33;:::i;:::-;6025:7;-1:-1:-1;6079:2:1;6064:18;;6051:32;;-1:-1:-1;6130:2:1;6115:18;;6102:32;;-1:-1:-1;6185:3:1;6170:19;;6157:33;6213:18;6202:30;;6199:2;;;6250:6;6242;6235:22;6199:2;6278:49;6319:7;6310:6;6299:9;6295:22;6278:49;:::i;6338:325::-;6406:6;6414;6467:2;6455:9;6446:7;6442:23;6438:32;6435:2;;;6488:6;6480;6473:22;6435:2;6532:9;6519:23;6551:31;6576:5;6551:31;:::i;:::-;6601:5;6653:2;6638:18;;;;6625:32;;-1:-1:-1;;;6425:238:1:o;6668:803::-;6790:6;6798;6806;6814;6867:2;6855:9;6846:7;6842:23;6838:32;6835:2;;;6888:6;6880;6873:22;6835:2;6933:9;6920:23;6962:18;7003:2;6995:6;6992:14;6989:2;;;7024:6;7016;7009:22;6989:2;7068:70;7130:7;7121:6;7110:9;7106:22;7068:70;:::i;:::-;7157:8;;-1:-1:-1;7042:96:1;-1:-1:-1;7245:2:1;7230:18;;7217:32;;-1:-1:-1;7261:16:1;;;7258:2;;;7295:6;7287;7280:22;7258:2;;7339:72;7403:7;7392:8;7381:9;7377:24;7339:72;:::i;:::-;6825:646;;;;-1:-1:-1;7430:8:1;-1:-1:-1;;;;6825:646:1:o;7476:1128::-;7634:6;7642;7650;7658;7666;7674;7727:2;7715:9;7706:7;7702:23;7698:32;7695:2;;;7748:6;7740;7733:22;7695:2;7793:9;7780:23;7822:18;7863:2;7855:6;7852:14;7849:2;;;7884:6;7876;7869:22;7849:2;7928:70;7990:7;7981:6;7970:9;7966:22;7928:70;:::i;:::-;8017:8;;-1:-1:-1;7902:96:1;-1:-1:-1;8105:2:1;8090:18;;8077:32;;-1:-1:-1;8121:16:1;;;8118:2;;;8155:6;8147;8140:22;8118:2;8199:72;8263:7;8252:8;8241:9;8237:24;8199:72;:::i;:::-;8290:8;;-1:-1:-1;8173:98:1;-1:-1:-1;8378:2:1;8363:18;;8350:32;;-1:-1:-1;8394:16:1;;;8391:2;;;8428:6;8420;8413:22;8391:2;;8472:72;8536:7;8525:8;8514:9;8510:24;8472:72;:::i;:::-;7685:919;;;;-1:-1:-1;7685:919:1;;-1:-1:-1;7685:919:1;;8563:8;;7685:919;-1:-1:-1;;;7685:919:1:o;8609:368::-;8693:6;8746:2;8734:9;8725:7;8721:23;8717:32;8714:2;;;8767:6;8759;8752:22;8714:2;8812:9;8799:23;8845:18;8837:6;8834:30;8831:2;;;8882:6;8874;8867:22;8831:2;8910:61;8963:7;8954:6;8943:9;8939:22;8910:61;:::i;8982:760::-;9109:6;9117;9125;9178:2;9166:9;9157:7;9153:23;9149:32;9146:2;;;9199:6;9191;9184:22;9146:2;9244:9;9231:23;9273:18;9314:2;9306:6;9303:14;9300:2;;;9335:6;9327;9320:22;9300:2;9363:61;9416:7;9407:6;9396:9;9392:22;9363:61;:::i;:::-;9353:71;;9477:2;9466:9;9462:18;9449:32;9433:48;;9506:2;9496:8;9493:16;9490:2;;;9527:6;9519;9512:22;9490:2;;9555:63;9610:7;9599:8;9588:9;9584:24;9555:63;:::i;:::-;9545:73;;;9668:2;9657:9;9653:18;9640:32;9681:31;9706:5;9681:31;:::i;:::-;9731:5;9721:15;;;9136:606;;;;;:::o;9747:997::-;9908:6;9916;9924;9932;9985:3;9973:9;9964:7;9960:23;9956:33;9953:2;;;10007:6;9999;9992:22;9953:2;10052:9;10039:23;10081:18;10122:2;10114:6;10111:14;10108:2;;;10143:6;10135;10128:22;10108:2;10171:61;10224:7;10215:6;10204:9;10200:22;10171:61;:::i;:::-;10161:71;;10285:2;10274:9;10270:18;10257:32;10241:48;;10314:2;10304:8;10301:16;10298:2;;;10335:6;10327;10320:22;10298:2;10363:63;10418:7;10407:8;10396:9;10392:24;10363:63;:::i;:::-;10353:73;;10479:2;10468:9;10464:18;10451:32;10435:48;;10508:2;10498:8;10495:16;10492:2;;;10529:6;10521;10514:22;10492:2;;10557:63;10612:7;10601:8;10590:9;10586:24;10557:63;:::i;:::-;10547:73;;;10670:2;10659:9;10655:18;10642:32;10683:31;10708:5;10683:31;:::i;:::-;9943:801;;;;-1:-1:-1;9943:801:1;;-1:-1:-1;;9943:801:1:o;10749:255::-;10816:6;10869:2;10857:9;10848:7;10844:23;10840:32;10837:2;;;10890:6;10882;10875:22;10837:2;10927:9;10921:16;10946:28;10968:5;10946:28;:::i;11009:793::-;11089:6;11097;11105;11113;11121;11174:3;11162:9;11153:7;11149:23;11145:33;11142:2;;;11196:6;11188;11181:22;11142:2;11240:9;11227:23;11259:28;11281:5;11259:28;:::i;:::-;11306:5;-1:-1:-1;11363:2:1;11348:18;;11335:32;11376:30;11335:32;11376:30;:::i;:::-;11425:7;-1:-1:-1;11484:2:1;11469:18;;11456:32;11497:30;11456:32;11497:30;:::i;:::-;11546:7;-1:-1:-1;11605:2:1;11590:18;;11577:32;11618:30;11577:32;11618:30;:::i;:::-;11667:7;-1:-1:-1;11726:3:1;11711:19;;11698:33;11740:30;11698:33;11740:30;:::i;:::-;11789:7;11779:17;;;11132:670;;;;;;;;:::o;11807:194::-;11877:6;11930:2;11918:9;11909:7;11905:23;11901:32;11898:2;;;11951:6;11943;11936:22;11898:2;-1:-1:-1;11979:16:1;;11888:113;-1:-1:-1;11888:113:1:o;12006:352::-;12064:6;12117:2;12105:9;12096:7;12092:23;12088:32;12085:2;;;12138:6;12130;12123:22;12085:2;12182:9;12169:23;-1:-1:-1;;;;;;12225:5:1;12221:78;12214:5;12211:89;12201:2;;12319:6;12311;12304:22;12363:725;12498:6;12506;12514;12522;12575:3;12563:9;12554:7;12550:23;12546:33;12543:2;;;12597:6;12589;12582:22;13093:749;13185:6;13193;13201;13209;13262:2;13250:9;13241:7;13237:23;13233:32;13230:2;;;13283:6;13275;13268:22;13230:2;13328:9;13315:23;13357:18;13398:2;13390:6;13387:14;13384:2;;;13419:6;13411;13404:22;13384:2;13463:58;13513:7;13504:6;13493:9;13489:22;13463:58;:::i;:::-;13540:8;;-1:-1:-1;13437:84:1;-1:-1:-1;13628:2:1;13613:18;;13600:32;;-1:-1:-1;13644:16:1;;;13641:2;;;13678:6;13670;13663:22;13641:2;;13722:60;13774:7;13763:8;13752:9;13748:24;13722:60;:::i;13847:978::-;13956:6;13964;13972;13980;13988;14041:3;14029:9;14020:7;14016:23;14012:33;14009:2;;;14063:6;14055;14048:22;14009:2;14108:9;14095:23;14137:18;14178:2;14170:6;14167:14;14164:2;;;14199:6;14191;14184:22;14164:2;14227:49;14268:7;14259:6;14248:9;14244:22;14227:49;:::i;:::-;14217:59;;14329:2;14318:9;14314:18;14301:32;14285:48;;14358:2;14348:8;14345:16;14342:2;;;14379:6;14371;14364:22;14342:2;;14407:51;14450:7;14439:8;14428:9;14424:24;14407:51;:::i;:::-;14397:61;;;14508:2;14497:9;14493:18;14480:32;14521:31;14546:5;14521:31;:::i;14830:190::-;14889:6;14942:2;14930:9;14921:7;14917:23;14913:32;14910:2;;;14963:6;14955;14948:22;14910:2;-1:-1:-1;14991:23:1;;14900:120;-1:-1:-1;14900:120:1:o;15224:466::-;15301:6;15309;15317;15370:2;15358:9;15349:7;15345:23;15341:32;15338:2;;;15391:6;15383;15376:22;15338:2;15432:9;15419:23;15409:33;;15492:2;15481:9;15477:18;15464:32;15505:31;15530:5;15505:31;:::i;:::-;15555:5;-1:-1:-1;15612:2:1;15597:18;;15584:32;15625:33;15584:32;15625:33;:::i;15695:525::-;15790:6;15798;15806;15859:2;15847:9;15838:7;15834:23;15830:32;15827:2;;;15880:6;15872;15865:22;15827:2;15921:9;15908:23;15898:33;;15982:2;15971:9;15967:18;15954:32;16009:18;16001:6;15998:30;15995:2;;;16046:6;16038;16031:22;15995:2;16090:70;16152:7;16143:6;16132:9;16128:22;16090:70;:::i;:::-;15817:403;;16179:8;;-1:-1:-1;16064:96:1;;-1:-1:-1;;;;15817:403:1:o;16225:571::-;16327:6;16335;16343;16396:2;16384:9;16375:7;16371:23;16367:32;16364:2;;;16417:6;16409;16402:22;16364:2;16458:9;16445:23;16435:33;;16519:2;16508:9;16504:18;16491:32;16546:18;16538:6;16535:30;16532:2;;;16583:6;16575;16568:22;16532:2;16611:61;16664:7;16655:6;16644:9;16640:22;16611:61;:::i;16801:497::-;16880:6;16888;16896;16949:2;16937:9;16928:7;16924:23;16920:32;16917:2;;;16970:6;16962;16955:22;16917:2;17011:9;16998:23;16988:33;;17072:2;17061:9;17057:18;17044:32;17099:18;17091:6;17088:30;17085:2;;;17136:6;17128;17121:22;17085:2;17180:58;17230:7;17221:6;17210:9;17206:22;17180:58;:::i;17303:464::-;17398:6;17406;17414;17422;17430;17483:3;17471:9;17462:7;17458:23;17454:33;17451:2;;;17505:6;17497;17490:22;17451:2;-1:-1:-1;;17533:23:1;;;17603:2;17588:18;;17575:32;;-1:-1:-1;17654:2:1;17639:18;;17626:32;;17705:2;17690:18;;17677:32;;-1:-1:-1;17756:3:1;17741:19;17728:33;;-1:-1:-1;17441:326:1;-1:-1:-1;17441:326:1:o;17772:440::-;17878:6;17886;17894;17902;17910;17963:3;17951:9;17942:7;17938:23;17934:33;17931:2;;;17985:6;17977;17970:22;17931:2;-1:-1:-1;;18013:16:1;;18069:2;18054:18;;18048:25;18113:2;18098:18;;18092:25;18157:2;18142:18;;18136:25;18201:3;18186:19;;;18180:26;18013:16;;18048:25;;-1:-1:-1;18092:25:1;18136;-1:-1:-1;18180:26:1;;-1:-1:-1;17921:291:1;-1:-1:-1;17921:291:1:o;18217:437::-;18270:3;18308:5;18302:12;18335:6;18330:3;18323:19;18361:4;18390:2;18385:3;18381:12;18374:19;;18427:2;18420:5;18416:14;18448:3;18460:169;18474:6;18471:1;18468:13;18460:169;;;18535:13;;18523:26;;18569:12;;;;18604:15;;;;18496:1;18489:9;18460:169;;;-1:-1:-1;18645:3:1;;18278:376;-1:-1:-1;;;;;18278:376:1:o;18659:268::-;18747:6;18742:3;18735:19;18799:6;18792:5;18785:4;18780:3;18776:14;18763:43;-1:-1:-1;18717:3:1;18826:16;;;18844:4;18822:27;;;18815:40;;;;18909:2;18888:15;;;-1:-1:-1;;18884:29:1;18875:39;;;18871:50;;18725:202::o;18932:257::-;18973:3;19011:5;19005:12;19038:6;19033:3;19026:19;19054:63;19110:6;19103:4;19098:3;19094:14;19087:4;19080:5;19076:16;19054:63;:::i;:::-;19171:2;19150:15;-1:-1:-1;;19146:29:1;19137:39;;;;19178:4;19133:50;;18981:208;-1:-1:-1;;18981:208:1:o;19706:274::-;19835:3;19873:6;19867:13;19889:53;19935:6;19930:3;19923:4;19915:6;19911:17;19889:53;:::i;:::-;19958:16;;;;;19843:137;-1:-1:-1;;19843:137:1:o;20216:915::-;20592:4;-1:-1:-1;;;;;20702:2:1;20694:6;20690:15;20679:9;20672:34;20754:2;20746:6;20742:15;20737:2;20726:9;20722:18;20715:43;;20794:3;20789:2;20778:9;20774:18;20767:31;20821:57;20873:3;20862:9;20858:19;20850:6;20821:57;:::i;:::-;20926:9;20918:6;20914:22;20909:2;20898:9;20894:18;20887:50;20960:44;20997:6;20989;20960:44;:::i;:::-;21041:22;;;21035:3;21020:19;;;21013:51;;;;-1:-1:-1;21073:20:1;;21122:2;21110:15;;20601:530;-1:-1:-1;;;;20601:530:1:o;22205:583::-;22427:4;-1:-1:-1;;;;;22537:2:1;22529:6;22525:15;22514:9;22507:34;22589:2;22581:6;22577:15;22572:2;22561:9;22557:18;22550:43;;22629:6;22624:2;22613:9;22609:18;22602:34;22672:6;22667:2;22656:9;22652:18;22645:34;22716:3;22710;22699:9;22695:19;22688:32;22737:45;22777:3;22766:9;22762:19;22754:6;22737:45;:::i;23891:261::-;24070:2;24059:9;24052:21;24033:4;24090:56;24142:2;24131:9;24127:18;24119:6;24090:56;:::i;24157:585::-;24442:2;24431:9;24424:21;24405:4;24468:56;24520:2;24509:9;24505:18;24497:6;24468:56;:::i;:::-;24572:9;24564:6;24560:22;24555:2;24544:9;24540:18;24533:50;24600:44;24637:6;24629;24600:44;:::i;:::-;24592:52;;;-1:-1:-1;;;;;24684:6:1;24680:55;24675:2;24664:9;24660:18;24653:83;24414:328;;;;;;:::o;24747:996::-;25188:3;25177:9;25170:22;25151:4;25215:57;25267:3;25256:9;25252:19;25244:6;25215:57;:::i;:::-;25320:9;25312:6;25308:22;25303:2;25292:9;25288:18;25281:50;25354:44;25391:6;25383;25354:44;:::i;:::-;25340:58;;25446:9;25438:6;25434:22;25429:2;25418:9;25414:18;25407:50;25480:44;25517:6;25509;25480:44;:::i;:::-;25466:58;;25572:9;25564:6;25560:22;25555:2;25544:9;25540:18;25533:50;25600:44;25637:6;25629;25600:44;:::i;:::-;25592:52;;;-1:-1:-1;;;;;25685:6:1;25681:55;25675:3;25664:9;25660:19;25653:84;25160:583;;;;;;;;:::o;26703:219::-;26852:2;26841:9;26834:21;26815:4;26872:44;26912:2;26901:9;26897:18;26889:6;26872:44;:::i;26927:761::-;27240:3;27229:9;27222:22;27203:4;27267:45;27307:3;27296:9;27292:19;27284:6;27267:45;:::i;:::-;27360:9;27352:6;27348:22;27343:2;27332:9;27328:18;27321:50;27394:32;27419:6;27411;27394:32;:::i;:::-;27380:46;;27474:9;27466:6;27462:22;27457:2;27446:9;27442:18;27435:50;27508:49;27550:6;27542;27534;27508:49;:::i;:::-;27494:63;;27605:9;27597:6;27593:22;27588:2;27577:9;27573:18;27566:50;27633:49;27675:6;27667;27659;27633:49;:::i;:::-;27625:57;27212:476;-1:-1:-1;;;;;;;;;27212:476:1:o;40294:315::-;40479:6;40468:9;40461:25;40522:2;40517;40506:9;40502:18;40495:30;40442:4;40542:61;40599:2;40588:9;40584:18;40576:6;40568;40542:61;:::i;41811:275::-;41882:2;41876:9;41947:2;41928:13;;-1:-1:-1;;41924:27:1;41912:40;;41982:18;41967:34;;42003:22;;;41964:62;41961:2;;;42029:18;;:::i;:::-;42065:2;42058:22;41856:230;;-1:-1:-1;41856:230:1:o;42091:128::-;42131:3;42162:1;42158:6;42155:1;42152:13;42149:2;;;42168:18;;:::i;:::-;-1:-1:-1;42204:9:1;;42139:80::o;42224:120::-;42264:1;42290;42280:2;;42295:18;;:::i;:::-;-1:-1:-1;42329:9:1;;42270:74::o;42349:168::-;42389:7;42455:1;42451;42447:6;42443:14;42440:1;42437:21;42432:1;42425:9;42418:17;42414:45;42411:2;;;42462:18;;:::i;:::-;-1:-1:-1;42502:9:1;;42401:116::o;42522:125::-;42562:4;42590:1;42587;42584:8;42581:2;;;42595:18;;:::i;:::-;-1:-1:-1;42632:9:1;;42571:76::o;42652:258::-;42724:1;42734:113;42748:6;42745:1;42742:13;42734:113;;;42824:11;;;42818:18;42805:11;;;42798:39;42770:2;42763:10;42734:113;;;42865:6;42862:1;42859:13;42856:2;;;-1:-1:-1;;42900:1:1;42882:16;;42875:27;42705:205::o;42915:437::-;42994:1;42990:12;;;;43037;;;43058:2;;43112:4;43104:6;43100:17;43090:27;;43058:2;43165;43157:6;43154:14;43134:18;43131:38;43128:2;;;-1:-1:-1;;;43199:1:1;43192:88;43303:4;43300:1;43293:15;43331:4;43328:1;43321:15;43128:2;;42970:382;;;:::o;43357:135::-;43396:3;-1:-1:-1;;43417:17:1;;43414:2;;;43437:18;;:::i;:::-;-1:-1:-1;43484:1:1;43473:13;;43404:88::o;43497:112::-;43529:1;43555;43545:2;;43560:18;;:::i;:::-;-1:-1:-1;43594:9:1;;43535:74::o;43614:184::-;-1:-1:-1;;;43663:1:1;43656:88;43763:4;43760:1;43753:15;43787:4;43784:1;43777:15;43803:184;-1:-1:-1;;;43852:1:1;43845:88;43952:4;43949:1;43942:15;43976:4;43973:1;43966:15;43992:184;-1:-1:-1;;;44041:1:1;44034:88;44141:4;44138:1;44131:15;44165:4;44162:1;44155:15;44181:154;-1:-1:-1;;;;;44260:5:1;44256:54;44249:5;44246:65;44236:2;;44325:1;44322;44315:12;44340:118;44426:5;44419:13;44412:21;44405:5;44402:32;44392:2;;44448:1;44445;44438:12
Swarm Source
ipfs://fdd9ce0808b0515981293436a69cc47bc2a981bd3970dfda29e0ce79d0397c08
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
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.