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 | 17198572 | 490 days ago | IN | 0 ETH | 0.36747955 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TokenImplementation
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; // import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; // import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; // import "@openzeppelin/contracts/access/Ownable.sol"; // import "@openzeppelin/contracts/security/Pausable.sol"; // import "@openzeppelin/contracts/utils/Context.sol"; // import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (a supervisor) that can be granted exclusive access to * specific functions. * * By default, the supervisor account will be the one that deploys the contract. This * can later be changed with {transferSupervisorOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlySupervisor`, which can be applied to your functions to restrict their use to * the supervisor. */ abstract contract Supervisable is Initializable, ContextUpgradeable { address private _supervisor; event SupervisorOwnershipTransferred(address indexed previouSupervisor, address indexed newSupervisor); function __Supervisable_init() internal onlyInitializing { __Supervisable_init_unchained(); } function __Supervisable_init_unchained() internal onlyInitializing { _transferSupervisorOwnership(_msgSender()); } /** * @dev Returns the address of the current supervisor. */ function supervisor() public view virtual returns (address) { return _supervisor; } /** * @dev Throws if called by any account other than the supervisor. */ modifier onlySupervisor() { require(supervisor() == _msgSender(), "Supervisable: caller is not the supervisor"); _; } /** * @dev Transfers supervisor ownership of the contract to a new account (`newSupervisor`). * Internal function without access restriction. */ function _transferSupervisorOwnership(address newSupervisor) internal virtual { address oldSupervisor = _supervisor; _supervisor = newSupervisor; emit SupervisorOwnershipTransferred(oldSupervisor, newSupervisor); } } /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract Burnable is ContextUpgradeable { mapping(address => bool) private _burners; event BurnerAdded(address indexed account); event BurnerRemoved(address indexed account); /** * @dev Returns whether the address is burner. */ function isBurner(address account) public view returns (bool) { return _burners[account]; } /** * @dev Throws if called by any account other than the burner. */ modifier onlyBurner() { require(_burners[_msgSender()], "Burnable: caller is not a burner"); _; } /** * @dev Add burner, only owner can add burner. */ function _addBurner(address account) internal { _burners[account] = true; emit BurnerAdded(account); } /** * @dev Remove operator, only owner can remove operator */ function _removeBurner(address account) internal { _burners[account] = false; emit BurnerRemoved(account); } } /** * @dev Contract for freezing mechanism. * Owner can add freezed account. * Supervisor can remove freezed account. */ contract Freezable is ContextUpgradeable { mapping(address => bool) private _freezes; event Freezed(address indexed account); event Unfreezed(address indexed account); /** * @dev Freeze account, only owner can freeze */ function _freeze(address account) internal { _freezes[account] = true; emit Freezed(account); } /** * @dev Unfreeze account, only supervisor can unfreeze */ function _unfreeze(address account) internal { _freezes[account] = false; emit Unfreezed(account); } /** * @dev Returns whether the address is freezed. */ function isFreezed(address account) public view returns (bool) { return _freezes[account]; } } /** * @dev Contract for locking mechanism. * Locker can add and remove locked account. */ contract Lockable is ContextUpgradeable { using SafeMathUpgradeable for uint256; struct TimeLock { uint256 amount; uint256 lockedAt; uint256 expiresAt; } struct VestingLock { uint256 amount; uint256 lockedAt; uint256 startsAt; uint256 period; uint256 count; } mapping(address => bool) private _lockers; mapping(address => TimeLock[]) private _timeLocks; mapping(address => VestingLock[]) private _vestingLocks; event LockerAdded(address indexed account); event LockerRemoved(address indexed account); event TimeLocked(address indexed account); event TimeUnlocked(address indexed account); event VestingLocked(address indexed account); event VestingUnlocked(address indexed account); event VestingUpdated(address indexed account, uint256 index); /** * @dev Throws if called by any account other than the locker. */ modifier onlyLocker() { require(_lockers[_msgSender()], "Lockable: caller is not a locker"); _; } /** * @dev Returns whether the address is locker. */ function isLocker(address account) public view returns (bool) { return _lockers[account]; } /** * @dev Add locker, only owner can add locker */ function _addLocker(address account) internal { _lockers[account] = true; emit LockerAdded(account); } /** * @dev Remove locker, only owner can remove locker */ function _removeLocker(address account) internal { _lockers[account] = false; emit LockerRemoved(account); } /** * @dev Add time lock, only locker can add */ function _addTimeLock( address account, uint256 amount, uint256 expiresAt ) internal { require(amount > 0, "TimeLock: lock amount is 0"); require(expiresAt > block.timestamp, "TimeLock: invalid expire date"); _timeLocks[account].push(TimeLock(amount, block.timestamp, expiresAt)); emit TimeLocked(account); } /** * @dev Remove time lock, only locker can remove * @param account The address want to remove time lock * @param index Time lock index */ function _removeTimeLock(address account, uint8 index) internal { require(_timeLocks[account].length > index && index >= 0, "TimeLock: invalid index"); uint256 len = _timeLocks[account].length; if (len - 1 != index) { // if it is not last item, swap it _timeLocks[account][index] = _timeLocks[account][len - 1]; } _timeLocks[account].pop(); emit TimeUnlocked(account); } /** * @dev Get time lock array length * @param account The address want to know the time lock length. * @return time lock length */ function getTimeLockLength(address account) public view returns (uint256) { return _timeLocks[account].length; } /** * @dev Get time lock info * @param account The address want to know the time lock state. * @param index Time lock index * @return time lock info */ function getTimeLock(address account, uint8 index) public view returns (uint256, uint256) { require(_timeLocks[account].length > index && index >= 0, "TimeLock: invalid index"); return (_timeLocks[account][index].amount, _timeLocks[account][index].expiresAt); } function getAllTimeLocks(address account) public view returns (TimeLock[] memory) { require(account != address(0), "TimeLock: query for the zero address"); return _timeLocks[account]; } /** * @dev get total time locked amount of address * @param account The address want to know the time lock amount. * @return time locked amount */ function getTimeLockedAmount(address account) public view returns (uint256) { uint256 timeLockedAmount = 0; uint256 len = _timeLocks[account].length; for (uint256 i = 0; i < len; i++) { if (block.timestamp < _timeLocks[account][i].expiresAt) { timeLockedAmount = timeLockedAmount + _timeLocks[account][i].amount; } } return timeLockedAmount; } /** * @dev Add vesting lock, only locker can add * @param account vesting lock account. * @param amount vesting lock amount. * @param startsAt vesting lock release start date. * @param period vesting lock period. End date is startsAt + (period - 1) * count * @param count vesting lock count. If count is 1, it works like a time lock */ function _addVestingLock( address account, uint256 amount, uint256 startsAt, uint256 period, uint256 count ) internal { require(account != address(0), "VestingLock: lock from the zero address"); // require(startsAt > block.timestamp, "VestingLock: must set after now"); require(period > 0, "VestingLock: period is 0"); require(count > 0, "VestingLock: count is 0"); _vestingLocks[account].push(VestingLock(amount, block.timestamp, startsAt, period, count)); emit VestingLocked(account); } /** * @dev Remove vesting lock, only supervisor can remove * @param account The address want to remove the vesting lock */ function _removeVestingLock(address account, uint256 index) internal { require(index < _vestingLocks[account].length, "Invalid index"); if (index != _vestingLocks[account].length - 1) { _vestingLocks[account][index] = _vestingLocks[account][_vestingLocks[account].length - 1]; } _vestingLocks[account].pop(); } function _updateVestingLock( address account, uint256 index, uint256 amount, uint256 startsAt, uint256 period, uint256 count ) internal { require(account != address(0), "VestingLock: lock from the zero address"); // require(startsAt > block.timestamp, "VestingLock: must set after now"); require(amount > 0, "VestingLock: amount is 0"); require(period > 0, "VestingLock: period is 0"); require(count > 0, "VestingLock: count is 0"); VestingLock storage lock = _vestingLocks[account][index]; lock.amount = amount; lock.startsAt = startsAt; lock.period = period; lock.count = count; emit VestingUpdated(account, index); } /** * @dev Get vesting lock info * @param account The address want to know the vesting lock state. * @return vesting lock info */ function getVestingLock(address account, uint256 index) public view returns (VestingLock memory) { return _vestingLocks[account][index]; } /** * @dev Get total vesting locked amount of address, locked amount will be released by 100%/months * If months is 5, locked amount released 20% per 1 month. * @param account The address want to know the vesting lock amount. * @return vesting locked amount */ function getVestingLockedAmount(address account) public view returns (uint256) { uint256 vestingLockedAmount = 0; for (uint256 i = 0; i < _vestingLocks[account].length; i++) { VestingLock memory lock = _vestingLocks[account][i]; uint256 amount = lock.amount; if (amount > 0) { uint256 startsAt = lock.startsAt; uint256 period = lock.period; uint256 count = lock.count; uint256 expiresAt = startsAt + period * (count); uint256 timestamp = block.timestamp; if (timestamp < startsAt) { vestingLockedAmount += amount; } else if (timestamp < expiresAt) { vestingLockedAmount += (amount * ((expiresAt - timestamp) / period)) / count; } } } return vestingLockedAmount; } /** * @dev Get all locked amount * @param account The address want to know the all locked amount * @return all locked amount */ function getAllLockedAmount(address account) public view returns (uint256) { return getTimeLockedAmount(account) + getVestingLockedAmount(account); } function getAllVestingCount(address account) public view returns (uint256) { require(account != address(0), "VestingLock: query for the zero address"); return _vestingLocks[account].length; } function getAllVestings(address account) public view returns (VestingLock[] memory) { require(account != address(0), "VestingLock: query for the zero address"); return _vestingLocks[account]; } } /** * @dev Contract for vesting, timelock enabled ERC-20 token */ contract TokenImplementation is Initializable, PausableUpgradeable, OwnableUpgradeable, Supervisable, Burnable, Freezable, Lockable, ERC20Upgradeable { function initialize(address owner, string memory name, string memory symbol, uint256 initialSupply) public initializer { __Ownable_init(); __Supervisable_init(); __ERC20_init(name, symbol); _mint(owner, initialSupply * 10 ** decimals()); addLocker(owner); transferSupervisorOwnership(owner); transferOwnership(owner); } /** * @dev Recover ERC20 token in contract address. * @param tokenAddress The token contract address * @param tokenAmount Number of tokens to be sent */ function recoverToken(address tokenAddress, uint256 tokenAmount) public onlyOwner { IERC20Upgradeable(tokenAddress).transfer(owner(), tokenAmount); } /** * @dev lock and pause before transfer token */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal override(ERC20Upgradeable) { require(!isFreezed(from), "Freezable: token transfer from freezed account"); require(!isFreezed(to), "Freezable: token transfer to freezed account"); require(!isFreezed(_msgSender()), "Freezable: token transfer called from freezed account"); require(!paused(), "Pausable: token transfer while paused"); if (from != address(0)) require(balanceOf(from) - getAllLockedAmount(from) >= amount, "Lockable: insufficient transfer amount"); super._beforeTokenTransfer(from, to, amount); } /** * @dev only supervisor can renounce supervisor ownership */ function renounceSupervisorOwnership() public onlySupervisor whenNotPaused { _transferSupervisorOwnership(address(0)); } /** * @dev only supervisor can transfer supervisor ownership */ function transferSupervisorOwnership(address newSupervisor) public onlySupervisor whenNotPaused { require(newSupervisor != address(0), "Supervisable: new supervisor is the zero address"); _transferSupervisorOwnership(newSupervisor); } /** * @dev pause all coin transfer */ function pause() public onlyOwner whenNotPaused { _pause(); } /** * @dev unpause all coin transfer */ function unpause() public onlyOwner whenPaused { _unpause(); } /** * @dev only owner can lock account */ function freeze(address account) public onlyOwner whenNotPaused { _freeze(account); } /** * @dev only supervisor can unfreeze account */ function unfreeze(address account) public onlySupervisor whenNotPaused { _unfreeze(account); } /** * @dev only owner can add burner */ function addBurner(address account) public onlyOwner whenNotPaused { _addBurner(account); } /** * @dev only owner can remove burner */ function removeBurner(address account) public onlyOwner whenNotPaused { _removeBurner(account); } /** * @dev burn burner's coin */ function burn(uint256 amount) public onlyBurner whenNotPaused { _burn(_msgSender(), amount); } /** * @dev only owner can add locker */ function addLocker(address account) public onlyOwner whenNotPaused { _addLocker(account); } /** * @dev only owner can remove locker */ function removeLocker(address account) public onlyOwner whenNotPaused { _removeLocker(account); } /** * @dev only locker can add time lock */ function addTimeLock( address account, uint256 amount, uint256 expiresAt ) public onlyLocker whenNotPaused { _addTimeLock(account, amount, expiresAt); } /** * @dev only supervisor can remove time lock */ function removeTimeLock(address account, uint8 index) public onlySupervisor whenNotPaused { _removeTimeLock(account, index); } /** * @dev only locker can add vesting lock */ function addVestingLock( address account, uint256 amount, uint256 startsAt, uint256 period, uint256 count ) public onlyLocker whenNotPaused { require(amount > 0 && balanceOf(account) >= amount, "VestingLock: amount is 0 or over balance"); _addVestingLock(account, amount, startsAt, period, count); } function updateVestingLock( address account, uint256 index, uint256 amount, uint256 startsAt, uint256 period, uint256 count ) public onlyLocker whenNotPaused { _updateVestingLock(account, index, amount, startsAt, period, count); } /** * @dev only supervisor can remove vesting lock */ function removeVestingLock(address account, uint index) public onlySupervisor whenNotPaused { _removeVestingLock(account, index); } function batchTransfer(address[] memory recipients, uint256[] memory amounts) public { require(recipients.length == amounts.length, "EML: recipients and amounts length mismatch"); for (uint256 i = 0; i < recipients.length; i++) { transfer(recipients[i], amounts[i]); } } function vestedTransfer( address recipient, uint256 amount, uint256 startsAt, uint256 period, uint256 count ) public onlyLocker whenNotPaused { // Transfer tokens to the recipient transfer(recipient, amount); // Add a vesting lock for the recipient addVestingLock(recipient, amount, startsAt, period, count); } function lockedTransfer( address recipient, uint256 amount, uint256 expiresAt ) public onlyLocker whenNotPaused { // Transfer tokens to the recipient transfer(recipient, amount); // Add a timed lock for the recipient addTimeLock(recipient, amount, expiresAt); } function batchVestedTransfer( address[] memory recipients, uint256[] memory amounts, uint256[] memory startsAt, uint256[] memory periods, uint256[] memory counts ) public onlyLocker whenNotPaused { require( recipients.length == amounts.length && ((recipients.length == startsAt.length && recipients.length == periods.length && recipients.length == counts.length) || (startsAt.length == 1 && periods.length == 1 && counts.length == 1)), "EML: arrays must have the same length" ); if (startsAt.length == 1 && periods.length == 1 && counts.length == 1) { for (uint256 i = 0; i < recipients.length; i++) { // Transfer tokens to the recipient transfer(recipients[i], amounts[i]); addVestingLock( recipients[i], amounts[i], startsAt[0], periods[0], counts[0] ); } } else { for (uint256 i = 0; i < recipients.length; i++) { // Transfer tokens to the recipient transfer(recipients[i], amounts[i]); addVestingLock( recipients[i], amounts[i], startsAt[i], periods[i], counts[i] ); } } } function batchTimeLockedTransfer( address[] memory recipients, uint256[] memory amounts, uint256[] memory expiresAt ) public onlyLocker whenNotPaused { require( recipients.length == amounts.length && ((recipients.length == expiresAt.length) || (expiresAt.length == 1)), "EML: arrays must have the same length" ); if (expiresAt.length == 1) { for (uint256 i = 0; i < recipients.length; i++) { // Transfer tokens to the recipient transfer(recipients[i], amounts[i]); addTimeLock( recipients[i], amounts[i], expiresAt[0] ); } } else { for (uint256 i = 0; i < recipients.length; i++) { // Transfer tokens to the recipient transfer(recipients[i], amounts[i]); addTimeLock( recipients[i], amounts[i], expiresAt[i] ); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ 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() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20Upgradeable.sol"; import "./extensions/IERC20MetadataUpgradeable.sol"; import "../../utils/ContextUpgradeable.sol"; import "../../proxy/utils/Initializable.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = _allowances[owner][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Spend `amount` form the allowance of `owner` toward `spender`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[45] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20Upgradeable.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20MetadataUpgradeable is IERC20Upgradeable { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMathUpgradeable { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { 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; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for * deploying minimal proxy contracts, also known as "clones". * * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies * > a minimal bytecode implementation that delegates all calls to a known, fixed address. * * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2` * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the * deterministic method. * * _Available since v3.4._ */ library Clones { /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function clone(address implementation) internal returns (address instance) { // solhint-disable-next-line no-inline-assembly assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create(0, ptr, 0x37) } require(instance != address(0), "ERC1167: create failed"); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { // solhint-disable-next-line no-inline-assembly assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create2(0, ptr, 0x37, salt) } require(instance != address(0), "ERC1167: create2 failed"); } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress(address implementation, bytes32 salt, address deployer) internal pure returns (address predicted) { // solhint-disable-next-line no-inline-assembly assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000) mstore(add(ptr, 0x38), shl(0x60, deployer)) mstore(add(ptr, 0x4c), salt) mstore(add(ptr, 0x6c), keccak256(ptr, 0x37)) predicted := keccak256(add(ptr, 0x37), 0x55) } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress(address implementation, bytes32 salt) internal view returns (address predicted) { return predictDeterministicAddress(implementation, salt, address(this)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/proxy/Clones.sol"; import "./Token_Implementation.sol"; contract TokenFactory is Ownable { address public logicContract; event ProxyCreated(address indexed proxy); constructor(address _logicContract) { logicContract = _logicContract; } function createProxy(address owner, string memory name, string memory symbol, uint256 initialSupply) public onlyOwner returns (address) { address newToken = Clones.clone(logicContract); TokenImplementation(newToken).initialize(owner, name, symbol, initialSupply); emit ProxyCreated(newToken); return newToken; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
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":true,"internalType":"address","name":"account","type":"address"}],"name":"BurnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"BurnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Freezed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"LockerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"LockerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previouSupervisor","type":"address"},{"indexed":true,"internalType":"address","name":"newSupervisor","type":"address"}],"name":"SupervisorOwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TimeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TimeUnlocked","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":"address","name":"account","type":"address"}],"name":"Unfreezed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"VestingLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"VestingUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"VestingUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiresAt","type":"uint256"}],"name":"addTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startsAt","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"addVestingLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"expiresAt","type":"uint256[]"}],"name":"batchTimeLockedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"batchTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"startsAt","type":"uint256[]"},{"internalType":"uint256[]","name":"periods","type":"uint256[]"},{"internalType":"uint256[]","name":"counts","type":"uint256[]"}],"name":"batchVestedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"freeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAllLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAllTimeLocks","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockedAt","type":"uint256"},{"internalType":"uint256","name":"expiresAt","type":"uint256"}],"internalType":"struct Lockable.TimeLock[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAllVestingCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAllVestings","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockedAt","type":"uint256"},{"internalType":"uint256","name":"startsAt","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"internalType":"struct Lockable.VestingLock[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"index","type":"uint8"}],"name":"getTimeLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTimeLockLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTimeLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getVestingLock","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockedAt","type":"uint256"},{"internalType":"uint256","name":"startsAt","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"internalType":"struct Lockable.VestingLock","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVestingLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"initialSupply","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBurner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isFreezed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isLocker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiresAt","type":"uint256"}],"name":"lockedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"index","type":"uint8"}],"name":"removeTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"removeVestingLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceSupervisorOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supervisor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSupervisor","type":"address"}],"name":"transferSupervisorOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unfreeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startsAt","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"updateVestingLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startsAt","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"vestedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613ec4806100206000396000f3fe608060405234801561001057600080fd5b50600436106102f15760003560e01c8063715018a61161019d578063ab4e942a116100e9578063d43916a3116100a2578063ef5f72521161007c578063ef5f725214610735578063f2fde38b14610748578063f44637ba1461075b578063fc67bca11461076e57600080fd5b8063d43916a3146106c9578063dd62ed3e146106e9578063dda95f741461072257600080fd5b8063ab4e942a1461064c578063b0a087c51461065f578063b29a814014610667578063ba40c71a1461067a578063be4329f4146106a3578063ce62cd4a146106b657600080fd5b806388d695b21161015657806395d89b411161013057806395d89b411461060b578063a457c2d714610613578063a9059cbb14610626578063ab0de0fe1461063957600080fd5b806388d695b2146105d45780638d1fdf2f146105e75780638da5cb5b146105fa57600080fd5b8063715018a61461055f57806372ea8499146105675780638111f24e1461057a5780638456cb59146105a65780638501dcf2146105ae578063854d9ffe146105c157600080fd5b8063395093511161025c5780634ca47ad11161021557806356e4b68b116101ef57806356e4b68b146104f35780635c975abb146105185780636f395c831461052357806370a082311461053657600080fd5b80634ca47ad1146104a55780634d12d4b6146104cd578063521c1ae0146104e057600080fd5b806339509351146104255780633f4ba83a1461043857806342966c68146104405780634334614a1461045357806345c8b1a61461047f57806345cc58901461049257600080fd5b806323b872dd116102ae57806323b872dd1461039157806324e58857146103a45780632c08b4b2146103c45780632ec63d7c146103d7578063313ce56714610403578063363b3c151461041257600080fd5b806302846858146102f657806306fdde031461030b578063095ea7b3146103295780630a7c8ba51461034c5780630d6054821461036c57806318160ddd1461037f575b600080fd5b610309610304366004613363565b610781565b005b6103136107e3565b6040516103209190613385565b60405180910390f35b61033c6103373660046133da565b610875565b6040519015158152602001610320565b61035f61035a3660046133da565b61088f565b6040516103209190613404565b61030961037a36600461343d565b61093e565b609f545b604051908152602001610320565b61033c61039f366004613470565b6109a0565b6103b76103b2366004613363565b6109c4565b60405161032091906134ac565b6103096103d23660046133da565b610a8e565b61033c6103e5366004613363565b6001600160a01b03166000908152609a602052604090205460ff1690565b60405160128152602001610320565b610309610420366004613363565b610ae9565b61033c6104333660046133da565b610bae565b610309610bed565b61030961044e366004613525565b610c6a565b61033c610461366004613363565b6001600160a01b031660009081526098602052604090205460ff1690565b61030961048d366004613363565b610cf6565b6103096104a0366004613363565b610d4c565b6104b86104b336600461353e565b610da2565b60408051928352602083019190915201610320565b6103096104db366004613632565b610e9a565b6103096104ee36600461379f565b610fab565b6097546001600160a01b03165b6040516001600160a01b039091168152602001610320565b60335460ff1661033c565b61030961053136600461353e565b611234565b610383610544366004613363565b6001600160a01b03166000908152609d602052604090205490565b61030961128b565b610309610575366004613871565b6112bf565b61033c610588366004613363565b6001600160a01b031660009081526099602052604090205460ff1690565b61030961131f565b6103836105bc366004613363565b611374565b6103836105cf366004613363565b6113b8565b6103096105e23660046138bb565b6113d6565b6103096105f5366004613363565b611489565b6065546001600160a01b0316610500565b6103136114df565b61033c6106213660046133da565b6114ee565b61033c6106343660046133da565b611580565b610383610647366004613363565b61158e565b61030961065a36600461391f565b6116d4565b6103096117be565b6103096106753660046133da565b611815565b610383610688366004613363565b6001600160a01b03166000908152609b602052604090205490565b6103836106b1366004613363565b6118d1565b6103096106c4366004613363565b61199e565b6106dc6106d7366004613363565b6119f4565b6040516103209190613961565b6103836106f73660046139ba565b6001600160a01b039182166000908152609e6020908152604080832093909416825291909152205490565b61030961073036600461391f565b611adb565b61030961074336600461343d565b611b45565b610309610756366004613363565b611bad565b610309610769366004613363565b611c45565b61030961077c3660046139ed565b611c9b565b6065546001600160a01b031633146107b45760405162461bcd60e51b81526004016107ab90613a75565b60405180910390fd5b60335460ff16156107d75760405162461bcd60e51b81526004016107ab90613aaa565b6107e081611e58565b50565b606060a080546107f290613ad4565b80601f016020809104026020016040519081016040528092919081815260200182805461081e90613ad4565b801561086b5780601f106108405761010080835404028352916020019161086b565b820191906000526020600020905b81548152906001019060200180831161084e57829003601f168201915b5050505050905090565b600033610883818585611ea1565b60019150505b92915050565b6108c16040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b0383166000908152609c602052604090208054839081106108eb576108eb613b0f565b90600052602060002090600502016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050905092915050565b336000908152609a602052604090205460ff1661096d5760405162461bcd60e51b81526004016107ab90613b25565b60335460ff16156109905760405162461bcd60e51b81526004016107ab90613aaa565b61099b838383611fc5565b505050565b6000336109ae8582856120ef565b6109b985858561217b565b506001949350505050565b60606001600160a01b0382166109ec5760405162461bcd60e51b81526004016107ab90613b5a565b6001600160a01b0382166000908152609c6020908152604080832080548251818502810185019093528083529193909284015b82821015610a8357838290600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505081526020019060010190610a1f565b505050509050919050565b6097546001600160a01b03163314610ab85760405162461bcd60e51b81526004016107ab90613ba1565b60335460ff1615610adb5760405162461bcd60e51b81526004016107ab90613aaa565b610ae58282612354565b5050565b6097546001600160a01b03163314610b135760405162461bcd60e51b81526004016107ab90613ba1565b60335460ff1615610b365760405162461bcd60e51b81526004016107ab90613aaa565b6001600160a01b038116610ba55760405162461bcd60e51b815260206004820152603060248201527f537570657276697361626c653a206e65772073757065727669736f722069732060448201526f746865207a65726f206164647265737360801b60648201526084016107ab565b6107e0816124f2565b336000818152609e602090815260408083206001600160a01b03871684529091528120549091906108839082908690610be8908790613c01565b611ea1565b6065546001600160a01b03163314610c175760405162461bcd60e51b81526004016107ab90613a75565b60335460ff16610c605760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107ab565b610c68612544565b565b3360009081526098602052604090205460ff16610cc95760405162461bcd60e51b815260206004820181905260248201527f4275726e61626c653a2063616c6c6572206973206e6f742061206275726e657260448201526064016107ab565b60335460ff1615610cec5760405162461bcd60e51b81526004016107ab90613aaa565b6107e033826125d7565b6097546001600160a01b03163314610d205760405162461bcd60e51b81526004016107ab90613ba1565b60335460ff1615610d435760405162461bcd60e51b81526004016107ab90613aaa565b6107e081612731565b6065546001600160a01b03163314610d765760405162461bcd60e51b81526004016107ab90613a75565b60335460ff1615610d995760405162461bcd60e51b81526004016107ab90613aaa565b6107e08161277a565b6001600160a01b0382166000908152609b6020526040812054819060ff8416108015610dcc575060015b610e125760405162461bcd60e51b81526020600482015260176024820152760a8d2daca98dec6d67440d2dcecc2d8d2c840d2dcc8caf604b1b60448201526064016107ab565b6001600160a01b0384166000908152609b60205260409020805460ff8516908110610e3f57610e3f613b0f565b600091825260208083206003909202909101546001600160a01b0387168352609b9091526040909120805460ff8616908110610e7d57610e7d613b0f565b906000526020600020906003020160020154915091509250929050565b600054610100900460ff16610eb55760005460ff1615610eb9565b303b155b610f1c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016107ab565b600054610100900460ff16158015610f3e576000805461ffff19166101011790555b610f466127c6565b610f4e6127f5565b610f588484612824565b610f7785610f686012600a613cfd565b610f729085613d0c565b612855565b610f8085610d4c565b610f8985610ae9565b610f9285611bad565b8015610fa4576000805461ff00191690555b5050505050565b336000908152609a602052604090205460ff16610fda5760405162461bcd60e51b81526004016107ab90613b25565b60335460ff1615610ffd5760405162461bcd60e51b81526004016107ab90613aaa565b8351855114801561104d57508251855114801561101b575081518551145b8015611028575080518551145b8061104d575082516001148015611040575081516001145b801561104d575080516001145b6110695760405162461bcd60e51b81526004016107ab90613d2b565b8251600114801561107b575081516001145b8015611088575080516001145b1561117b5760005b8551811015611175576110d58682815181106110ae576110ae613b0f565b60200260200101518683815181106110c8576110c8613b0f565b6020026020010151611580565b506111638682815181106110eb576110eb613b0f565b602002602001015186838151811061110557611105613b0f565b60200260200101518660008151811061112057611120613b0f565b60200260200101518660008151811061113b5761113b613b0f565b60200260200101518660008151811061115657611156613b0f565b60200260200101516116d4565b8061116d81613d70565b915050611090565b50610fa4565b60005b855181101561122c5761119c8682815181106110ae576110ae613b0f565b5061121a8682815181106111b2576111b2613b0f565b60200260200101518683815181106111cc576111cc613b0f565b60200260200101518684815181106111e6576111e6613b0f565b602002602001015186858151811061120057611200613b0f565b602002602001015186868151811061115657611156613b0f565b8061122481613d70565b91505061117e565b505050505050565b6097546001600160a01b0316331461125e5760405162461bcd60e51b81526004016107ab90613ba1565b60335460ff16156112815760405162461bcd60e51b81526004016107ab90613aaa565b610ae58282612940565b6065546001600160a01b031633146112b55760405162461bcd60e51b81526004016107ab90613a75565b610c686000612b02565b336000908152609a602052604090205460ff166112ee5760405162461bcd60e51b81526004016107ab90613b25565b60335460ff16156113115760405162461bcd60e51b81526004016107ab90613aaa565b61122c868686868686612b54565b6065546001600160a01b031633146113495760405162461bcd60e51b81526004016107ab90613a75565b60335460ff161561136c5760405162461bcd60e51b81526004016107ab90613aaa565b610c68612cfa565b60006001600160a01b03821661139c5760405162461bcd60e51b81526004016107ab90613b5a565b506001600160a01b03166000908152609c602052604090205490565b60006113c38261158e565b6113cc836118d1565b6108899190613c01565b805182511461143b5760405162461bcd60e51b815260206004820152602b60248201527f454d4c3a20726563697069656e747320616e6420616d6f756e7473206c656e6760448201526a0e8d040dad2e6dac2e8c6d60ab1b60648201526084016107ab565b60005b825181101561099b5761147683828151811061145c5761145c613b0f565b60200260200101518383815181106110c8576110c8613b0f565b508061148181613d70565b91505061143e565b6065546001600160a01b031633146114b35760405162461bcd60e51b81526004016107ab90613a75565b60335460ff16156114d65760405162461bcd60e51b81526004016107ab90613aaa565b6107e081612d52565b606060a180546107f290613ad4565b336000818152609e602090815260408083206001600160a01b0387168452909152812054909190838110156115735760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016107ab565b6109b98286868403611ea1565b60003361088381858561217b565b600080805b6001600160a01b0384166000908152609c60205260409020548110156116cd576001600160a01b0384166000908152609c602052604081208054839081106115dd576115dd613b0f565b60009182526020918290206040805160a0810182526005909302909101805480845260018201549484019490945260028101549183019190915260038101546060830152600401546080820152915080156116b857604082015160608301516080840151600061164d8284613d0c565b6116579085613c01565b905042848110156116735761166c868a613c01565b98506116b2565b818110156116b25782846116878385613d8b565b6116919190613da2565b61169b9088613d0c565b6116a59190613da2565b6116af908a613c01565b98505b50505050505b505080806116c590613d70565b915050611593565b5092915050565b336000908152609a602052604090205460ff166117035760405162461bcd60e51b81526004016107ab90613b25565b60335460ff16156117265760405162461bcd60e51b81526004016107ab90613aaa565b600084118015611754575083611751866001600160a01b03166000908152609d602052604090205490565b10155b6117b15760405162461bcd60e51b815260206004820152602860248201527f56657374696e674c6f636b3a20616d6f756e742069732030206f72206f7665726044820152672062616c616e636560c01b60648201526084016107ab565b610fa48585858585612d9e565b6097546001600160a01b031633146117e85760405162461bcd60e51b81526004016107ab90613ba1565b60335460ff161561180b5760405162461bcd60e51b81526004016107ab90613aaa565b610c6860006124f2565b6065546001600160a01b0316331461183f5760405162461bcd60e51b81526004016107ab90613a75565b816001600160a01b031663a9059cbb6118606065546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156118ad573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099b9190613dc4565b6001600160a01b0381166000908152609b60205260408120548190815b81811015611995576001600160a01b0385166000908152609b6020526040902080548290811061192057611920613b0f565b906000526020600020906003020160020154421015611983576001600160a01b0385166000908152609b6020526040902080548290811061196357611963613b0f565b906000526020600020906003020160000154836119809190613c01565b92505b8061198d81613d70565b9150506118ee565b50909392505050565b6065546001600160a01b031633146119c85760405162461bcd60e51b81526004016107ab90613a75565b60335460ff16156119eb5760405162461bcd60e51b81526004016107ab90613aaa565b6107e081612f03565b60606001600160a01b038216611a585760405162461bcd60e51b8152602060048201526024808201527f54696d654c6f636b3a20717565727920666f7220746865207a65726f206164646044820152637265737360e01b60648201526084016107ab565b6001600160a01b0382166000908152609b6020908152604080832080548251818502810185019093528083529193909284015b82821015610a835783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190611a8b565b336000908152609a602052604090205460ff16611b0a5760405162461bcd60e51b81526004016107ab90613b25565b60335460ff1615611b2d5760405162461bcd60e51b81526004016107ab90613aaa565b611b378585611580565b50610fa485858585856116d4565b336000908152609a602052604090205460ff16611b745760405162461bcd60e51b81526004016107ab90613b25565b60335460ff1615611b975760405162461bcd60e51b81526004016107ab90613aaa565b611ba18383611580565b5061099b83838361093e565b6065546001600160a01b03163314611bd75760405162461bcd60e51b81526004016107ab90613a75565b6001600160a01b038116611c3c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107ab565b6107e081612b02565b6065546001600160a01b03163314611c6f5760405162461bcd60e51b81526004016107ab90613a75565b60335460ff1615611c925760405162461bcd60e51b81526004016107ab90613aaa565b6107e081612f4c565b336000908152609a602052604090205460ff16611cca5760405162461bcd60e51b81526004016107ab90613b25565b60335460ff1615611ced5760405162461bcd60e51b81526004016107ab90613aaa565b81518351148015611d0a5750805183511480611d0a575080516001145b611d265760405162461bcd60e51b81526004016107ab90613d2b565b805160011415611ddb5760005b8351811015611dd557611d6b848281518110611d5157611d51613b0f565b60200260200101518483815181106110c8576110c8613b0f565b50611dc3848281518110611d8157611d81613b0f565b6020026020010151848381518110611d9b57611d9b613b0f565b602002602001015184600081518110611db657611db6613b0f565b602002602001015161093e565b80611dcd81613d70565b915050611d33565b50505050565b60005b8351811015611dd557611dfc848281518110611d5157611d51613b0f565b50611e46848281518110611e1257611e12613b0f565b6020026020010151848381518110611e2c57611e2c613b0f565b6020026020010151848481518110611db657611db6613b0f565b80611e5081613d70565b915050611dde565b6001600160a01b038116600081815260986020526040808220805460ff19169055517f90eabbc0c667db2a5029ed6bc0f5fe9f356d11684a4ca9fcfaec0e53f12b9c8e9190a250565b6001600160a01b038316611f035760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016107ab565b6001600160a01b038216611f645760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016107ab565b6001600160a01b038381166000818152609e602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600082116120155760405162461bcd60e51b815260206004820152601a60248201527f54696d654c6f636b3a206c6f636b20616d6f756e74206973203000000000000060448201526064016107ab565b4281116120645760405162461bcd60e51b815260206004820152601d60248201527f54696d654c6f636b3a20696e76616c696420657870697265206461746500000060448201526064016107ab565b6001600160a01b0383166000818152609b6020908152604080832081516060810183528781524281850190815281840188815283546001818101865594885295872092516003909602909201948555519184019190915551600290920191909155517fc80fbc3452298019908587d820303825af4187ac57ed90d7328886fd00b225579190a2505050565b6001600160a01b038381166000908152609e60209081526040808320938616835292905220546000198114611dd5578181101561216e5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016107ab565b611dd58484848403611ea1565b6001600160a01b0383166121df5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016107ab565b6001600160a01b0382166122415760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016107ab565b61224c838383612f98565b6001600160a01b0383166000908152609d6020526040902054818110156122c45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016107ab565b6001600160a01b038085166000908152609d60205260408082208585039055918516815290812080548492906122fb908490613c01565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161234791815260200190565b60405180910390a3611dd5565b6001600160a01b0382166000908152609c602052604090205481106123ab5760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016107ab565b6001600160a01b0382166000908152609c60205260409020546123d090600190613d8b565b8114612494576001600160a01b0382166000908152609c6020526040902080546123fc90600190613d8b565b8154811061240c5761240c613b0f565b9060005260206000209060050201609c6000846001600160a01b03166001600160a01b03168152602001908152602001600020828154811061245057612450613b0f565b906000526020600020906005020160008201548160000155600182015481600101556002820154816002015560038201548160030155600482015481600401559050505b6001600160a01b0382166000908152609c602052604090208054806124bb576124bb613de6565b6000828152602081206005600019909301928302018181556001810182905560028101829055600381018290556004015590555050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907facf6a327286171e5ce7f9bf15425ff49aab0fd07752fec84b2bd232c9f480c1790600090a35050565b60335460ff1661258d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107ab565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0382166126375760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016107ab565b61264382600083612f98565b6001600160a01b0382166000908152609d6020526040902054818110156126b75760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016107ab565b6001600160a01b0383166000908152609d602052604081208383039055609f80548492906126e6908490613d8b565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6001600160a01b038116600081815260996020526040808220805460ff19169055517f4d1fe3cc0f516ce2cfc5e83d52ee28af7f55376b18f58e7081c5fd25d8eeb1df9190a250565b6001600160a01b0381166000818152609a6020526040808220805460ff19166001179055517f7c5af8d36d8be103bc583da8e01d3e98f15216cc7ef38832c7550b34e8feb43a9190a250565b600054610100900460ff166127ed5760405162461bcd60e51b81526004016107ab90613dfc565b610c68613204565b600054610100900460ff1661281c5760405162461bcd60e51b81526004016107ab90613dfc565b610c68613234565b600054610100900460ff1661284b5760405162461bcd60e51b81526004016107ab90613dfc565b610ae58282613264565b6001600160a01b0382166128ab5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016107ab565b6128b760008383612f98565b80609f60008282546128c99190613c01565b90915550506001600160a01b0382166000908152609d6020526040812080548392906128f6908490613c01565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166000908152609b602052604090205460ff8216108015612968575060015b6129ae5760405162461bcd60e51b81526020600482015260176024820152760a8d2daca98dec6d67440d2dcecc2d8d2c840d2dcc8caf604b1b60448201526064016107ab565b6001600160a01b0382166000908152609b602052604090205460ff82166129d6600183613d8b565b14612a7e576001600160a01b0383166000908152609b602052604090206129fe600183613d8b565b81548110612a0e57612a0e613b0f565b9060005260206000209060030201609b6000856001600160a01b03166001600160a01b031681526020019081526020016000208360ff1681548110612a5557612a55613b0f565b600091825260209091208254600390920201908155600180830154908201556002918201549101555b6001600160a01b0383166000908152609b60205260409020805480612aa557612aa5613de6565b6000828152602081206003600019909301928302018181556001810182905560020181905591556040516001600160a01b038516917fb34baa9e1ce392292123bbdca3018904b21991f7411e14d99a10aaf88ec8ea0d91a2505050565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038616612b7a5760405162461bcd60e51b81526004016107ab90613e47565b60008411612bca5760405162461bcd60e51b815260206004820152601860248201527f56657374696e674c6f636b3a20616d6f756e742069732030000000000000000060448201526064016107ab565b60008211612c155760405162461bcd60e51b8152602060048201526018602482015277056657374696e674c6f636b3a20706572696f6420697320360441b60448201526064016107ab565b60008111612c5f5760405162461bcd60e51b8152602060048201526017602482015276056657374696e674c6f636b3a20636f756e74206973203604c1b60448201526064016107ab565b6001600160a01b0386166000908152609c60205260408120805487908110612c8957612c89613b0f565b60009182526020918290206005909102018681556002810186905560038101859055600481018490556040518881529092506001600160a01b038916917fe85844ca2c3e2785bea012532bceb8435e58637d4430f1bd131a88a55dad398e910160405180910390a250505050505050565b60335460ff1615612d1d5760405162461bcd60e51b81526004016107ab90613aaa565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586125ba3390565b6001600160a01b038116600081815260996020526040808220805460ff19166001179055517f0de8364a528e5ca2869160b20c375fe85b4e98d24a9cb48b4dc49c5f76d05b249190a250565b6001600160a01b038516612dc45760405162461bcd60e51b81526004016107ab90613e47565b60008211612e0f5760405162461bcd60e51b8152602060048201526018602482015277056657374696e674c6f636b3a20706572696f6420697320360441b60448201526064016107ab565b60008111612e595760405162461bcd60e51b8152602060048201526017602482015276056657374696e674c6f636b3a20636f756e74206973203604c1b60448201526064016107ab565b6001600160a01b0385166000818152609c60209081526040808320815160a081018352898152428185019081528184018a8152606083018a8152608084018a8152855460018181018855968a5297892094516005909802909401968755915193860193909355915160028501559051600384015551600490920191909155517f04a72c810da52db1f0e22421438d411667cd0c1559e9ae7c638f1aed4bfa066d9190a25050505050565b6001600160a01b0381166000818152609a6020526040808220805460ff19169055517f95266445d018e5b30f957c915e91b04bb4a19bf0f8f21020a08dad9be7931df49190a250565b6001600160a01b038116600081815260986020526040808220805460ff19166001179055517f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b945609190a250565b6001600160a01b03831660009081526099602052604090205460ff16156130185760405162461bcd60e51b815260206004820152602e60248201527f467265657a61626c653a20746f6b656e207472616e736665722066726f6d206660448201526d1c99595e9959081858d8dbdd5b9d60921b60648201526084016107ab565b6001600160a01b03821660009081526099602052604090205460ff16156130965760405162461bcd60e51b815260206004820152602c60248201527f467265657a61626c653a20746f6b656e207472616e7366657220746f2066726560448201526b195e9959081858d8dbdd5b9d60a21b60648201526084016107ab565b61309f33610588565b1561310a5760405162461bcd60e51b815260206004820152603560248201527f467265657a61626c653a20746f6b656e207472616e736665722063616c6c656460448201527408199c9bdb48199c99595e9959081858d8dbdd5b9d605a1b60648201526084016107ab565b60335460ff161561316b5760405162461bcd60e51b815260206004820152602560248201527f5061757361626c653a20746f6b656e207472616e73666572207768696c652070604482015264185d5cd95960da1b60648201526084016107ab565b6001600160a01b0383161561099b5780613184846113b8565b6001600160a01b0385166000908152609d60205260409020546131a79190613d8b565b101561099b5760405162461bcd60e51b815260206004820152602660248201527f4c6f636b61626c653a20696e73756666696369656e74207472616e7366657220604482015265185b5bdd5b9d60d21b60648201526084016107ab565b600054610100900460ff1661322b5760405162461bcd60e51b81526004016107ab90613dfc565b610c6833612b02565b600054610100900460ff1661325b5760405162461bcd60e51b81526004016107ab90613dfc565b610c68336124f2565b600054610100900460ff1661328b5760405162461bcd60e51b81526004016107ab90613dfc565b815161329e9060a09060208501906132ae565b50805161099b9060a19060208401905b8280546132ba90613ad4565b90600052602060002090601f0160209004810192826132dc5760008555613322565b82601f106132f557805160ff1916838001178555613322565b82800160010185558215613322579182015b82811115613322578251825591602001919060010190613307565b5061332e929150613332565b5090565b5b8082111561332e5760008155600101613333565b80356001600160a01b038116811461335e57600080fd5b919050565b60006020828403121561337557600080fd5b61337e82613347565b9392505050565b600060208083528351808285015260005b818110156133b257858101830151858201604001528201613396565b818111156133c4576000604083870101525b50601f01601f1916929092016040019392505050565b600080604083850312156133ed57600080fd5b6133f683613347565b946020939093013593505050565b60a08101610889828480518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b60008060006060848603121561345257600080fd5b61345b84613347565b95602085013595506040909401359392505050565b60008060006060848603121561348557600080fd5b61348e84613347565b925061349c60208501613347565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b818110156135195761350683855180518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b9284019260a092909201916001016134c8565b50909695505050505050565b60006020828403121561353757600080fd5b5035919050565b6000806040838503121561355157600080fd5b61355a83613347565b9150602083013560ff8116811461357057600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156135ba576135ba61357b565b604052919050565b600082601f8301126135d357600080fd5b813567ffffffffffffffff8111156135ed576135ed61357b565b613600601f8201601f1916602001613591565b81815284602083860101111561361557600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561364857600080fd5b61365185613347565b9350602085013567ffffffffffffffff8082111561366e57600080fd5b61367a888389016135c2565b9450604087013591508082111561369057600080fd5b5061369d878288016135c2565b949793965093946060013593505050565b600067ffffffffffffffff8211156136c8576136c861357b565b5060051b60200190565b600082601f8301126136e357600080fd5b813560206136f86136f3836136ae565b613591565b82815260059290921b8401810191818101908684111561371757600080fd5b8286015b848110156137395761372c81613347565b835291830191830161371b565b509695505050505050565b600082601f83011261375557600080fd5b813560206137656136f3836136ae565b82815260059290921b8401810191818101908684111561378457600080fd5b8286015b848110156137395780358352918301918301613788565b600080600080600060a086880312156137b757600080fd5b853567ffffffffffffffff808211156137cf57600080fd5b6137db89838a016136d2565b965060208801359150808211156137f157600080fd5b6137fd89838a01613744565b9550604088013591508082111561381357600080fd5b61381f89838a01613744565b9450606088013591508082111561383557600080fd5b61384189838a01613744565b9350608088013591508082111561385757600080fd5b5061386488828901613744565b9150509295509295909350565b60008060008060008060c0878903121561388a57600080fd5b61389387613347565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b600080604083850312156138ce57600080fd5b823567ffffffffffffffff808211156138e657600080fd5b6138f2868387016136d2565b9350602085013591508082111561390857600080fd5b5061391585828601613744565b9150509250929050565b600080600080600060a0868803121561393757600080fd5b61394086613347565b97602087013597506040870135966060810135965060800135945092505050565b602080825282518282018190526000919060409081850190868401855b828110156139ad578151805185528681015187860152850151858501526060909301929085019060010161397e565b5091979650505050505050565b600080604083850312156139cd57600080fd5b6139d683613347565b91506139e460208401613347565b90509250929050565b600080600060608486031215613a0257600080fd5b833567ffffffffffffffff80821115613a1a57600080fd5b613a26878388016136d2565b94506020860135915080821115613a3c57600080fd5b613a4887838801613744565b93506040860135915080821115613a5e57600080fd5b50613a6b86828701613744565b9150509250925092565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b600181811c90821680613ae857607f821691505b60208210811415613b0957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6020808252818101527f4c6f636b61626c653a2063616c6c6572206973206e6f742061206c6f636b6572604082015260600190565b60208082526027908201527f56657374696e674c6f636b3a20717565727920666f7220746865207a65726f206040820152666164647265737360c81b606082015260800190565b6020808252602a908201527f537570657276697361626c653a2063616c6c6572206973206e6f74207468652060408201526939bab832b93b34b9b7b960b11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115613c1457613c14613beb565b500190565b600181815b80851115613c54578160001904821115613c3a57613c3a613beb565b80851615613c4757918102915b93841c9390800290613c1e565b509250929050565b600082613c6b57506001610889565b81613c7857506000610889565b8160018114613c8e5760028114613c9857613cb4565b6001915050610889565b60ff841115613ca957613ca9613beb565b50506001821b610889565b5060208310610133831016604e8410600b8410161715613cd7575081810a610889565b613ce18383613c19565b8060001904821115613cf557613cf5613beb565b029392505050565b600061337e60ff841683613c5c565b6000816000190483118215151615613d2657613d26613beb565b500290565b60208082526025908201527f454d4c3a20617272617973206d7573742068617665207468652073616d65206c6040820152640cadccee8d60db1b606082015260800190565b6000600019821415613d8457613d84613beb565b5060010190565b600082821015613d9d57613d9d613beb565b500390565b600082613dbf57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215613dd657600080fd5b8151801515811461337e57600080fd5b634e487b7160e01b600052603160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526027908201527f56657374696e674c6f636b3a206c6f636b2066726f6d20746865207a65726f206040820152666164647265737360c81b60608201526080019056fea2646970667358221220a06f59e1233341dd69d77387147f9f2ed2558c794c5a8869c844459a5dd1438164736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102f15760003560e01c8063715018a61161019d578063ab4e942a116100e9578063d43916a3116100a2578063ef5f72521161007c578063ef5f725214610735578063f2fde38b14610748578063f44637ba1461075b578063fc67bca11461076e57600080fd5b8063d43916a3146106c9578063dd62ed3e146106e9578063dda95f741461072257600080fd5b8063ab4e942a1461064c578063b0a087c51461065f578063b29a814014610667578063ba40c71a1461067a578063be4329f4146106a3578063ce62cd4a146106b657600080fd5b806388d695b21161015657806395d89b411161013057806395d89b411461060b578063a457c2d714610613578063a9059cbb14610626578063ab0de0fe1461063957600080fd5b806388d695b2146105d45780638d1fdf2f146105e75780638da5cb5b146105fa57600080fd5b8063715018a61461055f57806372ea8499146105675780638111f24e1461057a5780638456cb59146105a65780638501dcf2146105ae578063854d9ffe146105c157600080fd5b8063395093511161025c5780634ca47ad11161021557806356e4b68b116101ef57806356e4b68b146104f35780635c975abb146105185780636f395c831461052357806370a082311461053657600080fd5b80634ca47ad1146104a55780634d12d4b6146104cd578063521c1ae0146104e057600080fd5b806339509351146104255780633f4ba83a1461043857806342966c68146104405780634334614a1461045357806345c8b1a61461047f57806345cc58901461049257600080fd5b806323b872dd116102ae57806323b872dd1461039157806324e58857146103a45780632c08b4b2146103c45780632ec63d7c146103d7578063313ce56714610403578063363b3c151461041257600080fd5b806302846858146102f657806306fdde031461030b578063095ea7b3146103295780630a7c8ba51461034c5780630d6054821461036c57806318160ddd1461037f575b600080fd5b610309610304366004613363565b610781565b005b6103136107e3565b6040516103209190613385565b60405180910390f35b61033c6103373660046133da565b610875565b6040519015158152602001610320565b61035f61035a3660046133da565b61088f565b6040516103209190613404565b61030961037a36600461343d565b61093e565b609f545b604051908152602001610320565b61033c61039f366004613470565b6109a0565b6103b76103b2366004613363565b6109c4565b60405161032091906134ac565b6103096103d23660046133da565b610a8e565b61033c6103e5366004613363565b6001600160a01b03166000908152609a602052604090205460ff1690565b60405160128152602001610320565b610309610420366004613363565b610ae9565b61033c6104333660046133da565b610bae565b610309610bed565b61030961044e366004613525565b610c6a565b61033c610461366004613363565b6001600160a01b031660009081526098602052604090205460ff1690565b61030961048d366004613363565b610cf6565b6103096104a0366004613363565b610d4c565b6104b86104b336600461353e565b610da2565b60408051928352602083019190915201610320565b6103096104db366004613632565b610e9a565b6103096104ee36600461379f565b610fab565b6097546001600160a01b03165b6040516001600160a01b039091168152602001610320565b60335460ff1661033c565b61030961053136600461353e565b611234565b610383610544366004613363565b6001600160a01b03166000908152609d602052604090205490565b61030961128b565b610309610575366004613871565b6112bf565b61033c610588366004613363565b6001600160a01b031660009081526099602052604090205460ff1690565b61030961131f565b6103836105bc366004613363565b611374565b6103836105cf366004613363565b6113b8565b6103096105e23660046138bb565b6113d6565b6103096105f5366004613363565b611489565b6065546001600160a01b0316610500565b6103136114df565b61033c6106213660046133da565b6114ee565b61033c6106343660046133da565b611580565b610383610647366004613363565b61158e565b61030961065a36600461391f565b6116d4565b6103096117be565b6103096106753660046133da565b611815565b610383610688366004613363565b6001600160a01b03166000908152609b602052604090205490565b6103836106b1366004613363565b6118d1565b6103096106c4366004613363565b61199e565b6106dc6106d7366004613363565b6119f4565b6040516103209190613961565b6103836106f73660046139ba565b6001600160a01b039182166000908152609e6020908152604080832093909416825291909152205490565b61030961073036600461391f565b611adb565b61030961074336600461343d565b611b45565b610309610756366004613363565b611bad565b610309610769366004613363565b611c45565b61030961077c3660046139ed565b611c9b565b6065546001600160a01b031633146107b45760405162461bcd60e51b81526004016107ab90613a75565b60405180910390fd5b60335460ff16156107d75760405162461bcd60e51b81526004016107ab90613aaa565b6107e081611e58565b50565b606060a080546107f290613ad4565b80601f016020809104026020016040519081016040528092919081815260200182805461081e90613ad4565b801561086b5780601f106108405761010080835404028352916020019161086b565b820191906000526020600020905b81548152906001019060200180831161084e57829003601f168201915b5050505050905090565b600033610883818585611ea1565b60019150505b92915050565b6108c16040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b0383166000908152609c602052604090208054839081106108eb576108eb613b0f565b90600052602060002090600502016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050905092915050565b336000908152609a602052604090205460ff1661096d5760405162461bcd60e51b81526004016107ab90613b25565b60335460ff16156109905760405162461bcd60e51b81526004016107ab90613aaa565b61099b838383611fc5565b505050565b6000336109ae8582856120ef565b6109b985858561217b565b506001949350505050565b60606001600160a01b0382166109ec5760405162461bcd60e51b81526004016107ab90613b5a565b6001600160a01b0382166000908152609c6020908152604080832080548251818502810185019093528083529193909284015b82821015610a8357838290600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505081526020019060010190610a1f565b505050509050919050565b6097546001600160a01b03163314610ab85760405162461bcd60e51b81526004016107ab90613ba1565b60335460ff1615610adb5760405162461bcd60e51b81526004016107ab90613aaa565b610ae58282612354565b5050565b6097546001600160a01b03163314610b135760405162461bcd60e51b81526004016107ab90613ba1565b60335460ff1615610b365760405162461bcd60e51b81526004016107ab90613aaa565b6001600160a01b038116610ba55760405162461bcd60e51b815260206004820152603060248201527f537570657276697361626c653a206e65772073757065727669736f722069732060448201526f746865207a65726f206164647265737360801b60648201526084016107ab565b6107e0816124f2565b336000818152609e602090815260408083206001600160a01b03871684529091528120549091906108839082908690610be8908790613c01565b611ea1565b6065546001600160a01b03163314610c175760405162461bcd60e51b81526004016107ab90613a75565b60335460ff16610c605760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107ab565b610c68612544565b565b3360009081526098602052604090205460ff16610cc95760405162461bcd60e51b815260206004820181905260248201527f4275726e61626c653a2063616c6c6572206973206e6f742061206275726e657260448201526064016107ab565b60335460ff1615610cec5760405162461bcd60e51b81526004016107ab90613aaa565b6107e033826125d7565b6097546001600160a01b03163314610d205760405162461bcd60e51b81526004016107ab90613ba1565b60335460ff1615610d435760405162461bcd60e51b81526004016107ab90613aaa565b6107e081612731565b6065546001600160a01b03163314610d765760405162461bcd60e51b81526004016107ab90613a75565b60335460ff1615610d995760405162461bcd60e51b81526004016107ab90613aaa565b6107e08161277a565b6001600160a01b0382166000908152609b6020526040812054819060ff8416108015610dcc575060015b610e125760405162461bcd60e51b81526020600482015260176024820152760a8d2daca98dec6d67440d2dcecc2d8d2c840d2dcc8caf604b1b60448201526064016107ab565b6001600160a01b0384166000908152609b60205260409020805460ff8516908110610e3f57610e3f613b0f565b600091825260208083206003909202909101546001600160a01b0387168352609b9091526040909120805460ff8616908110610e7d57610e7d613b0f565b906000526020600020906003020160020154915091509250929050565b600054610100900460ff16610eb55760005460ff1615610eb9565b303b155b610f1c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016107ab565b600054610100900460ff16158015610f3e576000805461ffff19166101011790555b610f466127c6565b610f4e6127f5565b610f588484612824565b610f7785610f686012600a613cfd565b610f729085613d0c565b612855565b610f8085610d4c565b610f8985610ae9565b610f9285611bad565b8015610fa4576000805461ff00191690555b5050505050565b336000908152609a602052604090205460ff16610fda5760405162461bcd60e51b81526004016107ab90613b25565b60335460ff1615610ffd5760405162461bcd60e51b81526004016107ab90613aaa565b8351855114801561104d57508251855114801561101b575081518551145b8015611028575080518551145b8061104d575082516001148015611040575081516001145b801561104d575080516001145b6110695760405162461bcd60e51b81526004016107ab90613d2b565b8251600114801561107b575081516001145b8015611088575080516001145b1561117b5760005b8551811015611175576110d58682815181106110ae576110ae613b0f565b60200260200101518683815181106110c8576110c8613b0f565b6020026020010151611580565b506111638682815181106110eb576110eb613b0f565b602002602001015186838151811061110557611105613b0f565b60200260200101518660008151811061112057611120613b0f565b60200260200101518660008151811061113b5761113b613b0f565b60200260200101518660008151811061115657611156613b0f565b60200260200101516116d4565b8061116d81613d70565b915050611090565b50610fa4565b60005b855181101561122c5761119c8682815181106110ae576110ae613b0f565b5061121a8682815181106111b2576111b2613b0f565b60200260200101518683815181106111cc576111cc613b0f565b60200260200101518684815181106111e6576111e6613b0f565b602002602001015186858151811061120057611200613b0f565b602002602001015186868151811061115657611156613b0f565b8061122481613d70565b91505061117e565b505050505050565b6097546001600160a01b0316331461125e5760405162461bcd60e51b81526004016107ab90613ba1565b60335460ff16156112815760405162461bcd60e51b81526004016107ab90613aaa565b610ae58282612940565b6065546001600160a01b031633146112b55760405162461bcd60e51b81526004016107ab90613a75565b610c686000612b02565b336000908152609a602052604090205460ff166112ee5760405162461bcd60e51b81526004016107ab90613b25565b60335460ff16156113115760405162461bcd60e51b81526004016107ab90613aaa565b61122c868686868686612b54565b6065546001600160a01b031633146113495760405162461bcd60e51b81526004016107ab90613a75565b60335460ff161561136c5760405162461bcd60e51b81526004016107ab90613aaa565b610c68612cfa565b60006001600160a01b03821661139c5760405162461bcd60e51b81526004016107ab90613b5a565b506001600160a01b03166000908152609c602052604090205490565b60006113c38261158e565b6113cc836118d1565b6108899190613c01565b805182511461143b5760405162461bcd60e51b815260206004820152602b60248201527f454d4c3a20726563697069656e747320616e6420616d6f756e7473206c656e6760448201526a0e8d040dad2e6dac2e8c6d60ab1b60648201526084016107ab565b60005b825181101561099b5761147683828151811061145c5761145c613b0f565b60200260200101518383815181106110c8576110c8613b0f565b508061148181613d70565b91505061143e565b6065546001600160a01b031633146114b35760405162461bcd60e51b81526004016107ab90613a75565b60335460ff16156114d65760405162461bcd60e51b81526004016107ab90613aaa565b6107e081612d52565b606060a180546107f290613ad4565b336000818152609e602090815260408083206001600160a01b0387168452909152812054909190838110156115735760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016107ab565b6109b98286868403611ea1565b60003361088381858561217b565b600080805b6001600160a01b0384166000908152609c60205260409020548110156116cd576001600160a01b0384166000908152609c602052604081208054839081106115dd576115dd613b0f565b60009182526020918290206040805160a0810182526005909302909101805480845260018201549484019490945260028101549183019190915260038101546060830152600401546080820152915080156116b857604082015160608301516080840151600061164d8284613d0c565b6116579085613c01565b905042848110156116735761166c868a613c01565b98506116b2565b818110156116b25782846116878385613d8b565b6116919190613da2565b61169b9088613d0c565b6116a59190613da2565b6116af908a613c01565b98505b50505050505b505080806116c590613d70565b915050611593565b5092915050565b336000908152609a602052604090205460ff166117035760405162461bcd60e51b81526004016107ab90613b25565b60335460ff16156117265760405162461bcd60e51b81526004016107ab90613aaa565b600084118015611754575083611751866001600160a01b03166000908152609d602052604090205490565b10155b6117b15760405162461bcd60e51b815260206004820152602860248201527f56657374696e674c6f636b3a20616d6f756e742069732030206f72206f7665726044820152672062616c616e636560c01b60648201526084016107ab565b610fa48585858585612d9e565b6097546001600160a01b031633146117e85760405162461bcd60e51b81526004016107ab90613ba1565b60335460ff161561180b5760405162461bcd60e51b81526004016107ab90613aaa565b610c6860006124f2565b6065546001600160a01b0316331461183f5760405162461bcd60e51b81526004016107ab90613a75565b816001600160a01b031663a9059cbb6118606065546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156118ad573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099b9190613dc4565b6001600160a01b0381166000908152609b60205260408120548190815b81811015611995576001600160a01b0385166000908152609b6020526040902080548290811061192057611920613b0f565b906000526020600020906003020160020154421015611983576001600160a01b0385166000908152609b6020526040902080548290811061196357611963613b0f565b906000526020600020906003020160000154836119809190613c01565b92505b8061198d81613d70565b9150506118ee565b50909392505050565b6065546001600160a01b031633146119c85760405162461bcd60e51b81526004016107ab90613a75565b60335460ff16156119eb5760405162461bcd60e51b81526004016107ab90613aaa565b6107e081612f03565b60606001600160a01b038216611a585760405162461bcd60e51b8152602060048201526024808201527f54696d654c6f636b3a20717565727920666f7220746865207a65726f206164646044820152637265737360e01b60648201526084016107ab565b6001600160a01b0382166000908152609b6020908152604080832080548251818502810185019093528083529193909284015b82821015610a835783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190611a8b565b336000908152609a602052604090205460ff16611b0a5760405162461bcd60e51b81526004016107ab90613b25565b60335460ff1615611b2d5760405162461bcd60e51b81526004016107ab90613aaa565b611b378585611580565b50610fa485858585856116d4565b336000908152609a602052604090205460ff16611b745760405162461bcd60e51b81526004016107ab90613b25565b60335460ff1615611b975760405162461bcd60e51b81526004016107ab90613aaa565b611ba18383611580565b5061099b83838361093e565b6065546001600160a01b03163314611bd75760405162461bcd60e51b81526004016107ab90613a75565b6001600160a01b038116611c3c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107ab565b6107e081612b02565b6065546001600160a01b03163314611c6f5760405162461bcd60e51b81526004016107ab90613a75565b60335460ff1615611c925760405162461bcd60e51b81526004016107ab90613aaa565b6107e081612f4c565b336000908152609a602052604090205460ff16611cca5760405162461bcd60e51b81526004016107ab90613b25565b60335460ff1615611ced5760405162461bcd60e51b81526004016107ab90613aaa565b81518351148015611d0a5750805183511480611d0a575080516001145b611d265760405162461bcd60e51b81526004016107ab90613d2b565b805160011415611ddb5760005b8351811015611dd557611d6b848281518110611d5157611d51613b0f565b60200260200101518483815181106110c8576110c8613b0f565b50611dc3848281518110611d8157611d81613b0f565b6020026020010151848381518110611d9b57611d9b613b0f565b602002602001015184600081518110611db657611db6613b0f565b602002602001015161093e565b80611dcd81613d70565b915050611d33565b50505050565b60005b8351811015611dd557611dfc848281518110611d5157611d51613b0f565b50611e46848281518110611e1257611e12613b0f565b6020026020010151848381518110611e2c57611e2c613b0f565b6020026020010151848481518110611db657611db6613b0f565b80611e5081613d70565b915050611dde565b6001600160a01b038116600081815260986020526040808220805460ff19169055517f90eabbc0c667db2a5029ed6bc0f5fe9f356d11684a4ca9fcfaec0e53f12b9c8e9190a250565b6001600160a01b038316611f035760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016107ab565b6001600160a01b038216611f645760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016107ab565b6001600160a01b038381166000818152609e602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600082116120155760405162461bcd60e51b815260206004820152601a60248201527f54696d654c6f636b3a206c6f636b20616d6f756e74206973203000000000000060448201526064016107ab565b4281116120645760405162461bcd60e51b815260206004820152601d60248201527f54696d654c6f636b3a20696e76616c696420657870697265206461746500000060448201526064016107ab565b6001600160a01b0383166000818152609b6020908152604080832081516060810183528781524281850190815281840188815283546001818101865594885295872092516003909602909201948555519184019190915551600290920191909155517fc80fbc3452298019908587d820303825af4187ac57ed90d7328886fd00b225579190a2505050565b6001600160a01b038381166000908152609e60209081526040808320938616835292905220546000198114611dd5578181101561216e5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016107ab565b611dd58484848403611ea1565b6001600160a01b0383166121df5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016107ab565b6001600160a01b0382166122415760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016107ab565b61224c838383612f98565b6001600160a01b0383166000908152609d6020526040902054818110156122c45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016107ab565b6001600160a01b038085166000908152609d60205260408082208585039055918516815290812080548492906122fb908490613c01565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161234791815260200190565b60405180910390a3611dd5565b6001600160a01b0382166000908152609c602052604090205481106123ab5760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016107ab565b6001600160a01b0382166000908152609c60205260409020546123d090600190613d8b565b8114612494576001600160a01b0382166000908152609c6020526040902080546123fc90600190613d8b565b8154811061240c5761240c613b0f565b9060005260206000209060050201609c6000846001600160a01b03166001600160a01b03168152602001908152602001600020828154811061245057612450613b0f565b906000526020600020906005020160008201548160000155600182015481600101556002820154816002015560038201548160030155600482015481600401559050505b6001600160a01b0382166000908152609c602052604090208054806124bb576124bb613de6565b6000828152602081206005600019909301928302018181556001810182905560028101829055600381018290556004015590555050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907facf6a327286171e5ce7f9bf15425ff49aab0fd07752fec84b2bd232c9f480c1790600090a35050565b60335460ff1661258d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107ab565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0382166126375760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016107ab565b61264382600083612f98565b6001600160a01b0382166000908152609d6020526040902054818110156126b75760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016107ab565b6001600160a01b0383166000908152609d602052604081208383039055609f80548492906126e6908490613d8b565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6001600160a01b038116600081815260996020526040808220805460ff19169055517f4d1fe3cc0f516ce2cfc5e83d52ee28af7f55376b18f58e7081c5fd25d8eeb1df9190a250565b6001600160a01b0381166000818152609a6020526040808220805460ff19166001179055517f7c5af8d36d8be103bc583da8e01d3e98f15216cc7ef38832c7550b34e8feb43a9190a250565b600054610100900460ff166127ed5760405162461bcd60e51b81526004016107ab90613dfc565b610c68613204565b600054610100900460ff1661281c5760405162461bcd60e51b81526004016107ab90613dfc565b610c68613234565b600054610100900460ff1661284b5760405162461bcd60e51b81526004016107ab90613dfc565b610ae58282613264565b6001600160a01b0382166128ab5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016107ab565b6128b760008383612f98565b80609f60008282546128c99190613c01565b90915550506001600160a01b0382166000908152609d6020526040812080548392906128f6908490613c01565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166000908152609b602052604090205460ff8216108015612968575060015b6129ae5760405162461bcd60e51b81526020600482015260176024820152760a8d2daca98dec6d67440d2dcecc2d8d2c840d2dcc8caf604b1b60448201526064016107ab565b6001600160a01b0382166000908152609b602052604090205460ff82166129d6600183613d8b565b14612a7e576001600160a01b0383166000908152609b602052604090206129fe600183613d8b565b81548110612a0e57612a0e613b0f565b9060005260206000209060030201609b6000856001600160a01b03166001600160a01b031681526020019081526020016000208360ff1681548110612a5557612a55613b0f565b600091825260209091208254600390920201908155600180830154908201556002918201549101555b6001600160a01b0383166000908152609b60205260409020805480612aa557612aa5613de6565b6000828152602081206003600019909301928302018181556001810182905560020181905591556040516001600160a01b038516917fb34baa9e1ce392292123bbdca3018904b21991f7411e14d99a10aaf88ec8ea0d91a2505050565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038616612b7a5760405162461bcd60e51b81526004016107ab90613e47565b60008411612bca5760405162461bcd60e51b815260206004820152601860248201527f56657374696e674c6f636b3a20616d6f756e742069732030000000000000000060448201526064016107ab565b60008211612c155760405162461bcd60e51b8152602060048201526018602482015277056657374696e674c6f636b3a20706572696f6420697320360441b60448201526064016107ab565b60008111612c5f5760405162461bcd60e51b8152602060048201526017602482015276056657374696e674c6f636b3a20636f756e74206973203604c1b60448201526064016107ab565b6001600160a01b0386166000908152609c60205260408120805487908110612c8957612c89613b0f565b60009182526020918290206005909102018681556002810186905560038101859055600481018490556040518881529092506001600160a01b038916917fe85844ca2c3e2785bea012532bceb8435e58637d4430f1bd131a88a55dad398e910160405180910390a250505050505050565b60335460ff1615612d1d5760405162461bcd60e51b81526004016107ab90613aaa565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586125ba3390565b6001600160a01b038116600081815260996020526040808220805460ff19166001179055517f0de8364a528e5ca2869160b20c375fe85b4e98d24a9cb48b4dc49c5f76d05b249190a250565b6001600160a01b038516612dc45760405162461bcd60e51b81526004016107ab90613e47565b60008211612e0f5760405162461bcd60e51b8152602060048201526018602482015277056657374696e674c6f636b3a20706572696f6420697320360441b60448201526064016107ab565b60008111612e595760405162461bcd60e51b8152602060048201526017602482015276056657374696e674c6f636b3a20636f756e74206973203604c1b60448201526064016107ab565b6001600160a01b0385166000818152609c60209081526040808320815160a081018352898152428185019081528184018a8152606083018a8152608084018a8152855460018181018855968a5297892094516005909802909401968755915193860193909355915160028501559051600384015551600490920191909155517f04a72c810da52db1f0e22421438d411667cd0c1559e9ae7c638f1aed4bfa066d9190a25050505050565b6001600160a01b0381166000818152609a6020526040808220805460ff19169055517f95266445d018e5b30f957c915e91b04bb4a19bf0f8f21020a08dad9be7931df49190a250565b6001600160a01b038116600081815260986020526040808220805460ff19166001179055517f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b945609190a250565b6001600160a01b03831660009081526099602052604090205460ff16156130185760405162461bcd60e51b815260206004820152602e60248201527f467265657a61626c653a20746f6b656e207472616e736665722066726f6d206660448201526d1c99595e9959081858d8dbdd5b9d60921b60648201526084016107ab565b6001600160a01b03821660009081526099602052604090205460ff16156130965760405162461bcd60e51b815260206004820152602c60248201527f467265657a61626c653a20746f6b656e207472616e7366657220746f2066726560448201526b195e9959081858d8dbdd5b9d60a21b60648201526084016107ab565b61309f33610588565b1561310a5760405162461bcd60e51b815260206004820152603560248201527f467265657a61626c653a20746f6b656e207472616e736665722063616c6c656460448201527408199c9bdb48199c99595e9959081858d8dbdd5b9d605a1b60648201526084016107ab565b60335460ff161561316b5760405162461bcd60e51b815260206004820152602560248201527f5061757361626c653a20746f6b656e207472616e73666572207768696c652070604482015264185d5cd95960da1b60648201526084016107ab565b6001600160a01b0383161561099b5780613184846113b8565b6001600160a01b0385166000908152609d60205260409020546131a79190613d8b565b101561099b5760405162461bcd60e51b815260206004820152602660248201527f4c6f636b61626c653a20696e73756666696369656e74207472616e7366657220604482015265185b5bdd5b9d60d21b60648201526084016107ab565b600054610100900460ff1661322b5760405162461bcd60e51b81526004016107ab90613dfc565b610c6833612b02565b600054610100900460ff1661325b5760405162461bcd60e51b81526004016107ab90613dfc565b610c68336124f2565b600054610100900460ff1661328b5760405162461bcd60e51b81526004016107ab90613dfc565b815161329e9060a09060208501906132ae565b50805161099b9060a19060208401905b8280546132ba90613ad4565b90600052602060002090601f0160209004810192826132dc5760008555613322565b82601f106132f557805160ff1916838001178555613322565b82800160010185558215613322579182015b82811115613322578251825591602001919060010190613307565b5061332e929150613332565b5090565b5b8082111561332e5760008155600101613333565b80356001600160a01b038116811461335e57600080fd5b919050565b60006020828403121561337557600080fd5b61337e82613347565b9392505050565b600060208083528351808285015260005b818110156133b257858101830151858201604001528201613396565b818111156133c4576000604083870101525b50601f01601f1916929092016040019392505050565b600080604083850312156133ed57600080fd5b6133f683613347565b946020939093013593505050565b60a08101610889828480518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b60008060006060848603121561345257600080fd5b61345b84613347565b95602085013595506040909401359392505050565b60008060006060848603121561348557600080fd5b61348e84613347565b925061349c60208501613347565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b818110156135195761350683855180518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b9284019260a092909201916001016134c8565b50909695505050505050565b60006020828403121561353757600080fd5b5035919050565b6000806040838503121561355157600080fd5b61355a83613347565b9150602083013560ff8116811461357057600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156135ba576135ba61357b565b604052919050565b600082601f8301126135d357600080fd5b813567ffffffffffffffff8111156135ed576135ed61357b565b613600601f8201601f1916602001613591565b81815284602083860101111561361557600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561364857600080fd5b61365185613347565b9350602085013567ffffffffffffffff8082111561366e57600080fd5b61367a888389016135c2565b9450604087013591508082111561369057600080fd5b5061369d878288016135c2565b949793965093946060013593505050565b600067ffffffffffffffff8211156136c8576136c861357b565b5060051b60200190565b600082601f8301126136e357600080fd5b813560206136f86136f3836136ae565b613591565b82815260059290921b8401810191818101908684111561371757600080fd5b8286015b848110156137395761372c81613347565b835291830191830161371b565b509695505050505050565b600082601f83011261375557600080fd5b813560206137656136f3836136ae565b82815260059290921b8401810191818101908684111561378457600080fd5b8286015b848110156137395780358352918301918301613788565b600080600080600060a086880312156137b757600080fd5b853567ffffffffffffffff808211156137cf57600080fd5b6137db89838a016136d2565b965060208801359150808211156137f157600080fd5b6137fd89838a01613744565b9550604088013591508082111561381357600080fd5b61381f89838a01613744565b9450606088013591508082111561383557600080fd5b61384189838a01613744565b9350608088013591508082111561385757600080fd5b5061386488828901613744565b9150509295509295909350565b60008060008060008060c0878903121561388a57600080fd5b61389387613347565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b600080604083850312156138ce57600080fd5b823567ffffffffffffffff808211156138e657600080fd5b6138f2868387016136d2565b9350602085013591508082111561390857600080fd5b5061391585828601613744565b9150509250929050565b600080600080600060a0868803121561393757600080fd5b61394086613347565b97602087013597506040870135966060810135965060800135945092505050565b602080825282518282018190526000919060409081850190868401855b828110156139ad578151805185528681015187860152850151858501526060909301929085019060010161397e565b5091979650505050505050565b600080604083850312156139cd57600080fd5b6139d683613347565b91506139e460208401613347565b90509250929050565b600080600060608486031215613a0257600080fd5b833567ffffffffffffffff80821115613a1a57600080fd5b613a26878388016136d2565b94506020860135915080821115613a3c57600080fd5b613a4887838801613744565b93506040860135915080821115613a5e57600080fd5b50613a6b86828701613744565b9150509250925092565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b600181811c90821680613ae857607f821691505b60208210811415613b0957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6020808252818101527f4c6f636b61626c653a2063616c6c6572206973206e6f742061206c6f636b6572604082015260600190565b60208082526027908201527f56657374696e674c6f636b3a20717565727920666f7220746865207a65726f206040820152666164647265737360c81b606082015260800190565b6020808252602a908201527f537570657276697361626c653a2063616c6c6572206973206e6f74207468652060408201526939bab832b93b34b9b7b960b11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115613c1457613c14613beb565b500190565b600181815b80851115613c54578160001904821115613c3a57613c3a613beb565b80851615613c4757918102915b93841c9390800290613c1e565b509250929050565b600082613c6b57506001610889565b81613c7857506000610889565b8160018114613c8e5760028114613c9857613cb4565b6001915050610889565b60ff841115613ca957613ca9613beb565b50506001821b610889565b5060208310610133831016604e8410600b8410161715613cd7575081810a610889565b613ce18383613c19565b8060001904821115613cf557613cf5613beb565b029392505050565b600061337e60ff841683613c5c565b6000816000190483118215151615613d2657613d26613beb565b500290565b60208082526025908201527f454d4c3a20617272617973206d7573742068617665207468652073616d65206c6040820152640cadccee8d60db1b606082015260800190565b6000600019821415613d8457613d84613beb565b5060010190565b600082821015613d9d57613d9d613beb565b500390565b600082613dbf57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215613dd657600080fd5b8151801515811461337e57600080fd5b634e487b7160e01b600052603160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526027908201527f56657374696e674c6f636b3a206c6f636b2066726f6d20746865207a65726f206040820152666164647265737360c81b60608201526080019056fea2646970667358221220a06f59e1233341dd69d77387147f9f2ed2558c794c5a8869c844459a5dd1438164736f6c634300080b0033
Deployed Bytecode Sourcemap
14183:8966:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17280:111;;;;;;:::i;:::-;;:::i;:::-;;2493:98:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4770:197;;;;;;:::i;:::-;;:::i;:::-;;;1409:14:14;;1402:22;1384:41;;1372:2;1357:18;4770:197:3;1244:187:14;11957:152:13;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;17975:198::-;;;;;;:::i;:::-;;:::i;3581:106:3:-;3668:12;;3581:106;;;2498:25:14;;;2486:2;2471:18;3581:106:3;2352:177:14;5529:286:3;;;;;;:::i;:::-;;:::i;13889:216:13:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;19223:145::-;;;;;;:::i;:::-;;:::i;6266:105::-;;;;;;:::i;:::-;-1:-1:-1;;;;;6346:17:13;6322:4;6346:17;;;:8;:17;;;;;;;;;6266:105;3430:91:3;;;3512:2;3729:36:14;;3717:2;3702:18;3430:91:3;3587:184:14;16156:257:13;;;;;;:::i;:::-;;:::i;6210:236:3:-;;;;;;:::i;:::-;;:::i;16616:76:13:-;;;:::i;17449:108::-;;;;;;:::i;:::-;;:::i;3321:105::-;;;;;;:::i;:::-;-1:-1:-1;;;;;3401:17:13;3377:4;3401:17;;;:8;:17;;;;;;;;;3321:105;16934:108;;;;;;:::i;:::-;;:::i;17622:105::-;;;;;;:::i;:::-;;:::i;8366:284::-;;;;;;:::i;:::-;;:::i;:::-;;;;4483:25:14;;;4539:2;4524:18;;4517:34;;;;4456:18;8366:284:13;4309:248:14;14342:389:13;;;;;;:::i;:::-;;:::i;20456:1529::-;;;;;;:::i;:::-;;:::i;2065:97::-;2143:11;;-1:-1:-1;;;;;2143:11:13;2065:97;;;-1:-1:-1;;;;;9173:32:14;;;9155:51;;9143:2;9128:18;2065:97:13;9009:203:14;1341:84:2;1411:7;;;;1341:84;;18249:140:13;;;;;;:::i;:::-;;:::i;3745:125:3:-;;;;;;:::i;:::-;-1:-1:-1;;;;;3845:18:3;3819:7;3845:18;;;:9;:18;;;;;;;3745:125;1908:101:0;;;:::i;18841:303:13:-;;;;;;:::i;:::-;;:::i;4865:106::-;;;;;;:::i;:::-;-1:-1:-1;;;;;4946:17:13;4922:4;4946:17;;;:8;:17;;;;;;;;;4865:106;16476:75;;;:::i;13667:214::-;;;;;;:::i;:::-;;:::i;13496:163::-;;;;;;:::i;:::-;;:::i;19376:317::-;;;;;;:::i;:::-;;:::i;16759:99::-;;;;;;:::i;:::-;;:::i;1276:85:0:-;1348:6;;-1:-1:-1;;;;;1348:6:0;1276:85;;2704:102:3;;;:::i;6933:429::-;;;;;;:::i;:::-;;:::i;4066:189::-;;;;;;:::i;:::-;;:::i;12413:918:13:-;;;;;;:::i;:::-;;:::i;18461:372::-;;;;;;:::i;:::-;;:::i;15933:134::-;;;:::i;14921:163::-;;;;;;:::i;:::-;;:::i;8045:126::-;;;;;;:::i;:::-;-1:-1:-1;;;;;8137:19:13;8110:7;8137:19;;;:10;:19;;;;;:26;;8045:126;9050:438;;;;;;:::i;:::-;;:::i;17795:111::-;;;;;;:::i;:::-;;:::i;8658:208::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4313:149:3:-;;;;;;:::i;:::-;-1:-1:-1;;;;;4428:18:3;;;4402:7;4428:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4313:149;19701:403:13;;;;;;:::i;:::-;;:::i;20112:336::-;;;;;;:::i;:::-;;:::i;2158:198:0:-;;;;;;:::i;:::-;;:::i;17107:105:13:-;;;;;;:::i;:::-;;:::i;21993:1153::-;;;;;;:::i;:::-;;:::i;17280:111::-;1348:6:0;;-1:-1:-1;;;;;1348:6:0;929:10:7;1488:23:0;1480:68;;;;-1:-1:-1;;;1480:68:0;;;;;;;:::i;:::-;;;;;;;;;1411:7:2;;;;1654:9:::1;1646:38;;;;-1:-1:-1::0;;;1646:38:2::1;;;;;;;:::i;:::-;17361:22:13::2;17375:7;17361:13;:22::i;:::-;17280:111:::0;:::o;2493:98:3:-;2547:13;2579:5;2572:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2493:98;:::o;4770:197::-;4853:4;929:10:7;4907:32:3;929:10:7;4923:7:3;4932:6;4907:8;:32::i;:::-;4956:4;4949:11;;;4770:197;;;;;:::o;11957:152:13:-;12034:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12034:18:13;-1:-1:-1;;;;;12072:22:13;;;;;;:13;:22;;;;;:29;;12095:5;;12072:29;;;;;;:::i;:::-;;;;;;;;;;;12065:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11957:152;;;;:::o;17975:198::-;929:10:7;6109:22:13;;;;:8;:22;;;;;;;;6101:67;;;;-1:-1:-1;;;6101:67:13;;;;;;;:::i;:::-;1411:7:2;;;;1654:9:::1;1646:38;;;;-1:-1:-1::0;;;1646:38:2::1;;;;;;;:::i;:::-;18125:40:13::2;18138:7;18147:6;18155:9;18125:12;:40::i;:::-;17975:198:::0;;;:::o;5529:286:3:-;5656:4;929:10:7;5712:38:3;5728:4;929:10:7;5743:6:3;5712:15;:38::i;:::-;5760:27;5770:4;5776:2;5780:6;5760:9;:27::i;:::-;-1:-1:-1;5804:4:3;;5529:286;-1:-1:-1;;;;5529:286:3:o;13889:216:13:-;13951:20;-1:-1:-1;;;;;13992:21:13;;13984:73;;;;-1:-1:-1;;;13984:73:13;;;;;;;:::i;:::-;-1:-1:-1;;;;;14075:22:13;;;;;;:13;:22;;;;;;;;14068:29;;;;;;;;;;;;;;;;;;;14075:22;;14068:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13889:216;;;:::o;19223:145::-;2143:11;;-1:-1:-1;;;;;2143:11:13;929:10:7;2305:28:13;2297:83;;;;-1:-1:-1;;;2297:83:13;;;;;;;:::i;:::-;1411:7:2;;;;1654:9:::1;1646:38;;;;-1:-1:-1::0;;;1646:38:2::1;;;;;;;:::i;:::-;19326:34:13::2;19345:7;19354:5;19326:18;:34::i;:::-;19223:145:::0;;:::o;16156:257::-;2143:11;;-1:-1:-1;;;;;2143:11:13;929:10:7;2305:28:13;2297:83;;;;-1:-1:-1;;;2297:83:13;;;;;;;:::i;:::-;1411:7:2;;;;1654:9:::1;1646:38;;;;-1:-1:-1::0;;;1646:38:2::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;16271:27:13;::::2;16263:88;;;::::0;-1:-1:-1;;;16263:88:13;;15362:2:14;16263:88:13::2;::::0;::::2;15344:21:14::0;15401:2;15381:18;;;15374:30;15440:34;15420:18;;;15413:62;-1:-1:-1;;;15491:18:14;;;15484:46;15547:19;;16263:88:13::2;15160:412:14::0;16263:88:13::2;16362:43;16391:13;16362:28;:43::i;6210:236:3:-:0;929:10:7;6298:4:3;6377:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;6377:27:3;;;;;;;;;;6298:4;;929:10:7;6352:66:3;;929:10:7;;6377:27:3;;:40;;6407:10;;6377:40;:::i;:::-;6352:8;:66::i;16616:76:13:-;1348:6:0;;-1:-1:-1;;;;;1348:6:0;929:10:7;1488:23:0;1480:68;;;;-1:-1:-1;;;1480:68:0;;;;;;;:::i;:::-;1411:7:2;;;;1912:41:::1;;;::::0;-1:-1:-1;;;1912:41:2;;16044:2:14;1912:41:2::1;::::0;::::1;16026:21:14::0;16083:2;16063:18;;;16056:30;-1:-1:-1;;;16102:18:14;;;16095:50;16162:18;;1912:41:2::1;15842:344:14::0;1912:41:2::1;16674:10:13::2;:8;:10::i;:::-;16616:76::o:0;17449:108::-;929:10:7;3561:22:13;;;;:8;:22;;;;;;;;3553:67;;;;-1:-1:-1;;;3553:67:13;;16393:2:14;3553:67:13;;;16375:21:14;;;16412:18;;;16405:30;16471:34;16451:18;;;16444:62;16523:18;;3553:67:13;16191:356:14;3553:67:13;1411:7:2;;;;1654:9:::1;1646:38;;;;-1:-1:-1::0;;;1646:38:2::1;;;;;;;:::i;:::-;17522:27:13::2;929:10:7::0;17542:6:13::2;17522:5;:27::i;16934:108::-:0;2143:11;;-1:-1:-1;;;;;2143:11:13;929:10:7;2305:28:13;2297:83;;;;-1:-1:-1;;;2297:83:13;;;;;;;:::i;:::-;1411:7:2;;;;1654:9:::1;1646:38;;;;-1:-1:-1::0;;;1646:38:2::1;;;;;;;:::i;:::-;17016:18:13::2;17026:7;17016:9;:18::i;17622:105::-:0;1348:6:0;;-1:-1:-1;;;;;1348:6:0;929:10:7;1488:23:0;1480:68;;;;-1:-1:-1;;;1480:68:0;;;;;;;:::i;:::-;1411:7:2;;;;1654:9:::1;1646:38;;;;-1:-1:-1::0;;;1646:38:2::1;;;;;;;:::i;:::-;17700:19:13::2;17711:7;17700:10;:19::i;8366:284::-:0;-1:-1:-1;;;;;8475:19:13;;8438:7;8475:19;;;:10;:19;;;;;:26;8438:7;;8475:34;;;-1:-1:-1;8475:48:13;;;;-1:-1:-1;8513:10:13;8475:48;8467:84;;;;-1:-1:-1;;;8467:84:13;;16754:2:14;8467:84:13;;;16736:21:14;16793:2;16773:18;;;16766:30;-1:-1:-1;;;16812:18:14;;;16805:53;16875:18;;8467:84:13;16552:347:14;8467:84:13;-1:-1:-1;;;;;8570:19:13;;;;;;:10;:19;;;;;:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:33;-1:-1:-1;;;;;8605:19:13;;;;:10;:19;;;;;;;:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:36;;;8562:80;;;;8366:284;;;;;:::o;14342:389::-;2369:13:1;;;;;;;:48;;2405:12;;;;2404:13;2369:48;;;3147:4;1476:19:6;:23;2385:16:1;2361:107;;;;-1:-1:-1;;;2361:107:1;;17106:2:14;2361:107:1;;;17088:21:14;17145:2;17125:18;;;17118:30;17184:34;17164:18;;;17157:62;-1:-1:-1;;;17235:18:14;;;17228:44;17289:19;;2361:107:1;16904:410:14;2361:107:1;2479:19;2502:13;;;;;;2501:14;2525:98;;;;2559:13;:20;;-1:-1:-1;;2593:19:1;;;;;2525:98;14472:16:13::1;:14;:16::i;:::-;14499:21;:19;:21::i;:::-;14531:26;14544:4;14550:6;14531:12;:26::i;:::-;14568:46;14574:5:::0;14597:16:::1;3512:2:3::0;14597::13::1;:16;:::i;:::-;14581:32;::::0;:13;:32:::1;:::i;:::-;14568:5;:46::i;:::-;14627:16;14637:5;14627:9;:16::i;:::-;14654:34;14682:5;14654:27;:34::i;:::-;14699:24;14717:5;14699:17;:24::i;:::-;2649:14:1::0;2645:66;;;2695:5;2679:21;;-1:-1:-1;;2679:21:1;;;2645:66;2080:637;14342:389:13;;;;:::o;20456:1529::-;929:10:7;6109:22:13;;;;:8;:22;;;;;;;;6101:67;;;;-1:-1:-1;;;6101:67:13;;;;;;;:::i;:::-;1411:7:2;;;;1654:9:::1;1646:38;;;;-1:-1:-1::0;;;1646:38:2::1;;;;;;;:::i;:::-;20756:7:13::2;:14;20735:10;:17;:35;:254;;;;;20810:8;:15;20789:10;:17;:36;:75;;;;;20850:7;:14;20829:10;:17;:35;20789:75;:113;;;;;20889:6;:13;20868:10;:17;:34;20789:113;20788:200;;;;20922:8;:15;20941:1;20922:20;:43;;;;;20946:7;:14;20964:1;20946:19;20922:43;:65;;;;;20969:6;:13;20986:1;20969:18;20922:65;20713:341;;;;-1:-1:-1::0;;;20713:341:13::2;;;;;;;:::i;:::-;21071:8;:15;21090:1;21071:20;:43;;;;;21095:7;:14;21113:1;21095:19;21071:43;:65;;;;;21118:6;:13;21135:1;21118:18;21071:65;21067:911;;;21158:9;21153:391;21177:10;:17;21173:1;:21;21153:391;;;21273:35;21282:10;21293:1;21282:13;;;;;;;;:::i;:::-;;;;;;;21297:7;21305:1;21297:10;;;;;;;;:::i;:::-;;;;;;;21273:8;:35::i;:::-;;21327:201;21364:10;21375:1;21364:13;;;;;;;;:::i;:::-;;;;;;;21400:7;21408:1;21400:10;;;;;;;;:::i;:::-;;;;;;;21433:8;21442:1;21433:11;;;;;;;;:::i;:::-;;;;;;;21467:7;21475:1;21467:10;;;;;;;;:::i;:::-;;;;;;;21500:6;21507:1;21500:9;;;;;;;;:::i;:::-;;;;;;;21327:14;:201::i;:::-;21196:3:::0;::::2;::::0;::::2;:::i;:::-;;;;21153:391;;;;21067:911;;;21581:9;21576:391;21600:10;:17;21596:1;:21;21576:391;;;21696:35;21705:10;21716:1;21705:13;;;;;;;;:::i;21696:35::-;;21750:201;21787:10;21798:1;21787:13;;;;;;;;:::i;:::-;;;;;;;21823:7;21831:1;21823:10;;;;;;;;:::i;:::-;;;;;;;21856:8;21865:1;21856:11;;;;;;;;:::i;:::-;;;;;;;21890:7;21898:1;21890:10;;;;;;;;:::i;:::-;;;;;;;21923:6;21930:1;21923:9;;;;;;;;:::i;21750:201::-;21619:3:::0;::::2;::::0;::::2;:::i;:::-;;;;21576:391;;;;20456:1529:::0;;;;;:::o;18249:140::-;2143:11;;-1:-1:-1;;;;;2143:11:13;929:10:7;2305:28:13;2297:83;;;;-1:-1:-1;;;2297:83:13;;;;;;;:::i;:::-;1411:7:2;;;;1654:9:::1;1646:38;;;;-1:-1:-1::0;;;1646:38:2::1;;;;;;;:::i;:::-;18350:31:13::2;18366:7;18375:5;18350:15;:31::i;1908:101:0:-:0;1348:6;;-1:-1:-1;;;;;1348:6:0;929:10:7;1488:23:0;1480:68;;;;-1:-1:-1;;;1480:68:0;;;;;;;:::i;:::-;1972:30:::1;1999:1;1972:18;:30::i;18841:303:13:-:0;929:10:7;6109:22:13;;;;:8;:22;;;;;;;;6101:67;;;;-1:-1:-1;;;6101:67:13;;;;;;;:::i;:::-;1411:7:2;;;;1654:9:::1;1646:38;;;;-1:-1:-1::0;;;1646:38:2::1;;;;;;;:::i;:::-;19069:67:13::2;19088:7;19097:5;19104:6;19112:8;19122:6;19130:5;19069:18;:67::i;16476:75::-:0;1348:6:0;;-1:-1:-1;;;;;1348:6:0;929:10:7;1488:23:0;1480:68;;;;-1:-1:-1;;;1480:68:0;;;;;;;:::i;:::-;1411:7:2;;;;1654:9:::1;1646:38;;;;-1:-1:-1::0;;;1646:38:2::1;;;;;;;:::i;:::-;16535:8:13::2;:6;:8::i;13667:214::-:0;13733:7;-1:-1:-1;;;;;13761:21:13;;13753:73;;;;-1:-1:-1;;;13753:73:13;;;;;;;:::i;:::-;-1:-1:-1;;;;;;13844:22:13;;;;;:13;:22;;;;;:29;;13667:214::o;13496:163::-;13562:7;13620:31;13643:7;13620:22;:31::i;:::-;13589:28;13609:7;13589:19;:28::i;:::-;:62;;;;:::i;19376:317::-;19501:7;:14;19480:10;:17;:35;19472:91;;;;-1:-1:-1;;;19472:91:13;;19623:2:14;19472:91:13;;;19605:21:14;19662:2;19642:18;;;19635:30;19701:34;19681:18;;;19674:62;-1:-1:-1;;;19752:18:14;;;19745:41;19803:19;;19472:91:13;19421:407:14;19472:91:13;19581:9;19576:110;19600:10;:17;19596:1;:21;19576:110;;;19639:35;19648:10;19659:1;19648:13;;;;;;;;:::i;:::-;;;;;;;19663:7;19671:1;19663:10;;;;;;;;:::i;19639:35::-;-1:-1:-1;19619:3:13;;;;:::i;:::-;;;;19576:110;;16759:99;1348:6:0;;-1:-1:-1;;;;;1348:6:0;929:10:7;1488:23:0;1480:68;;;;-1:-1:-1;;;1480:68:0;;;;;;;:::i;:::-;1411:7:2;;;;1654:9:::1;1646:38;;;;-1:-1:-1::0;;;1646:38:2::1;;;;;;;:::i;:::-;16834:16:13::2;16842:7;16834;:16::i;2704:102:3:-:0;2760:13;2792:7;2785:14;;;;;:::i;6933:429::-;929:10:7;7026:4:3;7107:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;7107:27:3;;;;;;;;;;7026:4;;929:10:7;7152:35:3;;;;7144:85;;;;-1:-1:-1;;;7144:85:3;;20035:2:14;7144:85:3;;;20017:21:14;20074:2;20054:18;;;20047:30;20113:34;20093:18;;;20086:62;-1:-1:-1;;;20164:18:14;;;20157:35;20209:19;;7144:85:3;19833:401:14;7144:85:3;7263:60;7272:5;7279:7;7307:15;7288:16;:34;7263:8;:60::i;4066:189::-;4145:4;929:10:7;4199:28:3;929:10:7;4216:2:3;4220:6;4199:9;:28::i;12413:918:13:-;12483:7;;;12545:742;-1:-1:-1;;;;;12569:22:13;;;;;;:13;:22;;;;;:29;12565:33;;12545:742;;;-1:-1:-1;;;;;12644:22:13;;12618:23;12644:22;;;:13;:22;;;;;:25;;12667:1;;12644:25;;;;;;:::i;:::-;;;;;;;;;;12618:51;;;;;;;;12644:25;;;;;;;12618:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12739:10:13;;12735:541;;12787:13;;;;12834:11;;;;12878:10;;;;12768:16;12936;12878:10;12834:11;12936:16;:::i;:::-;12925:27;;:8;:27;:::i;:::-;12905:47;-1:-1:-1;12989:15:13;13025:20;;;13021:242;;;13068:29;13091:6;13068:29;;:::i;:::-;;;13021:242;;;13137:9;13125;:21;13121:142;;;13240:5;13229:6;13204:21;13216:9;13204;:21;:::i;:::-;13203:32;;;;:::i;:::-;13193:43;;:6;:43;:::i;:::-;13192:53;;;;:::i;:::-;13169:76;;;;:::i;:::-;;;13121:142;12751:525;;;;;12735:541;12605:682;;12600:3;;;;;:::i;:::-;;;;12545:742;;;-1:-1:-1;13304:19:13;12413:918;-1:-1:-1;;12413:918:13:o;18461:372::-;929:10:7;6109:22:13;;;;:8;:22;;;;;;;;6101:67;;;;-1:-1:-1;;;6101:67:13;;;;;;;:::i;:::-;1411:7:2;;;;1654:9:::1;1646:38;;;;-1:-1:-1::0;;;1646:38:2::1;;;;;;;:::i;:::-;18679:1:13::2;18670:6;:10;:42;;;;;18706:6;18684:18;18694:7;-1:-1:-1::0;;;;;3845:18:3;3819:7;3845:18;;;:9;:18;;;;;;;3745:125;18684:18:13::2;:28;;18670:42;18662:95;;;::::0;-1:-1:-1;;;18662:95:13;;20793:2:14;18662:95:13::2;::::0;::::2;20775:21:14::0;20832:2;20812:18;;;20805:30;20871:34;20851:18;;;20844:62;-1:-1:-1;;;20922:18:14;;;20915:38;20970:19;;18662:95:13::2;20591:404:14::0;18662:95:13::2;18768:57;18784:7;18793:6;18801:8;18811:6;18819:5;18768:15;:57::i;15933:134::-:0;2143:11;;-1:-1:-1;;;;;2143:11:13;929:10:7;2305:28:13;2297:83;;;;-1:-1:-1;;;2297:83:13;;;;;;;:::i;:::-;1411:7:2;;;;1654:9:::1;1646:38;;;;-1:-1:-1::0;;;1646:38:2::1;;;;;;;:::i;:::-;16019:40:13::2;16056:1;16019:28;:40::i;14921:163::-:0;1348:6:0;;-1:-1:-1;;;;;1348:6:0;929:10:7;1488:23:0;1480:68;;;;-1:-1:-1;;;1480:68:0;;;;;;;:::i;:::-;15032:12:13::1;-1:-1:-1::0;;;;;15014:40:13::1;;15055:7;1348:6:0::0;;-1:-1:-1;;;;;1348:6:0;;1276:85;15055:7:13::1;15014:62;::::0;-1:-1:-1;;;;;;15014:62:13::1;::::0;;;;;;-1:-1:-1;;;;;21192:32:14;;;15014:62:13::1;::::0;::::1;21174:51:14::0;21241:18;;;21234:34;;;21147:18;;15014:62:13::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9050:438::-:0;-1:-1:-1;;;;;9192:19:13;;9117:7;9192:19;;;:10;:19;;;;;:26;9117:7;;;9229:218;9253:3;9249:1;:7;9229:218;;;-1:-1:-1;;;;;9300:19:13;;;;;;:10;:19;;;;;:22;;9320:1;;9300:22;;;;;;:::i;:::-;;;;;;;;;;;:32;;;9282:15;:50;9278:158;;;-1:-1:-1;;;;;9391:19:13;;;;;;:10;:19;;;;;:22;;9411:1;;9391:22;;;;;;:::i;:::-;;;;;;;;;;;:29;;;9372:16;:48;;;;:::i;:::-;9353:67;;9278:158;9258:3;;;;:::i;:::-;;;;9229:218;;;-1:-1:-1;9464:16:13;;9050:438;-1:-1:-1;;;9050:438:13:o;17795:111::-;1348:6:0;;-1:-1:-1;;;;;1348:6:0;929:10:7;1488:23:0;1480:68;;;;-1:-1:-1;;;1480:68:0;;;;;;;:::i;:::-;1411:7:2;;;;1654:9:::1;1646:38;;;;-1:-1:-1::0;;;1646:38:2::1;;;;;;;:::i;:::-;17876:22:13::2;17890:7;17876:13;:22::i;8658:208::-:0;8721:17;-1:-1:-1;;;;;8759:21:13;;8751:70;;;;-1:-1:-1;;;8751:70:13;;21763:2:14;8751:70:13;;;21745:21:14;21802:2;21782:18;;;21775:30;21841:34;21821:18;;;21814:62;-1:-1:-1;;;21892:18:14;;;21885:34;21936:19;;8751:70:13;21561:400:14;8751:70:13;-1:-1:-1;;;;;8839:19:13;;;;;;:10;:19;;;;;;;;8832:26;;;;;;;;;;;;;;;;;;;8839:19;;8832:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19701:403;929:10:7;6109:22:13;;;;:8;:22;;;;;;;;6101:67;;;;-1:-1:-1;;;6101:67:13;;;;;;;:::i;:::-;1411:7:2;;;;1654:9:::1;1646:38;;;;-1:-1:-1::0;;;1646:38:2::1;;;;;;;:::i;:::-;19949:27:13::2;19958:9;19969:6;19949:8;:27::i;:::-;;20038:58;20053:9;20064:6;20072:8;20082:6;20090:5;20038:14;:58::i;20112:336::-:0;929:10:7;6109:22:13;;;;:8;:22;;;;;;;;6101:67;;;;-1:-1:-1;;;6101:67:13;;;;;;;:::i;:::-;1411:7:2;;;;1654:9:::1;1646:38;;;;-1:-1:-1::0;;;1646:38:2::1;;;;;;;:::i;:::-;20312:27:13::2;20321:9;20332:6;20312:8;:27::i;:::-;;20399:41;20411:9;20422:6;20430:9;20399:11;:41::i;2158:198:0:-:0;1348:6;;-1:-1:-1;;;;;1348:6:0;929:10:7;1488:23:0;1480:68;;;;-1:-1:-1;;;1480:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2246:22:0;::::1;2238:73;;;::::0;-1:-1:-1;;;2238:73:0;;22168:2:14;2238:73:0::1;::::0;::::1;22150:21:14::0;22207:2;22187:18;;;22180:30;22246:34;22226:18;;;22219:62;-1:-1:-1;;;22297:18:14;;;22290:36;22343:19;;2238:73:0::1;21966:402:14::0;2238:73:0::1;2321:28;2340:8;2321:18;:28::i;17107:105:13:-:0;1348:6:0;;-1:-1:-1;;;;;1348:6:0;929:10:7;1488:23:0;1480:68;;;;-1:-1:-1;;;1480:68:0;;;;;;;:::i;:::-;1411:7:2;;;;1654:9:::1;1646:38;;;;-1:-1:-1::0;;;1646:38:2::1;;;;;;;:::i;:::-;17185:19:13::2;17196:7;17185:10;:19::i;21993:1153::-:0;929:10:7;6109:22:13;;;;:8;:22;;;;;;;;6101:67;;;;-1:-1:-1;;;6101:67:13;;;;;;;:::i;:::-;1411:7:2;;;;1654:9:::1;1646:38;;;;-1:-1:-1::0;;;1646:38:2::1;;;;;;;:::i;:::-;22229:7:13::2;:14;22208:10;:17;:35;:120;;;;;22283:9;:16;22262:10;:17;:37;22261:66;;;;22305:9;:16;22325:1;22305:21;22261:66;22186:207;;;;-1:-1:-1::0;;;22186:207:13::2;;;;;;;:::i;:::-;22410:9;:16;22430:1;22410:21;22406:733;;;22453:9;22448:324;22472:10;:17;22468:1;:21;22448:324;;;22568:35;22577:10;22588:1;22577:13;;;;;;;;:::i;:::-;;;;;;;22592:7;22600:1;22592:10;;;;;;;;:::i;22568:35::-;;22622:134;22656:10;22667:1;22656:13;;;;;;;;:::i;:::-;;;;;;;22692:7;22700:1;22692:10;;;;;;;;:::i;:::-;;;;;;;22725:9;22735:1;22725:12;;;;;;;;:::i;:::-;;;;;;;22622:11;:134::i;:::-;22491:3:::0;::::2;::::0;::::2;:::i;:::-;;;;22448:324;;;;17975:198:::0;;;:::o;22406:733::-:2;22809:9;22804:324;22828:10;:17;22824:1;:21;22804:324;;;22924:35;22933:10;22944:1;22933:13;;;;;;;;:::i;22924:35::-;;22978:134;23012:10;23023:1;23012:13;;;;;;;;:::i;:::-;;;;;;;23048:7;23056:1;23048:10;;;;;;;;:::i;:::-;;;;;;;23081:9;23091:1;23081:12;;;;;;;;:::i;22978:134::-;22847:3:::0;::::2;::::0;::::2;:::i;:::-;;;;22804:324;;3930:131:::0;-1:-1:-1;;;;;3990:17:13;;4010:5;3990:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;3990:25:13;;;4031:22;;;4010:5;4031:22;3930:131;:::o;10460:370:3:-;-1:-1:-1;;;;;10591:19:3;;10583:68;;;;-1:-1:-1;;;10583:68:3;;22575:2:14;10583:68:3;;;22557:21:14;22614:2;22594:18;;;22587:30;22653:34;22633:18;;;22626:62;-1:-1:-1;;;22704:18:14;;;22697:34;22748:19;;10583:68:3;22373:400:14;10583:68:3;-1:-1:-1;;;;;10669:21:3;;10661:68;;;;-1:-1:-1;;;10661:68:3;;22980:2:14;10661:68:3;;;22962:21:14;23019:2;22999:18;;;22992:30;23058:34;23038:18;;;23031:62;-1:-1:-1;;;23109:18:14;;;23102:32;23151:19;;10661:68:3;22778:398:14;10661:68:3;-1:-1:-1;;;;;10740:18:3;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10791:32;;2498:25:14;;;10791:32:3;;2471:18:14;10791:32:3;;;;;;;10460:370;;;:::o;6861:381:13:-;7006:1;6997:6;:10;6989:49;;;;-1:-1:-1;;;6989:49:13;;23383:2:14;6989:49:13;;;23365:21:14;23422:2;23402:18;;;23395:30;23461:28;23441:18;;;23434:56;23507:18;;6989:49:13;23181:350:14;6989:49:13;7069:15;7057:9;:27;7049:69;;;;-1:-1:-1;;;7049:69:13;;23738:2:14;7049:69:13;;;23720:21:14;23777:2;23757:18;;;23750:30;23816:31;23796:18;;;23789:59;23865:18;;7049:69:13;23536:353:14;7049:69:13;-1:-1:-1;;;;;7129:19:13;;;;;;:10;:19;;;;;;;;7154:44;;;;;;;;;;7171:15;7154:44;;;;;;;;;;;;7129:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7215:19;;;7129;7215;6861:381;;;:::o;11107:441:3:-;-1:-1:-1;;;;;4428:18:3;;;11237:24;4428:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;11303:37:3;;11299:243;;11384:6;11364:16;:26;;11356:68;;;;-1:-1:-1;;;11356:68:3;;24096:2:14;11356:68:3;;;24078:21:14;24135:2;24115:18;;;24108:30;24174:31;24154:18;;;24147:59;24223:18;;11356:68:3;23894:353:14;11356:68:3;11466:51;11475:5;11482:7;11510:6;11491:16;:25;11466:8;:51::i;7825:651::-;-1:-1:-1;;;;;7951:18:3;;7943:68;;;;-1:-1:-1;;;7943:68:3;;24454:2:14;7943:68:3;;;24436:21:14;24493:2;24473:18;;;24466:30;24532:34;24512:18;;;24505:62;-1:-1:-1;;;24583:18:14;;;24576:35;24628:19;;7943:68:3;24252:401:14;7943:68:3;-1:-1:-1;;;;;8029:16:3;;8021:64;;;;-1:-1:-1;;;8021:64:3;;24860:2:14;8021:64:3;;;24842:21:14;24899:2;24879:18;;;24872:30;24938:34;24918:18;;;24911:62;-1:-1:-1;;;24989:18:14;;;24982:33;25032:19;;8021:64:3;24658:399:14;8021:64:3;8096:38;8117:4;8123:2;8127:6;8096:20;:38::i;:::-;-1:-1:-1;;;;;8167:15:3;;8145:19;8167:15;;;:9;:15;;;;;;8200:21;;;;8192:72;;;;-1:-1:-1;;;8192:72:3;;25264:2:14;8192:72:3;;;25246:21:14;25303:2;25283:18;;;25276:30;25342:34;25322:18;;;25315:62;-1:-1:-1;;;25393:18:14;;;25386:36;25439:19;;8192:72:3;25062:402:14;8192:72:3;-1:-1:-1;;;;;8298:15:3;;;;;;;:9;:15;;;;;;8316:20;;;8298:38;;8356:13;;;;;;;;:23;;8330:6;;8298:15;8356:23;;8330:6;;8356:23;:::i;:::-;;;;;;;;8410:2;-1:-1:-1;;;;;8395:26:3;8404:4;-1:-1:-1;;;;;8395:26:3;;8414:6;8395:26;;;;2498:25:14;;2486:2;2471:18;;2352:177;8395:26:3;;;;;;;;8432:37;17975:198:13;10630:366;-1:-1:-1;;;;;10726:22:13;;;;;;:13;:22;;;;;:29;10718:37;;10710:63;;;;-1:-1:-1;;;10710:63:13;;25671:2:14;10710:63:13;;;25653:21:14;25710:2;25690:18;;;25683:30;-1:-1:-1;;;25729:18:14;;;25722:43;25782:18;;10710:63:13;25469:337:14;10710:63:13;-1:-1:-1;;;;;10799:22:13;;;;;;:13;:22;;;;;:29;:33;;10831:1;;10799:33;:::i;:::-;10790:5;:42;10786:164;;-1:-1:-1;;;;;10881:22:13;;;;;;:13;:22;;;;;10904:29;;:33;;10936:1;;10904:33;:::i;:::-;10881:57;;;;;;;;:::i;:::-;;;;;;;;;;;10849:13;:22;10863:7;-1:-1:-1;;;;;10849:22:13;-1:-1:-1;;;;;10849:22:13;;;;;;;;;;;;10872:5;10849:29;;;;;;;;:::i;:::-;;;;;;;;;;;:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10786:164;-1:-1:-1;;;;;10960:22:13;;;;;;:13;:22;;;;;:28;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;10960:28:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10630:366:13:o;2576:246::-;2689:11;;;-1:-1:-1;;;;;2711:27:13;;;-1:-1:-1;;;;;;2711:27:13;;;;;;;2754:60;;2689:11;;;2711:27;2689:11;;2754:60;;2665:21;;2754:60;2654:168;2576:246;:::o;2353:117:2:-;1411:7;;;;1912:41;;;;-1:-1:-1;;;1912:41:2;;16044:2:14;1912:41:2;;;16026:21:14;16083:2;16063:18;;;16056:30;-1:-1:-1;;;16102:18:14;;;16095:50;16162:18;;1912:41:2;15842:344:14;1912:41:2;2411:7:::1;:15:::0;;-1:-1:-1;;2411:15:2::1;::::0;;2441:22:::1;929:10:7::0;2450:12:2::1;2441:22;::::0;-1:-1:-1;;;;;9173:32:14;;;9155:51;;9143:2;9128:18;2441:22:2::1;;;;;;;2353:117::o:0;9461:576:3:-;-1:-1:-1;;;;;9544:21:3;;9536:67;;;;-1:-1:-1;;;9536:67:3;;26145:2:14;9536:67:3;;;26127:21:14;26184:2;26164:18;;;26157:30;26223:34;26203:18;;;26196:62;-1:-1:-1;;;26274:18:14;;;26267:31;26315:19;;9536:67:3;25943:397:14;9536:67:3;9614:49;9635:7;9652:1;9656:6;9614:20;:49::i;:::-;-1:-1:-1;;;;;9699:18:3;;9674:22;9699:18;;;:9;:18;;;;;;9735:24;;;;9727:71;;;;-1:-1:-1;;;9727:71:3;;26547:2:14;9727:71:3;;;26529:21:14;26586:2;26566:18;;;26559:30;26625:34;26605:18;;;26598:62;-1:-1:-1;;;26676:18:14;;;26669:32;26718:19;;9727:71:3;26345:398:14;9727:71:3;-1:-1:-1;;;;;9832:18:3;;;;;;:9;:18;;;;;9853:23;;;9832:44;;9896:12;:22;;9870:6;;9832:18;9896:22;;9870:6;;9896:22;:::i;:::-;;;;-1:-1:-1;;9934:37:3;;2498:25:14;;;9960:1:3;;-1:-1:-1;;;;;9934:37:3;;;;;2486:2:14;2471:18;9934:37:3;;;;;;;17975:198:13;;;:::o;4663:123::-;-1:-1:-1;;;;;4719:17:13;;4739:5;4719:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;4719:25:13;;;4760:18;;;4739:5;4760:18;4663:123;:::o;6448:125::-;-1:-1:-1;;;;;6505:17:13;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;6505:24:13;6525:4;6505:24;;;6545:20;;;6505:17;6545:20;6448:125;:::o;988:95:0:-;2952:13:1;;;;;;;2944:69;;;;-1:-1:-1;;;2944:69:1;;;;;;;:::i;:::-;1050:26:0::1;:24;:26::i;1736:107:13:-:0;2952:13:1;;;;;;;2944:69;;;;-1:-1:-1;;;2944:69:1;;;;;;;:::i;:::-;1804:31:13::1;:29;:31::i;2116:147:3:-:0;2952:13:1;;;;;;;2944:69;;;;-1:-1:-1;;;2944:69:1;;;;;;;:::i;:::-;2218:38:3::1;2241:5;2248:7;2218:22;:38::i;8752:389::-:0;-1:-1:-1;;;;;8835:21:3;;8827:65;;;;-1:-1:-1;;;8827:65:3;;27362:2:14;8827:65:3;;;27344:21:14;27401:2;27381:18;;;27374:30;27440:33;27420:18;;;27413:61;27491:18;;8827:65:3;27160:355:14;8827:65:3;8903:49;8932:1;8936:7;8945:6;8903:20;:49::i;:::-;8979:6;8963:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;8995:18:3;;;;;;:9;:18;;;;;:28;;9017:6;;8995:18;:28;;9017:6;;8995:28;:::i;:::-;;;;-1:-1:-1;;9038:37:3;;2498:25:14;;;-1:-1:-1;;;;;9038:37:3;;;9055:1;;9038:37;;2486:2:14;2471:18;9038:37:3;;;;;;;19223:145:13;;:::o;7419:457::-;-1:-1:-1;;;;;7502:19:13;;;;;;:10;:19;;;;;:26;:34;;;-1:-1:-1;7502:48:13;;;;-1:-1:-1;7540:10:13;7502:48;7494:84;;;;-1:-1:-1;;;7494:84:13;;16754:2:14;7494:84:13;;;16736:21:14;16793:2;16773:18;;;16766:30;-1:-1:-1;;;16812:18:14;;;16805:53;16875:18;;7494:84:13;16552:347:14;7494:84:13;-1:-1:-1;;;;;7605:19:13;;7591:11;7605:19;;;:10;:19;;;;;:26;7646:16;;;:7;7652:1;7605:26;7646:7;:::i;:::-;:16;7642:154;;-1:-1:-1;;;;;7756:19:13;;;;;;:10;:19;;;;;7776:7;7782:1;7776:3;:7;:::i;:::-;7756:28;;;;;;;;:::i;:::-;;;;;;;;;;;7727:10;:19;7738:7;-1:-1:-1;;;;;7727:19:13;-1:-1:-1;;;;;7727:19:13;;;;;;;;;;;;7747:5;7727:26;;;;;;;;;;:::i;:::-;;;;;;;;;:57;;:26;;;;;:57;;;;;;;;;;;;;;;;;;;;7642:154;-1:-1:-1;;;;;7806:19:13;;;;;;:10;:19;;;;;:25;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;7806:25:13;;;;;;;;;;;;;;;;;;;;;;;7847:21;;-1:-1:-1;;;;;7847:21:13;;;;;;7483:393;7419:457;;:::o;2510:187:0:-;2602:6;;;-1:-1:-1;;;;;2618:17:0;;;-1:-1:-1;;;;;;2618:17:0;;;;;;;2650:40;;2602:6;;;2618:17;2602:6;;2650:40;;2583:16;;2650:40;2573:124;2510:187;:::o;11004:786:13:-;-1:-1:-1;;;;;11218:21:13;;11210:73;;;;-1:-1:-1;;;11210:73:13;;;;;;;:::i;:::-;11395:1;11386:6;:10;11378:47;;;;-1:-1:-1;;;11378:47:13;;28130:2:14;11378:47:13;;;28112:21:14;28169:2;28149:18;;;28142:30;28208:26;28188:18;;;28181:54;28252:18;;11378:47:13;27928:348:14;11378:47:13;11453:1;11444:6;:10;11436:47;;;;-1:-1:-1;;;11436:47:13;;28483:2:14;11436:47:13;;;28465:21:14;28522:2;28502:18;;;28495:30;-1:-1:-1;;;28541:18:14;;;28534:54;28605:18;;11436:47:13;28281:348:14;11436:47:13;11510:1;11502:5;:9;11494:45;;;;-1:-1:-1;;;11494:45:13;;28836:2:14;11494:45:13;;;28818:21:14;28875:2;28855:18;;;28848:30;-1:-1:-1;;;28894:18:14;;;28887:53;28957:18;;11494:45:13;28634:347:14;11494:45:13;-1:-1:-1;;;;;11579:22:13;;11552:24;11579:22;;;:13;:22;;;;;:29;;11602:5;;11579:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;11619:20;;;11650:13;;;:24;;;11685:11;;;:20;;;11716:10;;;:18;;;11752:30;;2498:25:14;;;11579:29:13;;-1:-1:-1;;;;;;11752:30:13;;;;;2471:18:14;11752:30:13;;;;;;;11199:591;11004:786;;;;;;:::o;2106:115:2:-;1411:7;;;;1654:9;1646:38;;;;-1:-1:-1;;;1646:38:2;;;;;;;:::i;:::-;2165:7:::1;:14:::0;;-1:-1:-1;;2165:14:2::1;2175:4;2165:14;::::0;;2194:20:::1;2201:12;929:10:7::0;;850:96;4459:118:13;-1:-1:-1;;;;;4513:17:13;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;4513:24:13;4533:4;4513:24;;;4553:16;;;4513:17;4553:16;4459:118;:::o;9879:597::-;-1:-1:-1;;;;;10066:21:13;;10058:73;;;;-1:-1:-1;;;10058:73:13;;;;;;;:::i;:::-;10243:1;10234:6;:10;10226:47;;;;-1:-1:-1;;;10226:47:13;;28483:2:14;10226:47:13;;;28465:21:14;28522:2;28502:18;;;28495:30;-1:-1:-1;;;28541:18:14;;;28534:54;28605:18;;10226:47:13;28281:348:14;10226:47:13;10300:1;10292:5;:9;10284:45;;;;-1:-1:-1;;;10284:45:13;;28836:2:14;10284:45:13;;;28818:21:14;28875:2;28855:18;;;28848:30;-1:-1:-1;;;28894:18:14;;;28887:53;28957:18;;10284:45:13;28634:347:14;10284:45:13;-1:-1:-1;;;;;10340:22:13;;;;;;:13;:22;;;;;;;;10368:61;;;;;;;;;;10388:15;10368:61;;;;;;;;;;;;;;;;;;;;;;;;10340:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10446:22;;;10340;10446;9879:597;;;;;:::o;6656:131::-;-1:-1:-1;;;;;6716:17:13;;6736:5;6716:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;6716:25:13;;;6757:22;;;6736:5;6757:22;6656:131;:::o;3718:125::-;-1:-1:-1;;;;;3775:17:13;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;3775:24:13;3795:4;3775:24;;;3815:20;;;3775:17;3815:20;3718:125;:::o;15160:684::-;-1:-1:-1;;;;;4946:17:13;;4922:4;4946:17;;;:8;:17;;;;;;;;15321:16;15313:75;;;;-1:-1:-1;;;15313:75:13;;29188:2:14;15313:75:13;;;29170:21:14;29227:2;29207:18;;;29200:30;29266:34;29246:18;;;29239:62;-1:-1:-1;;;29317:18:14;;;29310:44;29371:19;;15313:75:13;28986:410:14;15313:75:13;-1:-1:-1;;;;;4946:17:13;;4922:4;4946:17;;;:8;:17;;;;;;;;15407:14;15399:71;;;;-1:-1:-1;;;15399:71:13;;29603:2:14;15399:71:13;;;29585:21:14;29642:2;29622:18;;;29615:30;29681:34;29661:18;;;29654:62;-1:-1:-1;;;29732:18:14;;;29725:42;29784:19;;15399:71:13;29401:408:14;15399:71:13;15490:23;929:10:7;15500:12:13;850:96:7;15490:23:13;15489:24;15481:90;;;;-1:-1:-1;;;15481:90:13;;30016:2:14;15481:90:13;;;29998:21:14;30055:2;30035:18;;;30028:30;30094:34;30074:18;;;30067:62;-1:-1:-1;;;30145:18:14;;;30138:51;30206:19;;15481:90:13;29814:417:14;15481:90:13;1411:7:2;;;;15590:9:13;15582:59;;;;-1:-1:-1;;;15582:59:13;;30438:2:14;15582:59:13;;;30420:21:14;30477:2;30457:18;;;30450:30;30516:34;30496:18;;;30489:62;-1:-1:-1;;;30567:18:14;;;30560:35;30612:19;;15582:59:13;30236:401:14;15582:59:13;-1:-1:-1;;;;;15656:18:13;;;15652:127;;15730:6;15702:24;15721:4;15702:18;:24::i;:::-;-1:-1:-1;;;;;3845:18:3;;3819:7;3845:18;;;:9;:18;;;;;;15684:42:13;;;;:::i;:::-;:52;;15676:103;;;;-1:-1:-1;;;15676:103:13;;30844:2:14;15676:103:13;;;30826:21:14;30883:2;30863:18;;;30856:30;30922:34;30902:18;;;30895:62;-1:-1:-1;;;30973:18:14;;;30966:36;31019:19;;15676:103:13;30642:402:14;1089:111:0;2952:13:1;;;;;;;2944:69;;;;-1:-1:-1;;;2944:69:1;;;;;;;:::i;:::-;1161:32:0::1;929:10:7::0;1161:18:0::1;:32::i;1851:128:13:-:0;2952:13:1;;;;;;;2944:69;;;;-1:-1:-1;;;2944:69:1;;;;;;;:::i;:::-;1929:42:13::1;929:10:7::0;1929:28:13::1;:42::i;2269:159:3:-:0;2952:13:1;;;;;;;2944:69;;;;-1:-1:-1;;;2944:69:1;;;;;;;:::i;:::-;2381:13:3;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;2404:17:3;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:14;82:20;;-1:-1:-1;;;;;131:31:14;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:14:o;383:597::-;495:4;524:2;553;542:9;535:21;585:6;579:13;628:6;623:2;612:9;608:18;601:34;653:1;663:140;677:6;674:1;671:13;663:140;;;772:14;;;768:23;;762:30;738:17;;;757:2;734:26;727:66;692:10;;663:140;;;821:6;818:1;815:13;812:91;;;891:1;886:2;877:6;866:9;862:22;858:31;851:42;812:91;-1:-1:-1;964:2:14;943:15;-1:-1:-1;;939:29:14;924:45;;;;971:2;920:54;;383:597;-1:-1:-1;;;383:597:14:o;985:254::-;1053:6;1061;1114:2;1102:9;1093:7;1089:23;1085:32;1082:52;;;1130:1;1127;1120:12;1082:52;1153:29;1172:9;1153:29;:::i;:::-;1143:39;1229:2;1214:18;;;;1201:32;;-1:-1:-1;;;985:254:14:o;1761:259::-;1953:3;1938:19;;1966:48;1942:9;1996:6;1519:5;1513:12;1508:3;1501:25;1575:4;1568:5;1564:16;1558:23;1551:4;1546:3;1542:14;1535:47;1631:4;1624:5;1620:16;1614:23;1607:4;1602:3;1598:14;1591:47;1687:4;1680:5;1676:16;1670:23;1663:4;1658:3;1654:14;1647:47;1743:4;1736:5;1732:16;1726:23;1719:4;1714:3;1710:14;1703:47;;;1436:320;2025:322;2102:6;2110;2118;2171:2;2159:9;2150:7;2146:23;2142:32;2139:52;;;2187:1;2184;2177:12;2139:52;2210:29;2229:9;2210:29;:::i;:::-;2200:39;2286:2;2271:18;;2258:32;;-1:-1:-1;2337:2:14;2322:18;;;2309:32;;2025:322;-1:-1:-1;;;2025:322:14:o;2534:328::-;2611:6;2619;2627;2680:2;2668:9;2659:7;2655:23;2651:32;2648:52;;;2696:1;2693;2686:12;2648:52;2719:29;2738:9;2719:29;:::i;:::-;2709:39;;2767:38;2801:2;2790:9;2786:18;2767:38;:::i;:::-;2757:48;;2852:2;2841:9;2837:18;2824:32;2814:42;;2534:328;;;;;:::o;2867:715::-;3096:2;3148:21;;;3218:13;;3121:18;;;3240:22;;;3067:4;;3096:2;3319:15;;;;3293:2;3278:18;;;3067:4;3362:194;3376:6;3373:1;3370:13;3362:194;;;3425:49;3470:3;3461:6;3455:13;1519:5;1513:12;1508:3;1501:25;1575:4;1568:5;1564:16;1558:23;1551:4;1546:3;1542:14;1535:47;1631:4;1624:5;1620:16;1614:23;1607:4;1602:3;1598:14;1591:47;1687:4;1680:5;1676:16;1670:23;1663:4;1658:3;1654:14;1647:47;1743:4;1736:5;1732:16;1726:23;1719:4;1714:3;1710:14;1703:47;;;1436:320;3425:49;3531:15;;;;3503:4;3494:14;;;;;3398:1;3391:9;3362:194;;;-1:-1:-1;3573:3:14;;2867:715;-1:-1:-1;;;;;;2867:715:14:o;3776:180::-;3835:6;3888:2;3876:9;3867:7;3863:23;3859:32;3856:52;;;3904:1;3901;3894:12;3856:52;-1:-1:-1;3927:23:14;;3776:180;-1:-1:-1;3776:180:14:o;3961:343::-;4027:6;4035;4088:2;4076:9;4067:7;4063:23;4059:32;4056:52;;;4104:1;4101;4094:12;4056:52;4127:29;4146:9;4127:29;:::i;:::-;4117:39;;4206:2;4195:9;4191:18;4178:32;4250:4;4243:5;4239:16;4232:5;4229:27;4219:55;;4270:1;4267;4260:12;4219:55;4293:5;4283:15;;;3961:343;;;;;:::o;4562:127::-;4623:10;4618:3;4614:20;4611:1;4604:31;4654:4;4651:1;4644:15;4678:4;4675:1;4668:15;4694:275;4765:2;4759:9;4830:2;4811:13;;-1:-1:-1;;4807:27:14;4795:40;;4865:18;4850:34;;4886:22;;;4847:62;4844:88;;;4912:18;;:::i;:::-;4948:2;4941:22;4694:275;;-1:-1:-1;4694:275:14:o;4974:531::-;5017:5;5070:3;5063:4;5055:6;5051:17;5047:27;5037:55;;5088:1;5085;5078:12;5037:55;5124:6;5111:20;5150:18;5146:2;5143:26;5140:52;;;5172:18;;:::i;:::-;5216:55;5259:2;5240:13;;-1:-1:-1;;5236:27:14;5265:4;5232:38;5216:55;:::i;:::-;5296:2;5287:7;5280:19;5342:3;5335:4;5330:2;5322:6;5318:15;5314:26;5311:35;5308:55;;;5359:1;5356;5349:12;5308:55;5424:2;5417:4;5409:6;5405:17;5398:4;5389:7;5385:18;5372:55;5472:1;5447:16;;;5465:4;5443:27;5436:38;;;;5451:7;4974:531;-1:-1:-1;;;4974:531:14:o;5510:686::-;5616:6;5624;5632;5640;5693:3;5681:9;5672:7;5668:23;5664:33;5661:53;;;5710:1;5707;5700:12;5661:53;5733:29;5752:9;5733:29;:::i;:::-;5723:39;;5813:2;5802:9;5798:18;5785:32;5836:18;5877:2;5869:6;5866:14;5863:34;;;5893:1;5890;5883:12;5863:34;5916:50;5958:7;5949:6;5938:9;5934:22;5916:50;:::i;:::-;5906:60;;6019:2;6008:9;6004:18;5991:32;5975:48;;6048:2;6038:8;6035:16;6032:36;;;6064:1;6061;6054:12;6032:36;;6087:52;6131:7;6120:8;6109:9;6105:24;6087:52;:::i;:::-;5510:686;;;;-1:-1:-1;6077:62:14;;6186:2;6171:18;6158:32;;-1:-1:-1;;;5510:686:14:o;6201:183::-;6261:4;6294:18;6286:6;6283:30;6280:56;;;6316:18;;:::i;:::-;-1:-1:-1;6361:1:14;6357:14;6373:4;6353:25;;6201:183::o;6389:668::-;6443:5;6496:3;6489:4;6481:6;6477:17;6473:27;6463:55;;6514:1;6511;6504:12;6463:55;6550:6;6537:20;6576:4;6600:60;6616:43;6656:2;6616:43;:::i;:::-;6600:60;:::i;:::-;6694:15;;;6780:1;6776:10;;;;6764:23;;6760:32;;;6725:12;;;;6804:15;;;6801:35;;;6832:1;6829;6822:12;6801:35;6868:2;6860:6;6856:15;6880:148;6896:6;6891:3;6888:15;6880:148;;;6962:23;6981:3;6962:23;:::i;:::-;6950:36;;7006:12;;;;6913;;6880:148;;;-1:-1:-1;7046:5:14;6389:668;-1:-1:-1;;;;;;6389:668:14:o;7062:662::-;7116:5;7169:3;7162:4;7154:6;7150:17;7146:27;7136:55;;7187:1;7184;7177:12;7136:55;7223:6;7210:20;7249:4;7273:60;7289:43;7329:2;7289:43;:::i;7273:60::-;7367:15;;;7453:1;7449:10;;;;7437:23;;7433:32;;;7398:12;;;;7477:15;;;7474:35;;;7505:1;7502;7495:12;7474:35;7541:2;7533:6;7529:15;7553:142;7569:6;7564:3;7561:15;7553:142;;;7635:17;;7623:30;;7673:12;;;;7586;;7553:142;;7729:1275;7949:6;7957;7965;7973;7981;8034:3;8022:9;8013:7;8009:23;8005:33;8002:53;;;8051:1;8048;8041:12;8002:53;8091:9;8078:23;8120:18;8161:2;8153:6;8150:14;8147:34;;;8177:1;8174;8167:12;8147:34;8200:61;8253:7;8244:6;8233:9;8229:22;8200:61;:::i;:::-;8190:71;;8314:2;8303:9;8299:18;8286:32;8270:48;;8343:2;8333:8;8330:16;8327:36;;;8359:1;8356;8349:12;8327:36;8382:63;8437:7;8426:8;8415:9;8411:24;8382:63;:::i;:::-;8372:73;;8498:2;8487:9;8483:18;8470:32;8454:48;;8527:2;8517:8;8514:16;8511:36;;;8543:1;8540;8533:12;8511:36;8566:63;8621:7;8610:8;8599:9;8595:24;8566:63;:::i;:::-;8556:73;;8682:2;8671:9;8667:18;8654:32;8638:48;;8711:2;8701:8;8698:16;8695:36;;;8727:1;8724;8717:12;8695:36;8750:63;8805:7;8794:8;8783:9;8779:24;8750:63;:::i;:::-;8740:73;;8866:3;8855:9;8851:19;8838:33;8822:49;;8896:2;8886:8;8883:16;8880:36;;;8912:1;8909;8902:12;8880:36;;8935:63;8990:7;8979:8;8968:9;8964:24;8935:63;:::i;:::-;8925:73;;;7729:1275;;;;;;;;:::o;9217:529::-;9321:6;9329;9337;9345;9353;9361;9414:3;9402:9;9393:7;9389:23;9385:33;9382:53;;;9431:1;9428;9421:12;9382:53;9454:29;9473:9;9454:29;:::i;:::-;9444:39;9530:2;9515:18;;9502:32;;-1:-1:-1;9581:2:14;9566:18;;9553:32;;9632:2;9617:18;;9604:32;;-1:-1:-1;9683:3:14;9668:19;;9655:33;;-1:-1:-1;9735:3:14;9720:19;9707:33;;-1:-1:-1;9217:529:14;-1:-1:-1;;;9217:529:14:o;9751:595::-;9869:6;9877;9930:2;9918:9;9909:7;9905:23;9901:32;9898:52;;;9946:1;9943;9936:12;9898:52;9986:9;9973:23;10015:18;10056:2;10048:6;10045:14;10042:34;;;10072:1;10069;10062:12;10042:34;10095:61;10148:7;10139:6;10128:9;10124:22;10095:61;:::i;:::-;10085:71;;10209:2;10198:9;10194:18;10181:32;10165:48;;10238:2;10228:8;10225:16;10222:36;;;10254:1;10251;10244:12;10222:36;;10277:63;10332:7;10321:8;10310:9;10306:24;10277:63;:::i;:::-;10267:73;;;9751:595;;;;;:::o;10351:460::-;10446:6;10454;10462;10470;10478;10531:3;10519:9;10510:7;10506:23;10502:33;10499:53;;;10548:1;10545;10538:12;10499:53;10571:29;10590:9;10571:29;:::i;:::-;10561:39;10647:2;10632:18;;10619:32;;-1:-1:-1;10698:2:14;10683:18;;10670:32;;10749:2;10734:18;;10721:32;;-1:-1:-1;10800:3:14;10785:19;10772:33;;-1:-1:-1;10351:460:14;-1:-1:-1;;;10351:460:14:o;10816:845::-;11039:2;11091:21;;;11161:13;;11064:18;;;11183:22;;;11010:4;;11039:2;11224;;11242:18;;;;11283:15;;;11010:4;11326:309;11340:6;11337:1;11334:13;11326:309;;;11399:13;;11437:9;;11425:22;;11487:11;;;11481:18;11467:12;;;11460:40;11540:11;;11534:18;11520:12;;;11513:40;11582:4;11573:14;;;;11610:15;;;;11362:1;11355:9;11326:309;;;-1:-1:-1;11652:3:14;;10816:845;-1:-1:-1;;;;;;;10816:845:14:o;11666:260::-;11734:6;11742;11795:2;11783:9;11774:7;11770:23;11766:32;11763:52;;;11811:1;11808;11801:12;11763:52;11834:29;11853:9;11834:29;:::i;:::-;11824:39;;11882:38;11916:2;11905:9;11901:18;11882:38;:::i;:::-;11872:48;;11666:260;;;;;:::o;11931:821::-;12083:6;12091;12099;12152:2;12140:9;12131:7;12127:23;12123:32;12120:52;;;12168:1;12165;12158:12;12120:52;12208:9;12195:23;12237:18;12278:2;12270:6;12267:14;12264:34;;;12294:1;12291;12284:12;12264:34;12317:61;12370:7;12361:6;12350:9;12346:22;12317:61;:::i;:::-;12307:71;;12431:2;12420:9;12416:18;12403:32;12387:48;;12460:2;12450:8;12447:16;12444:36;;;12476:1;12473;12466:12;12444:36;12499:63;12554:7;12543:8;12532:9;12528:24;12499:63;:::i;:::-;12489:73;;12615:2;12604:9;12600:18;12587:32;12571:48;;12644:2;12634:8;12631:16;12628:36;;;12660:1;12657;12650:12;12628:36;;12683:63;12738:7;12727:8;12716:9;12712:24;12683:63;:::i;:::-;12673:73;;;11931:821;;;;;:::o;12757:356::-;12959:2;12941:21;;;12978:18;;;12971:30;13037:34;13032:2;13017:18;;13010:62;13104:2;13089:18;;12757:356::o;13118:340::-;13320:2;13302:21;;;13359:2;13339:18;;;13332:30;-1:-1:-1;;;13393:2:14;13378:18;;13371:46;13449:2;13434:18;;13118:340::o;13463:380::-;13542:1;13538:12;;;;13585;;;13606:61;;13660:4;13652:6;13648:17;13638:27;;13606:61;13713:2;13705:6;13702:14;13682:18;13679:38;13676:161;;;13759:10;13754:3;13750:20;13747:1;13740:31;13794:4;13791:1;13784:15;13822:4;13819:1;13812:15;13676:161;;13463:380;;;:::o;13848:127::-;13909:10;13904:3;13900:20;13897:1;13890:31;13940:4;13937:1;13930:15;13964:4;13961:1;13954:15;13980:356;14182:2;14164:21;;;14201:18;;;14194:30;14260:34;14255:2;14240:18;;14233:62;14327:2;14312:18;;13980:356::o;14341:403::-;14543:2;14525:21;;;14582:2;14562:18;;;14555:30;14621:34;14616:2;14601:18;;14594:62;-1:-1:-1;;;14687:2:14;14672:18;;14665:37;14734:3;14719:19;;14341:403::o;14749:406::-;14951:2;14933:21;;;14990:2;14970:18;;;14963:30;15029:34;15024:2;15009:18;;15002:62;-1:-1:-1;;;15095:2:14;15080:18;;15073:40;15145:3;15130:19;;14749:406::o;15577:127::-;15638:10;15633:3;15629:20;15626:1;15619:31;15669:4;15666:1;15659:15;15693:4;15690:1;15683:15;15709:128;15749:3;15780:1;15776:6;15773:1;15770:13;15767:39;;;15786:18;;:::i;:::-;-1:-1:-1;15822:9:14;;15709:128::o;17319:422::-;17408:1;17451:5;17408:1;17465:270;17486:7;17476:8;17473:21;17465:270;;;17545:4;17541:1;17537:6;17533:17;17527:4;17524:27;17521:53;;;17554:18;;:::i;:::-;17604:7;17594:8;17590:22;17587:55;;;17624:16;;;;17587:55;17703:22;;;;17663:15;;;;17465:270;;;17469:3;17319:422;;;;;:::o;17746:806::-;17795:5;17825:8;17815:80;;-1:-1:-1;17866:1:14;17880:5;;17815:80;17914:4;17904:76;;-1:-1:-1;17951:1:14;17965:5;;17904:76;17996:4;18014:1;18009:59;;;;18082:1;18077:130;;;;17989:218;;18009:59;18039:1;18030:10;;18053:5;;;18077:130;18114:3;18104:8;18101:17;18098:43;;;18121:18;;:::i;:::-;-1:-1:-1;;18177:1:14;18163:16;;18192:5;;17989:218;;18291:2;18281:8;18278:16;18272:3;18266:4;18263:13;18259:36;18253:2;18243:8;18240:16;18235:2;18229:4;18226:12;18222:35;18219:77;18216:159;;;-1:-1:-1;18328:19:14;;;18360:5;;18216:159;18407:34;18432:8;18426:4;18407:34;:::i;:::-;18477:6;18473:1;18469:6;18465:19;18456:7;18453:32;18450:58;;;18488:18;;:::i;:::-;18526:20;;17746:806;-1:-1:-1;;;17746:806:14:o;18557:140::-;18615:5;18644:47;18685:4;18675:8;18671:19;18665:4;18644:47;:::i;18702:168::-;18742:7;18808:1;18804;18800:6;18796:14;18793:1;18790:21;18785:1;18778:9;18771:17;18767:45;18764:71;;;18815:18;;:::i;:::-;-1:-1:-1;18855:9:14;;18702:168::o;18875:401::-;19077:2;19059:21;;;19116:2;19096:18;;;19089:30;19155:34;19150:2;19135:18;;19128:62;-1:-1:-1;;;19221:2:14;19206:18;;19199:35;19266:3;19251:19;;18875:401::o;19281:135::-;19320:3;-1:-1:-1;;19341:17:14;;19338:43;;;19361:18;;:::i;:::-;-1:-1:-1;19408:1:14;19397:13;;19281:135::o;20239:125::-;20279:4;20307:1;20304;20301:8;20298:34;;;20312:18;;:::i;:::-;-1:-1:-1;20349:9:14;;20239:125::o;20369:217::-;20409:1;20435;20425:132;;20479:10;20474:3;20470:20;20467:1;20460:31;20514:4;20511:1;20504:15;20542:4;20539:1;20532:15;20425:132;-1:-1:-1;20571:9:14;;20369:217::o;21279:277::-;21346:6;21399:2;21387:9;21378:7;21374:23;21370:32;21367:52;;;21415:1;21412;21405:12;21367:52;21447:9;21441:16;21500:5;21493:13;21486:21;21479:5;21476:32;21466:60;;21522:1;21519;21512:12;25811:127;25872:10;25867:3;25863:20;25860:1;25853:31;25903:4;25900:1;25893:15;25927:4;25924:1;25917:15;26748:407;26950:2;26932:21;;;26989:2;26969:18;;;26962:30;27028:34;27023:2;27008:18;;27001:62;-1:-1:-1;;;27094:2:14;27079:18;;27072:41;27145:3;27130:19;;26748:407::o;27520:403::-;27722:2;27704:21;;;27761:2;27741:18;;;27734:30;27800:34;27795:2;27780:18;;27773:62;-1:-1:-1;;;27866:2:14;27851:18;;27844:37;27913:3;27898:19;;27520:403::o
Swarm Source
ipfs://a06f59e1233341dd69d77387147f9f2ed2558c794c5a8869c844459a5dd14381
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 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.