ERC-20
Staking
Overview
Max Total Supply
71,618,033,988 RISE
Holders
2,038 (0.00%)
Market
Price
$0.00 @ 0.000000 ETH (+0.28%)
Onchain Market Cap
$4,337,188.14
Circulating Supply Market Cap
$4,334,612.00
Other Info
Token Contract (WITH 18 Decimals)
Balance
6,375.193711091485980096 RISEValue
$0.39 ( ~0.000154688899211433 Eth) [0.0000%]Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
EverRise
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-01 */ // Copyright (c) 2022 EverRise Pte Ltd. All rights reserved. // EverRise licenses this file to you under the MIT license. /* The EverRise token is the keystone in the EverRise Ecosytem of dApps and the overaching key that unlocks multi-blockchain unification via the EverBridge. On EverRise token transactions 6% buyback and business development fees are collected: * 4% for token Buyback from the market, with bought back tokens directly distributed as ve-staking rewards * 2% for Business Development (Development, Sustainability and Marketing) ________ _______ __ / | / \ / | $$$$$$$$/__ __ ______ ______ $$$$$$$ |$$/ _______ ______ v3.14159265 $$ |__ / \ / |/ \ / \ $$ |__$$ |/ | / | / \ $$ | $$ \ /$$//$$$$$$ |/$$$$$$ |$$ $$< $$ |/$$$$$$$/ /$$$$$$ | $$$$$/ $$ /$$/ $$ $$ |$$ | $$/ $$$$$$$ |$$ |$$ \ $$ $$ | $$ |_____ $$ $$/ $$$$$$$$/ $$ | $$ | $$ |$$ | $$$$$$ |$$$$$$$$/ $$ | $$$/ $$ |$$ | $$ | $$ |$$ |/ $$/ $$ | $$$$$$$$/ $/ $$$$$$$/ $$/ $$/ $$/ $$/ $$$$$$$/ $$$$$$$/ Magnum opus Learn more about EverRise and the EverRise Ecosystem of dApps and how our utilities and partners can help protect your investors and help your project grow: https://everrise.com */ // SPDX-License-Identifier: MIT pragma solidity 0.8.13; error NotContractAddress(); // 0xd9716e43 error NoSameBlockSandwichTrades(); // 0x5fe87cb3 error TransferTooLarge(); // 0x1b97a875 error AmountLargerThanUnlockedAmount(); // 0x170abf7c error TokenNotStarted(); // 0xd87a63e0 error TokenAlreadyStarted(); // 0xe529091f error SandwichTradesAreDisallowed(); // 0xe069ee1d error AmountLargerThanAvailable(); // 0xbb296109 error StakeCanOnlyBeExtended(); // 0x73f7040a error NotStakeContractRequesting(); // 0x2ace6531 error NotEnoughToCoverStakeFee(); // 0x627554ed error NotZeroAddress(); // 0x66385fa3 error CallerNotApproved(); // 0x4014f1a5 error InvalidAddress(); // 0xe6c4247b error CallerNotOwner(); // 0x5cd83192 error NotZero(); // 0x0295aa98 error LiquidityIsLocked(); // 0x6bac637f error LiquidityAddOwnerOnly(); // 0x878d6363 error Overflow(); // 0x35278d12 error WalletLocked(); // 0xd550ed24 error LockTimeTooLong(); // 0xb660e89a error LockTimeTooShort(); // 0x6badcecf error NotLocked(); // 0x1834e265 error AmountMustBeGreaterThanZero(); // 0x5e85ae73 error Expired(); // 0x203d82d8 error InvalidSignature(); // 0x8baa579f error AmountLargerThanAllowance(); // 0x9b144c57 error AmountOutOfRange(); // 0xc64200e9 error Unlocked(); // 0x19aad371 error FailedEthSend(); // 0xb5747cc7 // File: EverRise-v3/Interfaces/IERC2612-Permit.sol pragma solidity 0.8.13; interface IERC2612 { function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function nonces(address owner) external view returns (uint256); function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: EverRise-v3/Interfaces/IERC173-Ownable.sol interface IOwnable { event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); function owner() external view returns (address); function transferOwnership(address newOwner) external; } // File: EverRise-v3/Abstract/Context.sol abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return payable(msg.sender); } } // File: EverRise-v3/Interfaces/IERC721-Nft.sol interface IERC721 /* is ERC165 */ { event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); function balanceOf(address _owner) external view returns (uint256); function ownerOf(uint256 _tokenId) external view returns (address); function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable; function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; function transferFrom(address _from, address _to, uint256 _tokenId) external payable; function approve(address _approved, uint256 _tokenId) external payable; function setApprovalForAll(address _operator, bool _approved) external; function getApproved(uint256 _tokenId) external view returns (address); function isApprovedForAll(address _owner, address _operator) external view returns (bool); } // File: EverRise-v3/Interfaces/InftEverRise.sol struct StakingDetails { uint96 initialTokenAmount; // Max 79 Bn tokens uint96 withdrawnAmount; // Max 79 Bn tokens uint48 depositTime; // 8 M years uint8 numOfMonths; // Max 256 month period uint8 achievementClaimed; // 256 bits, 20000 gwei gas address stakerAddress; // 160 bits (96 bits remaining) uint32 nftId; // Max 4 Bn nfts issued uint32 lookupIndex; // Max 4 Bn active stakes uint24 stakerIndex; // Max 16 M active stakes per wallet uint8 isActive; // 256 bits, 20000 gwei gas } // Total 512 bits, 40000 gwei gas interface InftEverRise is IERC721 { function voteEscrowedBalance(address account) external view returns (uint256); function unclaimedRewardsBalance(address account) external view returns (uint256); function totalAmountEscrowed() external view returns (uint256); function totalAmountVoteEscrowed() external view returns (uint256); function totalRewardsDistributed() external view returns (uint256); function totalRewardsUnclaimed() external view returns (uint256); function createRewards(uint256 tAmount) external; function getNftData(uint256 id) external view returns (StakingDetails memory); function enterStaking(address fromAddress, uint96 amount, uint8 numOfMonths) external returns (uint32 nftId); function leaveStaking(address fromAddress, uint256 id, bool overrideNotClaimed) external returns (uint96 amount); function earlyWithdraw(address fromAddress, uint256 id, uint96 amount) external returns (uint32 newNftId, uint96 penaltyAmount); function withdraw(address fromAddress, uint256 id, uint96 amount, bool overrideNotClaimed) external returns (uint32 newNftId); function bridgeStakeNftOut(address fromAddress, uint256 id) external returns (uint96 amount); function bridgeOrAirdropStakeNftIn(address toAddress, uint96 depositAmount, uint8 numOfMonths, uint48 depositTime, uint96 withdrawnAmount, uint96 rewards, bool achievementClaimed) external returns (uint32 nftId); function addStaker(address staker, uint256 nftId) external; function removeStaker(address staker, uint256 nftId) external; function reissueStakeNft(address staker, uint256 oldNftId, uint256 newNftId) external; function increaseStake(address staker, uint256 nftId, uint96 amount) external returns (uint32 newNftId, uint96 original, uint8 numOfMonths); function splitStake(uint256 id, uint96 amount) external payable returns (uint32 newNftId0, uint32 newNftId1); function claimAchievement(address staker, uint256 nftId) external returns (uint32 newNftId); function stakeCreateCost() external view returns (uint256); function approve(address owner, address _operator, uint256 nftId) external; } // File: EverRise-v3/Interfaces/IEverRiseWallet.sol struct ApprovalChecks { // Prevent permits being reused (IERC2612) uint64 nonce; // Allow revoke all spenders/operators approvals in single txn uint32 nftCheck; uint32 tokenCheck; // Allow auto timeout on approvals uint16 autoRevokeNftHours; uint16 autoRevokeTokenHours; // Allow full wallet locking of all transfers uint48 unlockTimestamp; } struct Allowance { uint128 tokenAmount; uint32 nftCheck; uint32 tokenCheck; uint48 timestamp; uint8 nftApproval; uint8 tokenApproval; } interface IEverRiseWallet { event RevokeAllApprovals(address indexed account, bool tokens, bool nfts); event SetApprovalAutoTimeout(address indexed account, uint16 tokensHrs, uint16 nftsHrs); event LockWallet(address indexed account, address altAccount, uint256 length); event LockWalletExtend(address indexed account, uint256 length); } // File: EverRise-v3/Interfaces/IUniswap.sol interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to); event Swap(address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to); event Sync(uint112 reserve0, uint112 reserve1); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r,bytes32 s) external; function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function DOMAIN_SEPARATOR() external view returns (bytes32); function nonces(address owner) external view returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function PERMIT_TYPEHASH() external pure returns (bytes32); function MINIMUM_LIQUIDITY() external pure returns (uint256); } interface IUniswapV2Router01 { function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity); function swapETHForExactTokens(uint256 amountOut, address[] calldata path, address to, uint256 deadline) external payable returns (uint256[] memory amounts); function swapExactETHForTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external payable returns (uint256[] memory amounts); function addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB, uint256 liquidity); function removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external returns (uint256[] memory amounts); function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline) external returns (uint256[] memory amounts); function swapTokensForExactETH(uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline) external returns (uint256[] memory amounts); function swapExactTokensForETH(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external returns (uint256[] memory amounts); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); function factory() external pure returns (address); function WETH() external pure returns (address); function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external pure returns (uint256 amountB); function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) external pure returns (uint256 amountOut); function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) external pure returns (uint256 amountIn); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external; function swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } // File: EverRise-v3/Abstract/ErrorNotZeroAddress.sol contract Ownable is IOwnable, Context { address public owner; function _onlyOwner() private view { if (owner != _msgSender()) revert CallerNotOwner(); } modifier onlyOwner() { _onlyOwner(); _; } constructor() { address msgSender = _msgSender(); owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } // Allow contract ownership and access to contract onlyOwner functions // to be locked using EverOwn with control gated by community vote. // // EverRise ($RISE) stakers become voting members of the // decentralized autonomous organization (DAO) that controls access // to the token contract via the EverRise Ecosystem dApp EverOwn function transferOwnership(address newOwner) external virtual onlyOwner { if (newOwner == address(0)) revert NotZeroAddress(); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } } // File: EverRise-v3/Abstract/EverRiseRoles.sol abstract contract EverRiseRoles is Ownable { mapping (Role => mapping (address => bool)) public roles; enum Role { NotValidRole, BuyBack, NftBridge, Limits, Liquidity, Fees, Exchanges, CrossChainBuyback, Upgrader } event ControlAdded(address indexed controller, Role indexed role); event ControlRemoved(address indexed controller, Role indexed role); function _onlyController(Role role) private view { if (!roles[role][_msgSender()]) revert CallerNotApproved(); } modifier onlyController(Role role) { _onlyController(role); _; } constructor() { address deployer = _msgSender(); ownerRoles(deployer, true); } function transferOwnership(address newOwner) override external onlyOwner { if (newOwner == address(0)) revert NotZeroAddress(); address previousOwner = owner; ownerRoles(previousOwner, false); ownerRoles(newOwner, true); owner = newOwner; emit OwnershipTransferred(previousOwner, newOwner); } function ownerRoles(address _owner, bool enable) private { roles[Role.BuyBack][_owner] = enable; roles[Role.NftBridge][_owner] = enable; roles[Role.Limits][_owner] = enable; roles[Role.Liquidity][_owner] = enable; roles[Role.Fees][_owner] = enable; roles[Role.Exchanges][_owner] = enable; roles[Role.CrossChainBuyback][_owner] = enable; roles[Role.Upgrader][_owner] = enable; } function addControlRole(address newController, Role role) external onlyOwner { if (role == Role.NotValidRole) revert NotZero(); if (newController == address(0)) revert NotZeroAddress(); roles[role][newController] = true; emit ControlAdded(newController, role); } function removeControlRole(address oldController, Role role) external onlyOwner { if (role == Role.NotValidRole) revert NotZero(); if (oldController == address(0)) revert NotZeroAddress(); roles[role][oldController] = false; emit ControlRemoved(oldController, role); } } // File: EverRise-v3/Abstract/EverRiseLib.sol library EverRiseAddressNumberLib { function toUint96(uint256 value) internal pure returns (uint96) { if (value > type(uint96).max) revert Overflow(); return uint96(value); } 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; } bytes private constant token0Selector = abi.encodeWithSelector(IUniswapV2Pair.token0.selector); bytes private constant token1Selector = abi.encodeWithSelector(IUniswapV2Pair.token1.selector); function pairTokens(address pair) internal view returns (address token0, address token1) { // Do not check if pair is not a contract to avoid warning in txn log if (!isContract(pair)) return (address(0), address(0)); return (tokenLookup(pair, token0Selector), tokenLookup(pair, token1Selector)); } function tokenLookup(address pair, bytes memory selector) private view returns (address) { (bool success, bytes memory data) = pair.staticcall(selector); if (success && data.length >= 32) { return abi.decode(data, (address)); } return address(0); } } library EverRiseLib { function swapTokensForEth( IUniswapV2Router02 uniswapV2Router, uint256 tokenAmount ) external { address tokenAddress = address(this); // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = tokenAddress; path[1] = uniswapV2Router.WETH(); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, tokenAddress, // The contract block.timestamp ); } function swapETHForTokensNoFee( IUniswapV2Router02 uniswapV2Router, address toAddress, uint256 amount ) external { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = address(this); // make the swap uniswapV2Router.swapExactETHForTokens{ value: amount }( 0, // accept any amount of Tokens path, toAddress, // The contract block.timestamp ); } } // File: EverRise-v3/Interfaces/IEverDrop.sol interface IEverDrop { function mirgateV1V2Holder(address holder, uint96 amount) external returns(bool); function mirgateV2Staker(address toAddress, uint96 rewards, uint96 depositTokens, uint8 numOfMonths, uint48 depositTime, uint96 withdrawnAmount) external returns(uint256 nftId); } // File: EverRise-v3/Interfaces/IERC20-Token.sol interface IERC20 { event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); function transferFromWithPermit(address sender, address recipient, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external returns (bool); } interface IERC20Metadata is IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } // File: EverRise-v3/Abstract/EverRiseWallet.sol abstract contract EverRiseWallet is Context, IERC2612, IEverRiseWallet, IERC20Metadata { using EverRiseAddressNumberLib for address; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); bytes32 public constant DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f; mapping (address => ApprovalChecks) internal _approvals; mapping (address => mapping (address => Allowance)) public allowances; //Lock related fields mapping(address => address) private _userUnlocks; function _walletLock(address fromAddress) internal view { if (_isWalletLocked(fromAddress)) revert WalletLocked(); } modifier walletLock(address fromAddress) { _walletLock(fromAddress); _; } function _isWalletLocked(address fromAddress) internal view returns (bool) { return _approvals[fromAddress].unlockTimestamp > block.timestamp; } function DOMAIN_SEPARATOR() public view returns (bytes32) { // Unique DOMAIN_SEPARATOR per user nbased on their current token check uint32 tokenCheck = _approvals[_msgSender()].tokenCheck; return keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), keccak256(abi.encodePacked(tokenCheck)), block.chainid, address(this) ) ); } function name() public virtual view returns (string memory); function nonces(address owner) external view returns (uint256) { return _approvals[owner].nonce; } /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function _setApprovalForAll(address owner, address operator, bool approved) internal { if (operator == address(0)) revert NotZeroAddress(); Allowance storage _allowance = allowances[owner][operator]; ApprovalChecks storage _approval = _approvals[owner]; if (approved) { uint16 autoRevokeNftHours = _approval.autoRevokeNftHours; uint48 timestamp = autoRevokeNftHours == 0 ? type(uint48).max : // Don't timeout approval uint48(block.timestamp) + autoRevokeNftHours * 1 hours; // Timeout after user chosen period _allowance.nftCheck = _approval.nftCheck; _allowance.timestamp = timestamp; _allowance.nftApproval = 1; } else { unchecked { // nftCheck gets incremented, so set one behind approval _allowance.nftCheck = _approval.nftCheck - 1; } _allowance.nftApproval = 0; } } function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public { if (spender == address(0)) revert NotZeroAddress(); if (deadline < block.timestamp) revert Expired(); ApprovalChecks storage _approval = _approvals[owner]; uint64 nonce = _approval.nonce; bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( PERMIT_TYPEHASH, owner, spender, value, nonce, deadline ) ) ) ); unchecked { // Nonces can wrap ++nonce; } _approval.nonce = nonce; if (v < 27) { v += 27; } else if (v > 30) { digest = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", digest)); } address recoveredAddress = ecrecover(digest, v, r, s); if (recoveredAddress == address(0) || recoveredAddress != owner) revert InvalidSignature(); _approve(owner, spender, value, true); } function approve(address spender, uint256 amount) external returns (bool) { return _approve(_msgSender(), spender, amount, true); } function _approve( address owner, address spender, uint256 amount, bool extend ) internal returns (bool) { if (owner == address(0)) revert NotZeroAddress(); if (spender == address(0)) revert NotZeroAddress(); if (amount > type(uint128).max) amount = type(uint128).max; ApprovalChecks storage _approval = _approvals[owner]; Allowance storage _allowance = allowances[owner][spender]; _allowance.tokenAmount = uint128(amount); _allowance.tokenCheck = _approval.tokenCheck; if (extend) { uint48 autoRevokeTokenHours = _approval.autoRevokeTokenHours; // Time extention approval _allowance.timestamp = autoRevokeTokenHours == 0 ? type(uint48).max : // Don't timeout approval uint48(block.timestamp) + autoRevokeTokenHours * 1 hours; // Timeout after user chosen period } _allowance.tokenApproval = 1; emit Approval(owner, spender, amount); return true; } function allowance(address owner, address spender) public view returns (uint256) { uint32 tokenCheck = _approvals[owner].tokenCheck; Allowance storage allowanceSettings = allowances[owner][spender]; if (tokenCheck != allowanceSettings.tokenCheck || block.timestamp > allowanceSettings.timestamp || allowanceSettings.tokenApproval != 1) { return 0; } return allowanceSettings.tokenAmount; } function transfer(address recipient, uint256 amount) external override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public override returns (bool) { _transfer(sender, recipient, amount); uint256 _allowance = allowance(sender, _msgSender()); if (amount > _allowance) revert AmountLargerThanAllowance(); unchecked { _allowance -= amount; } _approve(sender, _msgSender(), _allowance, false); return true; } function transferFromWithPermit( address sender, address recipient, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external returns (bool) { permit(sender, _msgSender(), amount, deadline, v, r, s); return transferFrom(sender, recipient, amount); } function lockTokensAndNfts(address altAccount, uint48 length) external walletLock(_msgSender()) { if (altAccount == address(0)) revert NotZeroAddress(); if (length / 1 days > 10 * 365 days) revert LockTimeTooLong(); _approvals[_msgSender()].unlockTimestamp = uint48(block.timestamp) + length; _userUnlocks[_msgSender()] = altAccount; emit LockWallet(_msgSender(), altAccount, length); } function extendLockTokensAndNfts(uint48 length) external { if (length / 1 days > 10 * 365 days) revert LockTimeTooLong(); uint48 currentLock = _approvals[_msgSender()].unlockTimestamp; if (currentLock < block.timestamp) revert Unlocked(); uint48 newLock = uint48(block.timestamp) + length; if (currentLock > newLock) revert LockTimeTooShort(); _approvals[_msgSender()].unlockTimestamp = newLock; emit LockWalletExtend(_msgSender(), length); } function unlockTokensAndNfts(address actualAccount) external { if (_userUnlocks[actualAccount] != _msgSender()) revert CallerNotApproved(); uint48 currentLock = _approvals[_msgSender()].unlockTimestamp; if (currentLock < block.timestamp) revert Unlocked(); _approvals[_msgSender()].unlockTimestamp = 1; } function revokeApprovals(bool tokens, bool nfts) external { address account = _msgSender(); ApprovalChecks storage _approval = _approvals[account]; unchecked { // Nonces can wrap if (nfts) { ++_approval.nftCheck; } if (tokens) { ++_approval.tokenCheck; } } emit RevokeAllApprovals(account, tokens, nfts); } function setAutoTimeout(uint16 tokensHrs, uint16 nftsHrs) external { address account = _msgSender(); ApprovalChecks storage _approval = _approvals[account]; _approval.autoRevokeNftHours = nftsHrs; _approval.autoRevokeTokenHours = tokensHrs; emit SetApprovalAutoTimeout(account, tokensHrs, nftsHrs); } /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function _isApprovedForAll(address account, address operator) internal view returns (bool) { uint32 nftCheck = _approvals[account].nftCheck; Allowance storage _allowance = allowances[account][operator]; if (nftCheck != _allowance.nftCheck || block.timestamp > _allowance.timestamp || _allowance.nftApproval != 1) { return false; } return true; } function _transfer( address from, address to, uint256 amount ) internal virtual; } // File: EverRise-v3/Interfaces/IEverRise.sol interface IEverRise is IERC20Metadata { function totalBuyVolume() external view returns (uint256); function totalSellVolume() external view returns (uint256); function holders() external view returns (uint256); function uniswapV2Pair() external view returns (address); function transferStake(address fromAddress, address toAddress, uint96 amountToTransfer) external; function isWalletLocked(address fromAddress) external view returns (bool); function setApprovalForAll(address fromAddress, address operator, bool approved) external; function isApprovedForAll(address account, address operator) external view returns (bool); function isExcludedFromFee(address account) external view returns (bool); function approvals(address account) external view returns (ApprovalChecks memory); } // File: EverRise-v3/Abstract/EverRiseConfigurable.sol abstract contract EverRiseConfigurable is EverRiseRoles, EverRiseWallet, IEverRise { using EverRiseAddressNumberLib for uint256; event BuyBackEnabledUpdated(bool enabled); event SwapEnabledUpdated(bool enabled); event ExcludeFromFeeUpdated(address account); event IncludeInFeeUpdated(address account); event LiquidityFeeUpdated(uint256 newValue); event TransactionCapUpdated(uint256 newValue); event MinStakeSizeUpdated(uint256 newValue); event BusinessDevelopmentDivisorUpdated(uint256 newValue); event MinTokensBeforeSwapUpdated(uint256 newValue); event BuybackMinAvailabilityUpdated(uint256 newValue); event MinBuybackAmountUpdated(uint256 newvalue); event MaxBuybackAmountUpdated(uint256 newvalue); event BuybackUpperLimitUpdated(uint256 newValue); event BuyBackTriggerTokenLimitUpdated(uint256 newValue); event BuybackBlocksUpdated(uint256 newValue); event BridgeVaultAddressUpdated(address indexed contractAddress); event BurnAddressUpdated(address indexed deadAddress); event OffChainBalanceExcluded(bool enable); event RouterAddressUpdated(address indexed newAddress); event BusinessDevelopmentAddressUpdated(address indexed newAddress); event StakingAddressUpdated(address indexed contractAddress); event LiquidityLocked(bool isLocked); event AutoBurnEnabled(bool enabled); event BurnableTokensZeroed(); event ExchangeHotWalletAdded(address indexed exchangeHotWallet); event ExchangeHotWalletRemoved(address indexed exchangeHotWallet); event BuyBackTriggered(); event BuyBackCrossChainTriggered(); address payable public businessDevelopmentAddress = payable(0x24D8DAbebD6c0d5CcC88EC40D95Bf8eB64F0CF9E); // Business Development Address address public everBridgeVault; address public burnAddress = 0x000000000000000000000000000000000000dEaD; mapping (address => bool) internal _isExcludedFromFee; mapping (address => bool) internal _exchangeHotWallet; uint8 public constant decimals = 18; // Golden supply uint96 internal immutable _totalSupply = uint96(7_1_618_033_988 * 10**decimals); function totalSupply() external view returns (uint256) { return _totalSupply; } // Fee and max txn are set by setTradingEnabled // to allow upgrading balances to arrange their wallets // and stake their assets before trading start uint256 public totalBuyVolume; uint256 public totalSellVolume; uint256 public transactionCap; uint96 public liquidityFee = 6; uint256 public businessDevelopmentDivisor = 2; uint96 internal _minimumTokensBeforeSwap = uint96(5 * 10**6 * 10**decimals); uint256 internal _buyBackUpperLimit = 10 * 10**18; uint256 internal _buyBackTriggerTokenLimit = 1 * 10**6 * 10**decimals; uint256 internal _buyBackMinAvailability = 1 * 10**18; //1 BNB uint256 internal _nextBuybackAmount; uint256 internal _latestBuybackBlock; uint256 internal _numberOfBlocks = 1000; uint256 internal _minBuybackAmount = 1 * 10**18 / (10**1); uint256 internal _maxBuybackAmount = 1 * 10**18; // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. uint256 constant _FALSE = 1; uint256 constant _TRUE = 2; // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to modifiers will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 internal _inSwap = _FALSE; uint256 internal _swapEnabled = _FALSE; uint256 internal _buyBackEnabled = _FALSE; uint256 internal _liquidityLocked = _TRUE; uint256 internal _offchainBalanceExcluded = _FALSE; uint256 internal _autoBurn = _FALSE; uint256 internal _burnableTokens = 1; IUniswapV2Router02 public uniswapV2Router; address public uniswapV2Pair; InftEverRise public stakeToken; function swapEnabled() external view returns (bool) { return _swapEnabled == _TRUE; } function offchainBalanceExcluded() external view returns (bool) { return _offchainBalanceExcluded == _TRUE; } function buyBackEnabled() external view returns (bool) { return _buyBackEnabled == _TRUE; } function liquidityLocked() external view returns (bool) { return _liquidityLocked == _TRUE; } function autoBurn() external view returns (bool) { return _autoBurn == _TRUE; } function setBurnableTokensZero() external onlyController(Role.Liquidity) { // set to 1 rather than zero to save on gas _burnableTokens = 1; emit BurnableTokensZeroed(); } function setBurnAddress(address _burnAddress) external onlyController(Role.Liquidity) { // May be bridgable burn (so only send to actual burn address on one chain) burnAddress = _burnAddress; emit BurnAddressUpdated(_burnAddress); } function setOffchainBalanceExcluded(bool _enabled) external onlyOwner { _offchainBalanceExcluded = _enabled ? _TRUE : _FALSE; emit OffChainBalanceExcluded(_enabled); } function setLiquidityLock(bool _enabled) public onlyController(Role.Liquidity) { _liquidityLocked = _enabled ? _TRUE : _FALSE; emit LiquidityLocked(_enabled); } function setAutoBurn(bool _enabled) external onlyController(Role.Liquidity) { _autoBurn = _enabled ? _TRUE : _FALSE; emit AutoBurnEnabled(_enabled); } function excludeFromFee(address account) public onlyController(Role.Fees) { if (_isExcludedFromFee[account]) revert InvalidAddress(); _isExcludedFromFee[account] = true; emit ExcludeFromFeeUpdated(account); } function addExchangeHotWallet(address account) external onlyController(Role.Exchanges) { _exchangeHotWallet[account] = true; emit ExchangeHotWalletAdded(account); } function removeExchangeHotWallet(address account) external onlyController(Role.Exchanges) { _exchangeHotWallet[account] = false; emit ExchangeHotWalletRemoved(account); } function isExchangeHotWallet(address account) public view returns(bool) { return _exchangeHotWallet[account]; } function includeInFee(address account) external onlyController(Role.Fees) { if (!_isExcludedFromFee[account]) revert InvalidAddress(); _isExcludedFromFee[account] = false; emit IncludeInFeeUpdated(account); } function setTransactionCap(uint256 txAmount) external onlyController(Role.Limits) { // Never under 0.001% if (txAmount < _totalSupply / 100_000) revert AmountOutOfRange(); transactionCap = txAmount; emit TransactionCapUpdated(txAmount); } function setNumberOfBlocksForBuyback(uint256 value) external onlyController(Role.BuyBack){ if (value < 100 || value > 1_000_000) revert AmountOutOfRange(); _numberOfBlocks = value; emit BuybackBlocksUpdated(value); } function setBusinessDevelopmentDivisor(uint256 divisor) external onlyController(Role.Liquidity) { if (divisor > liquidityFee) revert AmountOutOfRange(); businessDevelopmentDivisor = divisor; emit BusinessDevelopmentDivisorUpdated(divisor); } function setNumTokensSellToAddToLiquidity(uint96 minimumTokensBeforeSwap) external onlyController(Role.Liquidity) { if (minimumTokensBeforeSwap > 1_000_000_000) revert AmountOutOfRange(); _minimumTokensBeforeSwap = uint96(minimumTokensBeforeSwap * (10**uint256(decimals))); emit MinTokensBeforeSwapUpdated(minimumTokensBeforeSwap); } function setBuybackUpperLimit(uint256 buyBackLimit, uint256 numOfDecimals) external onlyController(Role.BuyBack) { // Catch typos, if decimals are pre-added if (buyBackLimit > 1_000_000_000) revert AmountOutOfRange(); _buyBackUpperLimit = buyBackLimit * (10**18) / (10**numOfDecimals); emit BuybackUpperLimitUpdated(_buyBackUpperLimit); } function setMinBuybackAmount(uint256 minAmount, uint256 numOfDecimals) external onlyController(Role.BuyBack) { // Catch typos, if decimals are pre-added if (minAmount > 1_000) revert AmountOutOfRange(); _minBuybackAmount = minAmount * (10**18) / (10**numOfDecimals); emit MinBuybackAmountUpdated(minAmount); } function setMaxBuybackAmountUpdated(uint256 maxAmount, uint256 numOfDecimals) external onlyController(Role.BuyBack) { // Catch typos, if decimals are pre-added if (maxAmount > 1_000_000) revert AmountOutOfRange(); _maxBuybackAmount = maxAmount * (10**18) / (10**numOfDecimals); emit MaxBuybackAmountUpdated(maxAmount); } function setBuybackTriggerTokenLimit(uint256 buyBackTriggerLimit) external onlyController(Role.BuyBack) { if (buyBackTriggerLimit > 100_000_000) revert AmountOutOfRange(); _buyBackTriggerTokenLimit = buyBackTriggerLimit * (10**uint256(decimals)); emit BuyBackTriggerTokenLimitUpdated(_buyBackTriggerTokenLimit); } function setBuybackMinAvailability(uint256 amount, uint256 numOfDecimals) external onlyController(Role.BuyBack) { if (amount > 100_000) revert AmountOutOfRange(); _buyBackMinAvailability = amount * (10**18) / (10**numOfDecimals); emit BuybackMinAvailabilityUpdated(_buyBackMinAvailability); } function setBuyBackEnabled(bool _enabled) external onlyController(Role.BuyBack) { _buyBackEnabled = _enabled ? _TRUE : _FALSE; emit BuyBackEnabledUpdated(_enabled); } function setBusinessDevelopmentAddress(address newAddress) external onlyController(Role.Liquidity) { if (newAddress == address(0)) revert NotZeroAddress(); businessDevelopmentAddress = payable(newAddress); emit BusinessDevelopmentAddressUpdated(newAddress); } function setEverBridgeVaultAddress(address contractAddress) external onlyOwner { excludeFromFee(contractAddress); everBridgeVault = contractAddress; emit BridgeVaultAddressUpdated(contractAddress); } function setStakingAddress(address contractAddress) external onlyOwner { stakeToken = InftEverRise(contractAddress); excludeFromFee(contractAddress); emit StakingAddressUpdated(contractAddress); } function setRouterAddress(address newAddress) external onlyController(Role.Liquidity) { if (newAddress == address(0)) revert NotZeroAddress(); IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(newAddress); uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).getPair( address(this), _uniswapV2Router.WETH() ); uniswapV2Router = _uniswapV2Router; emit RouterAddressUpdated(newAddress); } function isExcludedFromFee(address account) external view returns (bool) { return _isExcludedFromFee[account]; } function setSwapEnabled(bool _enabled) external onlyOwner { _swapEnabled = _enabled ? _TRUE : _FALSE; emit SwapEnabledUpdated(_enabled); } function hasTokenStarted() public view returns (bool) { return transactionCap > 0; } function setLiquidityFeePercent(uint96 liquidityFeeRate) external onlyController(Role.Liquidity) { if (liquidityFeeRate > 10) revert AmountOutOfRange(); liquidityFee = liquidityFeeRate; emit LiquidityFeeUpdated(liquidityFeeRate); } } // File: EverRise-v3/EverRise.sol // Copyright (c) 2022 EverRise Pte Ltd. All rights reserved. // EverRise licenses this file to you under the MIT license. /* The EverRise token is the keystone in the EverRise Ecosytem of dApps and the overaching key that unlocks multi-blockchain unification via the EverBridge. On EverRise token txns 6% buyback and business development fees are collected * 4% for token Buyback from the market, with bought back tokens directly distributed as ve-staking rewards * 2% for Business Development (Development, Sustainability and Marketing) ________ _______ __ / | / \ / | $$$$$$$$/__ __ ______ ______ $$$$$$$ |$$/ _______ ______ v3.14159265 $$ |__ / \ / |/ \ / \ $$ |__$$ |/ | / | / \ $$ | $$ \ /$$//$$$$$$ |/$$$$$$ |$$ $$< $$ |/$$$$$$$/ /$$$$$$ | $$$$$/ $$ /$$/ $$ $$ |$$ | $$/ $$$$$$$ |$$ |$$ \ $$ $$ | $$ |_____ $$ $$/ $$$$$$$$/ $$ | $$ | $$ |$$ | $$$$$$ |$$$$$$$$/ $$ | $$$/ $$ |$$ | $$ | $$ |$$ |/ $$/ $$ | $$$$$$$$/ $/ $$$$$$$/ $$/ $$/ $$/ $$/ $$$$$$$/ $$$$$$$/ Learn more about EverRise and the EverRise Ecosystem of dApps and how our utilities and partners can help protect your investors and help your project grow: https://www.everrise.com */ // 2^96 is 79 * 10**10 * 10**18 struct TransferDetails { uint96 balance0; address to; uint96 balance1; address origin; uint32 blockNumber; } contract EverRise is EverRiseConfigurable, IEverDrop { using EverRiseAddressNumberLib for address; using EverRiseAddressNumberLib for uint256; event BuybackTokensWithETH(uint256 amountIn, uint256 amountOut); event ConvertTokensForETH(uint256 amountIn, uint256 amountOut); event TokenStarted(); event RewardStakers(uint256 amount); event AutoBurn(uint256 amount); event StakingIncreased(address indexed from, uint256 amount, uint8 numberOfmonths); event StakingDecreased(address indexed from, uint256 amount); event RiseBridgedIn(address indexed contractAddress, address indexed to, uint256 amount); event RiseBridgedOut(address indexed contractAddress, address indexed from, uint256 amount); event NftBridgedIn(address indexed contractAddress, address indexed operator, address indexed to, uint256 id, uint256 value); event NftBridgedOut(address indexed contractAddress, address indexed operator, address indexed from, uint256 id, uint256 value); event TransferExternalTokens(address indexed tokenAddress, address indexed to, uint256 count); // Holder count uint256 private _holders; // Balance and locked (staked) balance mapping (address => uint96) private _tOwned; mapping (address => uint96) private _amountLocked; // Tracking for protections against sandwich trades // and rogue LP pairs mapping (address => uint256) private _lastTrade; TransferDetails private _lastTransfer; string public constant symbol = "RISE"; function name() public override (EverRiseWallet, IERC20Metadata) pure returns (string memory) { return "EverRise"; } modifier lockTheSwap() { require(_inSwap != _TRUE); _inSwap = _TRUE; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _inSwap = _FALSE; } constructor(address routerAddress) { if (routerAddress == address(0)) revert NotZeroAddress(); IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(routerAddress); // IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x10ED43C718714eb63d5aA57B78B54704E256024E); //Pancakeswap router mainnet - BSC // IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0xD99D1c33F9fC3444f8101754aBC46c52416550D1); //Testnet // IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff); //Quickswap V2 router mainnet - Polygon // IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506); //Sushiswap router mainnet - Polygon // IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //Uniswap V2 router mainnet - ETH uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); uniswapV2Router = _uniswapV2Router; _isExcludedFromFee[owner] = true; _isExcludedFromFee[address(this)] = true; // Put all tokens in contract so we can airdrop _tOwned[address(this)] = _totalSupply; emit Transfer(address(0), address(this), _totalSupply); _holders = 1; } // Function to receive ETH when msg.data is be empty receive() external payable {} // Balances function isWalletLocked(address fromAddress) override (IEverRise) external view returns (bool) { return _isWalletLocked(fromAddress); } function holders() external view returns (uint256) { return _holders; } function getAmountLocked(address account) external view returns (uint256) { return _amountLocked[account]; } function _balanceOf(address account) private view returns (uint256) { return _tOwned[account]; } function bridgeVaultLockedBalance() external view returns (uint256) { return _balanceOf(everBridgeVault); } function balanceOf(address account) external view override returns (uint256) { // Bridge vault balances are on other chains if (account == everBridgeVault && _offchainBalanceExcluded == _TRUE) return 0; uint256 balance = _balanceOf(account); if (_inSwap != _TRUE && _lastTransfer.blockNumber == uint32(block.number) && account.isContract() && !_isExcludedFromFee[account] ) { // Balance being checked is same address as last to in _transfer // check if likely same txn and a Liquidity Add _validateIfLiquidityChange(account, uint112(balance)); } return balance; } // Transfers function approvals(address account) external view returns (ApprovalChecks memory) { return _approvals[account]; } function _transfer( address from, address to, uint256 amount ) internal override walletLock(from) { if (from == address(0) || to == address(0)) revert NotZeroAddress(); if (amount == 0) revert AmountMustBeGreaterThanZero(); if (amount > (_balanceOf(from) - _amountLocked[from])) revert AmountLargerThanUnlockedAmount(); bool isIgnoredAddress = _isExcludedFromFee[from] || _isExcludedFromFee[to]; bool notInSwap = _inSwap != _TRUE; bool hasStarted = hasTokenStarted(); address pair = uniswapV2Pair; bool isSell = to == pair; bool isBuy = from == pair; if (!isIgnoredAddress) { if (to == address(this)) revert NotContractAddress(); if (amount > transactionCap) revert TransferTooLarge(); if (!hasStarted) revert TokenNotStarted(); if (notInSwap) { // Disallow multiple same source trades in same block if ((isSell || isBuy) && _lastTrade[tx.origin] == block.number) { revert SandwichTradesAreDisallowed(); } _lastTrade[tx.origin] = block.number; // Following block is for the contract to convert the tokens to ETH and do the buy back if (isSell && _swapEnabled == _TRUE) { uint96 swapTokens = _minimumTokensBeforeSwap; if (_balanceOf(address(this)) > swapTokens) { // Greater than to always leave at least 1 token in contract // reducing gas from switching from 0 to not-zero and not tracking // token in holder count changes. _convertTokens(swapTokens); } if (_buyback()) { emit BuyBackTriggered(); } } } } if (hasStarted) { if (isBuy) { totalBuyVolume += amount; } else if (isSell) { totalSellVolume += amount; if (amount > _buyBackTriggerTokenLimit) { // Start at 1% of balance uint256 amountToAdd = address(this).balance / 100; uint256 maxToAdd = _buyBackUpperLimit / 100; // Don't add more than the 1% of the upper limit if (amountToAdd > maxToAdd) amountToAdd = maxToAdd; // Add to next buyback _nextBuybackAmount += amountToAdd; } } } // If any account belongs to _isExcludedFromFee account then remove the fee bool takeFee = true; if (isIgnoredAddress || isExchangeHotWallet(to)) { takeFee = false; } // For safety Liquidity Adds should only be done by an owner, // and transfers to and from EverRise Ecosystem contracts // are not considered LP adds if (notInSwap) { if (isIgnoredAddress) { // Just set blocknumber to 1 to clear, to save gas on changing back _lastTransfer.blockNumber = 1; } else { // Not in a swap during a LP add, so record the transfer details _recordPotentialLiquidityChangeTransaction(to); } } _tokenTransfer(from, to, uint96(amount), takeFee); } function _tokenTransfer( address sender, address recipient, uint96 amount, bool takeFee ) private { uint96 fromAfter = _tOwned[sender] - amount; _tOwned[sender] = fromAfter; uint96 tLiquidity = takeFee ? amount * liquidityFee / (10**2) : 0; uint96 tTransferAmount = amount - tLiquidity; uint96 toBefore = _tOwned[recipient]; _tOwned[recipient] = toBefore + tTransferAmount; if (tLiquidity > 0) { // Skip writing to save gas if unchanged _tOwned[address(this)] += tLiquidity; } _trackHolders(fromAfter, toBefore); if (sender == everBridgeVault) { emit RiseBridgedIn(everBridgeVault, recipient, amount); } else if (recipient == everBridgeVault) { emit RiseBridgedOut(everBridgeVault, sender, amount); } emit Transfer(sender, recipient, tTransferAmount); } function _lockedTokenTransfer( address sender, address recipient, uint96 amount ) private { // Do the locked token transfer _decreaseLockedAmount(sender, amount, false); uint96 fromAfter = _tOwned[sender] - amount; _tOwned[sender] = fromAfter; uint96 toBefore = _tOwned[recipient]; _tOwned[recipient] = toBefore + amount; _increaseLockedAmount(recipient, amount); _trackHolders(fromAfter, toBefore); emit Transfer(sender, recipient, amount); } function _trackHolders(uint96 fromAfter, uint96 toBefore) private { uint256 startHolderCount = _holders; uint256 holderCount = startHolderCount; if (fromAfter == 0) --holderCount; if (toBefore == 0) ++holderCount; if (startHolderCount != holderCount) { // Skip writing to save gas if unchanged _holders = holderCount; } } // Buyback function crossChainBuyback() external onlyController(Role.CrossChainBuyback) { if (_buyback()) { emit BuyBackCrossChainTriggered(); } // Is autoburn on? if (_autoBurn == _TRUE) { uint96 swapTokens = _minimumTokensBeforeSwap; // Have we collected enough tokens to burn? if (_burnableTokens > swapTokens) { unchecked { // Just confirmed is valid above _burnableTokens -= swapTokens; } // Burn the tokens _tokenTransfer(uniswapV2Pair, burnAddress, swapTokens, false); // Reset LP balances IUniswapV2Pair(uniswapV2Pair).sync(); emit AutoBurn(swapTokens); } } } function _buyback() private returns (bool boughtBack) { if (_buyBackEnabled == _TRUE) { uint256 balance = address(this).balance; if (balance > _buyBackMinAvailability && block.number > _latestBuybackBlock + _numberOfBlocks ) { // Max of 10% of balance balance /= 10; uint256 buybackAmount = _nextBuybackAmount; if (buybackAmount > _maxBuybackAmount) { buybackAmount = _maxBuybackAmount; } if (buybackAmount > balance) { // Don't try to buyback more than is available. buybackAmount = balance; } if (buybackAmount > 0) { boughtBack = _buyBackTokens(buybackAmount); } } } } function _buyBackTokens(uint256 amount) private lockTheSwap returns (bool boughtBack) { _nextBuybackAmount = _minBuybackAmount; // reset the next buyback amount, set non-zero to save on future gas if (amount > 0) { uint256 tokensBefore = _balanceOf(address(stakeToken)); EverRiseLib.swapETHForTokensNoFee(uniswapV2Router, address(stakeToken), amount); // Don't trust the return value; calculate it ourselves uint256 tokensReceived = _balanceOf(address(stakeToken)) - tokensBefore; emit BuybackTokensWithETH(amount, tokensReceived); _latestBuybackBlock = block.number; //Distribute the rewards to the staking pool _distributeStakingRewards(tokensReceived); boughtBack = true; } } // Non-EverSwap LP conversion function _convertTokens(uint256 tokenAmount) private lockTheSwap { uint256 initialETHBalance = address(this).balance; _approve(address(this), address(uniswapV2Router), tokenAmount, true); // Mark the tokens as available to burn _burnableTokens += uint96(tokenAmount); EverRiseLib.swapTokensForEth(uniswapV2Router, tokenAmount); uint256 transferredETHBalance = address(this).balance - initialETHBalance; emit ConvertTokensForETH(tokenAmount, transferredETHBalance); // Send split to Business Development address transferredETHBalance = transferredETHBalance * businessDevelopmentDivisor / liquidityFee; sendEthViaCall(businessDevelopmentAddress, transferredETHBalance); } // Staking function _distributeStakingRewards(uint256 amount) private { if (amount > 0) { stakeToken.createRewards(amount); emit RewardStakers(amount); } } function transferStake(address fromAddress, address toAddress, uint96 amountToTransfer) external walletLock(fromAddress) { if (_msgSender() != address(stakeToken)) revert NotStakeContractRequesting(); _lockedTokenTransfer(fromAddress, toAddress, amountToTransfer); } function enterStaking(uint96 amount, uint8 numOfMonths) external payable walletLock(_msgSender()) { address staker = _msgSender(); if (msg.value < stakeToken.stakeCreateCost()) revert NotEnoughToCoverStakeFee(); uint32 nftId = stakeToken.enterStaking(staker, amount, numOfMonths); _lockAndAddStaker(staker, amount, numOfMonths, nftId); } function increaseStake(uint256 nftId, uint96 amount) external walletLock(_msgSender()) { address staker = _msgSender(); _increaseLockedAmount(staker, amount); uint8 numOfMonths; uint96 original; (, original, numOfMonths) = stakeToken.increaseStake(staker, nftId, amount); emit StakingDecreased(staker, original); emit StakingIncreased(staker, original + amount, numOfMonths); } function _increaseLockedAmount(address staker, uint96 amount) private { uint96 lockedAmount = _amountLocked[staker] + amount; if (lockedAmount > _balanceOf(staker)) revert AmountLargerThanUnlockedAmount(); _amountLocked[staker] = lockedAmount; emit Transfer(staker, staker, amount); } function _decreaseLockedAmount(address staker, uint96 amount, bool emitEvent) private { _amountLocked[staker] -= amount; if (emitEvent) { emit StakingDecreased(staker, amount); emit Transfer(staker, staker, amount); } } function leaveStaking(uint256 nftId, bool overrideNotClaimed) external walletLock(_msgSender()) { address staker = _msgSender(); uint96 amount = stakeToken.leaveStaking(staker, nftId, overrideNotClaimed); _decreaseLockedAmount(staker, amount, true); stakeToken.removeStaker(staker, nftId); } function earlyWithdraw(uint256 nftId, uint96 amount) external walletLock(_msgSender()) { address staker = _msgSender(); (uint32 newNftId, uint96 penaltyAmount) = stakeToken.earlyWithdraw(staker, nftId, amount); _decreaseLockedAmount(staker, amount, true); if (penaltyAmount > 0) { _tokenTransfer(staker, address(stakeToken), penaltyAmount, false); _distributeStakingRewards(penaltyAmount); } stakeToken.reissueStakeNft(staker, nftId, newNftId); } function withdraw(uint256 nftId, uint96 amount, bool overrideNotClaimed) external walletLock(_msgSender()) { address staker = _msgSender(); (uint32 newNftId) = stakeToken.withdraw(staker, nftId, amount, overrideNotClaimed); if (amount > 0) { _decreaseLockedAmount(staker, amount, true); } if (nftId != newNftId && newNftId != 0) { stakeToken.reissueStakeNft(staker, nftId, newNftId); } } function setApprovalForAll(address fromAddress, address operator, bool approved) external { if (_msgSender() != address(stakeToken)) revert NotStakeContractRequesting(); _setApprovalForAll(fromAddress, operator, approved); } function isApprovedForAll(address account, address operator) external view returns (bool) { if (_msgSender() != address(stakeToken)) revert NotStakeContractRequesting(); return _isApprovedForAll(account, operator); } // Nft bridging function approveNFTAndTokens(address bridgeAddress, uint256 nftId, uint256 tokenAmount) external { if (!roles[Role.NftBridge][bridgeAddress]) revert NotContractAddress(); stakeToken.approve(_msgSender(), bridgeAddress, nftId); _approve(_msgSender(), bridgeAddress, tokenAmount, true); } function bridgeStakeNftOut(address fromAddress, uint256 nftId) external onlyController(Role.NftBridge) { if (stakeToken.getApproved(nftId) != _msgSender() && !stakeToken.isApprovedForAll(_msgSender(), fromAddress)) { revert CallerNotApproved(); } _walletLock(fromAddress); uint96 amount = stakeToken.bridgeStakeNftOut(fromAddress, nftId); _decreaseLockedAmount(fromAddress, amount, true); // Send tokens to vault _tokenTransfer(fromAddress, everBridgeVault, amount, false); stakeToken.removeStaker(fromAddress, nftId); emit NftBridgedOut(address(this), everBridgeVault, fromAddress, nftId, amount); } function bridgeStakeNftIn(address toAddress, uint96 depositTokens, uint8 numOfMonths, uint48 depositTime, uint96 withdrawnAmount, bool achievementClaimed) external onlyController(Role.NftBridge) returns (uint256 nftId) { nftId = stakeToken.bridgeOrAirdropStakeNftIn(toAddress, depositTokens, numOfMonths, depositTime, withdrawnAmount, 0, achievementClaimed); uint96 amount = depositTokens - withdrawnAmount; //Send the tokens from Vault _tokenTransfer(everBridgeVault, toAddress, amount, false); _lockAndAddStaker(toAddress, amount, numOfMonths, nftId); emit NftBridgedIn(address(this), everBridgeVault, toAddress, nftId, amount); } function _lockAndAddStaker(address toAddress, uint96 amount, uint8 numOfMonths, uint256 nftId) private { _increaseLockedAmount(toAddress, amount); stakeToken.addStaker(toAddress, nftId); emit StakingIncreased(toAddress, amount, numOfMonths); } // Liquidity function _recordPotentialLiquidityChangeTransaction(address to) private { uint96 balance0 = uint96(_balanceOf(to)); (address token0, address token1) = to.pairTokens(); if (token1 == address(this)) { // Switch token so token1 is always other side of pair token1 = token0; } if (token1 == address(0)) { // Not LP pair, just set blocknumber to 1 to clear, to save gas on changing back _lastTransfer.blockNumber = 1; return; } uint96 balance1 = uint96(IERC20(token1).balanceOf(to)); _lastTransfer = TransferDetails({ balance0: balance0, to: to, balance1: balance1, origin: tx.origin, blockNumber: uint32(block.number) }); } // account must be recorded in _transfer and same block function _validateIfLiquidityChange(address account, uint112 balance0) private view { if (_lastTransfer.origin != tx.origin || account != _lastTransfer.to) { // Not same txn, or not LP addETH return; } // Check if LP change using the data recorded in _transfer // May be same transaction as _transfer (address token0, address token1) = account.pairTokens(); // Not LP pair if (token1 == address(0)) return; bool switchTokens; if (token1 == address(this)) { // Switch token so token1 is always other side of pair token1 = token0; switchTokens = true; } else if (token0 != address(this)) { // Not LP for this token return; } uint256 balance1 = IERC20(token1).balanceOf(account); // Test to see if this tx is part of a liquidity add if (balance0 > _lastTransfer.balance0 && balance1 > _lastTransfer.balance1) { // Both pair balances have increased, this is a Liquidty Add // Will block addETH and where other token address sorts higher revert LiquidityAddOwnerOnly(); } } // Admin function upgradeComplete() external onlyOwner { // Can only be called before start if (hasTokenStarted()) revert TokenAlreadyStarted(); // We will keep one token always in contract // so we don't need to track it in holder changes _tokenTransfer(address(this), _msgSender(), _tOwned[address(this)] - 1, false); _buyBackEnabled = _TRUE; _swapEnabled = _TRUE; transactionCap = _totalSupply / 1000; // Max txn 0.1% of supply emit TokenStarted(); } function sendEthViaCall(address payable to, uint256 amount) private { (bool sent, ) = to.call{value: amount}(""); if (!sent) revert FailedEthSend(); } function transferBalance(uint256 amount) external onlyOwner { sendEthViaCall(_msgSender(), amount); } function transferExternalTokens(address tokenAddress, address to, uint256 amount) external onlyOwner { if (tokenAddress == address(0)) revert NotZeroAddress(); transferTokens(tokenAddress, to, amount); } function transferTokens(address tokenAddress, address to, uint256 amount) private { IERC20(tokenAddress).transfer(to, amount); emit TransferExternalTokens(tokenAddress, to, amount); } function mirgateV2Staker(address toAddress, uint96 rewards,uint96 depositTokens, uint8 numOfMonths, uint48 depositTime, uint96 withdrawnAmount) external onlyController(Role.Upgrader) returns(uint256 nftId) { nftId = stakeToken.bridgeOrAirdropStakeNftIn(toAddress, depositTokens, numOfMonths, depositTime, withdrawnAmount, rewards, false); uint96 amount = depositTokens - withdrawnAmount; _tokenTransfer(address(this), toAddress, amount, false); if (rewards > 0) { _tokenTransfer(address(this), address(stakeToken), rewards, false); } _lockAndAddStaker(toAddress, amount, numOfMonths, nftId); } function mirgateV1V2Holder(address holder, uint96 amount) external onlyController(Role.Upgrader) returns(bool) { _tokenTransfer(address(this), holder, amount, false); return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"routerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmountLargerThanAllowance","type":"error"},{"inputs":[],"name":"AmountLargerThanUnlockedAmount","type":"error"},{"inputs":[],"name":"AmountMustBeGreaterThanZero","type":"error"},{"inputs":[],"name":"AmountOutOfRange","type":"error"},{"inputs":[],"name":"CallerNotApproved","type":"error"},{"inputs":[],"name":"CallerNotOwner","type":"error"},{"inputs":[],"name":"Expired","type":"error"},{"inputs":[],"name":"FailedEthSend","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"LiquidityAddOwnerOnly","type":"error"},{"inputs":[],"name":"LockTimeTooLong","type":"error"},{"inputs":[],"name":"LockTimeTooShort","type":"error"},{"inputs":[],"name":"NotContractAddress","type":"error"},{"inputs":[],"name":"NotEnoughToCoverStakeFee","type":"error"},{"inputs":[],"name":"NotStakeContractRequesting","type":"error"},{"inputs":[],"name":"NotZero","type":"error"},{"inputs":[],"name":"NotZeroAddress","type":"error"},{"inputs":[],"name":"SandwichTradesAreDisallowed","type":"error"},{"inputs":[],"name":"TokenAlreadyStarted","type":"error"},{"inputs":[],"name":"TokenNotStarted","type":"error"},{"inputs":[],"name":"TransferTooLarge","type":"error"},{"inputs":[],"name":"Unlocked","type":"error"},{"inputs":[],"name":"WalletLocked","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AutoBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"AutoBurnEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"BridgeVaultAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"deadAddress","type":"address"}],"name":"BurnAddressUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"BurnableTokensZeroed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"BusinessDevelopmentAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"BusinessDevelopmentDivisorUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"BuyBackCrossChainTriggered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"BuyBackEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"BuyBackTriggerTokenLimitUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"BuyBackTriggered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"BuybackBlocksUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"BuybackMinAvailabilityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"BuybackTokensWithETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"BuybackUpperLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"controller","type":"address"},{"indexed":true,"internalType":"enum EverRiseRoles.Role","name":"role","type":"uint8"}],"name":"ControlAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"controller","type":"address"},{"indexed":true,"internalType":"enum EverRiseRoles.Role","name":"role","type":"uint8"}],"name":"ControlRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"ConvertTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"exchangeHotWallet","type":"address"}],"name":"ExchangeHotWalletAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"exchangeHotWallet","type":"address"}],"name":"ExchangeHotWalletRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"IncludeInFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"LiquidityFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isLocked","type":"bool"}],"name":"LiquidityLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"altAccount","type":"address"},{"indexed":false,"internalType":"uint256","name":"length","type":"uint256"}],"name":"LockWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"length","type":"uint256"}],"name":"LockWalletExtend","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newvalue","type":"uint256"}],"name":"MaxBuybackAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newvalue","type":"uint256"}],"name":"MinBuybackAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"MinStakeSizeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"NftBridgedIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"NftBridgedOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enable","type":"bool"}],"name":"OffChainBalanceExcluded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"tokens","type":"bool"},{"indexed":false,"internalType":"bool","name":"nfts","type":"bool"}],"name":"RevokeAllApprovals","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardStakers","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RiseBridgedIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RiseBridgedOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"RouterAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint16","name":"tokensHrs","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"nftsHrs","type":"uint16"}],"name":"SetApprovalAutoTimeout","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"StakingAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakingDecreased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"numberOfmonths","type":"uint8"}],"name":"StakingIncreased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"TokenStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"TransactionCapUpdated","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":"tokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"TransferExternalTokens","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newController","type":"address"},{"internalType":"enum EverRiseRoles.Role","name":"role","type":"uint8"}],"name":"addControlRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addExchangeHotWallet","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":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowances","outputs":[{"internalType":"uint128","name":"tokenAmount","type":"uint128"},{"internalType":"uint32","name":"nftCheck","type":"uint32"},{"internalType":"uint32","name":"tokenCheck","type":"uint32"},{"internalType":"uint48","name":"timestamp","type":"uint48"},{"internalType":"uint8","name":"nftApproval","type":"uint8"},{"internalType":"uint8","name":"tokenApproval","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"approvals","outputs":[{"components":[{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"uint32","name":"nftCheck","type":"uint32"},{"internalType":"uint32","name":"tokenCheck","type":"uint32"},{"internalType":"uint16","name":"autoRevokeNftHours","type":"uint16"},{"internalType":"uint16","name":"autoRevokeTokenHours","type":"uint16"},{"internalType":"uint48","name":"unlockTimestamp","type":"uint48"}],"internalType":"struct ApprovalChecks","name":"","type":"tuple"}],"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":"bridgeAddress","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"approveNFTAndTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"toAddress","type":"address"},{"internalType":"uint96","name":"depositTokens","type":"uint96"},{"internalType":"uint8","name":"numOfMonths","type":"uint8"},{"internalType":"uint48","name":"depositTime","type":"uint48"},{"internalType":"uint96","name":"withdrawnAmount","type":"uint96"},{"internalType":"bool","name":"achievementClaimed","type":"bool"}],"name":"bridgeStakeNftIn","outputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromAddress","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"bridgeStakeNftOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bridgeVaultLockedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"businessDevelopmentAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"businessDevelopmentDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crossChainBuyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint96","name":"amount","type":"uint96"}],"name":"earlyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"amount","type":"uint96"},{"internalType":"uint8","name":"numOfMonths","type":"uint8"}],"name":"enterStaking","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"everBridgeVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint48","name":"length","type":"uint48"}],"name":"extendLockTokensAndNfts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAmountLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasTokenStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint96","name":"amount","type":"uint96"}],"name":"increaseStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExchangeHotWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromAddress","type":"address"}],"name":"isWalletLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"bool","name":"overrideNotClaimed","type":"bool"}],"name":"leaveStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"altAccount","type":"address"},{"internalType":"uint48","name":"length","type":"uint48"}],"name":"lockTokensAndNfts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"uint96","name":"amount","type":"uint96"}],"name":"mirgateV1V2Holder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint96","name":"rewards","type":"uint96"},{"internalType":"uint96","name":"depositTokens","type":"uint96"},{"internalType":"uint8","name":"numOfMonths","type":"uint8"},{"internalType":"uint48","name":"depositTime","type":"uint48"},{"internalType":"uint96","name":"withdrawnAmount","type":"uint96"}],"name":"mirgateV2Staker","outputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"offchainBalanceExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldController","type":"address"},{"internalType":"enum EverRiseRoles.Role","name":"role","type":"uint8"}],"name":"removeControlRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeExchangeHotWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"tokens","type":"bool"},{"internalType":"bool","name":"nfts","type":"bool"}],"name":"revokeApprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum EverRiseRoles.Role","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"name":"roles","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromAddress","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setAutoBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokensHrs","type":"uint16"},{"internalType":"uint16","name":"nftsHrs","type":"uint16"}],"name":"setAutoTimeout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_burnAddress","type":"address"}],"name":"setBurnAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setBurnableTokensZero","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setBusinessDevelopmentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setBusinessDevelopmentDivisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setBuyBackEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"numOfDecimals","type":"uint256"}],"name":"setBuybackMinAvailability","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyBackTriggerLimit","type":"uint256"}],"name":"setBuybackTriggerTokenLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyBackLimit","type":"uint256"},{"internalType":"uint256","name":"numOfDecimals","type":"uint256"}],"name":"setBuybackUpperLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setEverBridgeVaultAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"liquidityFeeRate","type":"uint96"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setLiquidityLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"uint256","name":"numOfDecimals","type":"uint256"}],"name":"setMaxBuybackAmountUpdated","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"numOfDecimals","type":"uint256"}],"name":"setMinBuybackAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"minimumTokensBeforeSwap","type":"uint96"}],"name":"setNumTokensSellToAddToLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setNumberOfBlocksForBuyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setOffchainBalanceExcluded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setStakingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"txAmount","type":"uint256"}],"name":"setTransactionCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeToken","outputs":[{"internalType":"contract InftEverRise","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyVolume","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellVolume","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transactionCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferExternalTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"transferFromWithPermit","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":"fromAddress","type":"address"},{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint96","name":"amountToTransfer","type":"uint96"}],"name":"transferStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"actualAccount","type":"address"}],"name":"unlockTokensAndNfts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upgradeComplete","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint96","name":"amount","type":"uint96"},{"internalType":"bool","name":"overrideNotClaimed","type":"bool"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a0604052600580546001600160a01b03199081167324d8dabebd6c0d5ccc88ec40d95bf8eb64f0cf9e179091556007805490911661dead179055620000486012600a6200067b565b62000059906410acc4794462000693565b6001600160601b0316608052600d80546001600160601b03191660061790556002600e556200008b6012600a6200067b565b6200009a90624c4b4062000693565b600f80546001600160601b0319166001600160601b0392909216919091179055678ac7230489e80000601055620000d46012600a6200067b565b620000e390620f424062000693565b601155670de0b6b3a76400006012556103e860155567016345785d8a0000601655670de0b6b3a7640000601755600160185560016019556001601a556002601b556001601c556001601d556001601e553480156200014057600080fd5b506040516200653c3803806200653c8339810160408190526200016391620006b5565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3503360008181527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f602090815260408083208054600160ff1991821681179092557fd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f845282852080548216831790557f7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b845282852080548216831790557fedc95719e9a3b28dd8e80877cb5880a9be7de1a13fc8b05e7999683b6b567643845282852080548216831790557fe2689cd4a84e23ad2f564004f1c9013e9589d260bde6380aba3ca7e09e4df40c845282852080548216831790557f8f331abe73332f95a25873e8b430885974c0409691f89d643119a11623a7924a845282852080548216831790557fdc686ec4a0ff239c70e7c7c36e8f853eced3bc8618f48d2b816da2a74311237e845282852080548216831790557f4db623e5c4870b62d3fc9b4e8f893a1a77627d75ab45d9ff7e56ba19564af99b909352922080549091169091179055506001600160a01b03811662000351576040516366385fa360e01b815260040160405180910390fd5b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000395573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003bb9190620006b5565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000409573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200042f9190620006b5565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200047d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a39190620006b5565b602080546001600160a01b03199081166001600160a01b03938416178255601f8054909116848416179055600080549092168252600881526040808320805460ff19908116600190811790925530808652838620805490921690921790556080516023845282852080546001600160601b0319166001600160601b039092169182179055915191825292917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350506001602255620006e0565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005bd578160001904821115620005a157620005a162000566565b80851615620005af57918102915b93841c939080029062000581565b509250929050565b600082620005d65750600162000675565b81620005e55750600062000675565b8160018114620005fe5760028114620006095762000629565b600191505062000675565b60ff8411156200061d576200061d62000566565b50506001821b62000675565b5060208310610133831016604e8410600b84101617156200064e575081810a62000675565b6200065a83836200057c565b806000190482111562000671576200067162000566565b0290505b92915050565b60006200068c60ff841683620005c5565b9392505050565b6000816000190483118215151615620006b057620006b062000566565b500290565b600060208284031215620006c857600080fd5b81516001600160a01b03811681146200068c57600080fd5b608051615e326200070a60003960008181610667015281816130fb01526138a70152615e326000f3fe6080604052600436106104fb5760003560e01c806370d5ae051161028c578063c0316ffe1161015a578063d98daa43116100cc578063ea2f0b3711610085578063ea2f0b371461125f578063ecc684a81461127f578063f2fde38b14611294578063f4e0d9ac146112b4578063f5dc51ec146112d4578063fa25e2de146112f457600080fd5b8063d98daa431461119f578063d9cd78f4146111bf578063da5fcc9f146111df578063dd62ed3e146111ff578063e01af92c1461121f578063e985e9c51461123f57600080fd5b8063cf913db91161011e578063cf913db9146110c6578063d1bdac24146110ff578063d505accf1461111f578063d6e03cd41461113f578063d921cd761461115f578063d96d54d81461117f57600080fd5b8063c0316ffe14611030578063c27afefc14611050578063c38c3ee614611070578063ca5f084f14611090578063cc5ba480146110a657600080fd5b80639bbe0533116101fe578063b22a6389116101b7578063b22a638914610f7a578063b51d404214610f9a578063b5d0abfd14610fba578063b971383a14610fda578063b9e5a03b14610ffa578063bfa1c45e1461101057600080fd5b80639bbe053314610ec2578063a63b91f414610ee2578063a9059cbb14610efa578063aefac34d14610f1a578063af1b597e14610f3a578063af77474414610f5a57600080fd5b80638a60c4c1116102505780638a60c4c114610de55780638aee2c2714610e055780638da5cb5b14610e255780638db2063b14610e4557806395d89b4114610e5a57806398118cb414610e8a57600080fd5b806370d5ae0514610d3b578063774a081014610d5b5780637d84ed2614610d705780637ecebe0014610d905780638188f71c14610dd057600080fd5b8063367605ca116103c95780634f27ec3e1161033b5780635f7e3821116102f45780635f7e382114610c6c5780635f898ce814610c8c578063601fdff314610cac5780636053a0e314610ceb5780636ddd171314610d0357806370a0823114610d1b57600080fd5b80634f27ec3e146109bc57806351ed6a30146109dc5780635342acb4146109fc57806355b6ed5c14610a3557806357976fb414610b045780635d0341ba14610b1c57600080fd5b806341cb87fc1161038d57806341cb87fc1461090657806341e70fa614610926578063437823ec1461093c578063445e76881461095c57806349bd5a5e1461097c5780634b0e72161461099c57600080fd5b8063367605ca1461087d57806336b1db151461089d578063379f96da146108bd578063410d3e67146108d0578063415e9718146108e657600080fd5b806320606b701161046d5780632b0e1d79116104265780632b0e1d79146107ad5780632b9afa03146107cd57806330adf81f146107ed578063313ce567146108215780633477320c146108485780633644e5151461086857600080fd5b806320606b70146106be57806323b872dd146106f257806326a17edf1461071257806329370cc61461073257806329d9ec5e146107525780632a49b6841461077257600080fd5b80630e59d5b7116104bf5780630e59d5b7146105d15780631551fe91146105e957806316758e0b146106095780631694505e1461062057806318160ddd146106585780631f5e98bb1461069e57600080fd5b806306fdde03146105075780630844c97f1461054a57806308792b1414610561578063095ea7b3146105815780630c0c91a2146105b157600080fd5b3661050257005b600080fd5b34801561051357600080fd5b50604080518082019091526008815267457665725269736560c01b60208201525b604051610541919061537b565b60405180910390f35b34801561055657600080fd5b5061055f611314565b005b34801561056d57600080fd5b5061055f61057c3660046153bc565b611456565b34801561058d57600080fd5b506105a161059c36600461540a565b611516565b6040519015158152602001610541565b3480156105bd57600080fd5b506105a16105cc366004615436565b61152e565b3480156105dd57600080fd5b50601c546002146105a1565b3480156105f557600080fd5b5061055f61060436600461546f565b611539565b34801561061557600080fd5b50600c5415156105a1565b34801561062c57600080fd5b50601f54610640906001600160a01b031681565b6040516001600160a01b039091168152602001610541565b34801561066457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006001600160601b03165b604051908152602001610541565b3480156106aa57600080fd5b5061055f6106b936600461546f565b6115df565b3480156106ca57600080fd5b506106907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b3480156106fe57600080fd5b506105a161070d36600461548c565b611663565b34801561071e57600080fd5b5061055f61072d3660046154cd565b6116bb565b34801561073e57600080fd5b5061055f61074d3660046154cd565b61170a565b34801561075e57600080fd5b5061055f61076d3660046154ea565b611759565b34801561077e57600080fd5b506105a161078d366004615520565b600160209081526000928352604080842090915290825290205460ff1681565b3480156107b957600080fd5b5061055f6107c836600461540a565b6117ee565b3480156107d957600080fd5b506106906107e8366004615571565b611a8a565b3480156107f957600080fd5b506106907f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561082d57600080fd5b50610836601281565b60405160ff9091168152602001610541565b34801561085457600080fd5b5061055f610863366004615436565b611bb3565b34801561087457600080fd5b50610690611c0e565b34801561088957600080fd5b5061055f6108983660046155f1565b611ce9565b3480156108a957600080fd5b5061055f6108b836600461564e565b611d2d565b61055f6108cb366004615681565b611db7565b3480156108dc57600080fd5b50610690600c5481565b3480156108f257600080fd5b5061055f6109013660046154ea565b611ef2565b34801561091257600080fd5b5061055f610921366004615436565b611f7a565b34801561093257600080fd5b50610690600b5481565b34801561094857600080fd5b5061055f610957366004615436565b612151565b34801561096857600080fd5b5061055f6109773660046156af565b6121ea565b34801561098857600080fd5b50602054610640906001600160a01b031681565b3480156109a857600080fd5b5061055f6109b7366004615436565b6122f7565b3480156109c857600080fd5b5061055f6109d73660046156d4565b61234d565b3480156109e857600080fd5b50602154610640906001600160a01b031681565b348015610a0857600080fd5b506105a1610a17366004615436565b6001600160a01b031660009081526008602052604090205460ff1690565b348015610a4157600080fd5b50610ab6610a503660046156ed565b60036020908152600092835260408084209091529082529020546001600160801b0381169063ffffffff600160801b8204811691600160a01b81049091169065ffffffffffff600160c01b8204169060ff600160f01b8204811691600160f81b90041686565b604080516001600160801b03909716875263ffffffff9586166020880152949093169385019390935265ffffffffffff16606084015260ff91821660808401521660a082015260c001610541565b348015610b1057600080fd5b50601b546002146105a1565b348015610b2857600080fd5b50610bf8610b37366004615436565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506001600160a01b0316600090815260026020908152604091829020825160c081018452905467ffffffffffffffff8116825263ffffffff600160401b8204811693830193909352600160601b81049092169281019290925261ffff600160801b820481166060840152600160901b820416608083015265ffffffffffff600160a01b9091041660a082015290565b6040516105419190600060c08201905067ffffffffffffffff8351168252602083015163ffffffff80821660208501528060408601511660408501525050606083015161ffff8082166060850152806080860151166080850152505065ffffffffffff60a08401511660a083015292915050565b348015610c7857600080fd5b50600554610640906001600160a01b031681565b348015610c9857600080fd5b506105a1610ca736600461570b565b6123b9565b348015610cb857600080fd5b50610690610cc7366004615436565b6001600160a01b03166000908152602460205260409020546001600160601b031690565b348015610cf757600080fd5b50601a546002146105a1565b348015610d0f57600080fd5b506019546002146105a1565b348015610d2757600080fd5b50610690610d36366004615436565b6123dd565b348015610d4757600080fd5b50600754610640906001600160a01b031681565b348015610d6757600080fd5b5061055f612480565b348015610d7c57600080fd5b5061055f610d8b366004615739565b6124bc565b348015610d9c57600080fd5b50610690610dab366004615436565b6001600160a01b031660009081526002602052604090205467ffffffffffffffff1690565b348015610ddc57600080fd5b50602254610690565b348015610df157600080fd5b5061055f610e003660046156d4565b612609565b348015610e1157600080fd5b5061055f610e203660046154ea565b61261b565b348015610e3157600080fd5b50600054610640906001600160a01b031681565b348015610e5157600080fd5b506106906126a4565b348015610e6657600080fd5b50610534604051806040016040528060048152602001635249534560e01b81525081565b348015610e9657600080fd5b50600d54610eaa906001600160601b031681565b6040516001600160601b039091168152602001610541565b348015610ece57600080fd5b5061055f610edd36600461575e565b6126c1565b348015610eee57600080fd5b50601d546002146105a1565b348015610f0657600080fd5b506105a1610f1536600461540a565b6127c8565b348015610f2657600080fd5b50600654610640906001600160a01b031681565b348015610f4657600080fd5b5061055f610f553660046154cd565b6127de565b348015610f6657600080fd5b5061055f610f7536600461578a565b61282d565b348015610f8657600080fd5b5061055f610f953660046157b1565b612987565b348015610fa657600080fd5b5061055f610fb53660046154ea565b612abc565b348015610fc657600080fd5b5061055f610fd5366004615436565b612b47565b348015610fe657600080fd5b5061055f610ff53660046157cc565b612b9f565b34801561100657600080fd5b50610690600a5481565b34801561101c57600080fd5b5061069061102b366004615801565b612c8a565b34801561103c57600080fd5b5061055f61104b36600461575e565b612d7b565b34801561105c57600080fd5b5061055f61106b36600461548c565b612e83565b34801561107c57600080fd5b5061055f61108b366004615873565b612ebd565b34801561109c57600080fd5b50610690600e5481565b3480156110b257600080fd5b5061055f6110c1366004615739565b612fbf565b3480156110d257600080fd5b506105a16110e1366004615436565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561110b57600080fd5b5061055f61111a3660046156d4565b6130e7565b34801561112b57600080fd5b5061055f61113a36600461589f565b61317d565b34801561114b57600080fd5b506105a161115a36600461589f565b61340d565b34801561116b57600080fd5b5061055f61117a366004615436565b613435565b34801561118b57600080fd5b5061055f61119a366004615436565b61348a565b3480156111ab57600080fd5b5061055f6111ba3660046156d4565b613507565b3480156111cb57600080fd5b5061055f6111da366004615436565b613582565b3480156111eb57600080fd5b5061055f6111fa3660046154cd565b613625565b34801561120b57600080fd5b5061069061121a3660046156ed565b613678565b34801561122b57600080fd5b5061055f61123a3660046154cd565b613719565b34801561124b57600080fd5b506105a161125a3660046156ed565b613765565b34801561126b57600080fd5b5061055f61127a366004615436565b6137a6565b34801561128b57600080fd5b5061055f61383b565b3480156112a057600080fd5b5061055f6112af366004615436565b613902565b3480156112c057600080fd5b5061055f6112cf366004615436565b6139a4565b3480156112e057600080fd5b5061055f6112ef366004615910565b613a07565b34801561130057600080fd5b5061055f61130f3660046156d4565b613a50565b600761131f81613abf565b611327613b37565b15611356576040517f6a436cd4d025d81a64b65845b219f011a8406fee86f3a2d737f274d94e268de190600090a15b6002601d540361145357600f54601e546001600160601b039091169081101561145157601e80546001600160601b038316900390556020546007546113aa916001600160a01b039081169116836000613bae565b602060009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156113fa57600080fd5b505af115801561140e573d6000803e3d6000fd5b50506040516001600160601b03841681527fbaf2a973da603337d11f56e6730fba6606e95b5e8085627c9ead4d24672d8616925060200190505b60405180910390a15b505b50565b3360008181526002602052604090208215611499578054600163ffffffff600160401b80840482169290920116026bffffffff0000000000000000199091161781555b83156114c8578054600163ffffffff600160601b808404821692909201160263ffffffff60601b199091161781555b60408051851515815284151560208201526001600160a01b038416917f5c20d5f19f8c6bc73cb1cba38e0b27f3837b43909d18a4ef193d1fa3c6f8f0d491015b60405180910390a250505050565b60006115253384846001613e1b565b90505b92915050565b600061152882613fdb565b600461154481613abf565b633b9aca00826001600160601b031611156115725760405163c64200e960e01b815260040160405180910390fd5b61157e6012600a615a4a565b611591906001600160601b038416615a56565b600f80546001600160601b0319166001600160601b0392831617905560405190831681527f5948780118f41f7c4577ae4619d5cbd064057bd8562d9f7b7e60324053375c0090602001611448565b60046115ea81613abf565b600a826001600160601b031611156116155760405163c64200e960e01b815260040160405180910390fd5b600d80546001600160601b0319166001600160601b0384169081179091556040519081527f5597c0e02a719eddde3b801d7abc15c0023afdcf6880c1e254427559820083c290602001611448565b6000611670848484614008565b600061167c8533613678565b90508083111561169f57604051639b144c5760e01b815260040160405180910390fd5b8290036116af8533836000613e1b565b50600195945050505050565b60046116c681613abf565b816116d25760016116d5565b60025b601b5560405182151581527fff33d24fddcb9b99aca93607453cdcbd7aa449ae3ea8a9f69421881c7eae81c990602001611448565b600161171581613abf565b81611721576001611724565b60025b601a5560405182151581527f3794234fa370c9f3b948dda3e3040530785b2ef1eb27dda3ffde478f4e2643c090602001611448565b600161176481613abf565b633b9aca008311156117895760405163c64200e960e01b815260040160405180910390fd5b61179482600a615a4a565b6117a684670de0b6b3a7640000615a56565b6117b09190615a8b565b60108190556040519081527fcc06eb9a0c57a5ee1100a0e2e4029558c04ff3b2a110a881ac9700cffed1a824906020015b60405180910390a1505050565b60026117f981613abf565b3360215460405163020604bf60e21b8152600481018590526001600160a01b03928316929091169063081812fc90602401602060405180830381865afa158015611847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186b9190615a9f565b6001600160a01b03161415801561190157506021546001600160a01b031663e985e9c5336040516001600160e01b031960e084901b1681526001600160a01b0391821660048201529086166024820152604401602060405180830381865afa1580156118db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ff9190615abc565b155b1561191f57604051634014f1a560e01b815260040160405180910390fd5b61192883614382565b602154604051632b0e1d7960e01b81526001600160a01b038581166004830152602482018590526000921690632b0e1d79906044016020604051808303816000875af115801561197c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a09190615ad9565b90506119ae848260016143a9565b6006546119c89085906001600160a01b0316836000613bae565b60215460405163632abfe960e11b81526001600160a01b038681166004830152602482018690529091169063c6557fd290604401600060405180830381600087803b158015611a1657600080fd5b505af1158015611a2a573d6000803e3d6000fd5b5050600654604080518781526001600160601b03861660208201526001600160a01b038981169550909216925030917fe0bf1306ae80358ba075e7e155d3d3100bd1cb7245f654f111d39453f756356a910160405180910390a450505050565b60006002611a9781613abf565b60215460405163153d88f360e11b81526001600160a01b0390911690632a7b11e690611ad4908b908b908b908b908b906000908c90600401615af6565b6020604051808303816000875af1158015611af3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b179190615b5f565b63ffffffff1691506000611b2b8589615b7a565b600654909150611b47906001600160a01b03168a836000613bae565b611b5389828986614488565b600654604080518581526001600160601b03841660208201526001600160a01b038c811693169130917f339e4100371ca3951325b190c421cb3c67f09635d57fc14e6aacfcb52d387329910160405180910390a450509695505050505050565b611bbb614544565b611bc481612151565b600680546001600160a01b0319166001600160a01b0383169081179091556040517f1501eda19b56071bf17a0a32e2efdeb611ccec1e2da5c7612bf674204901ce7a90600090a250565b3360009081526002602090815260409182902054825180840184526008815267457665725269736560c01b908301528251600160601b90910460e01b6001600160e01b03191681830152825180820360040181526024820184528051908301207f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60448301527fce794fa9785f2c930c5f814f254aa188dca4e3e9bde647a87f3a0c8d20d90736606483015260848201524660a48201523060c4808301919091528351808303909101815260e4909101909252815191012090565b6021546001600160a01b0316336001600160a01b031614611d1d57604051637c1aebb760e01b815260040160405180910390fd5b611d28838383614571565b505050565b6000336001600160a01b038116600081815260026020908152604091829020805463ffffffff60801b1916600160801b61ffff89811691820261ffff60901b191692909217600160901b928b169283021783558451918252928101929092529394507f6d8d587cf6c6d60a0dcd1fa635969d1d69787cfdf26d9f83ebaba44408fc1d2d9101611508565b33611dc181614382565b602154604080516305f00a1f60e21b8152905133926001600160a01b0316916317c0287c9160048083019260209291908290030181865afa158015611e0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2e9190615ba2565b341015611e4e5760405163627554ed60e01b815260040160405180910390fd5b60215460405163615eaa5960e01b81526001600160a01b0383811660048301526001600160601b038716602483015260ff86166044830152600092169063615eaa59906064016020604051808303816000875af1158015611eb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed79190615b5f565b9050611eeb8286868463ffffffff16614488565b5050505050565b6001611efd81613abf565b6103e8831115611f205760405163c64200e960e01b815260040160405180910390fd5b611f2b82600a615a4a565b611f3d84670de0b6b3a7640000615a56565b611f479190615a8b565b6016556040518381527f2d2d4e5324f4ce25e3d52eea5f16c64ccd01d35f9f80f30b73346811cc9b951d906020016117e1565b6004611f8581613abf565b6001600160a01b038216611fac576040516366385fa360e01b815260040160405180910390fd5b6000829050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120139190615a9f565b6001600160a01b031663e6a4390530836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612060573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120849190615a9f565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa1580156120cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f39190615a9f565b602080546001600160a01b03199081166001600160a01b0393841617909155601f8054909116838316179055604051908416907fafec26814d7c5e0716cdb68343bdf123509d8bae8a1a877de1c3869411985c5590600090a2505050565b600561215c81613abf565b6001600160a01b03821660009081526008602052604090205460ff16156121965760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b038216600081815260086020908152604091829020805460ff1916600117905590519182527f7168e8adb718597b3ac83e2dfe415bea8ebaabb57fe933ffac2e0ed93b80718e9101611448565b336121f481614382565b60003360215460405163d22d6f4360e01b81526001600160a01b0380841660048301526024820188905286151560448301529293506000929091169063d22d6f43906064016020604051808303816000875af1158015612258573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227c9190615ad9565b905061228a828260016143a9565b60215460405163632abfe960e11b81526001600160a01b038481166004830152602482018890529091169063c6557fd290604401600060405180830381600087803b1580156122d857600080fd5b505af11580156122ec573d6000803e3d6000fd5b505050505050505050565b600461230281613abf565b600780546001600160a01b0319166001600160a01b0384169081179091556040517f6feb2294766fb161940a49b92df0ad4a47ffb6ef8255e0b9f80c8c05b7ec6b0f90600090a25050565b600461235881613abf565b600d546001600160601b03168211156123845760405163c64200e960e01b815260040160405180910390fd5b600e8290556040518281527f160ad92b724bb5157ba7574b379ecc4ec5a5f5220cd651c3b44b4b1c12332b1190602001611448565b600060086123c681613abf565b6123d33085856000613bae565b5060019392505050565b6006546000906001600160a01b0383811691161480156123ff57506002601c54145b1561240c57506000919050565b6000612417836146bd565b905060026018541415801561243757506028544363ffffffff9081169116145b801561244c57506001600160a01b0383163b15155b801561247157506001600160a01b03831660009081526008602052604090205460ff16155b156115285761152883826146e1565b600461248b81613abf565b6001601e556040517f38e9e1bdbb19e199e2318a4fdd4145df21973acc643c88012128eeb61a386c6090600090a150565b336124c681614382565b336124d18184614845565b60215460405163e2c281db60e01b81526001600160a01b038381166004830152602482018790526001600160601b0386166044830152600092839291169063e2c281db906064016060604051808303816000875af1158015612537573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061255b9190615bbb565b6040516001600160601b03831681529094509092506001600160a01b03851691507fbedcdd66d86f5dc81286de7b36cc38398208ffb595a3e95330fca4fb21f08cba9060200160405180910390a26001600160a01b0383167ff4476f182b22aa6860f6aea0edf736040fd43167d941069fadffe4aef18ef7286125de8784615bfa565b604080516001600160601b03909216825260ff861660208301520160405180910390a2505050505050565b612611614544565b61145333826148ff565b600161262681613abf565b620f424083111561264a5760405163c64200e960e01b815260040160405180910390fd5b61265582600a615a4a565b61266784670de0b6b3a7640000615a56565b6126719190615a8b565b6017556040518381527fb25c7820d9392eafa2a90c45ca6438ae395e13490da78f2e2c77168cbb951534906020016117e1565b6006546000906126bc906001600160a01b03166146bd565b905090565b6126c9614544565b60008160088111156126dd576126dd615c25565b036126fa576040516252b55360e31b815260040160405180910390fd5b6001600160a01b038216612721576040516366385fa360e01b815260040160405180910390fd5b600180600083600881111561273857612738615c25565b600881111561274957612749615c25565b8152602080820192909252604090810160009081206001600160a01b03871682529092529020805460ff191691151591909117905580600881111561279057612790615c25565b6040516001600160a01b038416907fda7159b01021254a0864c86d0163ad02e9f9ce045913f19dc9315ce339a7270a90600090a35050565b60006127d5338484614008565b50600192915050565b60046127e981613abf565b816127f55760016127f8565b60025b601d5560405182151581527f381a2ba311289fc64532188b12030ca4ad77b2dc7c3a88ab03bacbf13da52a1c90602001611448565b3361283781614382565b600033602154604051632af7e50d60e21b81526001600160a01b038084166004830152602482018990526001600160601b038816604483015286151560648301529293506000929091169063abdf9434906084016020604051808303816000875af11580156128aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ce9190615b5f565b90506001600160601b038516156128eb576128eb828660016143a9565b8063ffffffff168614158015612906575063ffffffff811615155b1561297f57602154604051630b40697b60e31b81526001600160a01b0384811660048301526024820189905263ffffffff8416604483015290911690635a034bd8906064015b600060405180830381600087803b15801561296657600080fd5b505af115801561297a573d6000803e3d6000fd5b505050505b505050505050565b6312cc03006129996201518083615c3b565b65ffffffffffff1611156129c057604051635b30744d60e11b815260040160405180910390fd5b33600090815260026020526040902054600160a01b900465ffffffffffff1642811015612a00576040516319aad37160e01b815260040160405180910390fd5b6000612a0c8342615c60565b90508065ffffffffffff168265ffffffffffff161115612a3f57604051636badcecf60e01b815260040160405180910390fd5b336000818152600260205260409020805465ffffffffffff60a01b1916600160a01b65ffffffffffff85160217905560405165ffffffffffff851681526001600160a01b0391909116907f402f92847e995eb87d15fd380cf11ec5c61ca69a5f6cd305fd26cd1cb6a41757906020015b60405180910390a2505050565b6001612ac781613abf565b620186a0831115612aeb5760405163c64200e960e01b815260040160405180910390fd5b612af682600a615a4a565b612b0884670de0b6b3a7640000615a56565b612b129190615a8b565b60128190556040519081527fac218d80006936a5fb23226f25ffed76cd856dbcc539b7dd7a8abb5a418a8da4906020016117e1565b6006612b5281613abf565b6001600160a01b038216600081815260096020526040808220805460ff19166001179055517f07eccb5a6343032639dc3f1a913d254583bf745e350cdaa19ffc2b4cc2ebff6b9190a25050565b6001600160a01b03831660009081527fd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f602052604090205460ff16612bf75760405163d9716e4360e01b815260040160405180910390fd5b6021546001600160a01b031663e1f21c67336040516001600160e01b031960e084901b1681526001600160a01b039182166004820152908616602482015260448101859052606401600060405180830381600087803b158015612c5957600080fd5b505af1158015612c6d573d6000803e3d6000fd5b50505050612c84612c7b3390565b84836001613e1b565b50505050565b60006008612c9781613abf565b60215460405163153d88f360e11b81526001600160a01b0390911690632a7b11e690612cd4908b908a908a908a908a908f90600090600401615af6565b6020604051808303816000875af1158015612cf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d179190615b5f565b63ffffffff1691506000612d2b8488615b7a565b9050612d3a308a836000613bae565b6001600160601b03881615612d6357602154612d639030906001600160a01b03168a6000613bae565b612d6f89828886614488565b50509695505050505050565b612d83614544565b6000816008811115612d9757612d97615c25565b03612db4576040516252b55360e31b815260040160405180910390fd5b6001600160a01b038216612ddb576040516366385fa360e01b815260040160405180910390fd5b600060016000836008811115612df357612df3615c25565b6008811115612e0457612e04615c25565b8152602080820192909252604090810160009081206001600160a01b03871682529092529020805460ff1916911515919091179055806008811115612e4b57612e4b615c25565b6040516001600160a01b038416907f99b197980951aeda56a24210ac7963b47fac50b2277554a4fc7dc06fd305b57490600090a35050565b612e8b614544565b6001600160a01b038316612eb2576040516366385fa360e01b815260040160405180910390fd5b611d28838383614973565b33612ec781614382565b6001600160a01b038316612eee576040516366385fa360e01b815260040160405180910390fd5b6312cc0300612f006201518084615c3b565b65ffffffffffff161115612f2757604051635b30744d60e11b815260040160405180910390fd5b612f318242615c60565b336000818152600260209081526040808320805465ffffffffffff60a01b1916600160a01b65ffffffffffff97881602179055600482529182902080546001600160a01b0389166001600160a01b0319909116811790915582519081529386169084015290917f9141f23a32bd7f35c8ce161a6f9d05eba59799700a6a44094330bd68b3e251039101612aaf565b33612fc981614382565b60003360215460405163012a6efb60e21b81526001600160a01b038084166004830152602482018890526001600160601b0387166044830152929350600092839216906304a9bbec9060640160408051808303816000875af1158015613033573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130579190615c81565b91509150613067838660016143a9565b6001600160601b038116156130a2576021546130909084906001600160a01b0316836000613bae565b6130a2816001600160601b0316614a2c565b602154604051630b40697b60e31b81526001600160a01b0385811660048301526024820189905263ffffffff8516604483015290911690635a034bd89060640161294c565b60036130f281613abf565b61311f620186a07f0000000000000000000000000000000000000000000000000000000000000000615cad565b6001600160601b03168210156131485760405163c64200e960e01b815260040160405180910390fd5b600c8290556040518281527f699d1c4c28f453c7c162bf9ab9d182bcca9b5860718f5dbc0dadb620c0aa077e90602001611448565b6001600160a01b0386166131a4576040516366385fa360e01b815260040160405180910390fd5b428410156131c557604051630407b05b60e31b815260040160405180910390fd5b6001600160a01b03871660009081526002602052604081208054909167ffffffffffffffff909116906131f6611c0e565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960208201526001600160a01b03808e1692820192909252908b166060820152608081018a905267ffffffffffffffff841660a082015260c0810189905260e0016040516020818303038152906040528051906020012060405160200161329892919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181529190528051602090910120835467ffffffffffffffff600190940193841667ffffffffffffffff199091161784559050601b60ff871610156132f3576132ec601b87615cc7565b955061334b565b601e8660ff16111561334b576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052605c016040516020818303038152906040528051906020012090505b6040805160008082526020820180845284905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561339f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615806133d457508a6001600160a01b0316816001600160a01b031614155b156133f257604051638baa579f60e01b815260040160405180910390fd5b6133ff8b8b8b6001613e1b565b505050505050505050505050565b600061341e8833888888888861317d565b613429888888611663565b98975050505050505050565b600661344081613abf565b6001600160a01b038216600081815260096020526040808220805460ff19169055517fe96bbe78c8bc645f0ee444e35730f56b458ea663d1b2a35cf93cefd7fce93dc19190a25050565b600461349581613abf565b6001600160a01b0382166134bc576040516366385fa360e01b815260040160405180910390fd5b600580546001600160a01b0319166001600160a01b0384169081179091556040517f6a679ad6371327969c9ddeade76f85c3e657fd6d020eeb491becdd1b6d608db390600090a25050565b600161351281613abf565b6305f5e1008211156135375760405163c64200e960e01b815260040160405180910390fd5b6135436012600a615a4a565b61354d9083615a56565b60118190556040519081527f29b4862b0ac325a5ba77a99236953f6a42e083f4f886db919d7b0b5e9f2cee0090602001611448565b6001600160a01b038181166000908152600460205260409020541633146135bc57604051634014f1a560e01b815260040160405180910390fd5b33600090815260026020526040902054600160a01b900465ffffffffffff16428110156135fc576040516319aad37160e01b815260040160405180910390fd5b5050336000908152600260205260409020805465ffffffffffff60a01b1916600160a01b179055565b61362d614544565b8061363957600161363c565b60025b601c5560405181151581527f3d7f39af0cf901fec3da1b0ecfab4a0eb553ed671de67850e09cca22848dd866906020015b60405180910390a150565b6001600160a01b038083166000908152600260209081526040808320546003835281842094861684529390915281208054919263ffffffff600160601b909104811692600160a01b900416821415806136e057508054600160c01b900465ffffffffffff1642115b806136f757508054600160f81b900460ff16600114155b1561370757600092505050611528565b546001600160801b0316949350505050565b613721614544565b8061372d576001613730565b60025b60195560405181151581527f436b6cf978c7b6998fcce43dfe4d37e3a0dc2bb780144a2eb55d7138201e8a129060200161366d565b6021546000906001600160a01b0316336001600160a01b03161461379c57604051637c1aebb760e01b815260040160405180910390fd5b6115258383614ac1565b60056137b181613abf565b6001600160a01b03821660009081526008602052604090205460ff166137ea5760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b038216600081815260086020908152604091829020805460ff1916905590519182527fead11242b7eb5b3a03a27edc0039f1305d251bf91b3d1e94c3861c3d6e4ac1289101611448565b613843614544565b600c54156138645760405163e529091f60e01b815260040160405180910390fd5b61389530333060009081526023602052604090205461388e906001906001600160601b0316615b7a565b6000613bae565b6002601a8190556019556138cb6103e87f0000000000000000000000000000000000000000000000000000000000000000615cad565b6001600160601b0316600c556040517f994a0442f4498644e0bb3fe4b4c74ad21fbbb80e04b2fd1cb31f4248796d3dde90600090a1565b61390a614544565b6001600160a01b038116613931576040516366385fa360e01b815260040160405180910390fd5b600080546001600160a01b03169061394a908290614b5b565b613955826001614b5b565b600080546001600160a01b0319166001600160a01b0384811691821783556040519192908416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6139ac614544565b602180546001600160a01b0319166001600160a01b0383161790556139d081612151565b6040516001600160a01b038216907f8ae96d8af35324a34b19e4f33e72d620b502f69595bb43870ab5fd7a7de7823990600090a250565b82613a1181614382565b6021546001600160a01b0316336001600160a01b031614613a4557604051637c1aebb760e01b815260040160405180910390fd5b612c84848484614cec565b6001613a5b81613abf565b6064821080613a6c5750620f424082115b15613a8a5760405163c64200e960e01b815260040160405180910390fd5b60158290556040518281527fe24723968dd1fe95c864bec60a98788d4f02a5a3e1e9e80ccafdee9146ff54c790602001611448565b60016000826008811115613ad557613ad5615c25565b6008811115613ae657613ae6615c25565b81526020019081526020016000206000613afd3390565b6001600160a01b0316815260208101919091526040016000205460ff1661145357604051634014f1a560e01b815260040160405180910390fd5b60006002601a5403613bab57601254479081118015613b645750601554601454613b619190615cec565b43115b15613ba957613b74600a82615a8b565b60135460175491925090811115613b8a57506017545b81811115613b955750805b8015613ba757613ba481614dfe565b92505b505b505b90565b6001600160a01b038416600090815260236020526040812054613bdb9084906001600160601b0316615b7a565b6001600160a01b038616600090815260236020526040812080546001600160601b0319166001600160601b03841617905590915082613c1b576000613c3e565b600d54606490613c34906001600160601b031686615d04565b613c3e9190615cad565b90506000613c4c8286615b7a565b6001600160a01b0387166000908152602360205260409020549091506001600160601b0316613c7b8282615bfa565b6001600160a01b038816600090815260236020526040902080546001600160601b0319166001600160601b03928316179055831615613d01573060009081526023602052604081208054859290613cdc9084906001600160601b0316615bfa565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b613d0b8482614f39565b6006546001600160a01b0390811690891603613d73576006546040516001600160601b03881681526001600160a01b038981169216907f0e128c83dc42be0b80a07793e5b69c77c3981238a44754802b90d92ae85b3b489060200160405180910390a3613dd7565b6006546001600160a01b0390811690881603613dd7576006546040516001600160601b03881681526001600160a01b038a81169216907f5cd522aff7a2bf4d0c00ba029b9cebb7a25ed4a77695101f28f01f865421d0409060200160405180910390a35b6040516001600160601b03831681526001600160a01b0380891691908a1690600080516020615ddd8339815191529060200160405180910390a35050505050505050565b60006001600160a01b038516613e44576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b038416613e6b576040516366385fa360e01b815260040160405180910390fd5b6001600160801b03831115613e85576001600160801b0392505b6001600160a01b03858116600090815260026020908152604080832060038352818420948916845293909152902080546fffffffffffffffffffffffffffffffff1981166001600160801b0387169081178355835477ffffffff00000000ffffffffffffffffffffffffffffffff1990921617600160601b90910463ffffffff16600160a01b021781558315613f71578154600160901b900461ffff168015613f4357613f3481610e10615d33565b613f3e9042615c60565b613f4b565b65ffffffffffff5b825465ffffffffffff91909116600160c01b0265ffffffffffff60c01b19909116178255505b80546001600160f81b0316600160f81b1781556040516001600160a01b0380881691908916907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590613fc69089815260200190565b60405180910390a35060019695505050505050565b6001600160a01b031660009081526002602052604090205442600160a01b90910465ffffffffffff161190565b8261401281614382565b6001600160a01b038416158061402f57506001600160a01b038316155b1561404d576040516366385fa360e01b815260040160405180910390fd5b8160000361406e57604051635e85ae7360e01b815260040160405180910390fd5b6001600160a01b0384166000908152602460205260409020546001600160601b0316614099856146bd565b6140a39190615d58565b8211156140c3576040516305c2afdf60e21b815260040160405180910390fd5b6001600160a01b03841660009081526008602052604081205460ff168061410257506001600160a01b03841660009081526008602052604090205460ff165b601854909150600214156000614119600c54151590565b6020549091506001600160a01b0390811690878116821490891682148561427857306001600160a01b038a16036141635760405163d9716e4360e01b815260040160405180910390fd5b600c5488111561418657604051631b97a87560e01b815260040160405180910390fd5b836141a4576040516306c3d31f60e51b815260040160405180910390fd5b84156142785781806141b35750805b80156141cd57503260009081526025602052604090205443145b156141eb5760405163e069ee1d60e01b815260040160405180910390fd5b32600090815260256020526040902043905581801561420c57506002601954145b1561427857600f546001600160601b031680614227306146bd565b111561423f5761423f816001600160601b0316614f86565b614247613b37565b15614276576040517fac401825222c905dafef53f897e1fe565e107a9b114737f28ad26c699784bd8d90600090a15b505b83156143105780156142a15787600a60008282546142969190615cec565b909155506143109050565b81156143105787600b60008282546142b99190615cec565b90915550506011548811156143105760006142d5606447615a8b565b9050600060646010546142e89190615a8b565b9050808211156142f6578091505b81601360008282546143089190615cec565b909155505050505b6001868061433657506001600160a01b038a1660009081526009602052604090205460ff165b1561433f575060005b8515614369578615614360576028805463ffffffff19166001179055614369565b6143698a6150e0565b6143758b8b8b84613bae565b5050505050505050505050565b61438b81613fdb565b15611453576040516335543b4960e21b815260040160405180910390fd5b6001600160a01b038316600090815260246020526040812080548492906143da9084906001600160601b0316615b7a565b92506101000a8154816001600160601b0302191690836001600160601b031602179055508015611d28576040516001600160601b03831681526001600160a01b038416907fbedcdd66d86f5dc81286de7b36cc38398208ffb595a3e95330fca4fb21f08cba9060200160405180910390a26040516001600160601b03831681526001600160a01b038416908190600080516020615ddd833981519152906020015b60405180910390a3505050565b6144928484614845565b60215460405163238d3a8f60e11b81526001600160a01b038681166004830152602482018490529091169063471a751e90604401600060405180830381600087803b1580156144e057600080fd5b505af11580156144f4573d6000803e3d6000fd5b5050604080516001600160601b038716815260ff861660208201526001600160a01b03881693507ff4476f182b22aa6860f6aea0edf736040fd43167d941069fadffe4aef18ef728925001611508565b6000546001600160a01b0316331461456f57604051632e6c18c960e11b815260040160405180910390fd5b565b6001600160a01b038216614598576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b038084166000818152600360209081526040808320948716835293815283822092825260029052919091208215614678578054600160801b900461ffff1660008115614604576145f182610e10615d6f565b6145ff9061ffff1642615c60565b61460c565b65ffffffffffff5b8354855460ff60f01b1965ffffffffffff909316600160c01b0265ffffffffffff60c01b19600160801b63ffffffff600160401b9095049490941693909302929092166dffffffffffff00000000ffffffff60801b19909116171716600160f01b17845550611eeb9050565b5481546eff00000000000000000000ffffffff60801b1916600160801b600160401b90920463ffffffff90811660001901169190910260ff60f01b1916179055505050565b6001600160a01b03166000908152602360205260409020546001600160601b031690565b602754600160601b90046001600160a01b03163214158061471757506026546001600160a01b03838116600160601b9092041614155b15614720575050565b600080614735846001600160a01b0316615223565b90925090506001600160a01b03811661474e5750505050565b6000306001600160a01b0383160361476b57508190506001614782565b6001600160a01b0383163014614782575050505050565b6040516370a0823160e01b81526001600160a01b038681166004830152600091908416906370a0823190602401602060405180830381865afa1580156147cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147f09190615ba2565b6026549091506001600160601b03166dffffffffffffffffffffffffffff861611801561482757506027546001600160601b031681115b1561297f5760405163878d636360e01b815260040160405180910390fd5b6001600160a01b0382166000908152602460205260408120546148729083906001600160601b0316615bfa565b905061487d836146bd565b816001600160601b031611156148a6576040516305c2afdf60e21b815260040160405180910390fd5b6001600160a01b03831660008181526024602090815260409182902080546001600160601b0319166001600160601b0386811691909117909155915191851682528291600080516020615ddd833981519152910161447b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461494c576040519150601f19603f3d011682016040523d82523d6000602084013e614951565b606091505b5050905080611d285760405163b5747cc760e01b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af11580156149c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149e69190615abc565b50816001600160a01b0316836001600160a01b03167ff217402c85197de87cd806653771027d1e91101ef79ab35684a580c62b91a9b58360405161447b91815260200190565b80156114535760215460405163d9fbb1e960e01b8152600481018390526001600160a01b039091169063d9fbb1e990602401600060405180830381600087803b158015614a7857600080fd5b505af1158015614a8c573d6000803e3d6000fd5b505050507fd3be3dbc076afa976ee7dfe1f596f6d7905e9441a1a426a244a12ef071272dd48160405161366d91815260200190565b6001600160a01b038083166000908152600260209081526040808320546003835281842094861684529390915281208054919263ffffffff600160401b909104811692600160801b90041682141580614b2957508054600160c01b900465ffffffffffff1642115b80614b4057508054600160f01b900460ff16600114155b15614b5057600092505050611528565b506001949350505050565b6001600160a01b039190911660009081527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f60209081526040808320805494151560ff1995861681179091557fd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f835281842080548616821790557f7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b835281842080548616821790557fedc95719e9a3b28dd8e80877cb5880a9be7de1a13fc8b05e7999683b6b567643835281842080548616821790557fe2689cd4a84e23ad2f564004f1c9013e9589d260bde6380aba3ca7e09e4df40c835281842080548616821790557f8f331abe73332f95a25873e8b430885974c0409691f89d643119a11623a7924a835281842080548616821790557fdc686ec4a0ff239c70e7c7c36e8f853eced3bc8618f48d2b816da2a74311237e835281842080548616821790557f4db623e5c4870b62d3fc9b4e8f893a1a77627d75ab45d9ff7e56ba19564af99b9092529091208054909216179055565b614cf8838260006143a9565b6001600160a01b038316600090815260236020526040812054614d259083906001600160601b0316615b7a565b6001600160a01b0385811660009081526023602052604080822080546001600160601b0319166001600160601b0386811691909117909155928716825290205491925016614d738382615bfa565b6001600160a01b038516600090815260236020526040902080546001600160601b0319166001600160601b0392909216919091179055614db38484614845565b614dbd8282614f39565b6040516001600160601b03841681526001600160a01b038086169190871690600080516020615ddd8339815191529060200160405180910390a35050505050565b6000600260185403614e0f57600080fd5b60026018556016546013558115614f2f57602154600090614e38906001600160a01b03166146bd565b601f5460215460405163f43ae45b60e01b81526001600160a01b03928316600482015291166024820152604481018590529091507399fe7b37639ae33d0f15f61f4288a2fc9cff7bc19063f43ae45b9060640160006040518083038186803b158015614ea357600080fd5b505af4158015614eb7573d6000803e3d6000fd5b505060215460009250839150614ed5906001600160a01b03166146bd565b614edf9190615d58565b60408051868152602081018390529192507f3967d46c5aa65ced73be27b4c6d249e552274da7a605101a66ef571a8e2608a4910160405180910390a143601455614f2881614a2c565b6001925050505b6001601855919050565b602254806001600160601b038416600003614f5a57614f5781615d90565b90505b826001600160601b0316600003614f7757614f7481615da7565b90505b808214612c8457602255505050565b600260185403614f9557600080fd5b6002601855601f544790614fb69030906001600160a01b0316846001613e1b565b50816001600160601b0316601e6000828254614fd29190615cec565b9091555050601f54604051637041046d60e01b81526001600160a01b039091166004820152602481018390527399fe7b37639ae33d0f15f61f4288a2fc9cff7bc190637041046d9060440160006040518083038186803b15801561503557600080fd5b505af4158015615049573d6000803e3d6000fd5b505050506000814761505b9190615d58565b60408051858152602081018390529192507f1d835182508bc46cfe26167d5d6ca20231bf92fb2ee0d558d40553b29a40fdf9910160405180910390a1600d54600e546001600160601b03909116906150b39083615a56565b6150bd9190615a8b565b6005549091506150d6906001600160a01b0316826148ff565b5050600160185550565b60006150eb826146bd565b9050600080615102846001600160a01b0316615223565b9092509050306001600160a01b0382160361511a5750805b6001600160a01b03811661513e5750506028805463ffffffff191660011790555050565b6040516370a0823160e01b81526001600160a01b038581166004830152600091908316906370a0823190602401602060405180830381865afa158015615188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151ac9190615ba2565b6040805160a0810182526001600160601b039687168082526001600160a01b0398909816602082018190529290961690860181905232606087018190524363ffffffff166080909701879052600160601b928302909717602655950290941760275550506028805463ffffffff1916909117905550565b6000806001600160a01b0383163b61524057506000928392509050565b6040805160048152602481019091526020810180516001600160e01b0316630dfe168160e01b1790526152749084906152b1565b6040805160048152602481019091526020810180516001600160e01b031663d21220a760e01b1790526152a89085906152b1565b91509150915091565b6000806000846001600160a01b0316846040516152ce9190615dc0565b600060405180830381855afa9150503d8060008114615309576040519150601f19603f3d011682016040523d82523d6000602084013e61530e565b606091505b509150915081801561532257506020815110155b15615344578080602001905181019061533b9190615a9f565b92505050611528565b506000949350505050565b60005b8381101561536a578181015183820152602001615352565b83811115612c845750506000910152565b602081526000825180602084015261539a81604085016020870161534f565b601f01601f19169190910160400192915050565b801515811461145357600080fd5b600080604083850312156153cf57600080fd5b82356153da816153ae565b915060208301356153ea816153ae565b809150509250929050565b6001600160a01b038116811461145357600080fd5b6000806040838503121561541d57600080fd5b8235615428816153f5565b946020939093013593505050565b60006020828403121561544857600080fd5b8135615453816153f5565b9392505050565b6001600160601b038116811461145357600080fd5b60006020828403121561548157600080fd5b81356154538161545a565b6000806000606084860312156154a157600080fd5b83356154ac816153f5565b925060208401356154bc816153f5565b929592945050506040919091013590565b6000602082840312156154df57600080fd5b8135615453816153ae565b600080604083850312156154fd57600080fd5b50508035926020909101359150565b80356009811061551b57600080fd5b919050565b6000806040838503121561553357600080fd5b61553c8361550c565b915060208301356153ea816153f5565b60ff8116811461145357600080fd5b803565ffffffffffff8116811461551b57600080fd5b60008060008060008060c0878903121561558a57600080fd5b8635615595816153f5565b955060208701356155a58161545a565b945060408701356155b58161554c565b93506155c36060880161555b565b925060808701356155d38161545a565b915060a08701356155e3816153ae565b809150509295509295509295565b60008060006060848603121561560657600080fd5b8335615611816153f5565b92506020840135615621816153f5565b91506040840135615631816153ae565b809150509250925092565b803561ffff8116811461551b57600080fd5b6000806040838503121561566157600080fd5b61566a8361563c565b91506156786020840161563c565b90509250929050565b6000806040838503121561569457600080fd5b823561569f8161545a565b915060208301356153ea8161554c565b600080604083850312156156c257600080fd5b8235915060208301356153ea816153ae565b6000602082840312156156e657600080fd5b5035919050565b6000806040838503121561570057600080fd5b823561553c816153f5565b6000806040838503121561571e57600080fd5b8235615729816153f5565b915060208301356153ea8161545a565b6000806040838503121561574c57600080fd5b8235915060208301356153ea8161545a565b6000806040838503121561577157600080fd5b823561577c816153f5565b91506156786020840161550c565b60008060006060848603121561579f57600080fd5b8335925060208401356156218161545a565b6000602082840312156157c357600080fd5b6115258261555b565b6000806000606084860312156157e157600080fd5b83356157ec816153f5565b95602085013595506040909401359392505050565b60008060008060008060c0878903121561581a57600080fd5b8635615825816153f5565b955060208701356158358161545a565b945060408701356158458161545a565b935060608701356158558161554c565b92506158636080880161555b565b915060a08701356155e38161545a565b6000806040838503121561588657600080fd5b8235615891816153f5565b91506156786020840161555b565b600080600080600080600060e0888a0312156158ba57600080fd5b87356158c5816153f5565b965060208801356158d5816153f5565b9550604088013594506060880135935060808801356158f38161554c565b9699959850939692959460a0840135945060c09093013592915050565b60008060006060848603121561592557600080fd5b8335615930816153f5565b92506020840135615940816153f5565b915060408401356156318161545a565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156159a157816000190482111561598757615987615950565b8085161561599457918102915b93841c939080029061596b565b509250929050565b6000826159b857506001611528565b816159c557506000611528565b81600181146159db57600281146159e557615a01565b6001915050611528565b60ff8411156159f6576159f6615950565b50506001821b611528565b5060208310610133831016604e8410600b8410161715615a24575081810a611528565b615a2e8383615966565b8060001904821115615a4257615a42615950565b029392505050565b600061152583836159a9565b6000816000190483118215151615615a7057615a70615950565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615a9a57615a9a615a75565b500490565b600060208284031215615ab157600080fd5b8151615453816153f5565b600060208284031215615ace57600080fd5b8151615453816153ae565b600060208284031215615aeb57600080fd5b81516154538161545a565b6001600160a01b039790971687526001600160601b03958616602088015260ff94909416604087015265ffffffffffff9290921660608601528316608085015290911660a0830152151560c082015260e00190565b805163ffffffff8116811461551b57600080fd5b600060208284031215615b7157600080fd5b61152582615b4b565b60006001600160601b0383811690831681811015615b9a57615b9a615950565b039392505050565b600060208284031215615bb457600080fd5b5051919050565b600080600060608486031215615bd057600080fd5b615bd984615b4b565b92506020840151615be98161545a565b60408501519092506156318161554c565b60006001600160601b03808316818516808303821115615c1c57615c1c615950565b01949350505050565b634e487b7160e01b600052602160045260246000fd5b600065ffffffffffff80841680615c5457615c54615a75565b92169190910492915050565b600065ffffffffffff808316818516808303821115615c1c57615c1c615950565b60008060408385031215615c9457600080fd5b615c9d83615b4b565b915060208301516153ea8161545a565b60006001600160601b0380841680615c5457615c54615a75565b600060ff821660ff84168060ff03821115615ce457615ce4615950565b019392505050565b60008219821115615cff57615cff615950565b500190565b60006001600160601b0380831681851681830481118215151615615d2a57615d2a615950565b02949350505050565b600065ffffffffffff80831681851681830481118215151615615d2a57615d2a615950565b600082821015615d6a57615d6a615950565b500390565b600061ffff80831681851681830481118215151615615d2a57615d2a615950565b600081615d9f57615d9f615950565b506000190190565b600060018201615db957615db9615950565b5060010190565b60008251615dd281846020870161534f565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122091e982e5bd4e999830b5c60ea202a439612419afc9a698006fb4989473cf752364736f6c634300080d00330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Deployed Bytecode
0x6080604052600436106104fb5760003560e01c806370d5ae051161028c578063c0316ffe1161015a578063d98daa43116100cc578063ea2f0b3711610085578063ea2f0b371461125f578063ecc684a81461127f578063f2fde38b14611294578063f4e0d9ac146112b4578063f5dc51ec146112d4578063fa25e2de146112f457600080fd5b8063d98daa431461119f578063d9cd78f4146111bf578063da5fcc9f146111df578063dd62ed3e146111ff578063e01af92c1461121f578063e985e9c51461123f57600080fd5b8063cf913db91161011e578063cf913db9146110c6578063d1bdac24146110ff578063d505accf1461111f578063d6e03cd41461113f578063d921cd761461115f578063d96d54d81461117f57600080fd5b8063c0316ffe14611030578063c27afefc14611050578063c38c3ee614611070578063ca5f084f14611090578063cc5ba480146110a657600080fd5b80639bbe0533116101fe578063b22a6389116101b7578063b22a638914610f7a578063b51d404214610f9a578063b5d0abfd14610fba578063b971383a14610fda578063b9e5a03b14610ffa578063bfa1c45e1461101057600080fd5b80639bbe053314610ec2578063a63b91f414610ee2578063a9059cbb14610efa578063aefac34d14610f1a578063af1b597e14610f3a578063af77474414610f5a57600080fd5b80638a60c4c1116102505780638a60c4c114610de55780638aee2c2714610e055780638da5cb5b14610e255780638db2063b14610e4557806395d89b4114610e5a57806398118cb414610e8a57600080fd5b806370d5ae0514610d3b578063774a081014610d5b5780637d84ed2614610d705780637ecebe0014610d905780638188f71c14610dd057600080fd5b8063367605ca116103c95780634f27ec3e1161033b5780635f7e3821116102f45780635f7e382114610c6c5780635f898ce814610c8c578063601fdff314610cac5780636053a0e314610ceb5780636ddd171314610d0357806370a0823114610d1b57600080fd5b80634f27ec3e146109bc57806351ed6a30146109dc5780635342acb4146109fc57806355b6ed5c14610a3557806357976fb414610b045780635d0341ba14610b1c57600080fd5b806341cb87fc1161038d57806341cb87fc1461090657806341e70fa614610926578063437823ec1461093c578063445e76881461095c57806349bd5a5e1461097c5780634b0e72161461099c57600080fd5b8063367605ca1461087d57806336b1db151461089d578063379f96da146108bd578063410d3e67146108d0578063415e9718146108e657600080fd5b806320606b701161046d5780632b0e1d79116104265780632b0e1d79146107ad5780632b9afa03146107cd57806330adf81f146107ed578063313ce567146108215780633477320c146108485780633644e5151461086857600080fd5b806320606b70146106be57806323b872dd146106f257806326a17edf1461071257806329370cc61461073257806329d9ec5e146107525780632a49b6841461077257600080fd5b80630e59d5b7116104bf5780630e59d5b7146105d15780631551fe91146105e957806316758e0b146106095780631694505e1461062057806318160ddd146106585780631f5e98bb1461069e57600080fd5b806306fdde03146105075780630844c97f1461054a57806308792b1414610561578063095ea7b3146105815780630c0c91a2146105b157600080fd5b3661050257005b600080fd5b34801561051357600080fd5b50604080518082019091526008815267457665725269736560c01b60208201525b604051610541919061537b565b60405180910390f35b34801561055657600080fd5b5061055f611314565b005b34801561056d57600080fd5b5061055f61057c3660046153bc565b611456565b34801561058d57600080fd5b506105a161059c36600461540a565b611516565b6040519015158152602001610541565b3480156105bd57600080fd5b506105a16105cc366004615436565b61152e565b3480156105dd57600080fd5b50601c546002146105a1565b3480156105f557600080fd5b5061055f61060436600461546f565b611539565b34801561061557600080fd5b50600c5415156105a1565b34801561062c57600080fd5b50601f54610640906001600160a01b031681565b6040516001600160a01b039091168152602001610541565b34801561066457600080fd5b507f0000000000000000000000000000000000000000e7690c99f24eca66ba9000006001600160601b03165b604051908152602001610541565b3480156106aa57600080fd5b5061055f6106b936600461546f565b6115df565b3480156106ca57600080fd5b506106907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b3480156106fe57600080fd5b506105a161070d36600461548c565b611663565b34801561071e57600080fd5b5061055f61072d3660046154cd565b6116bb565b34801561073e57600080fd5b5061055f61074d3660046154cd565b61170a565b34801561075e57600080fd5b5061055f61076d3660046154ea565b611759565b34801561077e57600080fd5b506105a161078d366004615520565b600160209081526000928352604080842090915290825290205460ff1681565b3480156107b957600080fd5b5061055f6107c836600461540a565b6117ee565b3480156107d957600080fd5b506106906107e8366004615571565b611a8a565b3480156107f957600080fd5b506106907f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561082d57600080fd5b50610836601281565b60405160ff9091168152602001610541565b34801561085457600080fd5b5061055f610863366004615436565b611bb3565b34801561087457600080fd5b50610690611c0e565b34801561088957600080fd5b5061055f6108983660046155f1565b611ce9565b3480156108a957600080fd5b5061055f6108b836600461564e565b611d2d565b61055f6108cb366004615681565b611db7565b3480156108dc57600080fd5b50610690600c5481565b3480156108f257600080fd5b5061055f6109013660046154ea565b611ef2565b34801561091257600080fd5b5061055f610921366004615436565b611f7a565b34801561093257600080fd5b50610690600b5481565b34801561094857600080fd5b5061055f610957366004615436565b612151565b34801561096857600080fd5b5061055f6109773660046156af565b6121ea565b34801561098857600080fd5b50602054610640906001600160a01b031681565b3480156109a857600080fd5b5061055f6109b7366004615436565b6122f7565b3480156109c857600080fd5b5061055f6109d73660046156d4565b61234d565b3480156109e857600080fd5b50602154610640906001600160a01b031681565b348015610a0857600080fd5b506105a1610a17366004615436565b6001600160a01b031660009081526008602052604090205460ff1690565b348015610a4157600080fd5b50610ab6610a503660046156ed565b60036020908152600092835260408084209091529082529020546001600160801b0381169063ffffffff600160801b8204811691600160a01b81049091169065ffffffffffff600160c01b8204169060ff600160f01b8204811691600160f81b90041686565b604080516001600160801b03909716875263ffffffff9586166020880152949093169385019390935265ffffffffffff16606084015260ff91821660808401521660a082015260c001610541565b348015610b1057600080fd5b50601b546002146105a1565b348015610b2857600080fd5b50610bf8610b37366004615436565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506001600160a01b0316600090815260026020908152604091829020825160c081018452905467ffffffffffffffff8116825263ffffffff600160401b8204811693830193909352600160601b81049092169281019290925261ffff600160801b820481166060840152600160901b820416608083015265ffffffffffff600160a01b9091041660a082015290565b6040516105419190600060c08201905067ffffffffffffffff8351168252602083015163ffffffff80821660208501528060408601511660408501525050606083015161ffff8082166060850152806080860151166080850152505065ffffffffffff60a08401511660a083015292915050565b348015610c7857600080fd5b50600554610640906001600160a01b031681565b348015610c9857600080fd5b506105a1610ca736600461570b565b6123b9565b348015610cb857600080fd5b50610690610cc7366004615436565b6001600160a01b03166000908152602460205260409020546001600160601b031690565b348015610cf757600080fd5b50601a546002146105a1565b348015610d0f57600080fd5b506019546002146105a1565b348015610d2757600080fd5b50610690610d36366004615436565b6123dd565b348015610d4757600080fd5b50600754610640906001600160a01b031681565b348015610d6757600080fd5b5061055f612480565b348015610d7c57600080fd5b5061055f610d8b366004615739565b6124bc565b348015610d9c57600080fd5b50610690610dab366004615436565b6001600160a01b031660009081526002602052604090205467ffffffffffffffff1690565b348015610ddc57600080fd5b50602254610690565b348015610df157600080fd5b5061055f610e003660046156d4565b612609565b348015610e1157600080fd5b5061055f610e203660046154ea565b61261b565b348015610e3157600080fd5b50600054610640906001600160a01b031681565b348015610e5157600080fd5b506106906126a4565b348015610e6657600080fd5b50610534604051806040016040528060048152602001635249534560e01b81525081565b348015610e9657600080fd5b50600d54610eaa906001600160601b031681565b6040516001600160601b039091168152602001610541565b348015610ece57600080fd5b5061055f610edd36600461575e565b6126c1565b348015610eee57600080fd5b50601d546002146105a1565b348015610f0657600080fd5b506105a1610f1536600461540a565b6127c8565b348015610f2657600080fd5b50600654610640906001600160a01b031681565b348015610f4657600080fd5b5061055f610f553660046154cd565b6127de565b348015610f6657600080fd5b5061055f610f7536600461578a565b61282d565b348015610f8657600080fd5b5061055f610f953660046157b1565b612987565b348015610fa657600080fd5b5061055f610fb53660046154ea565b612abc565b348015610fc657600080fd5b5061055f610fd5366004615436565b612b47565b348015610fe657600080fd5b5061055f610ff53660046157cc565b612b9f565b34801561100657600080fd5b50610690600a5481565b34801561101c57600080fd5b5061069061102b366004615801565b612c8a565b34801561103c57600080fd5b5061055f61104b36600461575e565b612d7b565b34801561105c57600080fd5b5061055f61106b36600461548c565b612e83565b34801561107c57600080fd5b5061055f61108b366004615873565b612ebd565b34801561109c57600080fd5b50610690600e5481565b3480156110b257600080fd5b5061055f6110c1366004615739565b612fbf565b3480156110d257600080fd5b506105a16110e1366004615436565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561110b57600080fd5b5061055f61111a3660046156d4565b6130e7565b34801561112b57600080fd5b5061055f61113a36600461589f565b61317d565b34801561114b57600080fd5b506105a161115a36600461589f565b61340d565b34801561116b57600080fd5b5061055f61117a366004615436565b613435565b34801561118b57600080fd5b5061055f61119a366004615436565b61348a565b3480156111ab57600080fd5b5061055f6111ba3660046156d4565b613507565b3480156111cb57600080fd5b5061055f6111da366004615436565b613582565b3480156111eb57600080fd5b5061055f6111fa3660046154cd565b613625565b34801561120b57600080fd5b5061069061121a3660046156ed565b613678565b34801561122b57600080fd5b5061055f61123a3660046154cd565b613719565b34801561124b57600080fd5b506105a161125a3660046156ed565b613765565b34801561126b57600080fd5b5061055f61127a366004615436565b6137a6565b34801561128b57600080fd5b5061055f61383b565b3480156112a057600080fd5b5061055f6112af366004615436565b613902565b3480156112c057600080fd5b5061055f6112cf366004615436565b6139a4565b3480156112e057600080fd5b5061055f6112ef366004615910565b613a07565b34801561130057600080fd5b5061055f61130f3660046156d4565b613a50565b600761131f81613abf565b611327613b37565b15611356576040517f6a436cd4d025d81a64b65845b219f011a8406fee86f3a2d737f274d94e268de190600090a15b6002601d540361145357600f54601e546001600160601b039091169081101561145157601e80546001600160601b038316900390556020546007546113aa916001600160a01b039081169116836000613bae565b602060009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156113fa57600080fd5b505af115801561140e573d6000803e3d6000fd5b50506040516001600160601b03841681527fbaf2a973da603337d11f56e6730fba6606e95b5e8085627c9ead4d24672d8616925060200190505b60405180910390a15b505b50565b3360008181526002602052604090208215611499578054600163ffffffff600160401b80840482169290920116026bffffffff0000000000000000199091161781555b83156114c8578054600163ffffffff600160601b808404821692909201160263ffffffff60601b199091161781555b60408051851515815284151560208201526001600160a01b038416917f5c20d5f19f8c6bc73cb1cba38e0b27f3837b43909d18a4ef193d1fa3c6f8f0d491015b60405180910390a250505050565b60006115253384846001613e1b565b90505b92915050565b600061152882613fdb565b600461154481613abf565b633b9aca00826001600160601b031611156115725760405163c64200e960e01b815260040160405180910390fd5b61157e6012600a615a4a565b611591906001600160601b038416615a56565b600f80546001600160601b0319166001600160601b0392831617905560405190831681527f5948780118f41f7c4577ae4619d5cbd064057bd8562d9f7b7e60324053375c0090602001611448565b60046115ea81613abf565b600a826001600160601b031611156116155760405163c64200e960e01b815260040160405180910390fd5b600d80546001600160601b0319166001600160601b0384169081179091556040519081527f5597c0e02a719eddde3b801d7abc15c0023afdcf6880c1e254427559820083c290602001611448565b6000611670848484614008565b600061167c8533613678565b90508083111561169f57604051639b144c5760e01b815260040160405180910390fd5b8290036116af8533836000613e1b565b50600195945050505050565b60046116c681613abf565b816116d25760016116d5565b60025b601b5560405182151581527fff33d24fddcb9b99aca93607453cdcbd7aa449ae3ea8a9f69421881c7eae81c990602001611448565b600161171581613abf565b81611721576001611724565b60025b601a5560405182151581527f3794234fa370c9f3b948dda3e3040530785b2ef1eb27dda3ffde478f4e2643c090602001611448565b600161176481613abf565b633b9aca008311156117895760405163c64200e960e01b815260040160405180910390fd5b61179482600a615a4a565b6117a684670de0b6b3a7640000615a56565b6117b09190615a8b565b60108190556040519081527fcc06eb9a0c57a5ee1100a0e2e4029558c04ff3b2a110a881ac9700cffed1a824906020015b60405180910390a1505050565b60026117f981613abf565b3360215460405163020604bf60e21b8152600481018590526001600160a01b03928316929091169063081812fc90602401602060405180830381865afa158015611847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186b9190615a9f565b6001600160a01b03161415801561190157506021546001600160a01b031663e985e9c5336040516001600160e01b031960e084901b1681526001600160a01b0391821660048201529086166024820152604401602060405180830381865afa1580156118db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ff9190615abc565b155b1561191f57604051634014f1a560e01b815260040160405180910390fd5b61192883614382565b602154604051632b0e1d7960e01b81526001600160a01b038581166004830152602482018590526000921690632b0e1d79906044016020604051808303816000875af115801561197c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a09190615ad9565b90506119ae848260016143a9565b6006546119c89085906001600160a01b0316836000613bae565b60215460405163632abfe960e11b81526001600160a01b038681166004830152602482018690529091169063c6557fd290604401600060405180830381600087803b158015611a1657600080fd5b505af1158015611a2a573d6000803e3d6000fd5b5050600654604080518781526001600160601b03861660208201526001600160a01b038981169550909216925030917fe0bf1306ae80358ba075e7e155d3d3100bd1cb7245f654f111d39453f756356a910160405180910390a450505050565b60006002611a9781613abf565b60215460405163153d88f360e11b81526001600160a01b0390911690632a7b11e690611ad4908b908b908b908b908b906000908c90600401615af6565b6020604051808303816000875af1158015611af3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b179190615b5f565b63ffffffff1691506000611b2b8589615b7a565b600654909150611b47906001600160a01b03168a836000613bae565b611b5389828986614488565b600654604080518581526001600160601b03841660208201526001600160a01b038c811693169130917f339e4100371ca3951325b190c421cb3c67f09635d57fc14e6aacfcb52d387329910160405180910390a450509695505050505050565b611bbb614544565b611bc481612151565b600680546001600160a01b0319166001600160a01b0383169081179091556040517f1501eda19b56071bf17a0a32e2efdeb611ccec1e2da5c7612bf674204901ce7a90600090a250565b3360009081526002602090815260409182902054825180840184526008815267457665725269736560c01b908301528251600160601b90910460e01b6001600160e01b03191681830152825180820360040181526024820184528051908301207f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60448301527fce794fa9785f2c930c5f814f254aa188dca4e3e9bde647a87f3a0c8d20d90736606483015260848201524660a48201523060c4808301919091528351808303909101815260e4909101909252815191012090565b6021546001600160a01b0316336001600160a01b031614611d1d57604051637c1aebb760e01b815260040160405180910390fd5b611d28838383614571565b505050565b6000336001600160a01b038116600081815260026020908152604091829020805463ffffffff60801b1916600160801b61ffff89811691820261ffff60901b191692909217600160901b928b169283021783558451918252928101929092529394507f6d8d587cf6c6d60a0dcd1fa635969d1d69787cfdf26d9f83ebaba44408fc1d2d9101611508565b33611dc181614382565b602154604080516305f00a1f60e21b8152905133926001600160a01b0316916317c0287c9160048083019260209291908290030181865afa158015611e0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2e9190615ba2565b341015611e4e5760405163627554ed60e01b815260040160405180910390fd5b60215460405163615eaa5960e01b81526001600160a01b0383811660048301526001600160601b038716602483015260ff86166044830152600092169063615eaa59906064016020604051808303816000875af1158015611eb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed79190615b5f565b9050611eeb8286868463ffffffff16614488565b5050505050565b6001611efd81613abf565b6103e8831115611f205760405163c64200e960e01b815260040160405180910390fd5b611f2b82600a615a4a565b611f3d84670de0b6b3a7640000615a56565b611f479190615a8b565b6016556040518381527f2d2d4e5324f4ce25e3d52eea5f16c64ccd01d35f9f80f30b73346811cc9b951d906020016117e1565b6004611f8581613abf565b6001600160a01b038216611fac576040516366385fa360e01b815260040160405180910390fd5b6000829050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120139190615a9f565b6001600160a01b031663e6a4390530836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612060573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120849190615a9f565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa1580156120cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f39190615a9f565b602080546001600160a01b03199081166001600160a01b0393841617909155601f8054909116838316179055604051908416907fafec26814d7c5e0716cdb68343bdf123509d8bae8a1a877de1c3869411985c5590600090a2505050565b600561215c81613abf565b6001600160a01b03821660009081526008602052604090205460ff16156121965760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b038216600081815260086020908152604091829020805460ff1916600117905590519182527f7168e8adb718597b3ac83e2dfe415bea8ebaabb57fe933ffac2e0ed93b80718e9101611448565b336121f481614382565b60003360215460405163d22d6f4360e01b81526001600160a01b0380841660048301526024820188905286151560448301529293506000929091169063d22d6f43906064016020604051808303816000875af1158015612258573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227c9190615ad9565b905061228a828260016143a9565b60215460405163632abfe960e11b81526001600160a01b038481166004830152602482018890529091169063c6557fd290604401600060405180830381600087803b1580156122d857600080fd5b505af11580156122ec573d6000803e3d6000fd5b505050505050505050565b600461230281613abf565b600780546001600160a01b0319166001600160a01b0384169081179091556040517f6feb2294766fb161940a49b92df0ad4a47ffb6ef8255e0b9f80c8c05b7ec6b0f90600090a25050565b600461235881613abf565b600d546001600160601b03168211156123845760405163c64200e960e01b815260040160405180910390fd5b600e8290556040518281527f160ad92b724bb5157ba7574b379ecc4ec5a5f5220cd651c3b44b4b1c12332b1190602001611448565b600060086123c681613abf565b6123d33085856000613bae565b5060019392505050565b6006546000906001600160a01b0383811691161480156123ff57506002601c54145b1561240c57506000919050565b6000612417836146bd565b905060026018541415801561243757506028544363ffffffff9081169116145b801561244c57506001600160a01b0383163b15155b801561247157506001600160a01b03831660009081526008602052604090205460ff16155b156115285761152883826146e1565b600461248b81613abf565b6001601e556040517f38e9e1bdbb19e199e2318a4fdd4145df21973acc643c88012128eeb61a386c6090600090a150565b336124c681614382565b336124d18184614845565b60215460405163e2c281db60e01b81526001600160a01b038381166004830152602482018790526001600160601b0386166044830152600092839291169063e2c281db906064016060604051808303816000875af1158015612537573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061255b9190615bbb565b6040516001600160601b03831681529094509092506001600160a01b03851691507fbedcdd66d86f5dc81286de7b36cc38398208ffb595a3e95330fca4fb21f08cba9060200160405180910390a26001600160a01b0383167ff4476f182b22aa6860f6aea0edf736040fd43167d941069fadffe4aef18ef7286125de8784615bfa565b604080516001600160601b03909216825260ff861660208301520160405180910390a2505050505050565b612611614544565b61145333826148ff565b600161262681613abf565b620f424083111561264a5760405163c64200e960e01b815260040160405180910390fd5b61265582600a615a4a565b61266784670de0b6b3a7640000615a56565b6126719190615a8b565b6017556040518381527fb25c7820d9392eafa2a90c45ca6438ae395e13490da78f2e2c77168cbb951534906020016117e1565b6006546000906126bc906001600160a01b03166146bd565b905090565b6126c9614544565b60008160088111156126dd576126dd615c25565b036126fa576040516252b55360e31b815260040160405180910390fd5b6001600160a01b038216612721576040516366385fa360e01b815260040160405180910390fd5b600180600083600881111561273857612738615c25565b600881111561274957612749615c25565b8152602080820192909252604090810160009081206001600160a01b03871682529092529020805460ff191691151591909117905580600881111561279057612790615c25565b6040516001600160a01b038416907fda7159b01021254a0864c86d0163ad02e9f9ce045913f19dc9315ce339a7270a90600090a35050565b60006127d5338484614008565b50600192915050565b60046127e981613abf565b816127f55760016127f8565b60025b601d5560405182151581527f381a2ba311289fc64532188b12030ca4ad77b2dc7c3a88ab03bacbf13da52a1c90602001611448565b3361283781614382565b600033602154604051632af7e50d60e21b81526001600160a01b038084166004830152602482018990526001600160601b038816604483015286151560648301529293506000929091169063abdf9434906084016020604051808303816000875af11580156128aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ce9190615b5f565b90506001600160601b038516156128eb576128eb828660016143a9565b8063ffffffff168614158015612906575063ffffffff811615155b1561297f57602154604051630b40697b60e31b81526001600160a01b0384811660048301526024820189905263ffffffff8416604483015290911690635a034bd8906064015b600060405180830381600087803b15801561296657600080fd5b505af115801561297a573d6000803e3d6000fd5b505050505b505050505050565b6312cc03006129996201518083615c3b565b65ffffffffffff1611156129c057604051635b30744d60e11b815260040160405180910390fd5b33600090815260026020526040902054600160a01b900465ffffffffffff1642811015612a00576040516319aad37160e01b815260040160405180910390fd5b6000612a0c8342615c60565b90508065ffffffffffff168265ffffffffffff161115612a3f57604051636badcecf60e01b815260040160405180910390fd5b336000818152600260205260409020805465ffffffffffff60a01b1916600160a01b65ffffffffffff85160217905560405165ffffffffffff851681526001600160a01b0391909116907f402f92847e995eb87d15fd380cf11ec5c61ca69a5f6cd305fd26cd1cb6a41757906020015b60405180910390a2505050565b6001612ac781613abf565b620186a0831115612aeb5760405163c64200e960e01b815260040160405180910390fd5b612af682600a615a4a565b612b0884670de0b6b3a7640000615a56565b612b129190615a8b565b60128190556040519081527fac218d80006936a5fb23226f25ffed76cd856dbcc539b7dd7a8abb5a418a8da4906020016117e1565b6006612b5281613abf565b6001600160a01b038216600081815260096020526040808220805460ff19166001179055517f07eccb5a6343032639dc3f1a913d254583bf745e350cdaa19ffc2b4cc2ebff6b9190a25050565b6001600160a01b03831660009081527fd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f602052604090205460ff16612bf75760405163d9716e4360e01b815260040160405180910390fd5b6021546001600160a01b031663e1f21c67336040516001600160e01b031960e084901b1681526001600160a01b039182166004820152908616602482015260448101859052606401600060405180830381600087803b158015612c5957600080fd5b505af1158015612c6d573d6000803e3d6000fd5b50505050612c84612c7b3390565b84836001613e1b565b50505050565b60006008612c9781613abf565b60215460405163153d88f360e11b81526001600160a01b0390911690632a7b11e690612cd4908b908a908a908a908a908f90600090600401615af6565b6020604051808303816000875af1158015612cf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d179190615b5f565b63ffffffff1691506000612d2b8488615b7a565b9050612d3a308a836000613bae565b6001600160601b03881615612d6357602154612d639030906001600160a01b03168a6000613bae565b612d6f89828886614488565b50509695505050505050565b612d83614544565b6000816008811115612d9757612d97615c25565b03612db4576040516252b55360e31b815260040160405180910390fd5b6001600160a01b038216612ddb576040516366385fa360e01b815260040160405180910390fd5b600060016000836008811115612df357612df3615c25565b6008811115612e0457612e04615c25565b8152602080820192909252604090810160009081206001600160a01b03871682529092529020805460ff1916911515919091179055806008811115612e4b57612e4b615c25565b6040516001600160a01b038416907f99b197980951aeda56a24210ac7963b47fac50b2277554a4fc7dc06fd305b57490600090a35050565b612e8b614544565b6001600160a01b038316612eb2576040516366385fa360e01b815260040160405180910390fd5b611d28838383614973565b33612ec781614382565b6001600160a01b038316612eee576040516366385fa360e01b815260040160405180910390fd5b6312cc0300612f006201518084615c3b565b65ffffffffffff161115612f2757604051635b30744d60e11b815260040160405180910390fd5b612f318242615c60565b336000818152600260209081526040808320805465ffffffffffff60a01b1916600160a01b65ffffffffffff97881602179055600482529182902080546001600160a01b0389166001600160a01b0319909116811790915582519081529386169084015290917f9141f23a32bd7f35c8ce161a6f9d05eba59799700a6a44094330bd68b3e251039101612aaf565b33612fc981614382565b60003360215460405163012a6efb60e21b81526001600160a01b038084166004830152602482018890526001600160601b0387166044830152929350600092839216906304a9bbec9060640160408051808303816000875af1158015613033573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130579190615c81565b91509150613067838660016143a9565b6001600160601b038116156130a2576021546130909084906001600160a01b0316836000613bae565b6130a2816001600160601b0316614a2c565b602154604051630b40697b60e31b81526001600160a01b0385811660048301526024820189905263ffffffff8516604483015290911690635a034bd89060640161294c565b60036130f281613abf565b61311f620186a07f0000000000000000000000000000000000000000e7690c99f24eca66ba900000615cad565b6001600160601b03168210156131485760405163c64200e960e01b815260040160405180910390fd5b600c8290556040518281527f699d1c4c28f453c7c162bf9ab9d182bcca9b5860718f5dbc0dadb620c0aa077e90602001611448565b6001600160a01b0386166131a4576040516366385fa360e01b815260040160405180910390fd5b428410156131c557604051630407b05b60e31b815260040160405180910390fd5b6001600160a01b03871660009081526002602052604081208054909167ffffffffffffffff909116906131f6611c0e565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960208201526001600160a01b03808e1692820192909252908b166060820152608081018a905267ffffffffffffffff841660a082015260c0810189905260e0016040516020818303038152906040528051906020012060405160200161329892919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181529190528051602090910120835467ffffffffffffffff600190940193841667ffffffffffffffff199091161784559050601b60ff871610156132f3576132ec601b87615cc7565b955061334b565b601e8660ff16111561334b576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052605c016040516020818303038152906040528051906020012090505b6040805160008082526020820180845284905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561339f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615806133d457508a6001600160a01b0316816001600160a01b031614155b156133f257604051638baa579f60e01b815260040160405180910390fd5b6133ff8b8b8b6001613e1b565b505050505050505050505050565b600061341e8833888888888861317d565b613429888888611663565b98975050505050505050565b600661344081613abf565b6001600160a01b038216600081815260096020526040808220805460ff19169055517fe96bbe78c8bc645f0ee444e35730f56b458ea663d1b2a35cf93cefd7fce93dc19190a25050565b600461349581613abf565b6001600160a01b0382166134bc576040516366385fa360e01b815260040160405180910390fd5b600580546001600160a01b0319166001600160a01b0384169081179091556040517f6a679ad6371327969c9ddeade76f85c3e657fd6d020eeb491becdd1b6d608db390600090a25050565b600161351281613abf565b6305f5e1008211156135375760405163c64200e960e01b815260040160405180910390fd5b6135436012600a615a4a565b61354d9083615a56565b60118190556040519081527f29b4862b0ac325a5ba77a99236953f6a42e083f4f886db919d7b0b5e9f2cee0090602001611448565b6001600160a01b038181166000908152600460205260409020541633146135bc57604051634014f1a560e01b815260040160405180910390fd5b33600090815260026020526040902054600160a01b900465ffffffffffff16428110156135fc576040516319aad37160e01b815260040160405180910390fd5b5050336000908152600260205260409020805465ffffffffffff60a01b1916600160a01b179055565b61362d614544565b8061363957600161363c565b60025b601c5560405181151581527f3d7f39af0cf901fec3da1b0ecfab4a0eb553ed671de67850e09cca22848dd866906020015b60405180910390a150565b6001600160a01b038083166000908152600260209081526040808320546003835281842094861684529390915281208054919263ffffffff600160601b909104811692600160a01b900416821415806136e057508054600160c01b900465ffffffffffff1642115b806136f757508054600160f81b900460ff16600114155b1561370757600092505050611528565b546001600160801b0316949350505050565b613721614544565b8061372d576001613730565b60025b60195560405181151581527f436b6cf978c7b6998fcce43dfe4d37e3a0dc2bb780144a2eb55d7138201e8a129060200161366d565b6021546000906001600160a01b0316336001600160a01b03161461379c57604051637c1aebb760e01b815260040160405180910390fd5b6115258383614ac1565b60056137b181613abf565b6001600160a01b03821660009081526008602052604090205460ff166137ea5760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b038216600081815260086020908152604091829020805460ff1916905590519182527fead11242b7eb5b3a03a27edc0039f1305d251bf91b3d1e94c3861c3d6e4ac1289101611448565b613843614544565b600c54156138645760405163e529091f60e01b815260040160405180910390fd5b61389530333060009081526023602052604090205461388e906001906001600160601b0316615b7a565b6000613bae565b6002601a8190556019556138cb6103e87f0000000000000000000000000000000000000000e7690c99f24eca66ba900000615cad565b6001600160601b0316600c556040517f994a0442f4498644e0bb3fe4b4c74ad21fbbb80e04b2fd1cb31f4248796d3dde90600090a1565b61390a614544565b6001600160a01b038116613931576040516366385fa360e01b815260040160405180910390fd5b600080546001600160a01b03169061394a908290614b5b565b613955826001614b5b565b600080546001600160a01b0319166001600160a01b0384811691821783556040519192908416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6139ac614544565b602180546001600160a01b0319166001600160a01b0383161790556139d081612151565b6040516001600160a01b038216907f8ae96d8af35324a34b19e4f33e72d620b502f69595bb43870ab5fd7a7de7823990600090a250565b82613a1181614382565b6021546001600160a01b0316336001600160a01b031614613a4557604051637c1aebb760e01b815260040160405180910390fd5b612c84848484614cec565b6001613a5b81613abf565b6064821080613a6c5750620f424082115b15613a8a5760405163c64200e960e01b815260040160405180910390fd5b60158290556040518281527fe24723968dd1fe95c864bec60a98788d4f02a5a3e1e9e80ccafdee9146ff54c790602001611448565b60016000826008811115613ad557613ad5615c25565b6008811115613ae657613ae6615c25565b81526020019081526020016000206000613afd3390565b6001600160a01b0316815260208101919091526040016000205460ff1661145357604051634014f1a560e01b815260040160405180910390fd5b60006002601a5403613bab57601254479081118015613b645750601554601454613b619190615cec565b43115b15613ba957613b74600a82615a8b565b60135460175491925090811115613b8a57506017545b81811115613b955750805b8015613ba757613ba481614dfe565b92505b505b505b90565b6001600160a01b038416600090815260236020526040812054613bdb9084906001600160601b0316615b7a565b6001600160a01b038616600090815260236020526040812080546001600160601b0319166001600160601b03841617905590915082613c1b576000613c3e565b600d54606490613c34906001600160601b031686615d04565b613c3e9190615cad565b90506000613c4c8286615b7a565b6001600160a01b0387166000908152602360205260409020549091506001600160601b0316613c7b8282615bfa565b6001600160a01b038816600090815260236020526040902080546001600160601b0319166001600160601b03928316179055831615613d01573060009081526023602052604081208054859290613cdc9084906001600160601b0316615bfa565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b613d0b8482614f39565b6006546001600160a01b0390811690891603613d73576006546040516001600160601b03881681526001600160a01b038981169216907f0e128c83dc42be0b80a07793e5b69c77c3981238a44754802b90d92ae85b3b489060200160405180910390a3613dd7565b6006546001600160a01b0390811690881603613dd7576006546040516001600160601b03881681526001600160a01b038a81169216907f5cd522aff7a2bf4d0c00ba029b9cebb7a25ed4a77695101f28f01f865421d0409060200160405180910390a35b6040516001600160601b03831681526001600160a01b0380891691908a1690600080516020615ddd8339815191529060200160405180910390a35050505050505050565b60006001600160a01b038516613e44576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b038416613e6b576040516366385fa360e01b815260040160405180910390fd5b6001600160801b03831115613e85576001600160801b0392505b6001600160a01b03858116600090815260026020908152604080832060038352818420948916845293909152902080546fffffffffffffffffffffffffffffffff1981166001600160801b0387169081178355835477ffffffff00000000ffffffffffffffffffffffffffffffff1990921617600160601b90910463ffffffff16600160a01b021781558315613f71578154600160901b900461ffff168015613f4357613f3481610e10615d33565b613f3e9042615c60565b613f4b565b65ffffffffffff5b825465ffffffffffff91909116600160c01b0265ffffffffffff60c01b19909116178255505b80546001600160f81b0316600160f81b1781556040516001600160a01b0380881691908916907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590613fc69089815260200190565b60405180910390a35060019695505050505050565b6001600160a01b031660009081526002602052604090205442600160a01b90910465ffffffffffff161190565b8261401281614382565b6001600160a01b038416158061402f57506001600160a01b038316155b1561404d576040516366385fa360e01b815260040160405180910390fd5b8160000361406e57604051635e85ae7360e01b815260040160405180910390fd5b6001600160a01b0384166000908152602460205260409020546001600160601b0316614099856146bd565b6140a39190615d58565b8211156140c3576040516305c2afdf60e21b815260040160405180910390fd5b6001600160a01b03841660009081526008602052604081205460ff168061410257506001600160a01b03841660009081526008602052604090205460ff165b601854909150600214156000614119600c54151590565b6020549091506001600160a01b0390811690878116821490891682148561427857306001600160a01b038a16036141635760405163d9716e4360e01b815260040160405180910390fd5b600c5488111561418657604051631b97a87560e01b815260040160405180910390fd5b836141a4576040516306c3d31f60e51b815260040160405180910390fd5b84156142785781806141b35750805b80156141cd57503260009081526025602052604090205443145b156141eb5760405163e069ee1d60e01b815260040160405180910390fd5b32600090815260256020526040902043905581801561420c57506002601954145b1561427857600f546001600160601b031680614227306146bd565b111561423f5761423f816001600160601b0316614f86565b614247613b37565b15614276576040517fac401825222c905dafef53f897e1fe565e107a9b114737f28ad26c699784bd8d90600090a15b505b83156143105780156142a15787600a60008282546142969190615cec565b909155506143109050565b81156143105787600b60008282546142b99190615cec565b90915550506011548811156143105760006142d5606447615a8b565b9050600060646010546142e89190615a8b565b9050808211156142f6578091505b81601360008282546143089190615cec565b909155505050505b6001868061433657506001600160a01b038a1660009081526009602052604090205460ff165b1561433f575060005b8515614369578615614360576028805463ffffffff19166001179055614369565b6143698a6150e0565b6143758b8b8b84613bae565b5050505050505050505050565b61438b81613fdb565b15611453576040516335543b4960e21b815260040160405180910390fd5b6001600160a01b038316600090815260246020526040812080548492906143da9084906001600160601b0316615b7a565b92506101000a8154816001600160601b0302191690836001600160601b031602179055508015611d28576040516001600160601b03831681526001600160a01b038416907fbedcdd66d86f5dc81286de7b36cc38398208ffb595a3e95330fca4fb21f08cba9060200160405180910390a26040516001600160601b03831681526001600160a01b038416908190600080516020615ddd833981519152906020015b60405180910390a3505050565b6144928484614845565b60215460405163238d3a8f60e11b81526001600160a01b038681166004830152602482018490529091169063471a751e90604401600060405180830381600087803b1580156144e057600080fd5b505af11580156144f4573d6000803e3d6000fd5b5050604080516001600160601b038716815260ff861660208201526001600160a01b03881693507ff4476f182b22aa6860f6aea0edf736040fd43167d941069fadffe4aef18ef728925001611508565b6000546001600160a01b0316331461456f57604051632e6c18c960e11b815260040160405180910390fd5b565b6001600160a01b038216614598576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b038084166000818152600360209081526040808320948716835293815283822092825260029052919091208215614678578054600160801b900461ffff1660008115614604576145f182610e10615d6f565b6145ff9061ffff1642615c60565b61460c565b65ffffffffffff5b8354855460ff60f01b1965ffffffffffff909316600160c01b0265ffffffffffff60c01b19600160801b63ffffffff600160401b9095049490941693909302929092166dffffffffffff00000000ffffffff60801b19909116171716600160f01b17845550611eeb9050565b5481546eff00000000000000000000ffffffff60801b1916600160801b600160401b90920463ffffffff90811660001901169190910260ff60f01b1916179055505050565b6001600160a01b03166000908152602360205260409020546001600160601b031690565b602754600160601b90046001600160a01b03163214158061471757506026546001600160a01b03838116600160601b9092041614155b15614720575050565b600080614735846001600160a01b0316615223565b90925090506001600160a01b03811661474e5750505050565b6000306001600160a01b0383160361476b57508190506001614782565b6001600160a01b0383163014614782575050505050565b6040516370a0823160e01b81526001600160a01b038681166004830152600091908416906370a0823190602401602060405180830381865afa1580156147cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147f09190615ba2565b6026549091506001600160601b03166dffffffffffffffffffffffffffff861611801561482757506027546001600160601b031681115b1561297f5760405163878d636360e01b815260040160405180910390fd5b6001600160a01b0382166000908152602460205260408120546148729083906001600160601b0316615bfa565b905061487d836146bd565b816001600160601b031611156148a6576040516305c2afdf60e21b815260040160405180910390fd5b6001600160a01b03831660008181526024602090815260409182902080546001600160601b0319166001600160601b0386811691909117909155915191851682528291600080516020615ddd833981519152910161447b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461494c576040519150601f19603f3d011682016040523d82523d6000602084013e614951565b606091505b5050905080611d285760405163b5747cc760e01b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af11580156149c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149e69190615abc565b50816001600160a01b0316836001600160a01b03167ff217402c85197de87cd806653771027d1e91101ef79ab35684a580c62b91a9b58360405161447b91815260200190565b80156114535760215460405163d9fbb1e960e01b8152600481018390526001600160a01b039091169063d9fbb1e990602401600060405180830381600087803b158015614a7857600080fd5b505af1158015614a8c573d6000803e3d6000fd5b505050507fd3be3dbc076afa976ee7dfe1f596f6d7905e9441a1a426a244a12ef071272dd48160405161366d91815260200190565b6001600160a01b038083166000908152600260209081526040808320546003835281842094861684529390915281208054919263ffffffff600160401b909104811692600160801b90041682141580614b2957508054600160c01b900465ffffffffffff1642115b80614b4057508054600160f01b900460ff16600114155b15614b5057600092505050611528565b506001949350505050565b6001600160a01b039190911660009081527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f60209081526040808320805494151560ff1995861681179091557fd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f835281842080548616821790557f7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b835281842080548616821790557fedc95719e9a3b28dd8e80877cb5880a9be7de1a13fc8b05e7999683b6b567643835281842080548616821790557fe2689cd4a84e23ad2f564004f1c9013e9589d260bde6380aba3ca7e09e4df40c835281842080548616821790557f8f331abe73332f95a25873e8b430885974c0409691f89d643119a11623a7924a835281842080548616821790557fdc686ec4a0ff239c70e7c7c36e8f853eced3bc8618f48d2b816da2a74311237e835281842080548616821790557f4db623e5c4870b62d3fc9b4e8f893a1a77627d75ab45d9ff7e56ba19564af99b9092529091208054909216179055565b614cf8838260006143a9565b6001600160a01b038316600090815260236020526040812054614d259083906001600160601b0316615b7a565b6001600160a01b0385811660009081526023602052604080822080546001600160601b0319166001600160601b0386811691909117909155928716825290205491925016614d738382615bfa565b6001600160a01b038516600090815260236020526040902080546001600160601b0319166001600160601b0392909216919091179055614db38484614845565b614dbd8282614f39565b6040516001600160601b03841681526001600160a01b038086169190871690600080516020615ddd8339815191529060200160405180910390a35050505050565b6000600260185403614e0f57600080fd5b60026018556016546013558115614f2f57602154600090614e38906001600160a01b03166146bd565b601f5460215460405163f43ae45b60e01b81526001600160a01b03928316600482015291166024820152604481018590529091507399fe7b37639ae33d0f15f61f4288a2fc9cff7bc19063f43ae45b9060640160006040518083038186803b158015614ea357600080fd5b505af4158015614eb7573d6000803e3d6000fd5b505060215460009250839150614ed5906001600160a01b03166146bd565b614edf9190615d58565b60408051868152602081018390529192507f3967d46c5aa65ced73be27b4c6d249e552274da7a605101a66ef571a8e2608a4910160405180910390a143601455614f2881614a2c565b6001925050505b6001601855919050565b602254806001600160601b038416600003614f5a57614f5781615d90565b90505b826001600160601b0316600003614f7757614f7481615da7565b90505b808214612c8457602255505050565b600260185403614f9557600080fd5b6002601855601f544790614fb69030906001600160a01b0316846001613e1b565b50816001600160601b0316601e6000828254614fd29190615cec565b9091555050601f54604051637041046d60e01b81526001600160a01b039091166004820152602481018390527399fe7b37639ae33d0f15f61f4288a2fc9cff7bc190637041046d9060440160006040518083038186803b15801561503557600080fd5b505af4158015615049573d6000803e3d6000fd5b505050506000814761505b9190615d58565b60408051858152602081018390529192507f1d835182508bc46cfe26167d5d6ca20231bf92fb2ee0d558d40553b29a40fdf9910160405180910390a1600d54600e546001600160601b03909116906150b39083615a56565b6150bd9190615a8b565b6005549091506150d6906001600160a01b0316826148ff565b5050600160185550565b60006150eb826146bd565b9050600080615102846001600160a01b0316615223565b9092509050306001600160a01b0382160361511a5750805b6001600160a01b03811661513e5750506028805463ffffffff191660011790555050565b6040516370a0823160e01b81526001600160a01b038581166004830152600091908316906370a0823190602401602060405180830381865afa158015615188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151ac9190615ba2565b6040805160a0810182526001600160601b039687168082526001600160a01b0398909816602082018190529290961690860181905232606087018190524363ffffffff166080909701879052600160601b928302909717602655950290941760275550506028805463ffffffff1916909117905550565b6000806001600160a01b0383163b61524057506000928392509050565b6040805160048152602481019091526020810180516001600160e01b0316630dfe168160e01b1790526152749084906152b1565b6040805160048152602481019091526020810180516001600160e01b031663d21220a760e01b1790526152a89085906152b1565b91509150915091565b6000806000846001600160a01b0316846040516152ce9190615dc0565b600060405180830381855afa9150503d8060008114615309576040519150601f19603f3d011682016040523d82523d6000602084013e61530e565b606091505b509150915081801561532257506020815110155b15615344578080602001905181019061533b9190615a9f565b92505050611528565b506000949350505050565b60005b8381101561536a578181015183820152602001615352565b83811115612c845750506000910152565b602081526000825180602084015261539a81604085016020870161534f565b601f01601f19169190910160400192915050565b801515811461145357600080fd5b600080604083850312156153cf57600080fd5b82356153da816153ae565b915060208301356153ea816153ae565b809150509250929050565b6001600160a01b038116811461145357600080fd5b6000806040838503121561541d57600080fd5b8235615428816153f5565b946020939093013593505050565b60006020828403121561544857600080fd5b8135615453816153f5565b9392505050565b6001600160601b038116811461145357600080fd5b60006020828403121561548157600080fd5b81356154538161545a565b6000806000606084860312156154a157600080fd5b83356154ac816153f5565b925060208401356154bc816153f5565b929592945050506040919091013590565b6000602082840312156154df57600080fd5b8135615453816153ae565b600080604083850312156154fd57600080fd5b50508035926020909101359150565b80356009811061551b57600080fd5b919050565b6000806040838503121561553357600080fd5b61553c8361550c565b915060208301356153ea816153f5565b60ff8116811461145357600080fd5b803565ffffffffffff8116811461551b57600080fd5b60008060008060008060c0878903121561558a57600080fd5b8635615595816153f5565b955060208701356155a58161545a565b945060408701356155b58161554c565b93506155c36060880161555b565b925060808701356155d38161545a565b915060a08701356155e3816153ae565b809150509295509295509295565b60008060006060848603121561560657600080fd5b8335615611816153f5565b92506020840135615621816153f5565b91506040840135615631816153ae565b809150509250925092565b803561ffff8116811461551b57600080fd5b6000806040838503121561566157600080fd5b61566a8361563c565b91506156786020840161563c565b90509250929050565b6000806040838503121561569457600080fd5b823561569f8161545a565b915060208301356153ea8161554c565b600080604083850312156156c257600080fd5b8235915060208301356153ea816153ae565b6000602082840312156156e657600080fd5b5035919050565b6000806040838503121561570057600080fd5b823561553c816153f5565b6000806040838503121561571e57600080fd5b8235615729816153f5565b915060208301356153ea8161545a565b6000806040838503121561574c57600080fd5b8235915060208301356153ea8161545a565b6000806040838503121561577157600080fd5b823561577c816153f5565b91506156786020840161550c565b60008060006060848603121561579f57600080fd5b8335925060208401356156218161545a565b6000602082840312156157c357600080fd5b6115258261555b565b6000806000606084860312156157e157600080fd5b83356157ec816153f5565b95602085013595506040909401359392505050565b60008060008060008060c0878903121561581a57600080fd5b8635615825816153f5565b955060208701356158358161545a565b945060408701356158458161545a565b935060608701356158558161554c565b92506158636080880161555b565b915060a08701356155e38161545a565b6000806040838503121561588657600080fd5b8235615891816153f5565b91506156786020840161555b565b600080600080600080600060e0888a0312156158ba57600080fd5b87356158c5816153f5565b965060208801356158d5816153f5565b9550604088013594506060880135935060808801356158f38161554c565b9699959850939692959460a0840135945060c09093013592915050565b60008060006060848603121561592557600080fd5b8335615930816153f5565b92506020840135615940816153f5565b915060408401356156318161545a565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156159a157816000190482111561598757615987615950565b8085161561599457918102915b93841c939080029061596b565b509250929050565b6000826159b857506001611528565b816159c557506000611528565b81600181146159db57600281146159e557615a01565b6001915050611528565b60ff8411156159f6576159f6615950565b50506001821b611528565b5060208310610133831016604e8410600b8410161715615a24575081810a611528565b615a2e8383615966565b8060001904821115615a4257615a42615950565b029392505050565b600061152583836159a9565b6000816000190483118215151615615a7057615a70615950565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615a9a57615a9a615a75565b500490565b600060208284031215615ab157600080fd5b8151615453816153f5565b600060208284031215615ace57600080fd5b8151615453816153ae565b600060208284031215615aeb57600080fd5b81516154538161545a565b6001600160a01b039790971687526001600160601b03958616602088015260ff94909416604087015265ffffffffffff9290921660608601528316608085015290911660a0830152151560c082015260e00190565b805163ffffffff8116811461551b57600080fd5b600060208284031215615b7157600080fd5b61152582615b4b565b60006001600160601b0383811690831681811015615b9a57615b9a615950565b039392505050565b600060208284031215615bb457600080fd5b5051919050565b600080600060608486031215615bd057600080fd5b615bd984615b4b565b92506020840151615be98161545a565b60408501519092506156318161554c565b60006001600160601b03808316818516808303821115615c1c57615c1c615950565b01949350505050565b634e487b7160e01b600052602160045260246000fd5b600065ffffffffffff80841680615c5457615c54615a75565b92169190910492915050565b600065ffffffffffff808316818516808303821115615c1c57615c1c615950565b60008060408385031215615c9457600080fd5b615c9d83615b4b565b915060208301516153ea8161545a565b60006001600160601b0380841680615c5457615c54615a75565b600060ff821660ff84168060ff03821115615ce457615ce4615950565b019392505050565b60008219821115615cff57615cff615950565b500190565b60006001600160601b0380831681851681830481118215151615615d2a57615d2a615950565b02949350505050565b600065ffffffffffff80831681851681830481118215151615615d2a57615d2a615950565b600082821015615d6a57615d6a615950565b500390565b600061ffff80831681851681830481118215151615615d2a57615d2a615950565b600081615d9f57615d9f615950565b506000190190565b600060018201615db957615db9615950565b5060010190565b60008251615dd281846020870161534f565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122091e982e5bd4e999830b5c60ea202a439612419afc9a698006fb4989473cf752364736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
-----Decoded View---------------
Arg [0] : routerAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Deployed Bytecode Sourcemap
49477:24395:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51037:130;;;;;;;;;;-1:-1:-1;51142:17:0;;;;;;;;;;;;-1:-1:-1;;;51142:17:0;;;;51037:130;;;;;;;:::i;:::-;;;;;;;;60053:836;;;;;;;;;;;;;:::i;:::-;;32844:459;;;;;;;;;;-1:-1:-1;32844:459:0;;;;;:::i;:::-;;:::i;28698:145::-;;;;;;;;;;-1:-1:-1;28698:145:0;;;;;:::i;:::-;;:::i;:::-;;;1790:14:1;;1783:22;1765:41;;1753:2;1738:18;28698:145:0;1625:187:1;52968:149:0;;;;;;;;;;-1:-1:-1;52968:149:0;;;;;:::i;:::-;;:::i;39942:123::-;;;;;;;;;;-1:-1:-1;40024:24:0;;38993:1;40024:33;39942:123;;43313:390;;;;;;;;;;-1:-1:-1;43313:390:0;;;;;:::i;:::-;;:::i;47489:98::-;;;;;;;;;;-1:-1:-1;47561:14:0;;:18;;47489:98;;39709:41;;;;;;;;;;-1:-1:-1;39709:41:0;;;;-1:-1:-1;;;;;39709:41:0;;;;;;-1:-1:-1;;;;;2652:32:1;;;2634:51;;2622:2;2607:18;39709:41:0;2461:230:1;37555:93:0;;;;;;;;;;-1:-1:-1;37628:12:0;-1:-1:-1;;;;;37621:19:0;37555:93;;;2842:25:1;;;2830:2;2815:18;37555:93:0;2696:177:1;47595:263:0;;;;;;;;;;-1:-1:-1;47595:263:0;;;;;:::i;:::-;;:::i;24537:108::-;;;;;;;;;;-1:-1:-1;24537:108:0;24579:66;24537:108;;30661:479;;;;;;;;;;-1:-1:-1;30661:479:0;;;;;:::i;:::-;;:::i;41076:183::-;;;;;;;;;;-1:-1:-1;41076:183:0;;;;;:::i;:::-;;:::i;45643:189::-;;;;;;;;;;-1:-1:-1;45643:189:0;;;;;:::i;:::-;;:::i;43711:404::-;;;;;;;;;;-1:-1:-1;43711:404:0;;;;;:::i;:::-;;:::i;17521:56::-;;;;;;;;;;-1:-1:-1;17521:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;67718:713;;;;;;;;;;-1:-1:-1;67718:713:0;;;;;:::i;:::-;;:::i;68439:702::-;;;;;;;;;;-1:-1:-1;68439:702:0;;;;;:::i;:::-;;:::i;24317:108::-;;;;;;;;;;-1:-1:-1;24317:108:0;24359:66;24317:108;;37403:35;;;;;;;;;;;;37436:2;37403:35;;;;;5847:4:1;5835:17;;;5817:36;;5805:2;5790:18;37403:35:0;5675:184:1;46164:274:0;;;;;;;;;;-1:-1:-1;46164:274:0;;;;;:::i;:::-;;:::i;25288:492::-;;;;;;;;;;;;;:::i;66859:249::-;;;;;;;;;;-1:-1:-1;66859:249:0;;;;;:::i;:::-;;:::i;33311:354::-;;;;;;;;;;-1:-1:-1;33311:354:0;;;;;:::i;:::-;;:::i;63993:382::-;;;;;;:::i;:::-;;:::i;37897:29::-;;;;;;;;;;;;;;;;44123:375;;;;;;;;;;-1:-1:-1;44123:375:0;;;;;:::i;:::-;;:::i;46686:492::-;;;;;;;;;;-1:-1:-1;46686:492:0;;;;;:::i;:::-;;:::i;37860:30::-;;;;;;;;;;;;;;;;41448:250;;;;;;;;;;-1:-1:-1;41448:250:0;;;;;:::i;:::-;;:::i;65482:334::-;;;;;;;;;;-1:-1:-1;65482:334:0;;;;;:::i;:::-;;:::i;39757:28::-;;;;;;;;;;-1:-1:-1;39757:28:0;;;;-1:-1:-1;;;;;39757:28:0;;;40605:265;;;;;;;;;;-1:-1:-1;40605:265:0;;;;;:::i;:::-;;:::i;43030:275::-;;;;;;;;;;-1:-1:-1;43030:275:0;;;;;:::i;:::-;;:::i;39798:30::-;;;;;;;;;;-1:-1:-1;39798:30:0;;;;-1:-1:-1;;;;;39798:30:0;;;47186:126;;;;;;;;;;-1:-1:-1;47186:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;47277:27:0;47253:4;47277:27;;;:18;:27;;;;;;;;;47186:126;24716:69;;;;;;;;;;-1:-1:-1;24716:69:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24716:69:0;;;;-1:-1:-1;;;24716:69:0;;;;;-1:-1:-1;;;24716:69:0;;;;;;;-1:-1:-1;;;24716:69:0;;;;;-1:-1:-1;;;24716:69:0;;;;;-1:-1:-1;;;24716:69:0;;;;;;;;;-1:-1:-1;;;;;8823:47:1;;;8805:66;;8890:10;8936:15;;;8931:2;8916:18;;8909:43;8988:15;;;;8968:18;;;8961:43;;;;9052:14;9040:27;9035:2;9020:18;;9013:55;9117:4;9105:17;;;9099:3;9084:19;;9077:46;9160:17;9154:3;9139:19;;9132:46;8792:3;8777:19;24716:69:0;8532:652:1;40182:107:0;;;;;;;;;;-1:-1:-1;40256:16:0;;38993:1;40256:25;40182:107;;54336:128;;;;;;;;;;-1:-1:-1;54336:128:0;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54436:19:0;;;;;:10;:19;;;;;;;;;54429:26;;;;;;;;;;;;;;;-1:-1:-1;;;54429:26:0;;;;;;;;;;;-1:-1:-1;;;54429:26:0;;;;;;;;;;;;;-1:-1:-1;;;54429:26:0;;;;;;;;-1:-1:-1;;;54429:26:0;;;;;;;;-1:-1:-1;;;54429:26:0;;;;;;;;;54336:128;;;;;;;9343:4:1;9385:3;9374:9;9370:19;9362:27;;9435:18;9426:6;9420:13;9416:38;9405:9;9398:57;9502:4;9494:6;9490:17;9484:24;9527:10;9593:2;9579:12;9575:21;9568:4;9557:9;9553:20;9546:51;9665:2;9657:4;9649:6;9645:17;9639:24;9635:33;9628:4;9617:9;9613:20;9606:63;;;9718:4;9710:6;9706:17;9700:24;9743:6;9807:2;9791:14;9787:23;9780:4;9769:9;9765:20;9758:53;9879:2;9871:4;9863:6;9859:17;9853:24;9849:33;9842:4;9831:9;9827:20;9820:63;;;9951:14;9943:4;9935:6;9931:17;9925:24;9921:45;9914:4;9903:9;9899:20;9892:75;9189:784;;;;;37009:112:0;;;;;;;;;;-1:-1:-1;37009:112:0;;;;-1:-1:-1;;;;;37009:112:0;;;73665:204;;;;;;;;;;-1:-1:-1;73665:204:0;;;;;:::i;:::-;;:::i;53218:122::-;;;;;;;;;;-1:-1:-1;53218:122:0;;;;;:::i;:::-;-1:-1:-1;;;;;53310:22:0;53283:7;53310:22;;;:13;:22;;;;;;-1:-1:-1;;;;;53310:22:0;;53218:122;40071:105;;;;;;;;;;-1:-1:-1;40144:15:0;;38993:1;40144:24;40071:105;;39837:99;;;;;;;;;;-1:-1:-1;39907:12:0;;38993:1;39907:21;39837:99;;53595:713;;;;;;;;;;-1:-1:-1;53595:713:0;;;;;:::i;:::-;;:::i;37197:71::-;;;;;;;;;;-1:-1:-1;37197:71:0;;;;-1:-1:-1;;;;;37197:71:0;;;40396:203;;;;;;;;;;;;;:::i;64383:463::-;;;;;;;;;;-1:-1:-1;64383:463:0;;;;;:::i;:::-;;:::i;25856:112::-;;;;;;;;;;-1:-1:-1;25856:112:0;;;;;:::i;:::-;-1:-1:-1;;;;;25937:17:0;25910:7;25937:17;;;:10;:17;;;;;:23;;;;25856:112;53125:85;;;;;;;;;;-1:-1:-1;53194:8:0;;53125:85;;72398:115;;;;;;;;;;-1:-1:-1;72398:115:0;;;;;:::i;:::-;;:::i;44506:386::-;;;;;;;;;;-1:-1:-1;44506:386:0;;;;;:::i;:::-;;:::i;16454:20::-;;;;;;;;;;-1:-1:-1;16454:20:0;;;;-1:-1:-1;;;;;16454:20:0;;;53466:121;;;;;;;;;;;;;:::i;50992:38::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50992:38:0;;;;;37933:30;;;;;;;;;;-1:-1:-1;37933:30:0;;;;-1:-1:-1;;;;;37933:30:0;;;;;;-1:-1:-1;;;;;11073:39:1;;;11055:58;;11043:2;11028:18;37933:30:0;10911:208:1;19127:312:0;;;;;;;;;;-1:-1:-1;19127:312:0;;;;;:::i;:::-;;:::i;40295:93::-;;;;;;;;;;-1:-1:-1;40362:9:0;;38993:1;40362:18;40295:93;;30452:201;;;;;;;;;;-1:-1:-1;30452:201:0;;;;;:::i;:::-;;:::i;37160:30::-;;;;;;;;;;-1:-1:-1;37160:30:0;;;;-1:-1:-1;;;;;37160:30:0;;;41267:173;;;;;;;;;;-1:-1:-1;41267:173:0;;;;;:::i;:::-;;:::i;66377:474::-;;;;;;;;;;-1:-1:-1;66377:474:0;;;;;:::i;:::-;;:::i;31963:516::-;;;;;;;;;;-1:-1:-1;31963:516:0;;;;;:::i;:::-;;:::i;45286:349::-;;;;;;;;;;-1:-1:-1;45286:349:0;;;;;:::i;:::-;;:::i;41706:187::-;;;;;;;;;;-1:-1:-1;41706:187:0;;;;;:::i;:::-;;:::i;67390:320::-;;;;;;;;;;-1:-1:-1;67390:320:0;;;;;:::i;:::-;;:::i;37824:29::-;;;;;;;;;;;;;;;;72973:684;;;;;;;;;;-1:-1:-1;72973:684:0;;;;;:::i;:::-;;:::i;19447:318::-;;;;;;;;;;-1:-1:-1;19447:318:0;;;;;:::i;:::-;;:::i;72521:228::-;;;;;;;;;;-1:-1:-1;72521:228:0;;;;;:::i;:::-;;:::i;31515:440::-;;;;;;;;;;-1:-1:-1;31515:440:0;;;;;:::i;:::-;;:::i;37972:45::-;;;;;;;;;;;;;;;;65824:545;;;;;;;;;;-1:-1:-1;65824:545:0;;;;;:::i;:::-;;:::i;42102:125::-;;;;;;;;;;-1:-1:-1;42102:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;42192:27:0;42168:4;42192:27;;;:18;:27;;;;;;;;;42102:125;42485:281;;;;;;;;;;-1:-1:-1;42485:281:0;;;;;:::i;:::-;;:::i;27255:1435::-;;;;;;;;;;-1:-1:-1;27255:1435:0;;;;;:::i;:::-;;:::i;31148:359::-;;;;;;;;;;-1:-1:-1;31148:359:0;;;;;:::i;:::-;;:::i;41901:193::-;;;;;;;;;;-1:-1:-1;41901:193:0;;;;;:::i;:::-;;:::i;45840:316::-;;;;;;;;;;-1:-1:-1;45840:316:0;;;;;:::i;:::-;;:::i;44900:378::-;;;;;;;;;;-1:-1:-1;44900:378:0;;;;;:::i;:::-;;:::i;32487:349::-;;;;;;;;;;-1:-1:-1;32487:349:0;;;;;:::i;:::-;;:::i;40878:190::-;;;;;;;;;;-1:-1:-1;40878:190:0;;;;;:::i;:::-;;:::i;29953:491::-;;;;;;;;;;-1:-1:-1;29953:491:0;;;;;:::i;:::-;;:::i;47320:161::-;;;;;;;;;;-1:-1:-1;47320:161:0;;;;;:::i;:::-;;:::i;67116:241::-;;;;;;;;;;-1:-1:-1;67116:241:0;;;;;:::i;:::-;;:::i;42235:242::-;;;;;;;;;;-1:-1:-1;42235:242:0;;;;;:::i;:::-;;:::i;71673:536::-;;;;;;;;;;;;;:::i;18300:357::-;;;;;;;;;;-1:-1:-1;18300:357:0;;;;;:::i;:::-;;:::i;46446:232::-;;;;;;;;;;-1:-1:-1;46446:232:0;;;;;:::i;:::-;;:::i;63694:291::-;;;;;;;;;;-1:-1:-1;63694:291:0;;;;;:::i;:::-;;:::i;42774:248::-;;;;;;;;;;-1:-1:-1;42774:248:0;;;;;:::i;:::-;;:::i;60053:836::-;60106:22;18138:21;18154:4;18138:15;:21::i;:::-;60145:10:::1;:8;:10::i;:::-;60141:76;;;60177:28;::::0;::::1;::::0;;;::::1;60141:76;38993:1;60261:9;;:18:::0;60257:625:::1;;60316:24;::::0;60416:15:::1;::::0;-1:-1:-1;;;;;60316:24:0;;::::1;::::0;60416:28;-1:-1:-1;60412:459:0::1;;;60552:15;:29:::0;;-1:-1:-1;;;;;60552:29:0;::::1;::::0;::::1;::::0;;60670:13:::1;::::0;60685:11:::1;::::0;60655:61:::1;::::0;-1:-1:-1;;;;;60670:13:0;;::::1;::::0;60685:11:::1;60571:10:::0;60552:15:::1;60655:14;:61::i;:::-;60788:13;;;;;;;;;-1:-1:-1::0;;;;;60788:13:0::1;-1:-1:-1::0;;;;;60773:34:0::1;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;60835:20:0::1;::::0;-1:-1:-1;;;;;11073:39:1;;11055:58;;60835:20:0::1;::::0;-1:-1:-1;11043:2:1;11028:18;;-1:-1:-1;60835:20:0::1;;;;;;;;60412:459;60281:601;60257:625;60053:836:::0;:::o;32844:459::-;4033:10;32913:15;32989:19;;;:10;:19;;;;;33078:65;;;;33107:20;;;;-1:-1:-1;;;33107:20:0;;;;;;;;;;;-1:-1:-1;;33107:20:0;;;;;;33078:65;33161:6;33157:69;;;33188:22;;;;-1:-1:-1;;;33188:22:0;;;;;;;;;;;-1:-1:-1;;;;33188:22:0;;;;;;33157:69;33254:41;;;15435:14:1;;15428:22;15410:41;;15494:14;;15487:22;15482:2;15467:18;;15460:50;-1:-1:-1;;;;;33254:41:0;;;;;15383:18:1;33254:41:0;;;;;;;;32902:401;;32844:459;;:::o;28698:145::-;28766:4;28790:45;4033:10;28813:7;28822:6;28830:4;28790:8;:45::i;:::-;28783:52;;28698:145;;;;;:::o;52968:149::-;53057:4;53081:28;53097:11;53081:15;:28::i;43313:390::-;43429:14;18138:21;18154:4;18138:15;:21::i;:::-;43491:13:::1;43465:23;-1:-1:-1::0;;;;;43465:39:0::1;;43461:70;;;43513:18;;-1:-1:-1::0;;;43513:18:0::1;;;;;;;;;;;43461:70;43605:21;37436:2;43605;:21;:::i;:::-;43578:49;::::0;-1:-1:-1;;;;;43578:49:0;::::1;;:::i;:::-;43544:24;:84:::0;;-1:-1:-1;;;;;;43544:84:0::1;-1:-1:-1::0;;;;;43544:84:0;;::::1;;::::0;;43644:51:::1;::::0;11073:39:1;;;11055:58;;43644:51:0::1;::::0;11043:2:1;11028:18;43644:51:0::1;10911:208:1::0;47595:263:0;47676:14;18138:21;18154:4;18138:15;:21::i;:::-;47726:2:::1;47707:16;-1:-1:-1::0;;;;;47707:21:0::1;;47703:52;;;47737:18;;-1:-1:-1::0;;;47737:18:0::1;;;;;;;;;;;47703:52;47766:12;:31:::0;;-1:-1:-1;;;;;;47766:31:0::1;-1:-1:-1::0;;;;;47766:31:0;::::1;::::0;;::::1;::::0;;;47813:37:::1;::::0;11055:58:1;;;47813:37:0::1;::::0;11043:2:1;11028:18;47813:37:0::1;10911:208:1::0;30661:479:0;30793:4;30812:36;30822:6;30830:9;30841:6;30812:9;:36::i;:::-;30861:18;30882:31;30892:6;4033:10;29953:491;:::i;30882:31::-;30861:52;;30937:10;30928:6;:19;30924:59;;;30956:27;;-1:-1:-1;;;30956:27:0;;;;;;;;;;;30924:59;31019:20;;;31061:49;31070:6;4033:10;31092;31104:5;31061:8;:49::i;:::-;-1:-1:-1;31128:4:0;;30661:479;-1:-1:-1;;;;;30661:479:0:o;41076:183::-;41139:14;18138:21;18154:4;18138:15;:21::i;:::-;41185:8:::1;:25;;38960:1;41185:25;;;38993:1;41185:25;41166:16;:44:::0;41226:25:::1;::::0;1790:14:1;;1783:22;1765:41;;41226:25:0::1;::::0;1753:2:1;1738:18;41226:25:0::1;1625:187:1::0;45643:189:0;45709:12;18138:21;18154:4;18138:15;:21::i;:::-;45752:8:::1;:25;;38960:1;45752:25;;;38993:1;45752:25;45734:15;:43:::0;45793:31:::1;::::0;1790:14:1;;1783:22;1765:41;;45793:31:0::1;::::0;1753:2:1;1738:18;45793:31:0::1;1625:187:1::0;43711:404:0;43828:12;18138:21;18154:4;18138:15;:21::i;:::-;43928:13:::1;43913:12;:28;43909:59;;;43950:18;;-1:-1:-1::0;;;43950:18:0::1;;;;;;;;;;;43909:59;44029:17;44033:13:::0;44029:2:::1;:17;:::i;:::-;44002:23;:12:::0;44018:6:::1;44002:23;:::i;:::-;:45;;;;:::i;:::-;43981:18;:66:::0;;;44063:44:::1;::::0;2842:25:1;;;44063:44:0::1;::::0;2830:2:1;2815:18;44063:44:0::1;;;;;;;;43711:404:::0;;;:::o;67718:713::-;67805:14;18138:21;18154:4;18138:15;:21::i;:::-;4033:10;67836::::1;::::0;:29:::1;::::0;-1:-1:-1;;;67836:29:0;;::::1;::::0;::::1;2842:25:1::0;;;-1:-1:-1;;;;;67836:45:0;;::::1;::::0;:10;;::::1;::::0;:22:::1;::::0;2815:18:1;;67836:29:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;67836:45:0::1;;;:104;;;;-1:-1:-1::0;67886:10:0::1;::::0;-1:-1:-1;;;;;67886:10:0::1;:27;4033:10:::0;67886:54:::1;::::0;-1:-1:-1;;;;;;67886:54:0::1;::::0;;;;;;-1:-1:-1;;;;;17951:15:1;;;67886:54:0::1;::::0;::::1;17933:34:1::0;18003:15;;;17983:18;;;17976:43;17868:18;;67886:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67885:55;67836:104;67832:163;;;67964:19;;-1:-1:-1::0;;;67964:19:0::1;;;;;;;;;;;67832:163;68015:24;68027:11;68015;:24::i;:::-;68068:10;::::0;:48:::1;::::0;-1:-1:-1;;;68068:48:0;;-1:-1:-1;;;;;18472:32:1;;;68068:48:0::1;::::0;::::1;18454:51:1::0;18521:18;;;18514:34;;;68052:13:0::1;::::0;68068:10:::1;::::0;:28:::1;::::0;18427:18:1;;68068:48:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68052:64;;68127:48;68149:11;68162:6;68170:4;68127:21;:48::i;:::-;68247:15;::::0;68219:59:::1;::::0;68234:11;;-1:-1:-1;;;;;68247:15:0::1;68264:6:::0;68247:15:::1;68219:14;:59::i;:::-;68291:10;::::0;:43:::1;::::0;-1:-1:-1;;;68291:43:0;;-1:-1:-1;;;;;18472:32:1;;;68291:43:0::1;::::0;::::1;18454:51:1::0;18521:18;;;18514:34;;;68291:10:0;;::::1;::::0;:23:::1;::::0;18427:18:1;;68291:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;68379:15:0::1;::::0;68350:73:::1;::::0;;18986:25:1;;;-1:-1:-1;;;;;19047:39:1;;19042:2;19027:18;;19020:67;-1:-1:-1;;;;;68350:73:0;;::::1;::::0;-1:-1:-1;68379:15:0;;::::1;::::0;-1:-1:-1;68372:4:0::1;::::0;68350:73:::1;::::0;18959:18:1;68350:73:0::1;;;;;;;67821:610;67718:713:::0;;;:::o;68439:702::-;68643:13;68618:14;18138:21;18154:4;18138:15;:21::i;:::-;68682:10:::1;::::0;:128:::1;::::0;-1:-1:-1;;;68682:128:0;;-1:-1:-1;;;;;68682:10:0;;::::1;::::0;:36:::1;::::0;:128:::1;::::0;68719:9;;68730:13;;68745:11;;68758;;68771:15;;68682:10:::1;::::0;68791:18;;68682:128:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68674:136;;::::0;-1:-1:-1;68823:13:0::1;68839:31;68855:15:::0;68839:13;:31:::1;:::i;:::-;68934:15;::::0;68823:47;;-1:-1:-1;68919:57:0::1;::::0;-1:-1:-1;;;;;68934:15:0::1;68951:9:::0;68823:47;68934:15:::1;68919:14;:57::i;:::-;68989:56;69007:9;69018:6;69026:11;69039:5;68989:17;:56::i;:::-;69091:15;::::0;69063:70:::1;::::0;;18986:25:1;;;-1:-1:-1;;;;;19047:39:1;;19042:2;19027:18;;19020:67;-1:-1:-1;;;;;69063:70:0;;::::1;::::0;69091:15:::1;::::0;69084:4:::1;::::0;69063:70:::1;::::0;18959:18:1;69063:70:0::1;;;;;;;68663:478;68439:702:::0;;;;;;;;;:::o;46164:274::-;16627:12;:10;:12::i;:::-;46287:31:::1;46302:15;46287:14;:31::i;:::-;46339:15;:33:::0;;-1:-1:-1;;;;;;46339:33:0::1;-1:-1:-1::0;;;;;46339:33:0;::::1;::::0;;::::1;::::0;;;46388:42:::1;::::0;::::1;::::0;-1:-1:-1;;46388:42:0::1;46164:274:::0;:::o;25288:492::-;4033:10;25337:7;25458:24;;;:10;:24;;;;;;;;;:35;51142:17;;;;;;;;;;-1:-1:-1;;;51142:17:0;;;;25653:28;;-1:-1:-1;;;25458:35:0;;;20637:3:1;20615:16;-1:-1:-1;;;;;;20615:16:1;25653:28:0;;;20599:56:1;25653:28:0;;;;;;;;;20671:11:1;;;25653:28:0;;25643:39;;;;;;24579:66;25537:224;;;20952:25:1;25600:24:0;20993:18:1;;;20986:34;21036:18;;;21029:34;25701:13:0;21079:18:1;;;21072:34;25741:4:0;21122:19:1;;;;21115:61;;;;25537:224:0;;;;;;;;;;20924:19:1;;;;25537:224:0;;;25513:259;;;;;;25288:492::o;66859:249::-;66988:10;;-1:-1:-1;;;;;66988:10:0;4033;-1:-1:-1;;;;;66964:35:0;;66960:76;;67008:28;;-1:-1:-1;;;67008:28:0;;;;;;;;;;;66960:76;67049:51;67068:11;67081:8;67091;67049:18;:51::i;:::-;66859:249;;;:::o;33311:354::-;33389:15;4033:10;-1:-1:-1;;;;;33465:19:0;;33430:32;33465:19;;;:10;:19;;;;;;;;;33497:38;;-1:-1:-1;;;;33546:42:0;-1:-1:-1;;;33497:38:0;;;;;;;-1:-1:-1;;;;33546:42:0;;;;;-1:-1:-1;;;33546:42:0;;;;;;;;;33606:51;;21382:34:1;;;21432:18;;;21425:43;;;;33465:19:0;;-1:-1:-1;33606:51:0;;21330:18:1;33606:51:0;21187:287:1;63993:382:0;4033:10;25066:24;25078:11;25066;:24::i;:::-;64158:10:::1;::::0;:28:::1;::::0;;-1:-1:-1;;;64158:28:0;;;;4033:10;;-1:-1:-1;;;;;64158:10:0::1;::::0;:26:::1;::::0;:28:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:10;:28:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64146:9;:40;64142:79;;;64195:26;;-1:-1:-1::0;;;64195:26:0::1;;;;;;;;;;;64142:79;64249:10;::::0;:52:::1;::::0;-1:-1:-1;;;64249:52:0;;-1:-1:-1;;;;;21882:32:1;;;64249:52:0::1;::::0;::::1;21864:51:1::0;-1:-1:-1;;;;;21951:39:1;;21931:18;;;21924:67;22039:4;22027:17;;22007:18;;;22000:45;64234:12:0::1;::::0;64249:10:::1;::::0;:23:::1;::::0;21837:18:1;;64249:52:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64234:67;;64314:53;64332:6;64340;64348:11;64361:5;64314:53;;:17;:53::i;:::-;64091:284;;63993:382:::0;;;:::o;44123:375::-;44236:12;18138:21;18154:4;18138:15;:21::i;:::-;44333:5:::1;44321:9;:17;44317:48;;;44347:18;;-1:-1:-1::0;;;44347:18:0::1;;;;;;;;;;;44317:48;44422:17;44426:13:::0;44422:2:::1;:17;:::i;:::-;44398:20;:9:::0;44411:6:::1;44398:20;:::i;:::-;:42;;;;:::i;:::-;44378:17;:62:::0;44456:34:::1;::::0;2842:25:1;;;44456:34:0::1;::::0;2830:2:1;2815:18;44456:34:0::1;2696:177:1::0;46686:492:0;46756:14;18138:21;18154:4;18138:15;:21::i;:::-;-1:-1:-1;;;;;46787:24:0;::::1;46783:53;;46820:16;;-1:-1:-1::0;;;46820:16:0::1;;;;;;;;;;;46783:53;46849:35;46906:10;46849:68;;46963:16;-1:-1:-1::0;;;;;46963:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46945:53:0::1;;47021:4;47041:16;-1:-1:-1::0;;;;;47041:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46945:130;::::0;-1:-1:-1;;;;;;46945:130:0::1;::::0;;;;;;-1:-1:-1;;;;;17951:15:1;;;46945:130:0::1;::::0;::::1;17933:34:1::0;18003:15;;17983:18;;;17976:43;17868:18;;46945:130:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46929:13;:146:::0;;-1:-1:-1;;;;;;46929:146:0;;::::1;-1:-1:-1::0;;;;;46929:146:0;;::::1;;::::0;;;47088:15:::1;:34:::0;;;;::::1;::::0;;::::1;;::::0;;47138:32:::1;::::0;;;::::1;::::0;::::1;::::0;-1:-1:-1;;47138:32:0::1;46772:406;46686:492:::0;;:::o;41448:250::-;41511:9;18138:21;18154:4;18138:15;:21::i;:::-;-1:-1:-1;;;;;41537:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;41533:56;;;41573:16;;-1:-1:-1::0;;;41573:16:0::1;;;;;;;;;;;41533:56;-1:-1:-1::0;;;;;41610:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;41610:34:0::1;41640:4;41610:34;::::0;;41660:30;;2634:51:1;;;41660:30:0::1;::::0;2607:18:1;41660:30:0::1;2461:230:1::0;65482:334:0;4033:10;25066:24;25078:11;25066;:24::i;:::-;65589:14:::1;4033:10:::0;65647::::1;::::0;:58:::1;::::0;-1:-1:-1;;;65647:58:0;;-1:-1:-1;;;;;22579:32:1;;;65647:58:0::1;::::0;::::1;22561:51:1::0;22628:18;;;22621:34;;;22698:14;;22691:22;22671:18;;;22664:50;65589:29:0;;-1:-1:-1;65631:13:0::1;::::0;65647:10;;::::1;::::0;:23:::1;::::0;22534:18:1;;65647:58:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65631:74;;65716:43;65738:6;65746;65754:4;65716:21;:43::i;:::-;65770:10;::::0;:38:::1;::::0;-1:-1:-1;;;65770:38:0;;-1:-1:-1;;;;;18472:32:1;;;65770:38:0::1;::::0;::::1;18454:51:1::0;18521:18;;;18514:34;;;65770:10:0;;::::1;::::0;:23:::1;::::0;18427:18:1;;65770:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;65578:238;;65482:334:::0;;;:::o;40605:265::-;40675:14;18138:21;18154:4;18138:15;:21::i;:::-;40788:11:::1;:26:::0;;-1:-1:-1;;;;;;40788:26:0::1;-1:-1:-1::0;;;;;40788:26:0;::::1;::::0;;::::1;::::0;;;40830:32:::1;::::0;::::1;::::0;-1:-1:-1;;40830:32:0::1;40605:265:::0;;:::o;43030:275::-;43110:14;18138:21;18154:4;18138:15;:21::i;:::-;43151:12:::1;::::0;-1:-1:-1;;;;;43151:12:0::1;43141:22:::0;::::1;43137:53;;;43172:18;;-1:-1:-1::0;;;43172:18:0::1;;;;;;;;;;;43137:53;43203:26;:36:::0;;;43255:42:::1;::::0;2842:25:1;;;43255:42:0::1;::::0;2830:2:1;2815:18;43255:42:0::1;2696:177:1::0;73665:204:0;73770:4;73747:13;18138:21;18154:4;18138:15;:21::i;:::-;73787:52:::1;73810:4;73817:6;73825;73833:5;73787:14;:52::i;:::-;-1:-1:-1::0;73857:4:0::1;::::0;73665:204;-1:-1:-1;;;73665:204:0:o;53595:713::-;53752:15;;53663:7;;-1:-1:-1;;;;;53741:26:0;;;53752:15;;53741:26;:63;;;;;38993:1;53771:24;;:33;53741:63;53737:77;;;-1:-1:-1;53813:1:0;;53595:713;-1:-1:-1;53595:713:0:o;53737:77::-;53827:15;53845:19;53856:7;53845:10;:19::i;:::-;53827:37;;38993:1;53879:7;;:16;;:82;;;;-1:-1:-1;53912:25:0;;53948:12;53912:49;;;;:25;;:49;53879:82;:119;;;;-1:-1:-1;;;;;;53978:18:0;;20323:19;:23;;53978:20;53879:164;;;;-1:-1:-1;;;;;;54016:27:0;;;;;;:18;:27;;;;;;;;54015:28;53879:164;53875:399;;;54209:53;54236:7;54253;54209:26;:53::i;40396:203::-;40453:14;18138:21;18154:4;18138:15;:21::i;:::-;40552:1:::1;40534:15;:19:::0;40569:22:::1;::::0;::::1;::::0;;;::::1;40396:203:::0;:::o;64383:463::-;4033:10;25066:24;25078:11;25066;:24::i;:::-;4033:10;64535:37:::1;4033:10:::0;64565:6;64535:21:::1;:37::i;:::-;64667:10;::::0;:47:::1;::::0;-1:-1:-1;;;64667:47:0;;-1:-1:-1;;;;;22943:32:1;;;64667:47:0::1;::::0;::::1;22925:51:1::0;22992:18;;;22985:34;;;-1:-1:-1;;;;;23055:39:1;;23035:18;;;23028:67;64585:17:0::1;::::0;;;64667:10;::::1;::::0;:24:::1;::::0;22898:18:1;;64667:47:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64732:34;::::0;-1:-1:-1;;;;;11073:39:1;;11055:58;;64639:75:0;;-1:-1:-1;64639:75:0;;-1:-1:-1;;;;;;64732:34:0;::::1;::::0;-1:-1:-1;64732:34:0::1;::::0;11043:2:1;11028:18;64732:34:0::1;;;;;;;-1:-1:-1::0;;;;;64782:56:0;::::1;;64807:17;64818:6:::0;64807:8;:17:::1;:::i;:::-;64782:56;::::0;;-1:-1:-1;;;;;24009:39:1;;;23991:58;;24097:4;24085:17;;24080:2;24065:18;;24058:45;23964:18;64782:56:0::1;;;;;;;64484:362;;;64383:463:::0;;;:::o;72398:115::-;16627:12;:10;:12::i;:::-;72469:36:::1;4033:10:::0;72498:6:::1;72469:14;:36::i;44506:386::-:0;44626:12;18138:21;18154:4;18138:15;:21::i;:::-;44723:9:::1;44711;:21;44707:52;;;44741:18;;-1:-1:-1::0;;;44741:18:0::1;;;;;;;;;;;44707:52;44816:17;44820:13:::0;44816:2:::1;:17;:::i;:::-;44792:20;:9:::0;44805:6:::1;44792:20;:::i;:::-;:42;;;;:::i;:::-;44772:17;:62:::0;44850:34:::1;::::0;2842:25:1;;;44850:34:0::1;::::0;2830:2:1;2815:18;44850:34:0::1;2696:177:1::0;53466:121:0;53563:15;;53525:7;;53552:27;;-1:-1:-1;;;;;53563:15:0;53552:10;:27::i;:::-;53545:34;;53466:121;:::o;19127:312::-;16627:12;:10;:12::i;:::-;19232:17:::1;19224:4;:25;;;;;;;;:::i;:::-;::::0;19220:47:::1;;19258:9;;-1:-1:-1::0;;;19258:9:0::1;;;;;;;;;;;19220:47;-1:-1:-1::0;;;;;19282:27:0;::::1;19278:56;;19318:16;;-1:-1:-1::0;;;19318:16:0::1;;;;;;;;;;;19278:56;19376:4;19347:5:::0;:11:::1;19353:4;19347:11;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;19347:11:0;;;-1:-1:-1;;;;;19347:26:0;::::1;::::0;;;;;;;:33;;-1:-1:-1;;19347:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;19426:4;19398:33:::1;::::0;::::1;;;;;;:::i;:::-;;::::0;-1:-1:-1;;;;;19398:33:0;::::1;::::0;::::1;::::0;;;::::1;19127:312:::0;;:::o;30452:201::-;30559:4;30581:42;4033:10;30605:9;30616:6;30581:9;:42::i;:::-;-1:-1:-1;30641:4:0;30452:201;;;;:::o;41267:173::-;41327:14;18138:21;18154:4;18138:15;:21::i;:::-;41366:8:::1;:25;;38960:1;41366:25;;;38993:1;41366:25;41354:9;:37:::0;41407:25:::1;::::0;1790:14:1;;1783:22;1765:41;;41407:25:0::1;::::0;1753:2:1;1738:18;41407:25:0::1;1625:187:1::0;66377:474:0;4033:10;25066:24;25078:11;25066;:24::i;:::-;66495:14:::1;4033:10:::0;66557::::1;::::0;:62:::1;::::0;-1:-1:-1;;;66557:62:0;;-1:-1:-1;;;;;24487:32:1;;;66557:62:0::1;::::0;::::1;24469:51:1::0;24536:18;;;24529:34;;;-1:-1:-1;;;;;24599:39:1;;24579:18;;;24572:67;24682:14;;24675:22;24655:18;;;24648:50;66495:29:0;;-1:-1:-1;66538:15:0::1;::::0;66557:10;;::::1;::::0;:19:::1;::::0;24441::1;;66557:62:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66537:82:::0;-1:-1:-1;;;;;;66634:10:0;::::1;::::0;66630:86:::1;;66661:43;66683:6;66691;66699:4;66661:21;:43::i;:::-;66739:8;66730:17;;:5;:17;;:34;;;;-1:-1:-1::0;66751:13:0::1;::::0;::::1;::::0;::::1;66730:34;66726:118;;;66781:10;::::0;:51:::1;::::0;-1:-1:-1;;;66781:51:0;;-1:-1:-1;;;;;24928:32:1;;;66781:51:0::1;::::0;::::1;24910::1::0;24977:18;;;24970:34;;;25052:10;25040:23;;25020:18;;;25013:51;66781:10:0;;::::1;::::0;:26:::1;::::0;24883:18:1;;66781:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66726:118;66484:367;;66377:474:::0;;;;:::o;31963:516::-;32053:13;32035:15;32044:6;32035;:15;:::i;:::-;:31;;;32031:61;;;32075:17;;-1:-1:-1;;;32075:17:0;;;;;;;;;;;32031:61;4033:10;32103:18;32124:24;;;:10;:24;;;;;:40;-1:-1:-1;;;32124:40:0;;;;32195:15;32181:29;;32177:52;;;32219:10;;-1:-1:-1;;;32219:10:0;;;;;;;;;;;32177:52;32242:14;32259:32;32285:6;32266:15;32259:32;:::i;:::-;32242:49;;32320:7;32306:21;;:11;:21;;;32302:52;;;32336:18;;-1:-1:-1;;;32336:18:0;;;;;;;;;;;32302:52;4033:10;32365:24;;;;:10;:24;;;;;:50;;-1:-1:-1;;;;32365:50:0;-1:-1:-1;;;32365:50:0;;;;;;;32433:38;;25687:14:1;25675:27;;25657:46;;-1:-1:-1;;;;;32433:38:0;;;;;;;25645:2:1;25630:18;32433:38:0;;;;;;;;32020:459;;31963:516;:::o;45286:349::-;45402:12;18138:21;18154:4;18138:15;:21::i;:::-;45445:7:::1;45436:6;:16;45432:47;;;45461:18;;-1:-1:-1::0;;;45461:18:0::1;;;;;;;;;;;45432:47;45539:17;45543:13:::0;45539:2:::1;:17;:::i;:::-;45518;:6:::0;45528::::1;45518:17;:::i;:::-;:39;;;;:::i;:::-;45492:23;:65:::0;;;45573:54:::1;::::0;2842:25:1;;;45573:54:0::1;::::0;2830:2:1;2815:18;45573:54:0::1;2696:177:1::0;41706:187:0;41777:14;18138:21;18154:4;18138:15;:21::i;:::-;-1:-1:-1;;;;;41804:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;:34;;-1:-1:-1;;41804:34:0::1;41834:4;41804:34;::::0;;41854:31;::::1;::::0;41804:27;41854:31:::1;41706:187:::0;;:::o;67390:320::-;-1:-1:-1;;;;;67503:36:0;;:21;:36;;;:21;;:36;:21;:36;;;;;67498:70;;67548:20;;-1:-1:-1;;;67548:20:0;;;;;;;;;;;67498:70;67581:10;;-1:-1:-1;;;;;67581:10:0;:18;4033:10;67581:54;;-1:-1:-1;;;;;;67581:54:0;;;;;;;-1:-1:-1;;;;;25980:15:1;;;67581:54:0;;;25962:34:1;26032:15;;;26012:18;;;26005:43;26064:18;;;26057:34;;;25897:18;;67581:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67646:56;67655:12;4033:10;;3937:115;67655:12;67669:13;67684:11;67697:4;67646:8;:56::i;:::-;;67390:320;;;:::o;72973:684::-;73164:13;73141;18138:21;18154:4;18138:15;:21::i;:::-;73203:10:::1;::::0;:121:::1;::::0;-1:-1:-1;;;73203:121:0;;-1:-1:-1;;;;;73203:10:0;;::::1;::::0;:36:::1;::::0;:121:::1;::::0;73240:9;;73251:13;;73266:11;;73279;;73292:15;;73309:7;;73203:10:::1;::::0;:121:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73195:129;;::::0;-1:-1:-1;73337:13:0::1;73353:31;73369:15:::0;73353:13;:31:::1;:::i;:::-;73337:47;;73397:55;73420:4;73427:9;73438:6;73446:5;73397:14;:55::i;:::-;-1:-1:-1::0;;;;;73467:11:0;::::1;::::0;73463:110:::1;;73533:10;::::0;73495:66:::1;::::0;73518:4:::1;::::0;-1:-1:-1;;;;;73533:10:0::1;73546:7:::0;73533:10:::1;73495:14;:66::i;:::-;73593:56;73611:9;73622:6;73630:11;73643:5;73593:17;:56::i;:::-;73184:473;72973:684:::0;;;;;;;;;:::o;19447:318::-;16627:12;:10;:12::i;:::-;19555:17:::1;19547:4;:25;;;;;;;;:::i;:::-;::::0;19543:47:::1;;19581:9;;-1:-1:-1::0;;;19581:9:0::1;;;;;;;;;;;19543:47;-1:-1:-1::0;;;;;19605:27:0;::::1;19601:56;;19641:16;;-1:-1:-1::0;;;19641:16:0::1;;;;;;;;;;;19601:56;19699:5;19670;:11;19676:4;19670:11;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;19670:11:0;;;-1:-1:-1;;;;;19670:26:0;::::1;::::0;;;;;;;:34;;-1:-1:-1;;19670:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;19752:4;19722:35:::1;::::0;::::1;;;;;;:::i;:::-;;::::0;-1:-1:-1;;;;;19722:35:0;::::1;::::0;::::1;::::0;;;::::1;19447:318:::0;;:::o;72521:228::-;16627:12;:10;:12::i;:::-;-1:-1:-1;;;;;72637:26:0;::::1;72633:55;;72672:16;;-1:-1:-1::0;;;72672:16:0::1;;;;;;;;;;;72633:55;72701:40;72716:12;72730:2;72734:6;72701:14;:40::i;31515:440::-:0;4033:10;25066:24;25078:11;25066;:24::i;:::-;-1:-1:-1;;;;;31626:24:0;::::1;31622:53;;31659:16;;-1:-1:-1::0;;;31659:16:0::1;;;;;;;;;;;31622:53;31708:13;31690:15;31699:6;31690::::0;:15:::1;:::i;:::-;:31;;;31686:61;;;31730:17;;-1:-1:-1::0;;;31730:17:0::1;;;;;;;;;;;31686:61;31803:32;31829:6:::0;31810:15:::1;31803:32;:::i;:::-;4033:10:::0;31760:24:::1;::::0;;;:10:::1;:24;::::0;;;;;;;:75;;-1:-1:-1;;;;31760:75:0::1;-1:-1:-1::0;;;31760:75:0::1;::::0;;::::1;;;::::0;;31846:12:::1;:26:::0;;;;;;:39;;-1:-1:-1;;;;;31846:39:0;::::1;-1:-1:-1::0;;;;;;31846:39:0;;::::1;::::0;::::1;::::0;;;31903:44;;27015:51:1;;;27102:27;;;27082:18;;;27075:55;4033:10:0;;31903:44:::1;::::0;26988:18:1;31903:44:0::1;26842:294:1::0;65824:545:0;4033:10;25066:24;25078:11;25066;:24::i;:::-;65922:14:::1;4033:10:::0;66006::::1;::::0;:47:::1;::::0;-1:-1:-1;;;66006:47:0;;-1:-1:-1;;;;;22943:32:1;;;66006:47:0::1;::::0;::::1;22925:51:1::0;22992:18;;;22985:34;;;-1:-1:-1;;;;;23055:39:1;;23035:18;;;23028:67;65922:29:0;;-1:-1:-1;65965:15:0::1;::::0;;;66006:10:::1;::::0;:24:::1;::::0;22898:18:1;;66006:47:0::1;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65964:89;;;;66064:43;66086:6;66094;66102:4;66064:21;:43::i;:::-;-1:-1:-1::0;;;;;66132:17:0;::::1;::::0;66128:170:::1;;66197:10;::::0;66166:65:::1;::::0;66181:6;;-1:-1:-1;;;;;66197:10:0::1;66210:13:::0;66197:10:::1;66166:14;:65::i;:::-;66246:40;66272:13;-1:-1:-1::0;;;;;66246:40:0::1;:25;:40::i;:::-;66310:10;::::0;:51:::1;::::0;-1:-1:-1;;;66310:51:0;;-1:-1:-1;;;;;24928:32:1;;;66310:51:0::1;::::0;::::1;24910::1::0;24977:18;;;24970:34;;;25052:10;25040:23;;25020:18;;;25013:51;66310:10:0;;::::1;::::0;:26:::1;::::0;24883:18:1;;66310:51:0::1;24709:361:1::0;42485:281:0;42554:11;18138:21;18154:4;18138:15;:21::i;:::-;42624:22:::1;42639:7;42624:12;:22;:::i;:::-;-1:-1:-1::0;;;;;42613:33:0::1;:8;:33;42609:64;;;42655:18;;-1:-1:-1::0;;;42655:18:0::1;;;;;;;;;;;42609:64;42686:14;:25:::0;;;42727:31:::1;::::0;2842:25:1;;;42727:31:0::1;::::0;2830:2:1;2815:18;42727:31:0::1;2696:177:1::0;27255:1435:0;-1:-1:-1;;;;;27459:21:0;;27455:50;;27489:16;;-1:-1:-1;;;27489:16:0;;;;;;;;;;;27455:50;27531:15;27520:8;:26;27516:48;;;27555:9;;-1:-1:-1;;;27555:9:0;;;;;;;;;;;27516:48;-1:-1:-1;;;;;27612:17:0;;27577:32;27612:17;;;:10;:17;;;;;27655:15;;27612:17;;27655:15;;;;;27788:18;:16;:18::i;:::-;27857:240;;;24359:66;27857:240;;;27975:25:1;-1:-1:-1;;;;;28074:15:1;;;28054:18;;;28047:43;;;;28126:15;;;28106:18;;;28099:43;28158:18;;;28151:34;;;28234:18;28222:31;;28201:19;;;28194:60;28270:19;;;28263:35;;;27947:19;;27857:240:0;;;;;;;;;;;;27825:291;;;;;;27724:407;;;;;;;;-1:-1:-1;;;28567:27:1;;28619:1;28610:11;;28603:27;;;;28655:2;28646:12;;28639:28;28692:2;28683:12;;28309:392;27724:407:0;;;;-1:-1:-1;;27724:407:0;;;;;;;;;27700:442;;27724:407;27700:442;;;;28243:23;;;28212:7;;;;28243:23;;;-1:-1:-1;;28243:23:0;;;;;;27700:442;-1:-1:-1;28295:2:0;28291:6;;;;28287:171;;;28314:7;28319:2;28314:7;;:::i;:::-;;;28287:171;;;28347:2;28343:1;:6;;;28339:119;;;28385:60;;29157:66:1;28385:60:0;;;29145:79:1;29240:12;;;29233:28;;;29277:12;;28385:60:0;;;;;;;;;;;;28375:71;;;;;;28366:80;;28339:119;28497:26;;;28470:24;28497:26;;;;;;;;;29527:25:1;;;29600:4;29588:17;;29568:18;;;29561:45;;;;29622:18;;;29615:34;;;29665:18;;;29658:34;;;28497:26:0;;29499:19:1;;28497:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28497:26:0;;-1:-1:-1;;28497:26:0;;;-1:-1:-1;;;;;;;28538:30:0;;;;:59;;;28592:5;-1:-1:-1;;;;;28572:25:0;:16;-1:-1:-1;;;;;28572:25:0;;;28538:59;28534:90;;;28606:18;;-1:-1:-1;;;28606:18:0;;;;;;;;;;;28534:90;28645:37;28654:5;28661:7;28670:5;28677:4;28645:8;:37::i;:::-;;27444:1246;;;;27255:1435;;;;;;;:::o;31148:359::-;31368:4;31385:55;31392:6;4033:10;31414:6;31422:8;31432:1;31435;31438;31385:6;:55::i;:::-;31460:39;31473:6;31481:9;31492:6;31460:12;:39::i;:::-;31453:46;31148:359;-1:-1:-1;;;;;;;;31148:359:0:o;41901:193::-;41975:14;18138:21;18154:4;18138:15;:21::i;:::-;-1:-1:-1;;;;;42002:27:0;::::1;42032:5;42002:27:::0;;;:18:::1;:27;::::0;;;;;:35;;-1:-1:-1;;42002:35:0::1;::::0;;42053:33;::::1;::::0;42032:5;42053:33:::1;41901:193:::0;;:::o;45840:316::-;45941:14;18138:21;18154:4;18138:15;:21::i;:::-;-1:-1:-1;;;;;45977:24:0;::::1;45973:53;;46010:16;;-1:-1:-1::0;;;46010:16:0::1;;;;;;;;;;;45973:53;46039:26;:48:::0;;-1:-1:-1;;;;;;46039:48:0::1;-1:-1:-1::0;;;;;46039:48:0;::::1;::::0;;::::1;::::0;;;46103:45:::1;::::0;::::1;::::0;-1:-1:-1;;46103:45:0::1;45840:316:::0;;:::o;44900:378::-;45008:12;18138:21;18154:4;18138:15;:21::i;:::-;45064:11:::1;45042:19;:33;45038:64;;;45084:18;;-1:-1:-1::0;;;45084:18:0::1;;;;;;;;;;;45038:64;45174:21;37436:2;45174;:21;:::i;:::-;45151:45;::::0;:19;:45:::1;:::i;:::-;45123:25;:73:::0;;;45212:58:::1;::::0;2842:25:1;;;45212:58:0::1;::::0;2830:2:1;2815:18;45212:58:0::1;2696:177:1::0;32487:349:0;-1:-1:-1;;;;;32563:27:0;;;;;;;:12;:27;;;;;;;4033:10;32563:43;32559:75;;32615:19;;-1:-1:-1;;;32615:19:0;;;;;;;;;;;32559:75;4033:10;32645:18;32666:24;;;:10;:24;;;;;:40;-1:-1:-1;;;32666:40:0;;;;32737:15;32723:29;;32719:52;;;32761:10;;-1:-1:-1;;;32761:10:0;;;;;;;;;;;32719:52;-1:-1:-1;;4033:10:0;32784:24;;;;:10;:24;;;;;:44;;-1:-1:-1;;;;32784:44:0;-1:-1:-1;;;32784:44:0;;;32487:349::o;40878:190::-;16627:12;:10;:12::i;:::-;40986:8:::1;:25;;38960:1;40986:25;;;38993:1;40986:25;40959:24;:52:::0;41027:33:::1;::::0;1790:14:1;;1783:22;1765:41;;41027:33:0::1;::::0;1753:2:1;1738:18;41027:33:0::1;;;;;;;;40878:190:::0;:::o;29953:491::-;-1:-1:-1;;;;;30065:17:0;;;30025:7;30065:17;;;:10;:17;;;;;;;;:28;30142:10;:17;;;;;:26;;;;;;;;;;;30199:28;;30025:7;;30065:28;-1:-1:-1;;;30065:28:0;;;;;;-1:-1:-1;;;30199:28:0;;;30185:42;;;;:104;;-1:-1:-1;30262:27:0;;-1:-1:-1;;;30262:27:0;;;;30244:15;:45;30185:104;:157;;;-1:-1:-1;30306:31:0;;-1:-1:-1;;;30306:31:0;;;;30341:1;30306:36;;30185:157;30181:207;;;30375:1;30368:8;;;;;;30181:207;30407:29;-1:-1:-1;;;;;30407:29:0;;29953:491;-1:-1:-1;;;;29953:491:0:o;47320:161::-;16627:12;:10;:12::i;:::-;47404:8:::1;:25;;38960:1;47404:25;;;38993:1;47404:25;47389:12;:40:::0;47445:28:::1;::::0;1790:14:1;;1783:22;1765:41;;47445:28:0::1;::::0;1753:2:1;1738:18;47445:28:0::1;1625:187:1::0;67116:241:0;67245:10;;67200:4;;-1:-1:-1;;;;;67245:10:0;4033;-1:-1:-1;;;;;67221:35:0;;67217:76;;67265:28;;-1:-1:-1;;;67265:28:0;;;;;;;;;;;67217:76;67313:36;67331:7;67340:8;67313:17;:36::i;42235:242::-;42298:9;18138:21;18154:4;18138:15;:21::i;:::-;-1:-1:-1;;;;;42325:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;42320:57;;42361:16;;-1:-1:-1::0;;;42361:16:0::1;;;;;;;;;;;42320:57;-1:-1:-1::0;;;;;42390:27:0;::::1;42420:5;42390:27:::0;;;:18:::1;:27;::::0;;;;;;;;:35;;-1:-1:-1;;42390:35:0::1;::::0;;42441:28;;2634:51:1;;;42441:28:0::1;::::0;2607:18:1;42441:28:0::1;2461:230:1::0;71673:536:0;16627:12;:10;:12::i;:::-;47561:14;;:18;71774:51:::1;;71804:21;;-1:-1:-1::0;;;71804:21:0::1;;;;;;;;;;;71774:51;71951:78;71974:4;4033:10:::0;72011:4:::1;71995:22;::::0;;;:7:::1;:22;::::0;;;;;:26:::1;::::0;72020:1:::1;::::0;-1:-1:-1;;;;;71995:22:0::1;:26;:::i;:::-;72023:5;71951:14;:78::i;:::-;38993:1;72042:15;:23:::0;;;72076:12:::1;:20:::0;72124:19:::1;72139:4;72124:12;:19;:::i;:::-;-1:-1:-1::0;;;;;72107:36:0::1;:14;:36:::0;72187:14:::1;::::0;::::1;::::0;;;::::1;71673:536::o:0;18300:357::-;16627:12;:10;:12::i;:::-;-1:-1:-1;;;;;18388:22:0;::::1;18384:51;;18419:16;;-1:-1:-1::0;;;18419:16:0::1;;;;;;;;;;;18384:51;18448:21;18472:5:::0;;-1:-1:-1;;;;;18472:5:0::1;::::0;18488:32:::1;::::0;18472:5;;18488:10:::1;:32::i;:::-;18531:26;18542:8;18552:4;18531:10;:26::i;:::-;18570:5;:16:::0;;-1:-1:-1;;;;;;18570:16:0::1;-1:-1:-1::0;;;;;18570:16:0;;::::1;::::0;;::::1;::::0;;18604:45:::1;::::0;18570:16;;18604:45;;::::1;::::0;::::1;::::0;18570:5;18604:45:::1;18373:284;18300:357:::0;:::o;46446:232::-;16627:12;:10;:12::i;:::-;46528:10:::1;:42:::0;;-1:-1:-1;;;;;;46528:42:0::1;-1:-1:-1::0;;;;;46528:42:0;::::1;;::::0;;46583:31:::1;46528:42:::0;46583:14:::1;:31::i;:::-;46632:38;::::0;-1:-1:-1;;;;;46632:38:0;::::1;::::0;::::1;::::0;;;::::1;46446:232:::0;:::o;63694:291::-;63802:11;25066:24;25078:11;25066;:24::i;:::-;63854:10:::1;::::0;-1:-1:-1;;;;;63854:10:0::1;4033::::0;-1:-1:-1;;;;;63830:35:0::1;;63826:76;;63874:28;;-1:-1:-1::0;;;63874:28:0::1;;;;;;;;;;;63826:76;63915:62;63936:11;63949:9;63960:16;63915:20;:62::i;42774:248::-:0;42850:12;18138:21;18154:4;18138:15;:21::i;:::-;42886:3:::1;42878:5;:11;:32;;;;42901:9;42893:5;:17;42878:32;42874:63;;;42919:18;;-1:-1:-1::0;;;42919:18:0::1;;;;;;;;;;;42874:63;42948:15;:23:::0;;;42987:27:::1;::::0;2842:25:1;;;42987:27:0::1;::::0;2830:2:1;2815:18;42987:27:0::1;2696:177:1::0;17954:126:0;18019:5;:11;18025:4;18019:11;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:25;18031:12;4033:10;;3937:115;18031:12;-1:-1:-1;;;;;18019:25:0;;;;;;;;;;;;-1:-1:-1;18019:25:0;;;;18014:58;;18053:19;;-1:-1:-1;;;18053:19:0;;;;;;;;;;;60897:903;60934:15;38993:1;60966:15;;:24;60962:831;;61075:23;;61025:21;;61065:33;;:106;;;;;61156:15;;61134:19;;:37;;;;:::i;:::-;61119:12;:52;61065:106;61061:721;;;61249:13;61260:2;61249:13;;:::i;:::-;61305:18;;61362:17;;61249:13;;-1:-1:-1;61305:18:0;61346:33;;61342:115;;;-1:-1:-1;61420:17:0;;61342:115;61495:7;61479:13;:23;61475:164;;;-1:-1:-1;61612:7:0;61475:164;61663:17;;61659:108;;61718:29;61733:13;61718:14;:29::i;:::-;61705:42;;61659:108;61188:594;61061:721;60992:801;60962:831;60897:903;:::o;58040:979::-;-1:-1:-1;;;;;58209:15:0;;58190:16;58209:15;;;:7;:15;;;;;;:24;;58227:6;;-1:-1:-1;;;;;58209:15:0;:24;:::i;:::-;-1:-1:-1;;;;;58244:15:0;;;;;;:7;:15;;;;;:27;;-1:-1:-1;;;;;;58244:27:0;-1:-1:-1;;;;;58244:27:0;;;;;;;-1:-1:-1;58304:7:0;:45;;58348:1;58304:45;;;58323:12;;58339:5;;58314:21;;-1:-1:-1;;;;;58323:12:0;58314:6;:21;:::i;:::-;:31;;;;:::i;:::-;58284:65;-1:-1:-1;58360:22:0;58385:19;58284:65;58385:6;:19;:::i;:::-;-1:-1:-1;;;;;58435:18:0;;58417:15;58435:18;;;:7;:18;;;;;;58360:44;;-1:-1:-1;;;;;;58435:18:0;58486:26;58360:44;58435:18;58486:26;:::i;:::-;-1:-1:-1;;;;;58465:18:0;;;;;;:7;:18;;;;;:47;;-1:-1:-1;;;;;;58465:47:0;-1:-1:-1;;;;;58465:47:0;;;;;;58529:14;;;58525:137;;58630:4;58614:22;;;;:7;:22;;;;;:36;;58640:10;;58614:22;:36;;58640:10;;-1:-1:-1;;;;;58614:36:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;58614:36:0;;;;;-1:-1:-1;;;;;58614:36:0;;;;;;58525:137;58674:34;58688:9;58699:8;58674:13;:34::i;:::-;58733:15;;-1:-1:-1;;;;;58733:15:0;;;58723:25;;;;58719:231;;58784:15;;58770:49;;-1:-1:-1;;;;;11073:39:1;;11055:58;;-1:-1:-1;;;;;58770:49:0;;;;58784:15;;58770:49;;11043:2:1;11028:18;58770:49:0;;;;;;;58719:231;;;58854:15;;-1:-1:-1;;;;;58854:15:0;;;58841:28;;;;58837:113;;58906:15;;58891:47;;-1:-1:-1;;;;;11073:39:1;;11055:58;;-1:-1:-1;;;;;58891:47:0;;;;58906:15;;58891:47;;11043:2:1;11028:18;58891:47:0;;;;;;;58837:113;58967:44;;-1:-1:-1;;;;;11073:39:1;;11055:58;;-1:-1:-1;;;;;58967:44:0;;;;;;;;-1:-1:-1;;;;;;;;;;;58967:44:0;11043:2:1;11028:18;58967:44:0;;;;;;;58179:840;;;;58040:979;;;;:::o;28851:1094::-;28991:4;-1:-1:-1;;;;;29012:19:0;;29008:48;;29040:16;;-1:-1:-1;;;29040:16:0;;;;;;;;;;;29008:48;-1:-1:-1;;;;;29071:21:0;;29067:50;;29101:16;;-1:-1:-1;;;29101:16:0;;;;;;;;;;;29067:50;-1:-1:-1;;;;;29134:26:0;;29130:58;;;-1:-1:-1;;;;;29171:17:0;-1:-1:-1;29130:58:0;-1:-1:-1;;;;;29236:17:0;;;29201:32;29236:17;;;:10;:17;;;;;;;;29295:10;:17;;;;;:26;;;;;;;;;;;29334:40;;-1:-1:-1;;29334:40:0;;-1:-1:-1;;;;;29334:40:0;;;;;;;29409:20;;-1:-1:-1;;29385:44:0;;;;-1:-1:-1;;;29409:20:0;;;;;-1:-1:-1;;;29385:44:0;;;;29440:377;;;;29497:30;;-1:-1:-1;;;29497:30:0;;;;29605:25;;:164;;29739:30;:20;29762:7;29739:30;:::i;:::-;29713:56;;29720:15;29713:56;:::i;:::-;29605:164;;;29651:16;29605:164;29582:187;;;;;;;-1:-1:-1;;;29582:187:0;-1:-1:-1;;;;29582:187:0;;;;;;-1:-1:-1;29440:377:0;29829:28;;-1:-1:-1;;;;;29829:28:0;-1:-1:-1;;;29829:28:0;;;29883:32;;-1:-1:-1;;;;;29883:32:0;;;;;;;;;;;;29908:6;2842:25:1;;2830:2;2815:18;;2696:177;29883:32:0;;;;;;;;-1:-1:-1;29933:4:0;;28851:1094;-1:-1:-1;;;;;;28851:1094:0:o;25122:158::-;-1:-1:-1;;;;;25215:23:0;25191:4;25215:23;;;:10;:23;;;;;:39;25257:15;-1:-1:-1;;;25215:39:0;;;;;:57;;25122:158::o;54476:3556::-;54600:4;25066:24;25078:11;25066;:24::i;:::-;-1:-1:-1;;;;;54621:18:0;::::1;::::0;;:38:::1;;-1:-1:-1::0;;;;;;54643:16:0;::::1;::::0;54621:38:::1;54617:67;;;54668:16;;-1:-1:-1::0;;;54668:16:0::1;;;;;;;;;;;54617:67;54699:6;54709:1;54699:11:::0;54695:53:::1;;54719:29;;-1:-1:-1::0;;;54719:29:0::1;;;;;;;;;;;54695:53;-1:-1:-1::0;;;;;54792:19:0;::::1;;::::0;;;:13:::1;:19;::::0;;;;;-1:-1:-1;;;;;54792:19:0::1;54773:16;54806:4:::0;54773:10:::1;:16::i;:::-;:38;;;;:::i;:::-;54763:6;:49;54759:94;;;54821:32;;-1:-1:-1::0;;;54821:32:0::1;;;;;;;;;;;54759:94;-1:-1:-1::0;;;;;54890:24:0;::::1;54866:21;54890:24:::0;;;:18:::1;:24;::::0;;;;;::::1;;::::0;:50:::1;;-1:-1:-1::0;;;;;;54918:22:0;::::1;;::::0;;;:18:::1;:22;::::0;;;;;::::1;;54890:50;54970:7;::::0;54866:74;;-1:-1:-1;38993:1:0::1;54970:16;;54953:14;55015:17;47561:14:::0;;:18;;;47489:98;55015:17:::1;55058:13;::::0;54997:35;;-1:-1:-1;;;;;;55058:13:0;;::::1;::::0;55096:10;;::::1;::::0;::::1;::::0;55130:12;::::1;::::0;::::1;55158:16:::0;55153:1304:::1;;55209:4;-1:-1:-1::0;;;;;55195:19:0;::::1;::::0;55191:52:::1;;55223:20;;-1:-1:-1::0;;;55223:20:0::1;;;;;;;;;;;55191:52;55271:14;;55262:6;:23;55258:54;;;55294:18;;-1:-1:-1::0;;;55294:18:0::1;;;;;;;;;;;55258:54;55332:10;55327:41;;55351:17;;-1:-1:-1::0;;;55351:17:0::1;;;;;;;;;;;55327:41;55387:9;55383:1063;;;55493:6;:15;;;;55503:5;55493:15;55492:58;;;;-1:-1:-1::0;55524:9:0::1;55513:21;::::0;;;:10:::1;:21;::::0;;;;;55538:12:::1;55513:37;55492:58;55488:143;;;55582:29;;-1:-1:-1::0;;;55582:29:0::1;;;;;;;;;;;55488:143;55662:9;55651:21;::::0;;;:10:::1;:21;::::0;;;;55675:12:::1;55651:36:::0;;55817:6;:31;::::1;;;;38993:1;55827:12;;:21;55817:31;55813:618;;;55893:24;::::0;-1:-1:-1;;;;;55893:24:0::1;::::0;55944:25:::1;55963:4;55944:10;:25::i;:::-;:38;55940:358;;;56248:26;56263:10;-1:-1:-1::0;;;;;56248:26:0::1;:14;:26::i;:::-;56326:10;:8;:10::i;:::-;56322:90;;;56370:18;::::0;::::1;::::0;;;::::1;56322:90;55850:581;55813:618;56473:10;56469:697;;;56504:5;56500:655;;;56548:6;56530:14;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;56500:655:0::1;::::0;-1:-1:-1;56500:655:0::1;;56580:6;56576:579;;;56627:6;56608:15;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;56665:25:0::1;::::0;56656:34;::::1;56652:488;;;56762:19;56784:27;56808:3;56784:21;:27;:::i;:::-;56762:49;;56834:16;56874:3;56853:18;;:24;;;;:::i;:::-;56834:43;;56988:8;56974:11;:22;56970:50;;;57012:8;56998:22;;56970:50;57109:11;57087:18;;:33;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;56652:488:0::1;57278:4;57297:16:::0;;:43:::1;;-1:-1:-1::0;;;;;;42192:27:0;;42168:4;42192:27;;;:18;:27;;;;;;;;57317:23:::1;57293:91;;;-1:-1:-1::0;57367:5:0::1;57293:91;57586:9;57582:381;;;57616:16;57612:340;;;57738:25:::0;:29;;-1:-1:-1;;57738:29:0::1;57766:1;57738:29;::::0;;57612:340:::1;;;57890:46;57933:2;57890:42;:46::i;:::-;57975:49;57990:4;57996:2;58007:6;58016:7;57975:14;:49::i;:::-;54606:3426;;;;;;;54476:3556:::0;;;;:::o;24876:130::-;24947:28;24963:11;24947:15;:28::i;:::-;24943:55;;;24984:14;;-1:-1:-1;;;24984:14:0;;;;;;;;;;;65197:277;-1:-1:-1;;;;;65294:21:0;;;;;;:13;:21;;;;;:31;;65319:6;;65294:21;:31;;65319:6;;-1:-1:-1;;;;;65294:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;65294:31:0;;;;;-1:-1:-1;;;;;65294:31:0;;;;;;65340:9;65336:131;;;65371:32;;-1:-1:-1;;;;;11073:39:1;;11055:58;;-1:-1:-1;;;;;65371:32:0;;;;;11043:2:1;11028:18;65371:32:0;;;;;;;65423;;-1:-1:-1;;;;;11073:39:1;;11055:58;;-1:-1:-1;;;;;65423:32:0;;;;;-1:-1:-1;;;;;;;;;;;65423:32:0;11043:2:1;11028:18;65423:32:0;;;;;;;;65197:277;;;:::o;69149:::-;69263:40;69285:9;69296:6;69263:21;:40::i;:::-;69314:10;;:38;;-1:-1:-1;;;69314:38:0;;-1:-1:-1;;;;;18472:32:1;;;69314:38:0;;;18454:51:1;18521:18;;;18514:34;;;69314:10:0;;;;:20;;18427:18:1;;69314:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69370:48:0;;;-1:-1:-1;;;;;24009:39:1;;23991:58;;24097:4;24085:17;;24080:2;24065:18;;24058:45;-1:-1:-1;;;;;69370:48:0;;;-1:-1:-1;69370:48:0;;-1:-1:-1;23964:18:1;69370:48:0;23822:287:1;16483:104:0;16533:5;;-1:-1:-1;;;;;16533:5:0;4033:10;16533:21;16529:50;;16563:16;;-1:-1:-1;;;16563:16:0;;;;;;;;;;;16529:50;16483:104::o;26238:1009::-;-1:-1:-1;;;;;26338:22:0;;26334:51;;26369:16;;-1:-1:-1;;;26369:16:0;;;;;;;;;;;26334:51;-1:-1:-1;;;;;26429:17:0;;;26398:28;26429:17;;;:10;:17;;;;;;;;:27;;;;;;;;;;;26502:17;;;:10;:17;;;;;;26530:710;;;;26589:28;;-1:-1:-1;;;26589:28:0;;;;26561:25;26651:23;;:160;;26783:28;:18;26804:7;26783:28;:::i;:::-;26757:54;;;;26764:15;26757:54;:::i;:::-;26651:160;;;26695:16;26651:160;26886:18;;26864:40;;-1:-1:-1;;;;26919:32:0;;;;-1:-1:-1;;;26919:32:0;-1:-1:-1;;;;;;;26886:18:0;-1:-1:-1;;;26886:18:0;;;;;;;26864:40;;;;26919:32;;;;-1:-1:-1;;;;26919:32:0;;;;;26966:26;-1:-1:-1;;;26966:26:0;;;-1:-1:-1;26530:710:0;;-1:-1:-1;26530:710:0;;27150:18;27128:44;;-1:-1:-1;;;;27202:26:0;-1:-1:-1;;;;;;27150:18:0;;;;;;;-1:-1:-1;;27150:22:0;27128:44;;;;;-1:-1:-1;;;;27202:26:0;;;;-1:-1:-1;;;26238:1009:0:o;53348:110::-;-1:-1:-1;;;;;53434:16:0;53407:7;53434:16;;;:7;:16;;;;;;-1:-1:-1;;;;;53434:16:0;;53348:110::o;70381:1268::-;70480:20;;-1:-1:-1;;;70480:20:0;;-1:-1:-1;;;;;70480:20:0;70504:9;70480:33;;;:77;;-1:-1:-1;70541:13:0;:16;-1:-1:-1;;;;;70530:27:0;;;-1:-1:-1;;;70541:16:0;;;;70530:27;;70480:77;70476:163;;;70381:1268;;:::o;70476:163::-;70769:14;70785;70803:20;:7;-1:-1:-1;;;;;70803:18:0;;:20::i;:::-;70768:55;;-1:-1:-1;70768:55:0;-1:-1:-1;;;;;;70862:20:0;;70858:33;;70884:7;;70381:1268;;:::o;70858:33::-;70901:17;70951:4;-1:-1:-1;;;;;70933:23:0;;;70929:279;;-1:-1:-1;71050:6:0;;-1:-1:-1;71086:4:0;70929:279;;;-1:-1:-1;;;;;71112:23:0;;71130:4;71112:23;71108:100;;71190:7;;;70381:1268;;:::o;71108:100::-;71239:33;;-1:-1:-1;;;71239:33:0;;-1:-1:-1;;;;;2652:32:1;;;71239:33:0;;;2634:51:1;71220:16:0;;71239:24;;;;;;2607:18:1;;71239:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71360:13;:22;71220:52;;-1:-1:-1;;;;;;71360:22:0;71349:33;;;;:83;;;;-1:-1:-1;71410:22:0;;-1:-1:-1;;;;;71410:22:0;71399:33;;71349:83;71345:297;;;71607:23;;-1:-1:-1;;;71607:23:0;;;;;;;;;;;64854:335;-1:-1:-1;;;;;64957:21:0;;64935:19;64957:21;;;:13;:21;;;;;;:30;;64981:6;;-1:-1:-1;;;;;64957:21:0;:30;:::i;:::-;64935:52;;65017:18;65028:6;65017:10;:18::i;:::-;65002:12;-1:-1:-1;;;;;65002:33:0;;64998:78;;;65044:32;;-1:-1:-1;;;65044:32:0;;;;;;;;;;;64998:78;-1:-1:-1;;;;;65087:21:0;;;;;;:13;:21;;;;;;;;;:36;;-1:-1:-1;;;;;;65087:36:0;-1:-1:-1;;;;;65087:36:0;;;;;;;;;;65149:32;;11073:39:1;;;11055:58;;65087:21:0;;-1:-1:-1;;;;;;;;;;;65149:32:0;11028:18:1;65149:32:0;10911:208:1;72217:173:0;72297:9;72312:2;-1:-1:-1;;;;;72312:7:0;72327:6;72312:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72296:42;;;72354:4;72349:33;;72367:15;;-1:-1:-1;;;72367:15:0;;;;;;;;;;;72757:208;72850:41;;-1:-1:-1;;;72850:41:0;;-1:-1:-1;;;;;18472:32:1;;;72850:41:0;;;18454:51:1;18521:18;;;18514:34;;;72850:29:0;;;;;18427:18:1;;72850:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;72946:2;-1:-1:-1;;;;;72909:48:0;72932:12;-1:-1:-1;;;;;72909:48:0;;72950:6;72909:48;;;;2842:25:1;;2830:2;2815:18;;2696:177;63487:195:0;63561:10;;63557:118;;63588:10;;:32;;-1:-1:-1;;;63588:32:0;;;;;2842:25:1;;;-1:-1:-1;;;;;63588:10:0;;;;:24;;2815:18:1;;63588:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63642:21;63656:6;63642:21;;;;2842:25:1;;2830:2;2815:18;;2696:177;33818:447:0;-1:-1:-1;;;;;33938:19:0;;;33903:4;33938:19;;;:10;:19;;;;;;;;:28;34008:10;:19;;;;;:29;;;;;;;;;;;34066:19;;33903:4;;33938:28;-1:-1:-1;;;33938:28:0;;;;;;-1:-1:-1;;;34066:19:0;;;34054:31;;;;:86;;-1:-1:-1;34120:20:0;;-1:-1:-1;;;34120:20:0;;;;34102:15;:38;34054:86;:130;;;-1:-1:-1;34157:22:0;;-1:-1:-1;;;34157:22:0;;;;34183:1;34157:27;;34054:130;34050:184;;;34217:5;34210:12;;;;;;34050:184;-1:-1:-1;34253:4:0;;33818:447;-1:-1:-1;;;;33818:447:0:o;18665:454::-;-1:-1:-1;;;;;18733:27:0;;;;:19;:27;;;:19;;:27;;;:19;:27;;;:36;;;;;-1:-1:-1;;18733:36:0;;;;;;;;18780:21;:29;;;;;:38;;;;;;;;18829:18;:26;;;;;:35;;;;;;;;18875:21;:29;;;;;:38;;;;;;;;18924:16;:24;;;;;:33;;;;;;;;18968:21;:29;;;;;:38;;;;;;;;19017:29;:37;;;;;:46;;;;;;;;19074:20;:28;;;;;;:37;;;;;;;;18665:454::o;59027:576::-;59201:44;59223:6;59231;59239:5;59201:21;:44::i;:::-;-1:-1:-1;;;;;59275:15:0;;59256:16;59275:15;;;:7;:15;;;;;;:24;;59293:6;;-1:-1:-1;;;;;59275:15:0;:24;:::i;:::-;-1:-1:-1;;;;;59310:15:0;;;;;;;:7;:15;;;;;;:27;;-1:-1:-1;;;;;;59310:27:0;-1:-1:-1;;;;;59310:27:0;;;;;;;;;;59376:18;;;;;;;;59310:27;;-1:-1:-1;59376:18:0;59427:17;59438:6;59376:18;59427:17;:::i;:::-;-1:-1:-1;;;;;59406:18:0;;;;;;:7;:18;;;;;:38;;-1:-1:-1;;;;;;59406:38:0;-1:-1:-1;;;;;59406:38:0;;;;;;;;;;59455:40;59406:18;59488:6;59455:21;:40::i;:::-;59508:34;59522:9;59533:8;59508:13;:34::i;:::-;59560:35;;-1:-1:-1;;;;;11073:39:1;;11055:58;;-1:-1:-1;;;;;59560:35:0;;;;;;;;-1:-1:-1;;;;;;;;;;;59560:35:0;11043:2:1;11028:18;59560:35:0;;;;;;;59149:454;;59027:576;;;:::o;61808:833::-;61877:15;38993:1;51217:7;;:16;51209:25;;;;;;38993:1;51245:7;:15;61926:17:::1;::::0;61905:18:::1;:38:::0;62029:10;;62025:609:::1;;62098:10;::::0;62056:20:::1;::::0;62079:31:::1;::::0;-1:-1:-1;;;;;62098:10:0::1;62079;:31::i;:::-;62159:15;::::0;62184:10:::1;::::0;62125:79:::1;::::0;-1:-1:-1;;;62125:79:0;;-1:-1:-1;;;;;62159:15:0;;::::1;62125:79;::::0;::::1;25962:34:1::0;62184:10:0;::::1;26012:18:1::0;;;26005:43;26064:18;;;26057:34;;;62056:54:0;;-1:-1:-1;62125:11:0::1;::::0;:33:::1;::::0;25897:18:1;;62125:79:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;62332:10:0::1;::::0;62288:22:::1;::::0;-1:-1:-1;62347:12:0;;-1:-1:-1;62313:31:0::1;::::0;-1:-1:-1;;;;;62332:10:0::1;62313;:31::i;:::-;:46;;;;:::i;:::-;62381:44;::::0;;31582:25:1;;;31638:2;31623:18;;31616:34;;;62288:71:0;;-1:-1:-1;62381:44:0::1;::::0;31555:18:1;62381:44:0::1;;;;;;;62462:12;62440:19;:34:::0;62547:41:::1;62573:14:::0;62547:25:::1;:41::i;:::-;62618:4;62605:17;;62041:593;;62025:609;38960:1:::0;51417:7;:16;61808:833;;-1:-1:-1;61808:833:0:o;59611:418::-;59715:8;;;-1:-1:-1;;;;;59797:14:0;;59688:24;59797:14;59793:33;;59813:13;;;:::i;:::-;;;59793:33;59841:8;-1:-1:-1;;;;;59841:13:0;59853:1;59841:13;59837:32;;59856:13;;;:::i;:::-;;;59837:32;59906:11;59886:16;:31;59882:140;;59988:8;:22;-1:-1:-1;;;59611:418:0:o;62688:773::-;38993:1;51217:7;;:16;51209:25;;;;;;38993:1;51245:7;:15;62858::::1;::::0;62792:21:::1;::::0;62826:68:::1;::::0;62843:4:::1;::::0;-1:-1:-1;;;;;62858:15:0::1;62876:11:::0;62858:15;62826:8:::1;:68::i;:::-;;62980:11;-1:-1:-1::0;;;;;62954:38:0::1;:15;;:38;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;63034:15:0::1;::::0;63005:58:::1;::::0;-1:-1:-1;;;63005:58:0;;-1:-1:-1;;;;;63034:15:0;;::::1;63005:58;::::0;::::1;18454:51:1::0;18521:18;;;18514:34;;;63005:11:0::1;::::0;:28:::1;::::0;18427:18:1;;63005:58:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;63076:29;63132:17;63108:21;:41;;;;:::i;:::-;63165:55;::::0;;31582:25:1;;;31638:2;31623:18;;31616:34;;;63076:73:0;;-1:-1:-1;63165:55:0::1;::::0;31555:18:1;63165:55:0::1;;;;;;;63365:12;::::0;63336:26:::1;::::0;-1:-1:-1;;;;;63365:12:0;;::::1;::::0;63312:50:::1;::::0;:21;:50:::1;:::i;:::-;:65;;;;:::i;:::-;63403:26;::::0;63288:89;;-1:-1:-1;63388:65:0::1;::::0;-1:-1:-1;;;;;63403:26:0::1;63288:89:::0;63388:14:::1;:65::i;:::-;-1:-1:-1::0;;38960:1:0;51417:7;:16;-1:-1:-1;62688:773:0:o;69454:858::-;69537:15;69562:14;69573:2;69562:10;:14::i;:::-;69537:40;;69589:14;69605;69623:15;:2;-1:-1:-1;;;;;69623:13:0;;:15::i;:::-;69588:50;;-1:-1:-1;69588:50:0;-1:-1:-1;69671:4:0;-1:-1:-1;;;;;69653:23:0;;;69649:139;;-1:-1:-1;69770:6:0;69649:139;-1:-1:-1;;;;;69813:20:0;;69809:197;;-1:-1:-1;;69944:25:0;:29;;-1:-1:-1;;69944:29:0;69972:1;69944:29;;;-1:-1:-1;;69454:858:0:o;69809:197::-;70051:28;;-1:-1:-1;;;70051:28:0;;-1:-1:-1;;;;;2652:32:1;;;70051:28:0;;;2634:51:1;70026:15:0;;70051:24;;;;;;2607:18:1;;70051:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70109:195;;;;;;;;-1:-1:-1;;;;;70109:195:0;;;;;;-1:-1:-1;;;;;70109:195:0;;;;;;;;;;;;;;;;;;;;70235:9;70109:195;;;;;;70279:12;70109:195;;;;;;;;;-1:-1:-1;;;70093:211:0;;;;;;:13;:211;;;;;;;;-1:-1:-1;;70093:211:0;;;-1:-1:-1;;70093:211:0;;;;;;-1:-1:-1;69454:858:0:o;20584:332::-;20641:14;;-1:-1:-1;;;;;20323:19:0;;;20763:54;;-1:-1:-1;20802:1:0;;;;-1:-1:-1;20584:332:0;-1:-1:-1;20584:332:0:o;20763:54::-;20411;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20411:54:0;-1:-1:-1;;;20411:54:0;;;20839:33;;20851:4;;20839:11;:33::i;:::-;20521:54;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20521:54:0;-1:-1:-1;;;20521:54:0;;;20874:33;;20886:4;;20874:11;:33::i;:::-;20831:77;;;;20584:332;;;:::o;20924:346::-;21031:7;21057:12;21071:17;21092:4;-1:-1:-1;;;;;21092:15:0;21108:8;21092:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21056:61;;;;21134:7;:28;;;;;21160:2;21145:4;:11;:17;;21134:28;21130:95;;;21197:4;21186:27;;;;;;;;;;;;:::i;:::-;21179:34;;;;;;21130:95;-1:-1:-1;21260:1:0;;20924:346;-1:-1:-1;;;;20924:346:0:o;14:258:1:-;86:1;96:113;110:6;107:1;104:13;96:113;;;186:11;;;180:18;167:11;;;160:39;132:2;125:10;96:113;;;227:6;224:1;221:13;218:48;;;-1:-1:-1;;262:1:1;244:16;;237:27;14:258::o;277:383::-;426:2;415:9;408:21;389:4;458:6;452:13;501:6;496:2;485:9;481:18;474:34;517:66;576:6;571:2;560:9;556:18;551:2;543:6;539:15;517:66;:::i;:::-;644:2;623:15;-1:-1:-1;;619:29:1;604:45;;;;651:2;600:54;;277:383;-1:-1:-1;;277:383:1:o;665:118::-;751:5;744:13;737:21;730:5;727:32;717:60;;773:1;770;763:12;788:376;850:6;858;911:2;899:9;890:7;886:23;882:32;879:52;;;927:1;924;917:12;879:52;966:9;953:23;985:28;1007:5;985:28;:::i;:::-;1032:5;-1:-1:-1;1089:2:1;1074:18;;1061:32;1102:30;1061:32;1102:30;:::i;:::-;1151:7;1141:17;;;788:376;;;;;:::o;1169:131::-;-1:-1:-1;;;;;1244:31:1;;1234:42;;1224:70;;1290:1;1287;1280:12;1305:315;1373:6;1381;1434:2;1422:9;1413:7;1409:23;1405:32;1402:52;;;1450:1;1447;1440:12;1402:52;1489:9;1476:23;1508:31;1533:5;1508:31;:::i;:::-;1558:5;1610:2;1595:18;;;;1582:32;;-1:-1:-1;;;1305:315:1:o;1817:247::-;1876:6;1929:2;1917:9;1908:7;1904:23;1900:32;1897:52;;;1945:1;1942;1935:12;1897:52;1984:9;1971:23;2003:31;2028:5;2003:31;:::i;:::-;2053:5;1817:247;-1:-1:-1;;;1817:247:1:o;2069:137::-;-1:-1:-1;;;;;2147:5:1;2143:38;2136:5;2133:49;2123:77;;2196:1;2193;2186:12;2211:245;2269:6;2322:2;2310:9;2301:7;2297:23;2293:32;2290:52;;;2338:1;2335;2328:12;2290:52;2377:9;2364:23;2396:30;2420:5;2396:30;:::i;3060:456::-;3137:6;3145;3153;3206:2;3194:9;3185:7;3181:23;3177:32;3174:52;;;3222:1;3219;3212:12;3174:52;3261:9;3248:23;3280:31;3305:5;3280:31;:::i;:::-;3330:5;-1:-1:-1;3387:2:1;3372:18;;3359:32;3400:33;3359:32;3400:33;:::i;:::-;3060:456;;3452:7;;-1:-1:-1;;;3506:2:1;3491:18;;;;3478:32;;3060:456::o;3521:241::-;3577:6;3630:2;3618:9;3609:7;3605:23;3601:32;3598:52;;;3646:1;3643;3636:12;3598:52;3685:9;3672:23;3704:28;3726:5;3704:28;:::i;3767:248::-;3835:6;3843;3896:2;3884:9;3875:7;3871:23;3867:32;3864:52;;;3912:1;3909;3902:12;3864:52;-1:-1:-1;;3935:23:1;;;4005:2;3990:18;;;3977:32;;-1:-1:-1;3767:248:1:o;4020:145::-;4090:20;;4139:1;4129:12;;4119:40;;4155:1;4152;4145:12;4119:40;4020:145;;;:::o;4170:332::-;4247:6;4255;4308:2;4296:9;4287:7;4283:23;4279:32;4276:52;;;4324:1;4321;4314:12;4276:52;4347:31;4368:9;4347:31;:::i;:::-;4337:41;;4428:2;4417:9;4413:18;4400:32;4441:31;4466:5;4441:31;:::i;4507:114::-;4591:4;4584:5;4580:16;4573:5;4570:27;4560:55;;4611:1;4608;4601:12;4626:167;4693:20;;4753:14;4742:26;;4732:37;;4722:65;;4783:1;4780;4773:12;4798:872;4894:6;4902;4910;4918;4926;4934;4987:3;4975:9;4966:7;4962:23;4958:33;4955:53;;;5004:1;5001;4994:12;4955:53;5043:9;5030:23;5062:31;5087:5;5062:31;:::i;:::-;5112:5;-1:-1:-1;5169:2:1;5154:18;;5141:32;5182;5141;5182;:::i;:::-;5233:7;-1:-1:-1;5292:2:1;5277:18;;5264:32;5305:31;5264:32;5305:31;:::i;:::-;5355:7;-1:-1:-1;5381:37:1;5414:2;5399:18;;5381:37;:::i;:::-;5371:47;;5470:3;5459:9;5455:19;5442:33;5484:32;5508:7;5484:32;:::i;:::-;5535:7;-1:-1:-1;5594:3:1;5579:19;;5566:33;5608:30;5566:33;5608:30;:::i;:::-;5657:7;5647:17;;;4798:872;;;;;;;;:::o;5864:523::-;5938:6;5946;5954;6007:2;5995:9;5986:7;5982:23;5978:32;5975:52;;;6023:1;6020;6013:12;5975:52;6062:9;6049:23;6081:31;6106:5;6081:31;:::i;:::-;6131:5;-1:-1:-1;6188:2:1;6173:18;;6160:32;6201:33;6160:32;6201:33;:::i;:::-;6253:7;-1:-1:-1;6312:2:1;6297:18;;6284:32;6325:30;6284:32;6325:30;:::i;:::-;6374:7;6364:17;;;5864:523;;;;;:::o;6392:159::-;6459:20;;6519:6;6508:18;;6498:29;;6488:57;;6541:1;6538;6531:12;6556:256;6622:6;6630;6683:2;6671:9;6662:7;6658:23;6654:32;6651:52;;;6699:1;6696;6689:12;6651:52;6722:28;6740:9;6722:28;:::i;:::-;6712:38;;6769:37;6802:2;6791:9;6787:18;6769:37;:::i;:::-;6759:47;;6556:256;;;;;:::o;6817:382::-;6882:6;6890;6943:2;6931:9;6922:7;6918:23;6914:32;6911:52;;;6959:1;6956;6949:12;6911:52;6998:9;6985:23;7017:30;7041:5;7017:30;:::i;:::-;7066:5;-1:-1:-1;7123:2:1;7108:18;;7095:32;7136:31;7095:32;7136:31;:::i;7204:309::-;7269:6;7277;7330:2;7318:9;7309:7;7305:23;7301:32;7298:52;;;7346:1;7343;7336:12;7298:52;7382:9;7369:23;7359:33;;7442:2;7431:9;7427:18;7414:32;7455:28;7477:5;7455:28;:::i;7726:180::-;7785:6;7838:2;7826:9;7817:7;7813:23;7809:32;7806:52;;;7854:1;7851;7844:12;7806:52;-1:-1:-1;7877:23:1;;7726:180;-1:-1:-1;7726:180:1:o;8139:388::-;8207:6;8215;8268:2;8256:9;8247:7;8243:23;8239:32;8236:52;;;8284:1;8281;8274:12;8236:52;8323:9;8310:23;8342:31;8367:5;8342:31;:::i;10202:386::-;10269:6;10277;10330:2;10318:9;10309:7;10305:23;10301:32;10298:52;;;10346:1;10343;10336:12;10298:52;10385:9;10372:23;10404:31;10429:5;10404:31;:::i;:::-;10454:5;-1:-1:-1;10511:2:1;10496:18;;10483:32;10524;10483;10524;:::i;10593:313::-;10660:6;10668;10721:2;10709:9;10700:7;10696:23;10692:32;10689:52;;;10737:1;10734;10727:12;10689:52;10773:9;10760:23;10750:33;;10833:2;10822:9;10818:18;10805:32;10846:30;10870:5;10846:30;:::i;11124:332::-;11201:6;11209;11262:2;11250:9;11241:7;11237:23;11233:32;11230:52;;;11278:1;11275;11268:12;11230:52;11317:9;11304:23;11336:31;11361:5;11336:31;:::i;:::-;11386:5;-1:-1:-1;11410:40:1;11446:2;11431:18;;11410:40;:::i;11461:448::-;11534:6;11542;11550;11603:2;11591:9;11582:7;11578:23;11574:32;11571:52;;;11619:1;11616;11609:12;11571:52;11655:9;11642:23;11632:33;;11715:2;11704:9;11700:18;11687:32;11728:30;11752:5;11728:30;:::i;11914:184::-;11972:6;12025:2;12013:9;12004:7;12000:23;11996:32;11993:52;;;12041:1;12038;12031:12;11993:52;12064:28;12082:9;12064:28;:::i;12103:383::-;12180:6;12188;12196;12249:2;12237:9;12228:7;12224:23;12220:32;12217:52;;;12265:1;12262;12255:12;12217:52;12304:9;12291:23;12323:31;12348:5;12323:31;:::i;:::-;12373:5;12425:2;12410:18;;12397:32;;-1:-1:-1;12476:2:1;12461:18;;;12448:32;;12103:383;-1:-1:-1;;;12103:383:1:o;12491:876::-;12589:6;12597;12605;12613;12621;12629;12682:3;12670:9;12661:7;12657:23;12653:33;12650:53;;;12699:1;12696;12689:12;12650:53;12738:9;12725:23;12757:31;12782:5;12757:31;:::i;:::-;12807:5;-1:-1:-1;12864:2:1;12849:18;;12836:32;12877;12836;12877;:::i;:::-;12928:7;-1:-1:-1;12987:2:1;12972:18;;12959:32;13000;12959;13000;:::i;:::-;13051:7;-1:-1:-1;13110:2:1;13095:18;;13082:32;13123:31;13082:32;13123:31;:::i;:::-;13173:7;-1:-1:-1;13199:38:1;13232:3;13217:19;;13199:38;:::i;:::-;13189:48;;13289:3;13278:9;13274:19;13261:33;13303:32;13327:7;13303:32;:::i;13372:319::-;13439:6;13447;13500:2;13488:9;13479:7;13475:23;13471:32;13468:52;;;13516:1;13513;13506:12;13468:52;13555:9;13542:23;13574:31;13599:5;13574:31;:::i;:::-;13624:5;-1:-1:-1;13648:37:1;13681:2;13666:18;;13648:37;:::i;13696:801::-;13807:6;13815;13823;13831;13839;13847;13855;13908:3;13896:9;13887:7;13883:23;13879:33;13876:53;;;13925:1;13922;13915:12;13876:53;13964:9;13951:23;13983:31;14008:5;13983:31;:::i;:::-;14033:5;-1:-1:-1;14090:2:1;14075:18;;14062:32;14103:33;14062:32;14103:33;:::i;:::-;14155:7;-1:-1:-1;14209:2:1;14194:18;;14181:32;;-1:-1:-1;14260:2:1;14245:18;;14232:32;;-1:-1:-1;14316:3:1;14301:19;;14288:33;14330:31;14288:33;14330:31;:::i;:::-;13696:801;;;;-1:-1:-1;13696:801:1;;;;14380:7;14434:3;14419:19;;14406:33;;-1:-1:-1;14486:3:1;14471:19;;;14458:33;;13696:801;-1:-1:-1;;13696:801:1:o;14502:527::-;14578:6;14586;14594;14647:2;14635:9;14626:7;14622:23;14618:32;14615:52;;;14663:1;14660;14653:12;14615:52;14702:9;14689:23;14721:31;14746:5;14721:31;:::i;:::-;14771:5;-1:-1:-1;14828:2:1;14813:18;;14800:32;14841:33;14800:32;14841:33;:::i;:::-;14893:7;-1:-1:-1;14952:2:1;14937:18;;14924:32;14965;14924;14965;:::i;15521:127::-;15582:10;15577:3;15573:20;15570:1;15563:31;15613:4;15610:1;15603:15;15637:4;15634:1;15627:15;15653:422;15742:1;15785:5;15742:1;15799:270;15820:7;15810:8;15807:21;15799:270;;;15879:4;15875:1;15871:6;15867:17;15861:4;15858:27;15855:53;;;15888:18;;:::i;:::-;15938:7;15928:8;15924:22;15921:55;;;15958:16;;;;15921:55;16037:22;;;;15997:15;;;;15799:270;;;15803:3;15653:422;;;;;:::o;16080:806::-;16129:5;16159:8;16149:80;;-1:-1:-1;16200:1:1;16214:5;;16149:80;16248:4;16238:76;;-1:-1:-1;16285:1:1;16299:5;;16238:76;16330:4;16348:1;16343:59;;;;16416:1;16411:130;;;;16323:218;;16343:59;16373:1;16364:10;;16387:5;;;16411:130;16448:3;16438:8;16435:17;16432:43;;;16455:18;;:::i;:::-;-1:-1:-1;;16511:1:1;16497:16;;16526:5;;16323:218;;16625:2;16615:8;16612:16;16606:3;16600:4;16597:13;16593:36;16587:2;16577:8;16574:16;16569:2;16563:4;16560:12;16556:35;16553:77;16550:159;;;-1:-1:-1;16662:19:1;;;16694:5;;16550:159;16741:34;16766:8;16760:4;16741:34;:::i;:::-;16811:6;16807:1;16803:6;16799:19;16790:7;16787:32;16784:58;;;16822:18;;:::i;:::-;16860:20;;16080:806;-1:-1:-1;;;16080:806:1:o;16891:131::-;16951:5;16980:36;17007:8;17001:4;16980:36;:::i;17027:168::-;17067:7;17133:1;17129;17125:6;17121:14;17118:1;17115:21;17110:1;17103:9;17096:17;17092:45;17089:71;;;17140:18;;:::i;:::-;-1:-1:-1;17180:9:1;;17027:168::o;17200:127::-;17261:10;17256:3;17252:20;17249:1;17242:31;17292:4;17289:1;17282:15;17316:4;17313:1;17306:15;17332:120;17372:1;17398;17388:35;;17403:18;;:::i;:::-;-1:-1:-1;17437:9:1;;17332:120::o;17457:251::-;17527:6;17580:2;17568:9;17559:7;17555:23;17551:32;17548:52;;;17596:1;17593;17586:12;17548:52;17628:9;17622:16;17647:31;17672:5;17647:31;:::i;18030:245::-;18097:6;18150:2;18138:9;18129:7;18125:23;18121:32;18118:52;;;18166:1;18163;18156:12;18118:52;18198:9;18192:16;18217:28;18239:5;18217:28;:::i;18559:249::-;18628:6;18681:2;18669:9;18660:7;18656:23;18652:32;18649:52;;;18697:1;18694;18687:12;18649:52;18729:9;18723:16;18748:30;18772:5;18748:30;:::i;19098:744::-;-1:-1:-1;;;;;19422:32:1;;;;19404:51;;-1:-1:-1;;;;;19536:15:1;;;19531:2;19516:18;;19509:43;19600:4;19588:17;;;;19583:2;19568:18;;19561:45;19654:14;19642:27;;;;19637:2;19622:18;;19615:55;19707:15;;19701:3;19686:19;;19679:44;19760:15;;;19442:3;19739:19;;19732:44;19820:14;19813:22;19807:3;19792:19;;19785:51;19391:3;19376:19;;19098:744::o;19847:167::-;19925:13;;19978:10;19967:22;;19957:33;;19947:61;;20004:1;20001;19994:12;20019:206;20088:6;20141:2;20129:9;20120:7;20116:23;20112:32;20109:52;;;20157:1;20154;20147:12;20109:52;20180:39;20209:9;20180:39;:::i;20230:237::-;20269:4;-1:-1:-1;;;;;20374:10:1;;;;20344;;20396:12;;;20393:38;;;20411:18;;:::i;:::-;20448:13;;20230:237;-1:-1:-1;;;20230:237:1:o;21479:184::-;21549:6;21602:2;21590:9;21581:7;21577:23;21573:32;21570:52;;;21618:1;21615;21608:12;21570:52;-1:-1:-1;21641:16:1;;21479:184;-1:-1:-1;21479:184:1:o;23106:462::-;23190:6;23198;23206;23259:2;23247:9;23238:7;23234:23;23230:32;23227:52;;;23275:1;23272;23265:12;23227:52;23298:39;23327:9;23298:39;:::i;:::-;23288:49;;23380:2;23369:9;23365:18;23359:25;23393:30;23417:5;23393:30;:::i;:::-;23492:2;23477:18;;23471:25;23442:5;;-1:-1:-1;23505:31:1;23471:25;23505:31;:::i;23573:244::-;23612:3;-1:-1:-1;;;;;23693:2:1;23690:1;23686:10;23723:2;23720:1;23716:10;23754:3;23750:2;23746:12;23741:3;23738:21;23735:47;;;23762:18;;:::i;:::-;23798:13;;23573:244;-1:-1:-1;;;;23573:244:1:o;24114:127::-;24175:10;24170:3;24166:20;24163:1;24156:31;24206:4;24203:1;24196:15;24230:4;24227:1;24220:15;25075:195;25114:1;25140:14;25181:2;25178:1;25174:10;25203:3;25193:37;;25210:18;;:::i;:::-;25248:10;;25244:20;;;;;25075:195;-1:-1:-1;;25075:195:1:o;25275:232::-;25314:3;25342:14;25383:2;25380:1;25376:10;25413:2;25410:1;25406:10;25444:3;25440:2;25436:12;25431:3;25428:21;25425:47;;;25452:18;;:::i;27141:332::-;27218:6;27226;27279:2;27267:9;27258:7;27254:23;27250:32;27247:52;;;27295:1;27292;27285:12;27247:52;27318:39;27347:9;27318:39;:::i;:::-;27308:49;;27400:2;27389:9;27385:18;27379:25;27413:30;27437:5;27413:30;:::i;27478:207::-;27517:1;-1:-1:-1;;;;;27596:2:1;27593:1;27589:10;27618:3;27608:37;;27625:18;;:::i;28706:204::-;28744:3;28780:4;28777:1;28773:12;28812:4;28809:1;28805:12;28847:3;28841:4;28837:14;28832:3;28829:23;28826:49;;;28855:18;;:::i;:::-;28891:13;;28706:204;-1:-1:-1;;;28706:204:1:o;29703:128::-;29743:3;29774:1;29770:6;29767:1;29764:13;29761:39;;;29780:18;;:::i;:::-;-1:-1:-1;29816:9:1;;29703:128::o;29836:278::-;29875:7;-1:-1:-1;;;;;29960:2:1;29957:1;29953:10;29990:2;29987:1;29983:10;30046:3;30042:2;30038:12;30033:3;30030:21;30023:3;30016:11;30009:19;30005:47;30002:73;;;30055:18;;:::i;:::-;30095:13;;29836:278;-1:-1:-1;;;;29836:278:1:o;30119:266::-;30158:7;30190:14;30231:2;30228:1;30224:10;30261:2;30258:1;30254:10;30317:3;30313:2;30309:12;30304:3;30301:21;30294:3;30287:11;30280:19;30276:47;30273:73;;;30326:18;;:::i;30390:125::-;30430:4;30458:1;30455;30452:8;30449:34;;;30463:18;;:::i;:::-;-1:-1:-1;30500:9:1;;30390:125::o;30520:258::-;30559:7;30591:6;30624:2;30621:1;30617:10;30654:2;30651:1;30647:10;30710:3;30706:2;30702:12;30697:3;30694:21;30687:3;30680:11;30673:19;30669:47;30666:73;;;30719:18;;:::i;31661:136::-;31700:3;31728:5;31718:39;;31737:18;;:::i;:::-;-1:-1:-1;;;31773:18:1;;31661:136::o;31802:135::-;31841:3;31862:17;;;31859:43;;31882:18;;:::i;:::-;-1:-1:-1;31929:1:1;31918:13;;31802:135::o;32256:274::-;32385:3;32423:6;32417:13;32439:53;32485:6;32480:3;32473:4;32465:6;32461:17;32439:53;:::i;:::-;32508:16;;;;;32256:274;-1:-1:-1;;32256:274:1:o
Swarm Source
ipfs://91e982e5bd4e999830b5c60ea202a439612419afc9a698006fb4989473cf7523
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.