Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 28 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Transfer Fr... | 21459095 | 9 days ago | IN | 0 ETH | 0.00036029 | ||||
Safe Transfer Fr... | 18696773 | 396 days ago | IN | 0 ETH | 0.00305195 | ||||
Set Approval For... | 17247780 | 599 days ago | IN | 0 ETH | 0.00357199 | ||||
Safe Transfer Fr... | 17083898 | 622 days ago | IN | 0 ETH | 0.01064682 | ||||
Safe Transfer Fr... | 16944552 | 642 days ago | IN | 0 ETH | 0.00099452 | ||||
Set Approval For... | 16721348 | 673 days ago | IN | 0 ETH | 0.00068226 | ||||
Set Approval For... | 16721338 | 673 days ago | IN | 0 ETH | 0.00130054 | ||||
Safe Transfer Fr... | 16077394 | 763 days ago | IN | 0 ETH | 0.0005315 | ||||
Safe Transfer Fr... | 16041429 | 768 days ago | IN | 0 ETH | 0.0005621 | ||||
Safe Transfer Fr... | 16007438 | 773 days ago | IN | 0 ETH | 0.00126285 | ||||
Safe Transfer Fr... | 15893374 | 789 days ago | IN | 0 ETH | 0.00052521 | ||||
Safe Transfer Fr... | 15848375 | 795 days ago | IN | 0 ETH | 0.00160084 | ||||
Safe Transfer Fr... | 15524736 | 841 days ago | IN | 0 ETH | 0.00108743 | ||||
Set Base Uri For... | 15447668 | 853 days ago | IN | 0 ETH | 0.00235109 | ||||
Set Approval For... | 15426546 | 857 days ago | IN | 0 ETH | 0.0001387 | ||||
Safe Transfer Fr... | 15398763 | 861 days ago | IN | 0 ETH | 0.00194197 | ||||
Set Base Uri For... | 15374961 | 865 days ago | IN | 0 ETH | 0.00049072 | ||||
Set Base Uri For... | 15374956 | 865 days ago | IN | 0 ETH | 0.00053587 | ||||
Set Royalty Addr... | 15354628 | 868 days ago | IN | 0 ETH | 0.00056774 | ||||
Set Base Uri For... | 15354625 | 868 days ago | IN | 0 ETH | 0.00193791 | ||||
Set Allowed Crea... | 15354623 | 868 days ago | IN | 0 ETH | 0.00074841 | ||||
Set Approval For... | 15202845 | 892 days ago | IN | 0 ETH | 0.00026932 | ||||
Set Base Uri For... | 15079333 | 911 days ago | IN | 0 ETH | 0.00063057 | ||||
Set Allowed Crea... | 15079330 | 911 days ago | IN | 0 ETH | 0.0008706 | ||||
Set Allowed Crea... | 15078395 | 911 days ago | IN | 0 ETH | 0.00057515 |
Latest 3 internal transactions
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
14743473 | 967 days ago | Contract Creation | 0 ETH | |||
14743473 | 967 days ago | Contract Creation | 0 ETH | |||
14743473 | 967 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
MementoRise
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-09 */ // Copyright (c) 2022 EverRise Pte Ltd. All rights reserved. // EverRise licenses this file to you under the MIT license. /* EverRise Memento NFTs are awards for completing EverRise staking terms, participating in events and winning challenges. ___________ ________ _______ __ '._==_==_=_.' / | / \ / | .-\: /-. $$$$$$$$/__ __ ______ ______ $$$$$$$ |$$/ _______ ______ 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 NotSetup(); // 0xb09c99c0 error WalletLocked(); // 0xd550ed24 error FailedEthSend(); // 0xb5747cc7 error NotZeroAddress(); // 0x66385fa3 error CallerNotApproved(); // 0x4014f1a5 error InvalidAddress(); // 0xe6c4247b error CallerNotOwner(); // 0x5cd83192 error AmountMustBeGreaterThanZero(); // 0x5e85ae73 error AmountOutOfRange(); // 0xc64200e9 address constant EverMigrateAddress = 0x429CA183C5f4B43F09D70580C5365a6D21ccCd47; address constant EverRiseV1Address_BSC = 0xC7D43F2B51F44f09fBB8a691a0451E8FFCF36c0a; address constant EverRiseV1Address_ETH = 0x8A2D988Fe2E8c6716cbCeF1B33Df626C692F7B98; address constant EverRiseV2Address = 0x0cD022ddE27169b20895e0e2B2B8A33B25e63579; address constant EverRiseV2Address_AVAX = 0xC3A8d300333BFfE3ddF6166F2Bc84E6d38351BED; address constant EverRiseV3Address = 0xC17c30e98541188614dF99239cABD40280810cA3; address constant nftRiseV3Address = 0x23cD2E6b283754Fd2340a75732f9DdBb5d11807e; // Testnet // address constant EverRiseV3Address = 0x1665E2b184F352d226A882281f69ccf361349CC6; //address constant nftRiseV3Address = 0x0D3770c2318F84E33d0B0efEc8EfD2086683F0b2; //address constant EverRiseV3Address = 0x639631Ac62abE60c4F67278f80ca3291047eFc1B; // address constant nftRiseV3Address = 0x617cBE19e7A74dF4fb58eFE5830586c3466CC091; address constant mintFeeAddress = 0xc3b7FfA7611C45C1245a1923065442BC94Af9757; address constant royaltyFeeAddress = 0x0BFc8f6374028f1a61Ae3019E5C845F461575381; bytes constant ipfsAddress = "ipfs://bafybeidj6gy62qkgwi6ww32iw2khbjcusf3xefvi2gugykdfau54mvux54/metaOutput/"; interface ICreateRecipe { function createTo(address account, uint256 toTokenId, uint256 toAmount) external; } // File: memeRISE/ITransmuteRecipe.sol interface ITransmuteSingleRecipe { function transmuteSingleTo( address account, uint256 toToken, uint256 toAmount, uint256[] calldata fromIds, uint256[] calldata fromAmounts) external; } interface ITransmuteMultipleRecipe { function transmuteMultipleTo( address account, uint256[] calldata toTokenIds, uint256[] calldata toAmounts, uint256[] calldata fromIds, uint256[] calldata fromAmounts) external; } // File: memeRISE/Abstract/nativeCoinSender.sol contract NativeCoinSender { function sendEthViaCall(address payable to, uint256 amount) internal { (bool sent, ) = to.call{value: amount}(""); if (!sent) revert FailedEthSend(); } } // File: memeRISE/Interfaces/IEverRoyaltySplitter.sol interface IEverRoyaltySplitter { event RoyaltiesSplit(uint256 value); event SplitUpdated(uint256 previous, uint256 current); event UniswapV2RouterSet(address indexed previous, address indexed current); event EverRiseEcosystemSet(address indexed previous, address indexed current); event EverRiseTokenSet(address indexed previous, address indexed current); event StableCoinSet(address indexed previous, address indexed current); function distribute() external; } // File: memeRISE/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: memeRISE/Abstract/Context.sol abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return payable(msg.sender); } } // File: memeRISE/Abstract/ERC173-Ownable.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); } function transferOwnership(address newOwner) public onlyOwner { if (newOwner == address(0)) revert NotZeroAddress(); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } } // File: memeRISE/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: memeRISE/Interfaces/IEverRise.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 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 operator) external view returns (ApprovalChecks memory); } // File: memeRISE/Interfaces/IERC165-SupportsInterface.sol interface IERC165 { function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: memeRISE/Abstract/ERC165-SupportsInterface.sol abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: memeRISE/Interfaces/IERC2981-Royalty.sol interface IERC2981 is IERC165 { function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns ( address receiver, uint256 royaltyAmount ); } // File: memeRISE/Abstract/royaltyHandler.sol abstract contract royaltyHandler is IERC2981, Ownable { event RoyaltyFeeUpdated(uint256 newValue); event RoyaltyAddressUpdated(address indexed contractAddress); IEverRoyaltySplitter public royaltySplitter; uint256 public defaultRoyaltySplit = 5; function setDefaultNftRoyaltyFeePercent(uint256 royaltySplitRate) external onlyOwner { if (royaltySplitRate > 10) revert AmountOutOfRange(); defaultRoyaltySplit = royaltySplitRate; emit RoyaltyFeeUpdated(royaltySplitRate); } function setRoyaltyAddress(address newAddress) external onlyOwner { if (newAddress == address(0)) revert NotZeroAddress(); _setRoyaltyAddress(newAddress); } function _setRoyaltyAddress(address newAddress) internal { royaltySplitter = IEverRoyaltySplitter(newAddress); emit RoyaltyAddressUpdated(newAddress); } function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns ( address receiver, uint256 royaltyAmount ) { if (_tokenId == 0) revert AmountMustBeGreaterThanZero(); return (address(royaltySplitter), _salePrice / defaultRoyaltySplit); } } // File: memeRISE/Interfaces/IMementoRise.sol interface IMementoRise { function royaltyAddress() external view returns(address payable); function mint(address to, uint256 tokenId, uint256 amount) external; function mintFee(uint16 typeId) external returns (uint256); } // File: memeRISE/mementoRecipe.sol abstract contract MementoRecipe is NativeCoinSender, Ownable { IMementoRise public mementoRise; IEverRise public everRiseToken = IEverRise(EverRiseV3Address); event EverRiseTokenSet(address indexed tokenAddress); event MementoRiseSet(address indexed nftAddress); modifier onlyMementoRise() { require(_msgSender() == address(mementoRise), "Invalid requestor"); _; } constructor(address _mementoRise) { setMementoRise(_mementoRise); } function setEverRiseToken(address tokenAddress) external onlyOwner { if (tokenAddress == address(0)) revert NotZeroAddress(); everRiseToken = IEverRise(tokenAddress); emit EverRiseTokenSet(tokenAddress); } function setMementoRise(address nftAddress) public onlyOwner { if (nftAddress == address(0)) revert NotZeroAddress(); mementoRise = IMementoRise(nftAddress); emit MementoRiseSet(nftAddress); } function krakenMintFee(uint256 baseFee, uint256 quantity) internal { distributeMintFee(payable(address(everRiseToken)), baseFee, quantity); } function handleMintFee(uint256 baseFee, uint256 quantity) internal { distributeMintFee(mementoRise.royaltyAddress(), baseFee, quantity); } function distributeMintFee(address payable receiver, uint256 baseFee, uint256 quantity) private { uint256 _mintFee = baseFee * quantity; require(_mintFee == 0 || msg.value >= _mintFee, "Mint fee not covered"); uint256 _balance = address(this).balance; if (_balance > 0) { // Transfer everything, easier than transferring extras later sendEthViaCall(receiver, _balance); } } } // File: memeRISE/Interfaces/IERC1155-MultiToken.sol interface IERC1155 is IERC165 { event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); event ApprovalForAll(address indexed account, address indexed operator, bool approved); event URI(string value, uint256 indexed id); function balanceOf(address account, uint256 id) external view returns (uint256); function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); function setApprovalForAll(address operator, bool approved) external; function isApprovedForAll(address account, address operator) external view returns (bool); function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } interface IERC1155Receiver is IERC165 { function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external view returns (bytes4); function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external view returns (bytes4); } interface IERC1155MetadataURI { function uri(uint256 id) external view returns (string memory); } // File: memeRISE/mementoRise.sol // Copyright (c) 2022 EverRise Pte Ltd. All rights reserved. // EverRise licenses this file to you under the MIT license. /* EverRise Memento NFTs are awards for completing EverRise staking terms, participating in events and winning challenges. ___________ ________ _______ __ '._==_==_=_.' / | / \ / | .-\: /-. $$$$$$$$/__ __ ______ ______ $$$$$$$ |$$/ _______ ______ 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 */ interface IOpenSeaCollectible { function contractURI() external view returns (string memory); } abstract contract EverRiseTokenManaged is Ownable { IEverRise public everRiseToken; function setEverRiseToken(address tokenAddress) public onlyOwner { if (tokenAddress == address(0)) revert NotZeroAddress(); everRiseToken = IEverRise(tokenAddress); emit EverRiseTokenSet(tokenAddress); } event EverRiseTokenSet(address indexed tokenAddress); } interface IEverMigrate { function userTransaction(address sourceToken, address userAddress, uint256 position) external view returns (uint256, uint256, uint32); } enum Animal { Plankton, Seahorse, Starfish, Swordfish, Stingray, Dolphin, Narwhal, Shark, Orca, Whale, Megalodon, Kraken } contract MigrationV1V2Achievement is MementoRecipe { mapping (uint256 => bool) public processedTxn; mapping (address => uint16) public claimedReward; IEverMigrate public migrate = IEverMigrate(EverMigrateAddress); address immutable public everRiseV1; constructor(address _mementoRise) MementoRecipe(_mementoRise) { everRiseV1 = block.chainid == 1 ? EverRiseV1Address_ETH : EverRiseV1Address_BSC; } function claimMigrationAchievement(uint256 tokenId, uint256 txnPosition) external payable { address from = _msgSender(); (uint256 amount,, uint256 txnId) = migrate.userTransaction(everRiseV1, from, txnPosition); require(txnId > 0, "Invalid txn"); require(!processedTxn[txnId], "Already claimed txn"); processedTxn[txnId] = true; handleMintFee(mementoRise.mintFee(uint16(tokenId & 0xffff)), 1); Animal animal = Animal(tokenId >> 16); require(amount > getMinAmount(animal), "Not enough"); uint16 flag = uint16(1 << uint8(animal)); uint16 flags = claimedReward[from]; require(flags & flag == 0, "Already claimed level"); claimedReward[from] = flags | flag; mementoRise.mint(from, tokenId, 1); } function getMinAmount(Animal animal) private pure returns (uint256) { // 'Plankton', threshold: 1000 } if (animal == Animal.Plankton) { return (1_000 - 1) * 10**4 * 10**9; } // 'Seahorse', threshold: 10000 }, if (animal == Animal.Seahorse) { return (10_000 - 1) * 10**4 * 10**9; } // 'Starfish', threshold: 50000 }, if (animal == Animal.Starfish) { return (50_000 - 1) * 10**4 * 10**9; } // 'SwordFish', threshold: 100000 }, if (animal == Animal.Swordfish) { return (100_000 - 1) * 10**4 * 10**9; } // 'Stingray', threshold: 500000 }, if (animal == Animal.Stingray) { return (500_000 - 1) * 10**4 * 10**9; } // 'Dolphin', threshold: 1000000 }, if (animal == Animal.Dolphin) { return (1_000_000 - 1) * 10**4 * 10**9; } // 'Narwhal', threshold: 5000000 }, if (animal == Animal.Narwhal) { return (5_000_000 - 1) * 10**4 * 10**9; } // 'Shark', threshold: 10000000 }, if (animal == Animal.Shark) { return (10_000_000 - 1) * 10**4 * 10**9; } // 'Orca', threshold: 25000000 }, if (animal == Animal.Orca) { return (25_000_000 - 1) * 10**4 * 10**9; } // 'Whale', threshold: 50000000 }, if (animal == Animal.Whale) { return (50_000_000 - 1) * 10**4 * 10**9; } // 'Megalodon', threshold: 100000000 }, if (animal == Animal.Megalodon) { return (100_000_000 - 1) * 10**4 * 10**9; } // 'Kraken' threshold: 250000000 if (animal == Animal.Kraken) { return (250_000_000 - 1) * 10**4 * 10**9; } require(false, "Unknown level"); return (250_000_000_000 - 1) * 10**4 * 10**9; } } contract HolderV2Achievement is MementoRecipe, ICreateRecipe { IERC20 immutable public everRiseV2; mapping (address => bool) public processedClaim; constructor(address _mementoRise) MementoRecipe(_mementoRise) { everRiseV2 = block.chainid == 43114 ? IERC20(EverRiseV2Address_AVAX) : IERC20(EverRiseV2Address); } function createTo(address account, uint256 toTokenId, uint256 toAmount) external onlyMementoRise { require(toTokenId == 3, "Nft doesn't exist"); require(toAmount == 1, "Can only claim one per chain"); require(everRiseV2.balanceOf(account) > 0, "Not holding RISE v2"); require(!processedClaim[account], "Already claimed"); processedClaim[account] = true; } } 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 768 bits, 40000 gwei gas interface InftEverRise { function getNftData(uint256 id) external view returns (StakingDetails memory); function claimAchievement(address staker, uint256 nftId) external returns (uint32 newNftId); } contract StakingAchievement is MementoRecipe { InftEverRise public nftRise; constructor(address _mementoRise) MementoRecipe(_mementoRise) { nftRise = InftEverRise(nftRiseV3Address); } function _walletLock(address fromAddress) private view { if (everRiseToken.isWalletLocked(fromAddress)) revert WalletLocked(); } modifier walletLock(address fromAddress) { _walletLock(fromAddress); _; } function getTokenId(uint256 chainId, uint256 animalId, uint256 months) public pure returns (uint256) { require(chainId <= type(uint8).max, "Chain out of range"); require(animalId <= type(uint8).max, "AnimalId out of range"); require(months <= type(uint8).max, "Months out of range"); uint256 generatedTokenId = 1; generatedTokenId += chainId << 16; generatedTokenId += animalId << 24; generatedTokenId += months << 32; return generatedTokenId; } function claimStakingAchievement(uint256 tokenId, uint256 stakeNftId) external payable walletLock(_msgSender()) { address from = _msgSender(); krakenMintFee(mementoRise.mintFee(uint16(tokenId & 0xffff)), 1); uint32 newNftId = nftRise.claimAchievement(from, stakeNftId); StakingDetails memory stakeDetails = nftRise.getNftData(newNftId); uint256 generatedTokenId = 1; generatedTokenId += getChain() << 16; generatedTokenId += getAnimal(stakeDetails.initialTokenAmount) << 24; generatedTokenId += getMaterial(stakeDetails.numOfMonths) << 32; require(generatedTokenId == tokenId, "Incorrect nft requested"); mementoRise.mint(from, tokenId, 1); } function getMaterial(uint256 months) private pure returns (uint256) { if (months > 0 && months <= 12) return months; if (months == 24) return 14; if (months == 36) return 15; require(false, "Invalid time"); return 0; } function getAnimal(uint256 threshold) private pure returns (uint256) { // 'Kraken' threshold: 250000000 if (threshold > (250_000_000 - 1) * 10**18) { return 11; } // 'Megalodon', threshold: 100000000 }, if (threshold > (100_000_000 - 1) * 10**18) { return 10; } // 'Whale', threshold: 50000000 }, if (threshold > (50_000_000 - 1) * 10**18) { return 9; } // 'Orca', threshold: 25000000 }, if (threshold > (25_000_000 - 1) * 10**18) { return 8; } // 'Shark', threshold: 10000000 }, if (threshold > (10_000_000 - 1) * 10**18) { return 7; } // 'Narwhal', threshold: 5000000 }, if (threshold > (5_000_000 - 1) * 10**18) { return 6; } // 'Dolphin', threshold: 1000000 }, if (threshold > (1_000_000 - 1) * 10**18) { return 5; } // 'Stingray', threshold: 500000 }, if (threshold > (500_000 - 1) * 10**18) { return 4; } // 'Swordfish', threshold: 100000 }, if (threshold > (100_000 - 1) * 10**18) { return 3; } // 'Starfish', threshold: 50000 }, if (threshold > (50_000 - 1) * 10**18) { return 2; } // 'Seahorse', threshold: 10000 }, if (threshold > (10_000 - 1) * 10**18) { return 1; } // 'Plankton', threshold: 1000 } if (threshold > (1_000 - 1) * 10**18) { return 0; } // Smaller require(false, "Too small"); return 0; } function getChain() private view returns (uint256) { uint256 chainId = block.chainid; if (chainId == 1 || chainId == 3 || chainId == 4 || chainId == 5 || chainId == 42) // Ethereum return 4; if (chainId == 56 || chainId == 97) // BNB return 2; if (chainId == 137 || chainId == 80001) // Polygon return 3; if (chainId == 250 || chainId == 4002) // Fantom return 1; if (chainId == 43114 || chainId == 43113) // Avalanche return 0; require(false, "Unknown chain"); return 0; } } type BalanceKey is uint256; type BalanceAmount is uint256; library AmountLib { function add(BalanceAmount b, uint256 value) internal pure returns (BalanceAmount) { require(value < type(uint240).max, "Out of range"); uint256 amountPos = BalanceAmount.unwrap(b); uint240 amount = uint240(amountPos >> 16); uint16 position = uint16(amountPos & 0xffff); amount += uint240(value); amountPos = (uint256(amount) << 16) | position; return BalanceAmount.wrap(amountPos); } function subtract(BalanceAmount b, uint256 value) internal pure returns (BalanceAmount) { require(value < type(uint240).max, "Out of range"); uint256 amountPos = BalanceAmount.unwrap(b); uint240 amount = uint240(amountPos >> 16); uint16 position = uint16(amountPos & 0xffff); require (amount >= value, "Balance too low"); unchecked { amount -= uint240(value); } amountPos = (uint256(amount) << 16) | position; return BalanceAmount.wrap(amountPos); } function Amount(BalanceAmount b) internal pure returns (uint256 value) { uint256 amountPos = BalanceAmount.unwrap(b); return uint240(amountPos >> 16); } function getPosition(BalanceAmount b) internal pure returns (uint16) { uint256 amountPos = BalanceAmount.unwrap(b); return uint16(amountPos & 0xffff); } function setPosition(BalanceAmount b, uint16 position) internal pure returns (BalanceAmount) { uint256 amountPos = BalanceAmount.unwrap(b); uint240 amount = uint240(amountPos >> 16); return BalanceAmount.wrap((uint256(amount) << 16) | position); } } contract MementoRise is EverRiseTokenManaged, royaltyHandler, NativeCoinSender, ERC165, IERC1155, IMementoRise, IERC1155MetadataURI, IOpenSeaCollectible { using AmountLib for BalanceAmount; event BaseUriForTypeSet(uint16 indexed nftType, string uri); event NftBridgeSet(address bridge); event NftBridgedIn(address indexed contractAddress, address indexed operator, address indexed to, uint256 id, uint256 amount); event NftsBridgedIn(address indexed contractAddress, address indexed operator, address indexed to, uint256[] ids, uint256[] amounts); event NftBridgedOut(address indexed contractAddress, address indexed operator, address indexed from, uint256 id, uint256 amount); event NftsBridgedOut(address indexed contractAddress, address indexed operator, address indexed from, uint256[] ids, uint256[] amounts); event TransferExternalTokens(address indexed tokenAddress, address indexed to, uint256 count); event SetMintFee(uint16 typeId, uint256 fee); event SetTransmuteFee(uint16 typeId, uint256 fee); event SetMintFeeDefault(uint256 fee); event SetTransmuteFeeDefault(uint256 fee); event SetAllowedCreateTo(uint16 nftType, address contractAddress); event SetAllowedCreateFrom(uint16 nftType, address contractAddress); event SetAllowedTransumtateSingleTo(uint16 nftType, address contractAddress); event SetAllowedTransumtateMultipleTo(uint16 nftType, address contractAddress); address public nftBridge; uint256 public defaultCreateFee; uint256 public defaultTransmuteFee; mapping (uint16 => uint256) private _mintFee; mapping (uint16 => uint256) private _transmuteFee; mapping (uint16 => ICreateRecipe) public allowedCreateTo; mapping (uint16 => ITransmuteSingleRecipe) public allowedTransumtateSingleTo; mapping (uint16 => ITransmuteMultipleRecipe) public allowedTransumtateMultipleTo; mapping (uint16 => address) public allowedCreateFrom; mapping (uint16 => bytes) public baseUris; mapping (BalanceKey => BalanceAmount) private _balanceOf; mapping (address => uint96[]) public tokensHeld; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; StakingAchievement public stakingAchievement; MigrationV1V2Achievement public migrationV1V2Achievement; HolderV2Achievement public holderV2Achievement; constructor(address _owner) { _setRoyaltyAddress(royaltyFeeAddress); StakingAchievement _stakingAchievement = new StakingAchievement(address(this)); MigrationV1V2Achievement _migrationV1V2Achievement = new MigrationV1V2Achievement(address(this)); HolderV2Achievement _holderV2Achievement = new HolderV2Achievement(address(this)); stakingAchievement = _stakingAchievement; migrationV1V2Achievement = _migrationV1V2Achievement; holderV2Achievement = _holderV2Achievement; allowedCreateFrom[1] = address(_stakingAchievement); allowedCreateFrom[2] = address(_migrationV1V2Achievement); allowedCreateTo[3] = _holderV2Achievement; uint256 _defaultCreateFee = getDefaultCreateFee(); defaultCreateFee = _defaultCreateFee; uint256 _defaultTransmuteFee = _defaultCreateFee * 5 / 2; // x2.5 defaultTransmuteFee = _defaultTransmuteFee; emit SetMintFeeDefault(_defaultCreateFee); emit SetTransmuteFeeDefault(_defaultTransmuteFee); setEverRiseToken(EverRiseV3Address); transferOwnership(_owner); _stakingAchievement.transferOwnership(_owner); _migrationV1V2Achievement.transferOwnership(_owner); _holderV2Achievement.transferOwnership(_owner); bytes memory _uri = ipfsAddress; baseUris[1] = _uri; baseUris[2] = _uri; baseUris[3] = _uri; emit TransferSingle(address(this), address(0), address(0), 4295098369, 0); emit TransferSingle(address(this), address(0), address(0), 2, 0); emit TransferSingle(address(this), address(0), address(0), 3, 0); } function name() external pure returns (string memory) { return "EverRise Mementos"; } function symbol() external pure returns (string memory) { return "memeRISE"; } function decimals() external pure returns (uint8) { return 0; } uint256 public totalSupply; function setMintFee(uint16 typeId, uint256 fee) external onlyOwner { _mintFee[typeId] = fee; emit SetMintFee(typeId, fee); } function setTransmuteFee(uint16 typeId, uint256 fee) external onlyOwner { _transmuteFee[typeId] = fee; emit SetTransmuteFee(typeId, fee); } function setMintFeeDefault(uint256 fee) external onlyOwner { defaultCreateFee = fee; emit SetMintFeeDefault(fee); } function setTransmuteFeeDefault(uint256 fee) external onlyOwner { defaultTransmuteFee = fee; emit SetTransmuteFeeDefault(fee); } function mintFee(uint16 typeId) public view returns (uint256) { uint256 fee = _mintFee[typeId]; if (fee == 0) return defaultCreateFee; return fee; } function transmuteFee(uint16 typeId) public view returns (uint256) { uint256 fee = _transmuteFee[typeId]; if (fee == 0) return defaultTransmuteFee; return fee; } function getDefaultCreateFee() private view returns (uint256) { uint256 chainId = block.chainid; if (chainId == 1) // Ethereum return 10000000000000000; // 0.01 if (chainId == 56) // BNB return 10000000000000000; // 0.01 if (chainId == 137) // Polygon return 3000000000000000000; // 3 if (chainId == 250) // Fantom return 3000000000000000000; // 3 if (chainId == 43114) // Avalanche return 50000000000000000; // 0.05 return 3000000000000000000; } function setNftBridge(address _bridge) external onlyOwner { nftBridge = _bridge; emit NftBridgeSet(nftBridge); } function setBaseUriForType(uint16 nftType, string calldata baseUri) external onlyOwner { baseUris[nftType] = bytes(baseUri); emit BaseUriForTypeSet(nftType, baseUri); } function setAllowedCreateTo(uint16 nftType, address contractAddress) external onlyOwner { allowedCreateTo[nftType] = ICreateRecipe(contractAddress); emit SetAllowedCreateTo(nftType, contractAddress); } function setAllowedCreateFrom(uint16 nftType, address contractAddress) external onlyOwner { allowedCreateFrom[nftType] = contractAddress; emit SetAllowedCreateFrom(nftType, contractAddress); } function setAllowedTransumtateSingleTo(uint16 nftType, address contractAddress) external onlyOwner { allowedTransumtateSingleTo[nftType] = ITransmuteSingleRecipe(contractAddress); emit SetAllowedTransumtateSingleTo(nftType, contractAddress); } function setAllowedTransumtateMultipleTo(uint16 nftType, address contractAddress) external onlyOwner { allowedTransumtateMultipleTo[nftType] = ITransmuteMultipleRecipe(contractAddress); emit SetAllowedTransumtateMultipleTo(nftType, contractAddress); } function royaltyAddress() external view returns (address payable) { return payable(address(royaltySplitter)); } function tokenURI(uint256 id) external view returns (string memory) { return uri(id); } function uri(uint256 id) public view returns (string memory) { uint16 nftType = uint16(id & 0xffff); bytes memory baseUri = baseUris[nftType]; require(baseUri.length > 0, "Uri not set"); return string(abi.encodePacked(baseUri, uint2hexstr(id), ".json")); } function uint2hexstr(uint i) public pure returns (string memory) { uint mask = 15; bytes memory bstr = new bytes(64); uint k = 64; while (k > 0) { uint curr = (i & mask); bstr[--k] = curr > 9 ? bytes1(uint8(55 + curr)) : bytes1(uint8(48 + curr)); // 55 = 65 - 10 i = i >> 4; } return string(bstr); } function contractURI() external view returns (string memory) { return string( abi.encodePacked("https://data.everrise.com/data/memerise-", toString(block.chainid), ".json") ); } function _walletLock(address fromAddress) private view { if (everRiseToken.isWalletLocked(fromAddress)) revert WalletLocked(); } modifier walletLock(address fromAddress) { _walletLock(fromAddress); _; } function handleMintFee(uint256 baseFee, uint256 quantity) internal { uint256 totalFee = baseFee * quantity; require(totalFee == 0 || msg.value >= totalFee, "Mint fee not covered"); uint256 _balance = address(this).balance; if (_balance > 0) { // Transfer everything, easier than transferring extras later sendEthViaCall(payable(address(royaltySplitter)), _balance); } } function toBalanceKey(address account, uint256 tokenId) private pure returns (BalanceKey) { if (tokenId > type(uint96).max) revert AmountOutOfRange(); uint256 key = uint256(uint160(account)) << 96 | uint96(tokenId); return BalanceKey.wrap(key); } function balanceOf(address account, uint256 tokenId) view public returns (uint256) { if (account == address(0)) revert NotZeroAddress(); return _balanceOf[toBalanceKey(account, tokenId)].Amount(); } function mint(address to, uint256 tokenId, uint256 amount) external { address requestor = _msgSender(); uint16 nftType = uint16(tokenId & 0xffff); require(allowedCreateFrom[nftType] == requestor, "Requestor not allowed to mint that type"); // Mint new tokens AddBalance(to, tokenId, amount); emit TransferSingle(to, address(0), to, tokenId, amount); } function create(uint256 tokenId, uint256 amount) external payable { uint16 nftType = uint16(tokenId & 0xffff); ICreateRecipe creator = allowedCreateTo[nftType]; if (address(creator) == address(0)) revert NotSetup(); handleMintFee(mintFee(nftType), amount); address from = _msgSender(); creator.createTo(from, tokenId, amount); // Mint new tokens AddBalance(from, tokenId, amount); emit TransferSingle(from, address(0), from, tokenId, amount); } function getAllTokensHeld(address account) external view returns (uint96[] memory tokenIds, uint256[] memory amounts) { uint96[] storage refTokenIds = tokensHeld[account]; uint256 tokenIdsLength = refTokenIds.length; if (tokenIdsLength < 2) { // Position 0 is skipped tokenIds = new uint96[](0); amounts = new uint256[](0); return (tokenIds, amounts); } uint256 length = tokenIdsLength - 1; uint256 position; tokenIds = new uint96[](length); amounts = new uint256[](length); for (uint256 i = 1; i < tokenIdsLength;) { unchecked { position = i - 1; } uint96 tokenId = refTokenIds[i]; tokenIds[position] = tokenId; amounts[position] = _balanceOf[toBalanceKey(account, tokenId)].Amount(); unchecked { ++i; } } } function AddBalance(address account, uint256 tokenId, uint256 amount) private { require(tokenId < type(uint96).max, "Out of range"); BalanceKey key = toBalanceKey(account, tokenId); BalanceAmount currentBalance = _balanceOf[key]; if (currentBalance.getPosition() > 0) { // Simple add _balanceOf[key] = currentBalance.add(amount); } else { uint96[] storage refTokenIds = tokensHeld[account]; uint256 length = refTokenIds.length; if (length == 0) { // Add empty zero item refTokenIds.push(); refTokenIds.push(uint96(tokenId)); _balanceOf[key] = BalanceAmount.wrap((uint256(amount) << 16) | 1); } else { require(length < type(uint16).max, "Too many types"); uint16 position = uint16(length); refTokenIds.push(uint96(tokenId)); _balanceOf[key] = BalanceAmount.wrap((uint256(amount) << 16) | position); } } totalSupply += amount; } function SubtractBalance(address account, uint256 tokenId, uint256 amount) private { require(tokenId < type(uint96).max, "Out of range"); BalanceKey key = toBalanceKey(account, tokenId); BalanceAmount currentBalance = _balanceOf[key]; uint16 position = currentBalance.getPosition(); require (position > 0, "Non-existance"); currentBalance = currentBalance.subtract(amount); if (currentBalance.Amount() > 0) { // Simple decrement _balanceOf[key] = currentBalance; } else { _balanceOf[key] = BalanceAmount.wrap(0); // Remove from position array uint96[] storage refTokenIds = tokensHeld[account]; uint256 length = refTokenIds.length; require (length > 1, "Token List"); uint256 last = length - 1; if (position < last) { uint96 lastTokenId = refTokenIds[last]; key = toBalanceKey(account, lastTokenId); currentBalance = _balanceOf[key]; _balanceOf[key] = currentBalance.setPosition(position); refTokenIds[position] = lastTokenId; } refTokenIds.pop(); } totalSupply -= amount; } function transmuteMultiple(uint256[] calldata toTokenIds, uint256[] calldata toAmounts, uint256[] calldata fromIds, uint256[] calldata fromAmounts) external payable walletLock(_msgSender()) { uint256 fromIdsLength = fromIds.length; require(fromIdsLength > 0, "No input tokens"); require(fromIdsLength == fromAmounts.length, "Input: ids and amounts length mismatch"); uint256 toTokenIdsLength = toTokenIds.length; require(toTokenIdsLength > 0, "No output tokens"); require(toTokenIdsLength == toAmounts.length, "Output: ids and amounts length mismatch"); uint16 nftType = uint16(toTokenIds[0] & 0xffff); uint256 totalAmount; for (uint256 i = 0; i < toTokenIdsLength; i++) { uint256 toTokenId = toTokenIds[i]; require(nftType == uint16(toTokenId & 0xffff), "Not same type outputs"); uint256 toAmount = toAmounts[i]; require(toAmount > 0, "No zero outputs"); totalAmount += toAmount; } ITransmuteMultipleRecipe transmutator = allowedTransumtateMultipleTo[nftType]; if (address(transmutator) == address(0)) revert NotSetup(); handleMintFee(transmuteFee(nftType), totalAmount); _transmuteMultiple(transmutator, toTokenIds, toAmounts, fromIds, fromAmounts); } function _transmuteMultiple(ITransmuteMultipleRecipe transmutator, uint256[] calldata toTokenIds, uint256[] calldata toAmounts, uint256[] calldata fromIds, uint256[] calldata fromAmounts) private { address from = _msgSender(); transmutator.transmuteMultipleTo(from, toTokenIds, toAmounts, fromIds, fromAmounts); // Burn passed in tokens uint256 idsLength = fromIds.length; for (uint256 i = 0; i < idsLength; i++) { uint256 fromId = fromIds[i]; uint256 fromAmount = fromAmounts[i]; SubtractBalance(from, fromId, fromAmount); } emit TransferBatch(from, from, address(0), fromIds, fromAmounts); // Mint new tokens idsLength = toTokenIds.length; for (uint256 i = 0; i < idsLength; i++) { uint256 toTokenId = toTokenIds[i]; uint256 toAmount = toAmounts[i]; AddBalance(from, toTokenId, toAmount); } emit TransferBatch(from, address(0), from, toTokenIds, toAmounts); } function transmuteSingle(uint256 toTokenId, uint256 toAmount, uint256[] calldata fromIds, uint256[] calldata fromAmounts) external payable walletLock(_msgSender()) { uint256 fromIdsLength = fromIds.length; require(fromIdsLength == fromAmounts.length, "ERC1155: ids and amounts length mismatch"); require(toAmount > 0, "No zero output"); uint16 nftType = uint16(toTokenId & 0xffff); ITransmuteSingleRecipe transmutator = allowedTransumtateSingleTo[nftType]; if (address(transmutator) == address(0)) revert NotSetup(); handleMintFee(transmuteFee(nftType), toAmount); address from = _msgSender(); transmutator.transmuteSingleTo(from, toTokenId, toAmount, fromIds, fromAmounts); // Burn passed in tokens for (uint256 i = 0; i < fromIdsLength; i++) { uint256 tokenId = fromIds[i]; uint256 amount = fromAmounts[i]; SubtractBalance(from, tokenId, amount); } emit TransferBatch(from, from, address(0), fromIds, fromAmounts); // Mint new tokens AddBalance(from, toTokenId, toAmount); emit TransferSingle(from, address(0), from, toTokenId, toAmount); } function supportsInterface(bytes4 interfaceId) public view virtual override (ERC165, IERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory) { uint256 accountsLength = accounts.length; require(accountsLength == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accountsLength); for (uint256 i = 0; i < accountsLength; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } // Approval function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } function _setApprovalForAll( address owner, address operator, bool approved ) private { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } // Transfer function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external walletLock(from) { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external walletLock(from) { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } function _safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) private { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); SubtractBalance(from, id, amount); AddBalance(to, id, amount); emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } function _safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) private { uint256 idsLength = ids.length; require(idsLength == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); for (uint256 i = 0; i < idsLength; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; SubtractBalance(from, id, amount); AddBalance(to, id, amount); } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } // Hook checks function _doSafeBatchTransferAcceptanceCheck(address operator, address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) private view { if (isContract(to)) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeTransferAcceptanceCheck(address operator, address from, address to, uint256 id, uint256 amount, bytes calldata data) private view { if (isContract(to)) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } // Bridge functions function bridgeNftOut(address from, uint256 id, uint256 amount) external { address operator = _msgSender(); require(operator == nftBridge, "Only bridge"); _walletLock(from); if (isApprovedForAll(from, operator)) { revert CallerNotApproved(); } SubtractBalance(from, id, amount); emit TransferSingle(operator, from, address(0), id, amount); emit NftBridgedOut(address(this), nftBridge, from, id, amount); } function bridgeNftsOut(address from, uint256[] calldata ids, uint256[] calldata amounts) external { address operator = _msgSender(); require(operator == nftBridge, "Only bridge"); _walletLock(from); if (isApprovedForAll(from, operator)) { revert CallerNotApproved(); } uint256 idsLength = ids.length; require(idsLength == amounts.length, "ERC1155: ids and amounts length mismatch"); for (uint256 i = 0; i < idsLength; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; SubtractBalance(from, id, amount); } emit TransferBatch(operator, from, address(0), ids, amounts); emit NftsBridgedOut(address(this), nftBridge, from, ids, amounts); } function bridgeNftIn(address to, uint256 id, uint256 amount) external { address operator = _msgSender(); require(operator == nftBridge, "Only bridge"); AddBalance(to, id, amount); emit TransferSingle(operator, address(0), to, id, amount); emit NftBridgedIn(address(this), nftBridge, to, id, amount); } function bridgeNftsIn(address to, uint256[] calldata ids, uint256[] calldata amounts) external { address operator = _msgSender(); require(operator == nftBridge, "Only bridge"); uint256 idsLength = ids.length; require(idsLength == amounts.length, "ERC1155: ids and amounts length mismatch"); for (uint256 i = 0; i < idsLength; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; AddBalance(to, id, amount); } emit TransferBatch(operator, address(0), to, ids, amounts); emit NftsBridgedIn(address(this), nftBridge, to, ids, amounts); } // Utility functions function isContract(address account) private view returns (bool) { return account.code.length > 0; } function toString(uint256 value) private pure returns (bytes memory output) { if (value == 0) { return "0"; } uint256 remaining = value; uint256 length; while (remaining != 0) { length++; remaining /= 10; } output = new bytes(length); uint256 position = length; remaining = value; while (remaining != 0) { output[--position] = bytes1(uint8(48 + remaining % 10)); remaining /= 10; } } // Remove trapped tokens 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); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmountMustBeGreaterThanZero","type":"error"},{"inputs":[],"name":"AmountOutOfRange","type":"error"},{"inputs":[],"name":"CallerNotApproved","type":"error"},{"inputs":[],"name":"CallerNotOwner","type":"error"},{"inputs":[],"name":"FailedEthSend","type":"error"},{"inputs":[],"name":"NotSetup","type":"error"},{"inputs":[],"name":"NotZeroAddress","type":"error"},{"inputs":[],"name":"WalletLocked","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"nftType","type":"uint16"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"BaseUriForTypeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"EverRiseTokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"bridge","type":"address"}],"name":"NftBridgeSet","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":"amount","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":"amount","type":"uint256"}],"name":"NftBridgedOut","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":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"NftsBridgedIn","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":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"NftsBridgedOut","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":"contractAddress","type":"address"}],"name":"RoyaltyAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"RoyaltyFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"nftType","type":"uint16"},{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"}],"name":"SetAllowedCreateFrom","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"nftType","type":"uint16"},{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"}],"name":"SetAllowedCreateTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"nftType","type":"uint16"},{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"}],"name":"SetAllowedTransumtateMultipleTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"nftType","type":"uint16"},{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"}],"name":"SetAllowedTransumtateSingleTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"typeId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"SetMintFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"SetMintFeeDefault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"typeId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"SetTransmuteFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"SetTransmuteFeeDefault","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","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":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"allowedCreateFrom","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"allowedCreateTo","outputs":[{"internalType":"contract ICreateRecipe","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"allowedTransumtateMultipleTo","outputs":[{"internalType":"contract ITransmuteMultipleRecipe","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"allowedTransumtateSingleTo","outputs":[{"internalType":"contract ITransmuteSingleRecipe","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"baseUris","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bridgeNftIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bridgeNftOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"bridgeNftsIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"bridgeNftsOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"create","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"defaultCreateFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultRoyaltySplit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultTransmuteFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"everRiseToken","outputs":[{"internalType":"contract IEverRise","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAllTokensHeld","outputs":[{"internalType":"uint96[]","name":"tokenIds","type":"uint96[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holderV2Achievement","outputs":[{"internalType":"contract HolderV2Achievement","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"migrationV1V2Achievement","outputs":[{"internalType":"contract MigrationV1V2Achievement","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"typeId","type":"uint16"}],"name":"mintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"nftBridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltySplitter","outputs":[{"internalType":"contract IEverRoyaltySplitter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"nftType","type":"uint16"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setAllowedCreateFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"nftType","type":"uint16"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setAllowedCreateTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"nftType","type":"uint16"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setAllowedTransumtateMultipleTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"nftType","type":"uint16"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setAllowedTransumtateSingleTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"nftType","type":"uint16"},{"internalType":"string","name":"baseUri","type":"string"}],"name":"setBaseUriForType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"royaltySplitRate","type":"uint256"}],"name":"setDefaultNftRoyaltyFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"setEverRiseToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"typeId","type":"uint16"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setMintFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setMintFeeDefault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bridge","type":"address"}],"name":"setNftBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"typeId","type":"uint16"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setTransmuteFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setTransmuteFeeDefault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingAchievement","outputs":[{"internalType":"contract StakingAchievement","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokensHeld","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"typeId","type":"uint16"}],"name":"transmuteFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"toTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"toAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"fromIds","type":"uint256[]"},{"internalType":"uint256[]","name":"fromAmounts","type":"uint256[]"}],"name":"transmuteMultiple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"toTokenId","type":"uint256"},{"internalType":"uint256","name":"toAmount","type":"uint256"},{"internalType":"uint256[]","name":"fromIds","type":"uint256[]"},{"internalType":"uint256[]","name":"fromAmounts","type":"uint256[]"}],"name":"transmuteSingle","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"uint2hexstr","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405260056003553480156200001657600080fd5b50604051620073c7380380620073c783398101604081905262000039916200083f565b600080546001600160a01b03191633908117825560405190918291600080516020620073a7833981519152908290a35062000088730bfc8f6374028f1a61ae3019e5c845f46157538162000576565b60003060405162000099906200076f565b6001600160a01b039091168152602001604051809103906000f080158015620000c6573d6000803e3d6000fd5b509050600030604051620000da906200077d565b6001600160a01b039091168152602001604051809103906000f08015801562000107573d6000803e3d6000fd5b5090506000306040516200011b906200078b565b6001600160a01b039091168152602001604051809103906000f08015801562000148573d6000803e3d6000fd5b50601180546001600160a01b038087166001600160a01b0319928316811790935560128054878316908416811790915560138054928616928416831790557fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c805484169094179093557f5d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd720805483169093179092556003600090815260096020527fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e78054909216909217905590915062000220620005c0565b905080600581905550600060028260056200023c919062000871565b6200024891906200089f565b60068190556040518381529091507f361f81bf9859e8ff7e84509ee6276217a23296cf8d9a95f69a795da5ba188e969060200160405180910390a16040518181527f767e110cb18739f6f7c12deb132f97152546ce38f20895371668d93aa933f8a79060200160405180910390a1620002d573c17c30e98541188614df99239cabd40280810ca362000649565b620002e086620006c5565b60405163f2fde38b60e01b81526001600160a01b03878116600483015286169063f2fde38b90602401600060405180830381600087803b1580156200032457600080fd5b505af115801562000339573d6000803e3d6000fd5b505060405163f2fde38b60e01b81526001600160a01b0389811660048301528716925063f2fde38b9150602401600060405180830381600087803b1580156200038157600080fd5b505af115801562000396573d6000803e3d6000fd5b505060405163f2fde38b60e01b81526001600160a01b0389811660048301528616925063f2fde38b9150602401600060405180830381600087803b158015620003de57600080fd5b505af1158015620003f3573d6000803e3d6000fd5b5050505060006040518060800160405280604e815260200162007359604e91396001600052600d6020908152815191925062000454917ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c59184019062000799565b506002600052600d6020908152815162000494917f10a81eed9d63d16face5e76357905348e6253d3394086026bb2bf2145d7cc249919084019062000799565b506003600052600d60209081528151620004d4917f26b4a10d0f0b04925c23bd4480ee147c916e5e87a7d68206a533dad160ac81e2919084019062000799565b50604080516401000200018152600060208201819052918291309160008051602062007339833981519152910160405180910390a46040805160028152600060208201819052918291309160008051602062007339833981519152910160405180910390a46040805160038152600060208201819052918291309160008051602062007339833981519152910160405180910390a450505050505050620008fe565b600280546001600160a01b0319166001600160a01b0383169081179091556040517fc3f6f2bdf6d9c842a3bc549613cd55a1e4949821f557b66feb8d73eb7f576d9390600090a250565b6000466001819003620005db57662386f26fc1000091505090565b80603803620005f257662386f26fc1000091505090565b806089036200060a576729a2241af62c000091505090565b8060fa0362000622576729a2241af62c000091505090565b8061a86a036200063a5766b1a2bc2ec5000091505090565b6729a2241af62c000091505090565b6200065362000741565b6001600160a01b0381166200067b576040516366385fa360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f151b7e66bd44c3b053284cb5cc54c216555683d266fbd4518b9dc513064be66d90600090a250565b620006cf62000741565b6001600160a01b038116620006f7576040516366385fa360e01b815260040160405180910390fd5b600080546040516001600160a01b0380851693921691600080516020620073a783398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146200076d57604051632e6c18c960e11b815260040160405180910390fd5b565b6110288062004c8183390190565b610e6b8062005ca983390190565b6108258062006b1483390190565b828054620007a790620008c2565b90600052602060002090601f016020900481019282620007cb576000855562000816565b82601f10620007e657805160ff191683800117855562000816565b8280016001018555821562000816579182015b8281111562000816578251825591602001919060010190620007f9565b506200082492915062000828565b5090565b5b8082111562000824576000815560010162000829565b6000602082840312156200085257600080fd5b81516001600160a01b03811681146200086a57600080fd5b9392505050565b60008160001904831182151516156200089a57634e487b7160e01b600052601160045260246000fd5b500290565b600082620008bd57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680620008d757607f821691505b602082108103620008f857634e487b7160e01b600052602260045260246000fd5b50919050565b614373806200090e6000396000f3fe6080604052600436106103965760003560e01c806379ed19b2116101dc578063c87b56dd11610102578063eda3e65d116100a0578063f2fde38b1161006f578063f2fde38b14610b4a578063f8f2096714610b6a578063ff2aafd714610ba0578063ff6916b314610bc057600080fd5b8063eda3e65d14610aca578063ef9ae33a14610aea578063efa1685f14610b0a578063f242432a14610b2a57600080fd5b8063e060ffa6116100dc578063e060ffa614610a62578063e1539f7014610a82578063e8a3d48514610a95578063e985e9c514610aaa57600080fd5b8063c87b56dd14610a0c578063d441ef4914610a2c578063dc0b748114610a4c57600080fd5b8063991940be1161017a578063ad2f852a11610149578063ad2f852a1461098e578063af91b174146109ac578063b9664101146109cc578063c27afefc146109ec57600080fd5b8063991940be146109055780639de36f3b1461093b5780639f7b45791461095b578063a22cb4651461096e57600080fd5b80638da5cb5b116101b65780638da5cb5b14610874578063908618731461089457806393676d82146108b457806395d89b41146108d457600080fd5b806379ed19b2146107fe5780638116ed72146108345780638a60c4c11461085457600080fd5b8063304d14e2116102c15780634a5846bb1161025f5780635718f41a1161022e5780635718f41a1461077e5780636d07d7121461079e578063756ff919146107be57806377e71675146107de57600080fd5b80634a5846bb146106fb5780634e1273f41461071b5780634ead47161461074857806354497f0a1461075e57600080fd5b80633c93d8be1161029b5780633c93d8be14610670578063411d8f2f146106905780634792cd55146106b057806347f7f1f4146106e857600080fd5b8063304d14e214610614578063313ce567146106345780633bd5b0f21461065057600080fd5b80630e89341c116103395780631a380b12116103085780631a380b12146105515780631f069bb8146105875780632a55205a146105b55780632eb2c2d6146105f457600080fd5b80630e89341c146104db578063156e29f6146104fb57806316f4d1121461051b57806318160ddd1461053b57600080fd5b806306d254da1161037557806306d254da1461042057806306fdde031461044057806307682fd0146104835780630779ace8146104a357600080fd5b8062fdd58e1461039b57806301ffc9a7146103ce57806303d6d110146103fe575b600080fd5b3480156103a757600080fd5b506103bb6103b6366004613564565b610bd6565b6040519081526020015b60405180910390f35b3480156103da57600080fd5b506103ee6103e93660046135a4565b610c2c565b60405190151581526020016103c5565b34801561040a57600080fd5b5061041e6104193660046135c1565b610c99565b005b34801561042c57600080fd5b5061041e61043b3660046135da565b610cdd565b34801561044c57600080fd5b506040805180820190915260118152704576657252697365204d656d656e746f7360781b60208201525b6040516103c5919061364d565b34801561048f57600080fd5b5061041e61049e366004613672565b610d18565b3480156104af57600080fd5b506011546104c3906001600160a01b031681565b6040516001600160a01b0390911681526020016103c5565b3480156104e757600080fd5b506104766104f63660046135c1565b610d8c565b34801561050757600080fd5b5061041e6105163660046136a5565b610ea7565b34801561052757600080fd5b506104766105363660046136d8565b610f6f565b34801561054757600080fd5b506103bb60145481565b34801561055d57600080fd5b506104c361056c3660046136d8565b600b602052600090815260409020546001600160a01b031681565b34801561059357600080fd5b506105a76105a23660046135da565b611009565b6040516103c592919061372e565b3480156105c157600080fd5b506105d56105d036600461378e565b6111b8565b604080516001600160a01b0390931683526020830191909152016103c5565b34801561060057600080fd5b5061041e61060f366004613835565b611204565b34801561062057600080fd5b506012546104c3906001600160a01b031681565b34801561064057600080fd5b50604051600081526020016103c5565b34801561065c57600080fd5b5061041e61066b3660046135c1565b6112ac565b34801561067c57600080fd5b5061047661068b3660046135c1565b6112e9565b34801561069c57600080fd5b506002546104c3906001600160a01b031681565b3480156106bc57600080fd5b506106d06106cb366004613564565b61138c565b6040516001600160601b0390911681526020016103c5565b61041e6106f63660046138ef565b6113d8565b34801561070757600080fd5b5061041e61071636600461399e565b6116b1565b34801561072757600080fd5b5061073b610736366004613a1e565b611805565b6040516103c59190613a89565b34801561075457600080fd5b506103bb60065481565b34801561076a57600080fd5b506103bb6107793660046136d8565b61193a565b34801561078a57600080fd5b5061041e6107993660046135da565b61195f565b3480156107aa57600080fd5b5061041e6107b9366004613a9c565b6119d8565b3480156107ca57600080fd5b5061041e6107d936600461399e565b611a42565b3480156107ea57600080fd5b5061041e6107f93660046136a5565b611bb6565b34801561080a57600080fd5b506104c36108193660046136d8565b600c602052600090815260409020546001600160a01b031681565b34801561084057600080fd5b506001546104c3906001600160a01b031681565b34801561086057600080fd5b5061041e61086f3660046135c1565b611cab565b34801561088057600080fd5b506000546104c3906001600160a01b031681565b3480156108a057600080fd5b506013546104c3906001600160a01b031681565b3480156108c057600080fd5b5061041e6108cf366004613672565b611cbd565b3480156108e057600080fd5b506040805180820190915260088152676d656d655249534560c01b6020820152610476565b34801561091157600080fd5b506104c36109203660046136d8565b600a602052600090815260409020546001600160a01b031681565b34801561094757600080fd5b5061041e610956366004613672565b611d29565b61041e61096936600461378e565b611d95565b34801561097a57600080fd5b5061041e610989366004613afc565b611e91565b34801561099a57600080fd5b506002546001600160a01b03166104c3565b3480156109b857600080fd5b506004546104c3906001600160a01b031681565b3480156109d857600080fd5b5061041e6109e7366004613672565b611ea0565b3480156109f857600080fd5b5061041e610a07366004613b33565b611f0c565b348015610a1857600080fd5b50610476610a273660046135c1565b611f4b565b348015610a3857600080fd5b5061041e610a473660046135da565b611f56565b348015610a5857600080fd5b506103bb60035481565b348015610a6e57600080fd5b5061041e610a7d366004613b6f565b611fac565b61041e610a90366004613b8b565b612000565b348015610aa157600080fd5b50610476612224565b348015610ab657600080fd5b506103ee610ac5366004613c0d565b612253565b348015610ad657600080fd5b5061041e610ae5366004613b6f565b612281565b348015610af657600080fd5b506103bb610b053660046136d8565b6122d5565b348015610b1657600080fd5b5061041e610b253660046136a5565b6122fa565b348015610b3657600080fd5b5061041e610b45366004613c29565b6123b4565b348015610b5657600080fd5b5061041e610b653660046135da565b61244f565b348015610b7657600080fd5b506104c3610b853660046136d8565b6009602052600090815260409020546001600160a01b031681565b348015610bac57600080fd5b5061041e610bbb3660046135c1565b6124d9565b348015610bcc57600080fd5b506103bb60055481565b60006001600160a01b038316610bff576040516366385fa360e01b815260040160405180910390fd5b610c25600e6000610c108686612538565b81526020019081526020016000205460101c90565b9392505050565b60006001600160e01b0319821663152a902d60e11b1480610c5d57506001600160e01b03198216636cdb3d1360e11b145b80610c7857506001600160e01b031982166303a24d0760e21b145b80610c9357506301ffc9a760e01b6001600160e01b03198316145b92915050565b610ca1612585565b60058190556040518181527f361f81bf9859e8ff7e84509ee6276217a23296cf8d9a95f69a795da5ba188e96906020015b60405180910390a150565b610ce5612585565b6001600160a01b038116610d0c576040516366385fa360e01b815260040160405180910390fd5b610d15816125b2565b50565b610d20612585565b61ffff821660008181526009602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527fdd20b1130ab22b031cb7a5d84a67429127607d602dd2c3a3c0fde1c4c7ff7fca91015b60405180910390a15050565b61ffff81166000818152600d602052604081208054606093929190610db090613c8e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddc90613c8e565b8015610e295780601f10610dfe57610100808354040283529160200191610e29565b820191906000526020600020905b815481529060010190602001808311610e0c57829003601f168201915b505050505090506000815111610e745760405162461bcd60e51b815260206004820152600b60248201526a155c9a481b9bdd081cd95d60aa1b60448201526064015b60405180910390fd5b80610e7e856112e9565b604051602001610e8f929190613cc8565b60405160208183030381529060405292505050919050565b61ffff82166000818152600c60205260409020543391906001600160a01b03168214610f255760405162461bcd60e51b815260206004820152602760248201527f526571756573746f72206e6f7420616c6c6f77656420746f206d696e742074686044820152666174207479706560c81b6064820152608401610e6b565b610f308585856125fc565b60408051858152602081018590526001600160a01b03871691600091839160008051602061431e83398151915291015b60405180910390a45050505050565b600d6020526000908152604090208054610f8890613c8e565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb490613c8e565b80156110015780601f10610fd657610100808354040283529160200191611001565b820191906000526020600020905b815481529060010190602001808311610fe457829003601f168201915b505050505081565b6001600160a01b0381166000908152600f602052604090208054606091829160028110156110525750506040805160008082526020820190815281830190925294909350915050565b600061105f600183613d33565b90506000816001600160401b0381111561107b5761107b613d07565b6040519080825280602002602001820160405280156110a4578160200160208202803683370190505b509550816001600160401b038111156110bf576110bf613d07565b6040519080825280602002602001820160405280156110e8578160200160208202803683370190505b50945060015b838110156111ae57600181039150600085828154811061111057611110613d4a565b9060005260206000209060029182820401919006600c029054906101000a90046001600160601b031690508088848151811061114e5761114e613d4a565b60200260200101906001600160601b031690816001600160601b031681525050611188600e6000610c108c856001600160601b0316612538565b87848151811061119a5761119a613d4a565b6020908102919091010152506001016110ee565b5050505050915091565b600080836000036111dc57604051635e85ae7360e01b815260040160405180910390fd5b6002546003546001600160a01b03909116906111f89085613d76565b915091505b9250929050565b8761120e816127a2565b6001600160a01b03891633148061122a575061122a8933612253565b6112915760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610e6b565b6112a1898989898989898961282e565b505050505050505050565b6112b4612585565b60068190556040518181527f767e110cb18739f6f7c12deb132f97152546ce38f20895371668d93aa933f8a790602001610cd2565b604080518181526060818101835291600f9160009160208201818036833701905050905060405b801561138457848316600981116113345761132c816030613d8a565b60f81b611343565b61133f816037613d8a565b60f81b5b8361134d84613da2565b9350838151811061136057611360613d4a565b60200101906001600160f81b031916908160001a905350600486901c955050611310565b509392505050565b600f60205281600052604060002081815481106113a857600080fd5b9060005260206000209060029182820401919006600c02915091509054906101000a90046001600160601b031681565b336113e2816127a2565b83806114225760405162461bcd60e51b815260206004820152600f60248201526e4e6f20696e70757420746f6b656e7360881b6044820152606401610e6b565b8083146114805760405162461bcd60e51b815260206004820152602660248201527f496e7075743a2069647320616e6420616d6f756e7473206c656e677468206d696044820152650e6dac2e8c6d60d31b6064820152608401610e6b565b88806114c15760405162461bcd60e51b815260206004820152601060248201526f4e6f206f757470757420746f6b656e7360801b6044820152606401610e6b565b8088146115205760405162461bcd60e51b815260206004820152602760248201527f4f75747075743a2069647320616e6420616d6f756e7473206c656e677468206d6044820152660d2e6dac2e8c6d60cb1b6064820152608401610e6b565b60008b8b600081811061153557611535613d4a565b9050602002013561ffff169050600080600090505b838110156116425760008e8e8381811061156657611566613d4a565b9050602002013590508061ffff1661ffff168461ffff16146115c25760405162461bcd60e51b81526020600482015260156024820152744e6f742073616d652074797065206f75747075747360581b6044820152606401610e6b565b60008d8d848181106115d6576115d6613d4a565b905060200201359050600081116116215760405162461bcd60e51b815260206004820152600f60248201526e4e6f207a65726f206f75747075747360881b6044820152606401610e6b565b61162b8185613d8a565b93505050808061163a90613db9565b91505061154a565b5061ffff82166000908152600b60205260409020546001600160a01b03168061167e576040516302c2726760e61b815260040160405180910390fd5b61169061168a846122d5565b8361294a565b6116a1818f8f8f8f8f8f8f8f6129cb565b5050505050505050505050505050565b60045433906001600160a01b031681146116dd5760405162461bcd60e51b8152600401610e6b90613dd2565b838281146116fd5760405162461bcd60e51b8152600401610e6b90613df7565b60005b8181101561176057600087878381811061171c5761171c613d4a565b905060200201359050600086868481811061173957611739613d4a565b90506020020135905061174d8a83836125fc565b50508061175990613db9565b9050611700565b50866001600160a01b031660006001600160a01b0316836001600160a01b03166000805160206142fe833981519152898989896040516117a39493929190613e75565b60405180910390a46004546040516001600160a01b03808a1692169030907ff8eec0223e61fb21a9418d0f74bd406cc488700cb40adc84b4fea1ed9bcb5a87906117f4908b908b908b908b90613e75565b60405180910390a450505050505050565b6060838281146118695760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610e6b565b6000816001600160401b0381111561188357611883613d07565b6040519080825280602002602001820160405280156118ac578160200160208202803683370190505b50905060005b8281101561192f576119028888838181106118cf576118cf613d4a565b90506020020160208101906118e491906135da565b8787848181106118f6576118f6613d4a565b90506020020135610bd6565b82828151811061191457611914613d4a565b602090810291909101015261192881613db9565b90506118b2565b509695505050505050565b61ffff8116600090815260076020526040812054808203610c93575050600554919050565b611967612585565b6001600160a01b03811661198e576040516366385fa360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f151b7e66bd44c3b053284cb5cc54c216555683d266fbd4518b9dc513064be66d90600090a250565b6119e0612585565b61ffff83166000908152600d602052604090206119fe9083836134af565b508261ffff167fcc9a40567cb8e27b48f1a5bfcc2110d8cceffe00200ee24ac050c39ade3fedb18383604051611a35929190613ed0565b60405180910390a2505050565b60045433906001600160a01b03168114611a6e5760405162461bcd60e51b8152600401610e6b90613dd2565b611a77866127a2565b611a818682612253565b15611a9f57604051634014f1a560e01b815260040160405180910390fd5b83828114611abf5760405162461bcd60e51b8152600401610e6b90613df7565b60005b81811015611b22576000878783818110611ade57611ade613d4a565b9050602002013590506000868684818110611afb57611afb613d4a565b905060200201359050611b0f8a8383612b98565b505080611b1b90613db9565b9050611ac2565b5060006001600160a01b0316876001600160a01b0316836001600160a01b03166000805160206142fe83398151915289898989604051611b659493929190613e75565b60405180910390a46004546040516001600160a01b03808a1692169030907f0a3fdbd3b9434e5fc9ade247da79eaf7e2d1707500d64db5b1560a764f626285906117f4908b908b908b908b90613e75565b60045433906001600160a01b03168114611be25760405162461bcd60e51b8152600401610e6b90613dd2565b611beb846127a2565b611bf58482612253565b15611c1357604051634014f1a560e01b815260040160405180910390fd5b611c1e848484612b98565b60408051848152602081018490526000916001600160a01b03878116929085169160008051602061431e833981519152910160405180910390a460045460408051858152602081018590526001600160a01b0387811693169130917fe0bf1306ae80358ba075e7e155d3d3100bd1cb7245f654f111d39453f756356a91015b60405180910390a450505050565b611cb3612585565b610d153382612df3565b611cc5612585565b61ffff82166000818152600b602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527fb1d02679ca901853728f6f7c39123cda2def88f2e76a14d1a05c2935f00816059101610d80565b611d31612585565b61ffff82166000818152600a602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527f1b076f90831c47b63fdc4f0786bb37b8982b57b628e166f900b25629c9241d3b9101610d80565b61ffff82166000818152600960205260409020546001600160a01b031680611dd0576040516302c2726760e61b815260040160405180910390fd5b611de2611ddc8361193a565b8461294a565b60003360405163165994d960e21b81526001600160a01b038083166004830152602482018890526044820187905291925090831690635966536490606401600060405180830381600087803b158015611e3a57600080fd5b505af1158015611e4e573d6000803e3d6000fd5b50505050611e5d8186866125fc565b60408051868152602081018690526001600160a01b03831691600091839160008051602061431e8339815191529101610f60565b611e9c338383612e67565b5050565b611ea8612585565b61ffff82166000818152600c602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527f4e3bfcc5c9ecdf35191832c1fea9acb386b20abc50dd2796f7f65e6c2f385df79101610d80565b611f14612585565b6001600160a01b038316611f3b576040516366385fa360e01b815260040160405180910390fd5b611f46838383612f48565b505050565b6060610c9382610d8c565b611f5e612585565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527fc7ba3c390578157af9596e71002363b398c7e5294bab3e788d9df3b2251bbac290602001610cd2565b611fb4612585565b61ffff8216600081815260076020908152604091829020849055815192835282018390527f152156d1d9eb3e2fc375680993f6f491dca9c47939e35f4c06a04a43a08a2f309101610d80565b3361200a816127a2565b8382811461202a5760405162461bcd60e51b8152600401610e6b90613df7565b6000871161206b5760405162461bcd60e51b815260206004820152600e60248201526d139bc81e995c9bc81bdd5d1c1d5d60921b6044820152606401610e6b565b61ffff88166000818152600a60205260409020546001600160a01b0316806120a6576040516302c2726760e61b815260040160405180910390fd5b6120b86120b2836122d5565b8a61294a565b6040516337d415bb60e01b815233906001600160a01b038316906337d415bb906120f29084908f908f908f908f908f908f90600401613eec565b600060405180830381600087803b15801561210c57600080fd5b505af1158015612120573d6000803e3d6000fd5b5050505060005b848110156121895760008a8a8381811061214357612143613d4a565b905060200201359050600089898481811061216057612160613d4a565b905060200201359050612174848383612b98565b5050808061218190613db9565b915050612127565b5060006001600160a01b0316816001600160a01b0316826001600160a01b03166000805160206142fe8339815191528c8c8c8c6040516121cc9493929190613e75565b60405180910390a46121df818c8c6125fc565b604080518c8152602081018c90526001600160a01b03831691600091839160008051602061431e83398151915291015b60405180910390a45050505050505050505050565b606061222f46613001565b60405160200161223f9190613f3b565b604051602081830303815290604052905090565b6001600160a01b03918216600090815260106020908152604080832093909416825291909152205460ff1690565b612289612585565b61ffff8216600081815260086020908152604091829020849055815192835282018390527fdd4719940454f4e3d8bc79a3d99dbc5cb7311cffee06273c4fa1a1b07f2f25809101610d80565b61ffff8116600090815260086020526040812054808203610c93575050600654919050565b60045433906001600160a01b031681146123265760405162461bcd60e51b8152600401610e6b90613dd2565b6123318484846125fc565b60408051848152602081018490526001600160a01b03808716926000929185169160008051602061431e833981519152910160405180910390a460045460408051858152602081018590526001600160a01b0387811693169130917f339e4100371ca3951325b190c421cb3c67f09635d57fc14e6aacfcb52d3873299101611c9d565b856123be816127a2565b6001600160a01b0387163314806123da57506123da8733612253565b6124385760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610e6b565b612446878787878787613109565b50505050505050565b612457612585565b6001600160a01b03811661247e576040516366385fa360e01b815260040160405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6124e1612585565b600a8111156125035760405163c64200e960e01b815260040160405180910390fd5b60038190556040518181527fd9b587d0d884e97b8e3772325d18ffc0412781f43cb5471b8eb5972667724f0190602001610cd2565b60006001600160601b038211156125625760405163c64200e960e01b815260040160405180910390fd5b506001600160601b031660609190911b6bffffffffffffffffffffffff19161790565b6000546001600160a01b031633146125b057604051632e6c18c960e11b815260040160405180910390fd5b565b600280546001600160a01b0319166001600160a01b0383169081179091556040517fc3f6f2bdf6d9c842a3bc549613cd55a1e4949821f557b66feb8d73eb7f576d9390600090a250565b6001600160601b0382106126225760405162461bcd60e51b8152600401610e6b90613fa0565b600061262e8484612538565b6000818152600e602052604090205490915061ffff8116156126685761265481846131a3565b6000838152600e6020526040902055612784565b6001600160a01b0385166000908152600f60205260408120805490918190036126e75781546000838152602080822060028085018755600194850190810490910180546001600160601b03808d16938716600c026101000a93840293021916919091179055868252600e905260409020601087901b9091179055612781565b61ffff81106127295760405162461bcd60e51b815260206004820152600e60248201526d546f6f206d616e7920747970657360901b6044820152606401610e6b565b815460018082018455600084815260208082206002850401805493909416600c026101000a6001600160601b0381810219909416938b160292909217909255858252600e90526040902061ffff8216601087901b1790555b50505b82601460008282546127969190613d8a565b90915550505050505050565b60015460405163060648d160e11b81526001600160a01b03838116600483015290911690630c0c91a290602401602060405180830381865afa1580156127ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128109190613fc6565b15610d15576040516335543b4960e21b815260040160405180910390fd5b8483811461284e5760405162461bcd60e51b8152600401610e6b90613df7565b6001600160a01b0388166128745760405162461bcd60e51b8152600401610e6b90613fe3565b3360005b828110156128e357600089898381811061289457612894613d4a565b90506020020135905060008888848181106128b1576128b1613d4a565b9050602002013590506128c58d8383612b98565b6128d08c83836125fc565b5050806128dc90613db9565b9050612878565b50886001600160a01b03168a6001600160a01b0316826001600160a01b03166000805160206142fe8339815191528b8b8b8b6040516129259493929190613e75565b60405180910390a461293e818b8b8b8b8b8b8b8b6131fc565b50505050505050505050565b60006129568284614028565b90508015806129655750803410155b6129a85760405162461bcd60e51b8152602060048201526014602482015273135a5b9d08199959481b9bdd0818dbdd995c995960621b6044820152606401610e6b565b4780156129c5576002546129c5906001600160a01b031682612df3565b50505050565b60405163b4d36d9d60e01b815233906001600160a01b038b169063b4d36d9d90612a099084908d908d908d908d908d908d908d908d90600401614047565b600060405180830381600087803b158015612a2357600080fd5b505af1158015612a37573d6000803e3d6000fd5b5086925060009150505b81811015612aa3576000878783818110612a5d57612a5d613d4a565b9050602002013590506000868684818110612a7a57612a7a613d4a565b905060200201359050612a8e858383612b98565b50508080612a9b90613db9565b915050612a41565b5060006001600160a01b0316826001600160a01b0316836001600160a01b03166000805160206142fe83398151915289898989604051612ae69493929190613e75565b60405180910390a4508760005b81811015612b555760008b8b83818110612b0f57612b0f613d4a565b90506020020135905060008a8a84818110612b2c57612b2c613d4a565b905060200201359050612b408583836125fc565b50508080612b4d90613db9565b915050612af3565b50816001600160a01b031660006001600160a01b0316836001600160a01b03166000805160206142fe8339815191528d8d8d8d60405161220f9493929190613e75565b6001600160601b038210612bbe5760405162461bcd60e51b8152600401610e6b90613fa0565b6000612bca8484612538565b6000818152600e602052604090205490915061ffff811680612c1e5760405162461bcd60e51b815260206004820152600d60248201526c4e6f6e2d6578697374616e636560981b6044820152606401610e6b565b612c28828561335b565b91506000612c368360101c90565b1115612c52576000838152600e60205260409020829055612dd4565b6000838152600e602090815260408083208390556001600160a01b0389168352600f9091529020805460018111612cb85760405162461bcd60e51b815260206004820152600a602482015269151bdad95b88131a5cdd60b21b6044820152606401610e6b565b6000612cc5600183613d33565b9050808461ffff161015612d8f576000838281548110612ce757612ce7613d4a565b600091825260209091206002820401546001909116600c026101000a90046001600160601b03169050612d1a8a82612538565b6000818152600e60205260409020805461ffff881661ffff19821681179092558654929950975082918691908110612d5457612d54613d4a565b9060005260206000209060029182820401919006600c026101000a8154816001600160601b0302191690836001600160601b03160217905550505b82805480612d9f57612d9f6140b9565b60008281526020902060026000199092019182040180546001600160601b03600c60018516026101000a021916905590555050505b8360146000828254612de69190613d33565b9091555050505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612e40576040519150601f19603f3d011682016040523d82523d6000602084013e612e45565b606091505b5050905080611f465760405163b5747cc760e01b815260040160405180910390fd5b816001600160a01b0316836001600160a01b031603612eda5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610e6b565b6001600160a01b03838116600081815260106020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191015b60405180910390a3505050565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015612f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fbb9190613fc6565b50816001600160a01b0316836001600160a01b03167ff217402c85197de87cd806653771027d1e91101ef79ab35684a580c62b91a9b583604051612f3b91815260200190565b6060816000036130285750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613052578061303c81613db9565b915061304b9050600a83613d76565b915061302c565b806001600160401b0381111561306a5761306a613d07565b6040519080825280601f01601f191660200182016040528015613094576020820181803683370190505b509250839150805b8215613101576130ad600a846140cf565b6130b8906030613d8a565b60f81b846130c583613da2565b925082815181106130d8576130d8613d4a565b60200101906001600160f81b031916908160001a9053506130fa600a84613d76565b925061309c565b505050919050565b6001600160a01b03851661312f5760405162461bcd60e51b8152600401610e6b90613fe3565b3361313b878686612b98565b6131468686866125fc565b856001600160a01b0316876001600160a01b0316826001600160a01b031660008051602061431e833981519152888860405161318c929190918252602082015260400190565b60405180910390a4612446818888888888886133ea565b60006001600160f01b0382106131cb5760405162461bcd60e51b8152600401610e6b90613fa0565b82601081901c61ffff82166131e085836140e3565b61ffff1960109190911b1661ffff909116179250505092915050565b6001600160a01b0387163b156112a15760405163bc197c8160e01b81526001600160a01b0388169063bc197c8190613246908c908c908b908b908b908b908b908b9060040161410e565b602060405180830381865afa92505050801561327f575060408051601f3d908101601f1916820190925261327c91810190614172565b60015b61332b5761328b61418f565b806308c379a0036132c4575061329f6141e5565b806132aa57506132c6565b8060405162461bcd60e51b8152600401610e6b919061364d565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610e6b565b6001600160e01b0319811663bc197c8160e01b1461293e5760405162461bcd60e51b8152600401610e6b9061426e565b60006001600160f01b0382106133835760405162461bcd60e51b8152600401610e6b90613fa0565b82601081901c61ffff8216848210156133d05760405162461bcd60e51b815260206004820152600f60248201526e42616c616e636520746f6f206c6f7760881b6044820152606401610e6b565b61ffff1693900360101b61ffff1916929092179392505050565b6001600160a01b0385163b156124465760405163f23a6e6160e01b81526001600160a01b0386169063f23a6e6190613430908a908a9089908990899089906004016142b6565b602060405180830381865afa925050508015613469575060408051601f3d908101601f1916820190925261346691810190614172565b60015b6134755761328b61418f565b6001600160e01b0319811663f23a6e6160e01b146134a55760405162461bcd60e51b8152600401610e6b9061426e565b5050505050505050565b8280546134bb90613c8e565b90600052602060002090601f0160209004810192826134dd5760008555613523565b82601f106134f65782800160ff19823516178555613523565b82800160010185558215613523579182015b82811115613523578235825591602001919060010190613508565b5061352f929150613533565b5090565b5b8082111561352f5760008155600101613534565b80356001600160a01b038116811461355f57600080fd5b919050565b6000806040838503121561357757600080fd5b61358083613548565b946020939093013593505050565b6001600160e01b031981168114610d1557600080fd5b6000602082840312156135b657600080fd5b8135610c258161358e565b6000602082840312156135d357600080fd5b5035919050565b6000602082840312156135ec57600080fd5b610c2582613548565b60005b838110156136105781810151838201526020016135f8565b838111156129c55750506000910152565b600081518084526136398160208601602086016135f5565b601f01601f19169290920160200192915050565b602081526000610c256020830184613621565b803561ffff8116811461355f57600080fd5b6000806040838503121561368557600080fd5b61368e83613660565b915061369c60208401613548565b90509250929050565b6000806000606084860312156136ba57600080fd5b6136c384613548565b95602085013595506040909401359392505050565b6000602082840312156136ea57600080fd5b610c2582613660565b600081518084526020808501945080840160005b8381101561372357815187529582019590820190600101613707565b509495945050505050565b604080825283519082018190526000906020906060840190828701845b828110156137705781516001600160601b03168452928401929084019060010161374b565b5050508381038285015261378481866136f3565b9695505050505050565b600080604083850312156137a157600080fd5b50508035926020909101359150565b60008083601f8401126137c257600080fd5b5081356001600160401b038111156137d957600080fd5b6020830191508360208260051b85010111156111fd57600080fd5b60008083601f84011261380657600080fd5b5081356001600160401b0381111561381d57600080fd5b6020830191508360208285010111156111fd57600080fd5b60008060008060008060008060a0898b03121561385157600080fd5b61385a89613548565b975061386860208a01613548565b965060408901356001600160401b038082111561388457600080fd5b6138908c838d016137b0565b909850965060608b01359150808211156138a957600080fd5b6138b58c838d016137b0565b909650945060808b01359150808211156138ce57600080fd5b506138db8b828c016137f4565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b03121561390b57600080fd5b88356001600160401b038082111561392257600080fd5b61392e8c838d016137b0565b909a50985060208b013591508082111561394757600080fd5b6139538c838d016137b0565b909850965060408b013591508082111561396c57600080fd5b6139788c838d016137b0565b909650945060608b013591508082111561399157600080fd5b506138db8b828c016137b0565b6000806000806000606086880312156139b657600080fd5b6139bf86613548565b945060208601356001600160401b03808211156139db57600080fd5b6139e789838a016137b0565b90965094506040880135915080821115613a0057600080fd5b50613a0d888289016137b0565b969995985093965092949392505050565b60008060008060408587031215613a3457600080fd5b84356001600160401b0380821115613a4b57600080fd5b613a57888389016137b0565b90965094506020870135915080821115613a7057600080fd5b50613a7d878288016137b0565b95989497509550505050565b602081526000610c2560208301846136f3565b600080600060408486031215613ab157600080fd5b613aba84613660565b925060208401356001600160401b03811115613ad557600080fd5b613ae1868287016137f4565b9497909650939450505050565b8015158114610d1557600080fd5b60008060408385031215613b0f57600080fd5b613b1883613548565b91506020830135613b2881613aee565b809150509250929050565b600080600060608486031215613b4857600080fd5b613b5184613548565b9250613b5f60208501613548565b9150604084013590509250925092565b60008060408385031215613b8257600080fd5b61358083613660565b60008060008060008060808789031215613ba457600080fd5b863595506020870135945060408701356001600160401b0380821115613bc957600080fd5b613bd58a838b016137b0565b90965094506060890135915080821115613bee57600080fd5b50613bfb89828a016137b0565b979a9699509497509295939492505050565b60008060408385031215613c2057600080fd5b61368e83613548565b60008060008060008060a08789031215613c4257600080fd5b613c4b87613548565b9550613c5960208801613548565b9450604087013593506060870135925060808701356001600160401b03811115613c8257600080fd5b613bfb89828a016137f4565b600181811c90821680613ca257607f821691505b602082108103613cc257634e487b7160e01b600052602260045260246000fd5b50919050565b60008351613cda8184602088016135f5565b835190830190613cee8183602088016135f5565b64173539b7b760d91b9101908152600501949350505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015613d4557613d45613d1d565b500390565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082613d8557613d85613d60565b500490565b60008219821115613d9d57613d9d613d1d565b500190565b600081613db157613db1613d1d565b506000190190565b600060018201613dcb57613dcb613d1d565b5060010190565b6020808252600b908201526a4f6e6c792062726964676560a81b604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b81835260006001600160fb1b03831115613e5857600080fd5b8260051b8083602087013760009401602001938452509192915050565b604081526000613e89604083018688613e3f565b8281036020840152613e9c818587613e3f565b979650505050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000613ee4602083018486613ea7565b949350505050565b60018060a01b038816815286602082015285604082015260a060608201526000613f1a60a083018688613e3f565b8281036080840152613f2d818587613e3f565b9a9950505050505050505050565b7f68747470733a2f2f646174612e65766572726973652e636f6d2f646174612f6d815267656d65726973652d60c01b602082015260008251613f848160288501602087016135f5565b64173539b7b760d91b6028939091019283015250602d01919050565b6020808252600c908201526b4f7574206f662072616e676560a01b604082015260600190565b600060208284031215613fd857600080fd5b8151610c2581613aee565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b600081600019048311821515161561404257614042613d1d565b500290565b6001600160a01b038a16815260a06020820181905260009061406c9083018a8c613e3f565b828103604084015261407f81898b613e3f565b90508281036060840152614094818789613e3f565b905082810360808401526140a9818587613e3f565b9c9b505050505050505050505050565b634e487b7160e01b600052603160045260246000fd5b6000826140de576140de613d60565b500690565b60006001600160f01b0382811684821680830382111561410557614105613d1d565b01949350505050565b6001600160a01b0389811682528816602082015260a06040820181905260009061413b908301888a613e3f565b828103606084015261414e818789613e3f565b90508281036080840152614163818587613ea7565b9b9a5050505050505050505050565b60006020828403121561418457600080fd5b8151610c258161358e565b600060033d11156141a85760046000803e5060005160e01c5b90565b601f8201601f191681016001600160401b03811182821017156141de57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d10156141f35790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561422257505050505090565b828501915081518181111561423a5750505050505090565b843d87010160208285010111156142545750505050505090565b614263602082860101876141ab565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03878116825286166020820152604081018590526060810184905260a0608082018190526000906142f19083018486613ea7565b9897505050505050505056fe4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fbc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62a264697066735822122071d342dbdbbc311f858d35bc6379f16f6881f7f05921d63b12aab3660b326dfe64736f6c634300080d00336080604052600280546001600160a01b03191673c17c30e98541188614df99239cabd40280810ca317905534801561003657600080fd5b5060405161102838038061102883398101604081905261005591610172565b600080546001600160a01b031916339081178255604051839282917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061009f816100cc565b5050600380546001600160a01b0319167323cd2e6b283754fd2340a75732f9ddbb5d11807e1790556101a2565b6100d4610145565b6001600160a01b0381166100fb576040516366385fa360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f047bb057cb56af8c7f8b85dbf04218832f6163ba1d8f03b944083b01f977a88290600090a250565b6000546001600160a01b0316331461017057604051632e6c18c960e11b815260040160405180910390fd5b565b60006020828403121561018457600080fd5b81516001600160a01b038116811461019b57600080fd5b9392505050565b610e77806101b16000396000f3fe6080604052600436106100865760003560e01c806373a225571161005957806373a22557146101385780638116ed72146101585780638da5cb5b14610178578063dfbb06dd14610198578063f2fde38b146101ab57600080fd5b806301e089dd1461008b57806328004236146100c857806333a19e2f146100f65780635718f41a14610118575b600080fd5b34801561009757600080fd5b506001546100ab906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100d457600080fd5b506100e86100e3366004610b9d565b6101cb565b6040519081526020016100bf565b34801561010257600080fd5b50610116610111366004610bde565b6102e1565b005b34801561012457600080fd5b50610116610133366004610bde565b61035a565b34801561014457600080fd5b506003546100ab906001600160a01b031681565b34801561016457600080fd5b506002546100ab906001600160a01b031681565b34801561018457600080fd5b506000546100ab906001600160a01b031681565b6101166101a6366004610c02565b6103d3565b3480156101b757600080fd5b506101166101c6366004610bde565b61067b565b600060ff8411156102185760405162461bcd60e51b8152602060048201526012602482015271436861696e206f7574206f662072616e676560701b60448201526064015b60405180910390fd5b60ff8311156102615760405162461bcd60e51b8152602060048201526015602482015274416e696d616c4964206f7574206f662072616e676560581b604482015260640161020f565b60ff8211156102a85760405162461bcd60e51b81526020600482015260136024820152724d6f6e746873206f7574206f662072616e676560681b604482015260640161020f565b60016102b8601086901b82610c3a565b90506102c8601885901b82610c3a565b90506102d8602084901b82610c3a565b95945050505050565b6102e9610705565b6001600160a01b038116610310576040516366385fa360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f047bb057cb56af8c7f8b85dbf04218832f6163ba1d8f03b944083b01f977a88290600090a250565b610362610705565b6001600160a01b038116610389576040516366385fa360e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f151b7e66bd44c3b053284cb5cc54c216555683d266fbd4518b9dc513064be66d90600090a250565b336103dd81610732565b600033600154604051632a24bf8560e11b815261ffff87166004820152919250610460916001600160a01b03909116906354497f0a906024016020604051808303816000875af1158015610435573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104599190610c52565b60016107c1565b6003546040516331eee37160e21b81526001600160a01b03838116600483015260248201869052600092169063c7bb8dc4906044016020604051808303816000875af11580156104b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d89190610c84565b60035460405163a802d82b60e01b815263ffffffff831660048201529192506000916001600160a01b039091169063a802d82b9060240161014060405180830381865afa15801561052d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105519190610d38565b90506001601061055f6107dc565b61056a911b82610c3a565b9050601861058983600001516bffffffffffffffffffffffff166108c9565b610594911b82610c3a565b905060206105a8836060015160ff16610a3c565b6105b3911b82610c3a565b90508681146106045760405162461bcd60e51b815260206004820152601760248201527f496e636f7272656374206e667420726571756573746564000000000000000000604482015260640161020f565b60018054604051630ab714fb60e11b81526001600160a01b038781166004830152602482018b9052604482019390935291169063156e29f690606401600060405180830381600087803b15801561065a57600080fd5b505af115801561066e573d6000803e3d6000fd5b5050505050505050505050565b610683610705565b6001600160a01b0381166106aa576040516366385fa360e01b815260040160405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461073057604051632e6c18c960e11b815260040160405180910390fd5b565b60025460405163060648d160e11b81526001600160a01b03838116600483015290911690630c0c91a290602401602060405180830381865afa15801561077c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a09190610e00565b156107be576040516335543b4960e21b815260040160405180910390fd5b50565b6002546107d8906001600160a01b03168383610aae565b5050565b60004660018114806107ee5750806003145b806107f95750806004145b806108045750806005145b8061080f575080602a145b1561081c57600491505090565b806038148061082b5750806061145b1561083857600291505090565b806089148061084957508062013881145b1561085657600391505090565b8060fa1480610866575080610fa2145b1561087357600191505090565b8061a86a148061088457508061a869145b1561089157600091505090565b60405162461bcd60e51b815260206004820152600d60248201526c2ab735b737bbb71031b430b4b760991b604482015260640161020f565b60006acecb8f1a13695b929c00008211156108e65750600b919050565b6a52b7d2cee7561f3c9c00008211156109015750600a919050565b6a295be960834fb5ca9c000082111561091c57506009919050565b6a14adf4a9514c81119c000082111561093757506008919050565b6a08459508334a94a29c000082111561095257506007919050565b6a0422ca7d2949f07d9c000082111561096d57506006919050565b69d3c20dee1639f99c000082111561098757506005919050565b6969e10006afc3291c00008211156109a157506004919050565b69152cf4e72a974f1c00008211156109bb57506003919050565b690a96738339f1d3dc00008211156109d557506002919050565b69021e0c0013070adc00008211156109ef57506001919050565b683627e8f712373c0000821115610a0857506000919050565b60405162461bcd60e51b8152602060048201526009602482015268151bdbc81cdb585b1b60ba1b604482015260640161020f565b60008082118015610a4e5750600c8211155b15610a57575090565b81601803610a675750600e919050565b81602403610a775750600f919050565b60405162461bcd60e51b815260206004820152600c60248201526b496e76616c69642074696d6560a01b604482015260640161020f565b6000610aba8284610e22565b9050801580610ac95750803410155b610b0c5760405162461bcd60e51b8152602060048201526014602482015273135a5b9d08199959481b9bdd0818dbdd995c995960621b604482015260640161020f565b478015610b1d57610b1d8582610b24565b5050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610b71576040519150601f19603f3d011682016040523d82523d6000602084013e610b76565b606091505b5050905080610b985760405163b5747cc760e01b815260040160405180910390fd5b505050565b600080600060608486031215610bb257600080fd5b505081359360208301359350604090920135919050565b6001600160a01b03811681146107be57600080fd5b600060208284031215610bf057600080fd5b8135610bfb81610bc9565b9392505050565b60008060408385031215610c1557600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b60008219821115610c4d57610c4d610c24565b500190565b600060208284031215610c6457600080fd5b5051919050565b805163ffffffff81168114610c7f57600080fd5b919050565b600060208284031215610c9657600080fd5b610bfb82610c6b565b604051610140810167ffffffffffffffff81118282101715610cd157634e487b7160e01b600052604160045260246000fd5b60405290565b80516bffffffffffffffffffffffff81168114610c7f57600080fd5b805165ffffffffffff81168114610c7f57600080fd5b805160ff81168114610c7f57600080fd5b8051610c7f81610bc9565b805162ffffff81168114610c7f57600080fd5b60006101408284031215610d4b57600080fd5b610d53610c9f565b610d5c83610cd7565b8152610d6a60208401610cd7565b6020820152610d7b60408401610cf3565b6040820152610d8c60608401610d09565b6060820152610d9d60808401610d09565b6080820152610dae60a08401610d1a565b60a0820152610dbf60c08401610c6b565b60c0820152610dd060e08401610c6b565b60e0820152610100610de3818501610d25565b90820152610120610df5848201610d09565b908201529392505050565b600060208284031215610e1257600080fd5b81518015158114610bfb57600080fd5b6000816000190483118215151615610e3c57610e3c610c24565b50029056fea2646970667358221220c59f58d5a63256e7230820bd78e195d441968fc17564d85cca0bb5a88d48556564736f6c634300080d003360a0604052600280546001600160a01b031990811673c17c30e98541188614df99239cabd40280810ca3179091556005805490911673429ca183c5f4b43f09d70580c5365a6d21cccd4717905534801561005857600080fd5b50604051610e6b380380610e6b833981016040819052610077916101b2565b600080546001600160a01b031916339081178255604051839282917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506100c18161010c565b50466001146100e45773c7d43f2b51f44f09fbb8a691a0451e8ffcf36c0a6100fa565b738a2d988fe2e8c6716cbcef1b33df626c692f7b985b6001600160a01b0316608052506101e2565b610114610185565b6001600160a01b03811661013b576040516366385fa360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f047bb057cb56af8c7f8b85dbf04218832f6163ba1d8f03b944083b01f977a88290600090a250565b6000546001600160a01b031633146101b057604051632e6c18c960e11b815260040160405180910390fd5b565b6000602082840312156101c457600080fd5b81516001600160a01b03811681146101db57600080fd5b9392505050565b608051610c6761020460003960008181610229015261037a0152610c676000f3fe60806040526004361061009c5760003560e01c80638116ed72116100645780638116ed72146101a45780638da5cb5b146101c45780638fd3ab80146101e4578063ac2ff9f314610204578063bdcd427f14610217578063f2fde38b1461024b57600080fd5b806301e089dd146100a15780631e6f3d8a146100de57806333a19e2f146101225780634de7b1f6146101445780635718f41a14610184575b600080fd5b3480156100ad57600080fd5b506001546100c1906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100ea57600080fd5b5061010f6100f9366004610b17565b60046020526000908152604090205461ffff1681565b60405161ffff90911681526020016100d5565b34801561012e57600080fd5b5061014261013d366004610b17565b61026b565b005b34801561015057600080fd5b5061017461015f366004610b3b565b60036020526000908152604090205460ff1681565b60405190151581526020016100d5565b34801561019057600080fd5b5061014261019f366004610b17565b6102e4565b3480156101b057600080fd5b506002546100c1906001600160a01b031681565b3480156101d057600080fd5b506000546100c1906001600160a01b031681565b3480156101f057600080fd5b506005546100c1906001600160a01b031681565b610142610212366004610b54565b61035d565b34801561022357600080fd5b506100c17f000000000000000000000000000000000000000000000000000000000000000081565b34801561025757600080fd5b50610142610266366004610b17565b6106c1565b61027361074b565b6001600160a01b03811661029a576040516366385fa360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f047bb057cb56af8c7f8b85dbf04218832f6163ba1d8f03b944083b01f977a88290600090a250565b6102ec61074b565b6001600160a01b038116610313576040516366385fa360e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f151b7e66bd44c3b053284cb5cc54c216555683d266fbd4518b9dc513064be66d90600090a250565b6000336005546040516369ffae4960e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301528381166024830152604482018690529293506000928392169063d3ff5c9290606401606060405180830381865afa1580156103df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104039190610b76565b63ffffffff169250509150600081116104515760405162461bcd60e51b815260206004820152600b60248201526a24b73b30b634b2103a3c3760a91b60448201526064015b60405180910390fd5b60008181526003602052604090205460ff16156104a65760405162461bcd60e51b815260206004820152601360248201527220b63932b0b23c9031b630b4b6b2b2103a3c3760691b6044820152606401610448565b60008181526003602052604090819020805460ff19166001908117909155549051632a24bf8560e11b815261ffff8716600482015261053c916001600160a01b0316906354497f0a906024016020604051808303816000875af1158015610511573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105359190610bb8565b6001610778565b6000601086901c600b81111561055457610554610bd1565b905061055f816107f2565b831161059a5760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b6044820152606401610448565b600081600b8111156105ae576105ae610bd1565b6001600160a01b038616600090815260046020526040902054600160ff929092169190911b915061ffff80821691831616156106245760405162461bcd60e51b8152602060048201526015602482015274105b1c9958591e4818db185a5b5959081b195d995b605a1b6044820152606401610448565b6001600160a01b03868116600081815260046020819052604091829020805461ffff191687871761ffff16179055600180549251630ab714fb60e11b815291820193909352602481018c905260448101929092529091169063156e29f690606401600060405180830381600087803b15801561069f57600080fd5b505af11580156106b3573d6000803e3d6000fd5b505050505050505050505050565b6106c961074b565b6001600160a01b0381166106f0576040516366385fa360e01b815260040160405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461077657604051632e6c18c960e11b815260040160405180910390fd5b565b60015460408051635697c29560e11b815290516107ee926001600160a01b03169163ad2f852a9160048083019260209291908290030181865afa1580156107c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e79190610be7565b8383610a10565b5050565b60008082600b81111561080757610807610bd1565b0361081a575066237dda214e6000919050565b600182600b81111561082e5761082e610bd1565b0361084257506701633c600f176000919050565b600282600b81111561085657610856610bd1565b0361086a57506706f05241853f6000919050565b600382600b81111561087e5761087e610bd1565b036108925750670de0ad9b58f16000919050565b600482600b8111156108a6576108a6610bd1565b036108ba57506745638869f6816000919050565b600582600b8111156108ce576108ce610bd1565b036108e25750678ac719ec3b756000919050565b600682600b8111156108f6576108f6610bd1565b0361090b57506802b5e3a5fe63156000919050565b600782600b81111561091f5761091f610bd1565b03610934575068056bc75515149d6000919050565b600882600b81111561094857610948610bd1565b0361095d5750680d8d72625929356000919050565b600982600b81111561097157610971610bd1565b036109865750681b1ae4cdcaa0dd6000919050565b600a82600b81111561099a5761099a610bd1565b036109af5750683635c9a4ad902d6000919050565b600b82600b8111156109c3576109c3610bd1565b036109d857506887867829565e1d6000919050565b60405162461bcd60e51b815260206004820152600d60248201526c155b9adb9bdddb881b195d995b609a1b6044820152606401610448565b6000610a1c8284610c04565b9050801580610a2b5750803410155b610a6e5760405162461bcd60e51b8152602060048201526014602482015273135a5b9d08199959481b9bdd0818dbdd995c995960621b6044820152606401610448565b478015610a7f57610a7f8582610a86565b5050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610ad3576040519150601f19603f3d011682016040523d82523d6000602084013e610ad8565b606091505b5050905080610afa5760405163b5747cc760e01b815260040160405180910390fd5b505050565b6001600160a01b0381168114610b1457600080fd5b50565b600060208284031215610b2957600080fd5b8135610b3481610aff565b9392505050565b600060208284031215610b4d57600080fd5b5035919050565b60008060408385031215610b6757600080fd5b50508035926020909101359150565b600080600060608486031215610b8b57600080fd5b8351925060208401519150604084015163ffffffff81168114610bad57600080fd5b809150509250925092565b600060208284031215610bca57600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b600060208284031215610bf957600080fd5b8151610b3481610aff565b6000816000190483118215151615610c2c57634e487b7160e01b600052601160045260246000fd5b50029056fea26469706673582212208f5c2ec31480b9e7419926a35e046a4e3c6901ae3770225b444c78d97b7ce7ef64736f6c634300080d003360a0604052600280546001600160a01b03191673c17c30e98541188614df99239cabd40280810ca317905534801561003657600080fd5b5060405161082538038061082583398101604081905261005591610191565b600080546001600160a01b031916339081178255604051839282917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061009f816100eb565b504661a86a146100c357730cd022dde27169b20895e0e2b2b8a33b25e635796100d9565b73c3a8d300333bffe3ddf6166f2bc84e6d38351bed5b6001600160a01b0316608052506101c1565b6100f3610164565b6001600160a01b03811661011a576040516366385fa360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f047bb057cb56af8c7f8b85dbf04218832f6163ba1d8f03b944083b01f977a88290600090a250565b6000546001600160a01b0316331461018f57604051632e6c18c960e11b815260040160405180910390fd5b565b6000602082840312156101a357600080fd5b81516001600160a01b03811681146101ba57600080fd5b9392505050565b6080516106426101e36000396000818161012e015261039a01526106426000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80638116ed72116100665780638116ed72146101035780638da5cb5b14610116578063ccc87d4914610129578063f2fde38b14610150578063f7c106ba1461016357600080fd5b806301e089dd1461009857806333a19e2f146100c85780635718f41a146100dd57806359665364146100f0575b600080fd5b6001546100ab906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100db6100d636600461059e565b610196565b005b6100db6100eb36600461059e565b61020f565b6100db6100fe3660046105c0565b610288565b6002546100ab906001600160a01b031681565b6000546100ab906001600160a01b031681565b6100ab7f000000000000000000000000000000000000000000000000000000000000000081565b6100db61015e36600461059e565b6104cb565b61018661017136600461059e565b60036020526000908152604090205460ff1681565b60405190151581526020016100bf565b61019e610555565b6001600160a01b0381166101c5576040516366385fa360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f047bb057cb56af8c7f8b85dbf04218832f6163ba1d8f03b944083b01f977a88290600090a250565b610217610555565b6001600160a01b03811661023e576040516366385fa360e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f151b7e66bd44c3b053284cb5cc54c216555683d266fbd4518b9dc513064be66d90600090a250565b6001546001600160a01b0316336001600160a01b0316146102e45760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b2103932b8bab2b9ba37b960791b60448201526064015b60405180910390fd5b816003146103285760405162461bcd60e51b815260206004820152601160248201527013999d08191bd95cdb89dd08195e1a5cdd607a1b60448201526064016102db565b806001146103785760405162461bcd60e51b815260206004820152601c60248201527f43616e206f6e6c7920636c61696d206f6e652070657220636861696e0000000060448201526064016102db565b6040516370a0823160e01b81526001600160a01b0384811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156103e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061040791906105f3565b1161044a5760405162461bcd60e51b81526020600482015260136024820152722737ba103437b63234b733902924a9a2903b1960691b60448201526064016102db565b6001600160a01b03831660009081526003602052604090205460ff16156104a55760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b60448201526064016102db565b50506001600160a01b03166000908152600360205260409020805460ff19166001179055565b6104d3610555565b6001600160a01b0381166104fa576040516366385fa360e01b815260040160405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461058057604051632e6c18c960e11b815260040160405180910390fd5b565b80356001600160a01b038116811461059957600080fd5b919050565b6000602082840312156105b057600080fd5b6105b982610582565b9392505050565b6000806000606084860312156105d557600080fd5b6105de84610582565b95602085013595506040909401359392505050565b60006020828403121561060557600080fd5b505191905056fea26469706673582212201d9fbe26287866c52ee9aab93432f3000137878b2d49faab5ce386da0541d86964736f6c634300080d0033c3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62697066733a2f2f62616679626569646a3667793632716b67776936777733326977326b68626a6375736633786566766932677567796b6466617535346d76757835342f6d6574614f75747075742f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e000000000000000000000000033280d3a65b96eb878dd711abe9b2c0dbf740579
Deployed Bytecode
0x6080604052600436106103965760003560e01c806379ed19b2116101dc578063c87b56dd11610102578063eda3e65d116100a0578063f2fde38b1161006f578063f2fde38b14610b4a578063f8f2096714610b6a578063ff2aafd714610ba0578063ff6916b314610bc057600080fd5b8063eda3e65d14610aca578063ef9ae33a14610aea578063efa1685f14610b0a578063f242432a14610b2a57600080fd5b8063e060ffa6116100dc578063e060ffa614610a62578063e1539f7014610a82578063e8a3d48514610a95578063e985e9c514610aaa57600080fd5b8063c87b56dd14610a0c578063d441ef4914610a2c578063dc0b748114610a4c57600080fd5b8063991940be1161017a578063ad2f852a11610149578063ad2f852a1461098e578063af91b174146109ac578063b9664101146109cc578063c27afefc146109ec57600080fd5b8063991940be146109055780639de36f3b1461093b5780639f7b45791461095b578063a22cb4651461096e57600080fd5b80638da5cb5b116101b65780638da5cb5b14610874578063908618731461089457806393676d82146108b457806395d89b41146108d457600080fd5b806379ed19b2146107fe5780638116ed72146108345780638a60c4c11461085457600080fd5b8063304d14e2116102c15780634a5846bb1161025f5780635718f41a1161022e5780635718f41a1461077e5780636d07d7121461079e578063756ff919146107be57806377e71675146107de57600080fd5b80634a5846bb146106fb5780634e1273f41461071b5780634ead47161461074857806354497f0a1461075e57600080fd5b80633c93d8be1161029b5780633c93d8be14610670578063411d8f2f146106905780634792cd55146106b057806347f7f1f4146106e857600080fd5b8063304d14e214610614578063313ce567146106345780633bd5b0f21461065057600080fd5b80630e89341c116103395780631a380b12116103085780631a380b12146105515780631f069bb8146105875780632a55205a146105b55780632eb2c2d6146105f457600080fd5b80630e89341c146104db578063156e29f6146104fb57806316f4d1121461051b57806318160ddd1461053b57600080fd5b806306d254da1161037557806306d254da1461042057806306fdde031461044057806307682fd0146104835780630779ace8146104a357600080fd5b8062fdd58e1461039b57806301ffc9a7146103ce57806303d6d110146103fe575b600080fd5b3480156103a757600080fd5b506103bb6103b6366004613564565b610bd6565b6040519081526020015b60405180910390f35b3480156103da57600080fd5b506103ee6103e93660046135a4565b610c2c565b60405190151581526020016103c5565b34801561040a57600080fd5b5061041e6104193660046135c1565b610c99565b005b34801561042c57600080fd5b5061041e61043b3660046135da565b610cdd565b34801561044c57600080fd5b506040805180820190915260118152704576657252697365204d656d656e746f7360781b60208201525b6040516103c5919061364d565b34801561048f57600080fd5b5061041e61049e366004613672565b610d18565b3480156104af57600080fd5b506011546104c3906001600160a01b031681565b6040516001600160a01b0390911681526020016103c5565b3480156104e757600080fd5b506104766104f63660046135c1565b610d8c565b34801561050757600080fd5b5061041e6105163660046136a5565b610ea7565b34801561052757600080fd5b506104766105363660046136d8565b610f6f565b34801561054757600080fd5b506103bb60145481565b34801561055d57600080fd5b506104c361056c3660046136d8565b600b602052600090815260409020546001600160a01b031681565b34801561059357600080fd5b506105a76105a23660046135da565b611009565b6040516103c592919061372e565b3480156105c157600080fd5b506105d56105d036600461378e565b6111b8565b604080516001600160a01b0390931683526020830191909152016103c5565b34801561060057600080fd5b5061041e61060f366004613835565b611204565b34801561062057600080fd5b506012546104c3906001600160a01b031681565b34801561064057600080fd5b50604051600081526020016103c5565b34801561065c57600080fd5b5061041e61066b3660046135c1565b6112ac565b34801561067c57600080fd5b5061047661068b3660046135c1565b6112e9565b34801561069c57600080fd5b506002546104c3906001600160a01b031681565b3480156106bc57600080fd5b506106d06106cb366004613564565b61138c565b6040516001600160601b0390911681526020016103c5565b61041e6106f63660046138ef565b6113d8565b34801561070757600080fd5b5061041e61071636600461399e565b6116b1565b34801561072757600080fd5b5061073b610736366004613a1e565b611805565b6040516103c59190613a89565b34801561075457600080fd5b506103bb60065481565b34801561076a57600080fd5b506103bb6107793660046136d8565b61193a565b34801561078a57600080fd5b5061041e6107993660046135da565b61195f565b3480156107aa57600080fd5b5061041e6107b9366004613a9c565b6119d8565b3480156107ca57600080fd5b5061041e6107d936600461399e565b611a42565b3480156107ea57600080fd5b5061041e6107f93660046136a5565b611bb6565b34801561080a57600080fd5b506104c36108193660046136d8565b600c602052600090815260409020546001600160a01b031681565b34801561084057600080fd5b506001546104c3906001600160a01b031681565b34801561086057600080fd5b5061041e61086f3660046135c1565b611cab565b34801561088057600080fd5b506000546104c3906001600160a01b031681565b3480156108a057600080fd5b506013546104c3906001600160a01b031681565b3480156108c057600080fd5b5061041e6108cf366004613672565b611cbd565b3480156108e057600080fd5b506040805180820190915260088152676d656d655249534560c01b6020820152610476565b34801561091157600080fd5b506104c36109203660046136d8565b600a602052600090815260409020546001600160a01b031681565b34801561094757600080fd5b5061041e610956366004613672565b611d29565b61041e61096936600461378e565b611d95565b34801561097a57600080fd5b5061041e610989366004613afc565b611e91565b34801561099a57600080fd5b506002546001600160a01b03166104c3565b3480156109b857600080fd5b506004546104c3906001600160a01b031681565b3480156109d857600080fd5b5061041e6109e7366004613672565b611ea0565b3480156109f857600080fd5b5061041e610a07366004613b33565b611f0c565b348015610a1857600080fd5b50610476610a273660046135c1565b611f4b565b348015610a3857600080fd5b5061041e610a473660046135da565b611f56565b348015610a5857600080fd5b506103bb60035481565b348015610a6e57600080fd5b5061041e610a7d366004613b6f565b611fac565b61041e610a90366004613b8b565b612000565b348015610aa157600080fd5b50610476612224565b348015610ab657600080fd5b506103ee610ac5366004613c0d565b612253565b348015610ad657600080fd5b5061041e610ae5366004613b6f565b612281565b348015610af657600080fd5b506103bb610b053660046136d8565b6122d5565b348015610b1657600080fd5b5061041e610b253660046136a5565b6122fa565b348015610b3657600080fd5b5061041e610b45366004613c29565b6123b4565b348015610b5657600080fd5b5061041e610b653660046135da565b61244f565b348015610b7657600080fd5b506104c3610b853660046136d8565b6009602052600090815260409020546001600160a01b031681565b348015610bac57600080fd5b5061041e610bbb3660046135c1565b6124d9565b348015610bcc57600080fd5b506103bb60055481565b60006001600160a01b038316610bff576040516366385fa360e01b815260040160405180910390fd5b610c25600e6000610c108686612538565b81526020019081526020016000205460101c90565b9392505050565b60006001600160e01b0319821663152a902d60e11b1480610c5d57506001600160e01b03198216636cdb3d1360e11b145b80610c7857506001600160e01b031982166303a24d0760e21b145b80610c9357506301ffc9a760e01b6001600160e01b03198316145b92915050565b610ca1612585565b60058190556040518181527f361f81bf9859e8ff7e84509ee6276217a23296cf8d9a95f69a795da5ba188e96906020015b60405180910390a150565b610ce5612585565b6001600160a01b038116610d0c576040516366385fa360e01b815260040160405180910390fd5b610d15816125b2565b50565b610d20612585565b61ffff821660008181526009602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527fdd20b1130ab22b031cb7a5d84a67429127607d602dd2c3a3c0fde1c4c7ff7fca91015b60405180910390a15050565b61ffff81166000818152600d602052604081208054606093929190610db090613c8e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddc90613c8e565b8015610e295780601f10610dfe57610100808354040283529160200191610e29565b820191906000526020600020905b815481529060010190602001808311610e0c57829003601f168201915b505050505090506000815111610e745760405162461bcd60e51b815260206004820152600b60248201526a155c9a481b9bdd081cd95d60aa1b60448201526064015b60405180910390fd5b80610e7e856112e9565b604051602001610e8f929190613cc8565b60405160208183030381529060405292505050919050565b61ffff82166000818152600c60205260409020543391906001600160a01b03168214610f255760405162461bcd60e51b815260206004820152602760248201527f526571756573746f72206e6f7420616c6c6f77656420746f206d696e742074686044820152666174207479706560c81b6064820152608401610e6b565b610f308585856125fc565b60408051858152602081018590526001600160a01b03871691600091839160008051602061431e83398151915291015b60405180910390a45050505050565b600d6020526000908152604090208054610f8890613c8e565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb490613c8e565b80156110015780601f10610fd657610100808354040283529160200191611001565b820191906000526020600020905b815481529060010190602001808311610fe457829003601f168201915b505050505081565b6001600160a01b0381166000908152600f602052604090208054606091829160028110156110525750506040805160008082526020820190815281830190925294909350915050565b600061105f600183613d33565b90506000816001600160401b0381111561107b5761107b613d07565b6040519080825280602002602001820160405280156110a4578160200160208202803683370190505b509550816001600160401b038111156110bf576110bf613d07565b6040519080825280602002602001820160405280156110e8578160200160208202803683370190505b50945060015b838110156111ae57600181039150600085828154811061111057611110613d4a565b9060005260206000209060029182820401919006600c029054906101000a90046001600160601b031690508088848151811061114e5761114e613d4a565b60200260200101906001600160601b031690816001600160601b031681525050611188600e6000610c108c856001600160601b0316612538565b87848151811061119a5761119a613d4a565b6020908102919091010152506001016110ee565b5050505050915091565b600080836000036111dc57604051635e85ae7360e01b815260040160405180910390fd5b6002546003546001600160a01b03909116906111f89085613d76565b915091505b9250929050565b8761120e816127a2565b6001600160a01b03891633148061122a575061122a8933612253565b6112915760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610e6b565b6112a1898989898989898961282e565b505050505050505050565b6112b4612585565b60068190556040518181527f767e110cb18739f6f7c12deb132f97152546ce38f20895371668d93aa933f8a790602001610cd2565b604080518181526060818101835291600f9160009160208201818036833701905050905060405b801561138457848316600981116113345761132c816030613d8a565b60f81b611343565b61133f816037613d8a565b60f81b5b8361134d84613da2565b9350838151811061136057611360613d4a565b60200101906001600160f81b031916908160001a905350600486901c955050611310565b509392505050565b600f60205281600052604060002081815481106113a857600080fd5b9060005260206000209060029182820401919006600c02915091509054906101000a90046001600160601b031681565b336113e2816127a2565b83806114225760405162461bcd60e51b815260206004820152600f60248201526e4e6f20696e70757420746f6b656e7360881b6044820152606401610e6b565b8083146114805760405162461bcd60e51b815260206004820152602660248201527f496e7075743a2069647320616e6420616d6f756e7473206c656e677468206d696044820152650e6dac2e8c6d60d31b6064820152608401610e6b565b88806114c15760405162461bcd60e51b815260206004820152601060248201526f4e6f206f757470757420746f6b656e7360801b6044820152606401610e6b565b8088146115205760405162461bcd60e51b815260206004820152602760248201527f4f75747075743a2069647320616e6420616d6f756e7473206c656e677468206d6044820152660d2e6dac2e8c6d60cb1b6064820152608401610e6b565b60008b8b600081811061153557611535613d4a565b9050602002013561ffff169050600080600090505b838110156116425760008e8e8381811061156657611566613d4a565b9050602002013590508061ffff1661ffff168461ffff16146115c25760405162461bcd60e51b81526020600482015260156024820152744e6f742073616d652074797065206f75747075747360581b6044820152606401610e6b565b60008d8d848181106115d6576115d6613d4a565b905060200201359050600081116116215760405162461bcd60e51b815260206004820152600f60248201526e4e6f207a65726f206f75747075747360881b6044820152606401610e6b565b61162b8185613d8a565b93505050808061163a90613db9565b91505061154a565b5061ffff82166000908152600b60205260409020546001600160a01b03168061167e576040516302c2726760e61b815260040160405180910390fd5b61169061168a846122d5565b8361294a565b6116a1818f8f8f8f8f8f8f8f6129cb565b5050505050505050505050505050565b60045433906001600160a01b031681146116dd5760405162461bcd60e51b8152600401610e6b90613dd2565b838281146116fd5760405162461bcd60e51b8152600401610e6b90613df7565b60005b8181101561176057600087878381811061171c5761171c613d4a565b905060200201359050600086868481811061173957611739613d4a565b90506020020135905061174d8a83836125fc565b50508061175990613db9565b9050611700565b50866001600160a01b031660006001600160a01b0316836001600160a01b03166000805160206142fe833981519152898989896040516117a39493929190613e75565b60405180910390a46004546040516001600160a01b03808a1692169030907ff8eec0223e61fb21a9418d0f74bd406cc488700cb40adc84b4fea1ed9bcb5a87906117f4908b908b908b908b90613e75565b60405180910390a450505050505050565b6060838281146118695760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610e6b565b6000816001600160401b0381111561188357611883613d07565b6040519080825280602002602001820160405280156118ac578160200160208202803683370190505b50905060005b8281101561192f576119028888838181106118cf576118cf613d4a565b90506020020160208101906118e491906135da565b8787848181106118f6576118f6613d4a565b90506020020135610bd6565b82828151811061191457611914613d4a565b602090810291909101015261192881613db9565b90506118b2565b509695505050505050565b61ffff8116600090815260076020526040812054808203610c93575050600554919050565b611967612585565b6001600160a01b03811661198e576040516366385fa360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f151b7e66bd44c3b053284cb5cc54c216555683d266fbd4518b9dc513064be66d90600090a250565b6119e0612585565b61ffff83166000908152600d602052604090206119fe9083836134af565b508261ffff167fcc9a40567cb8e27b48f1a5bfcc2110d8cceffe00200ee24ac050c39ade3fedb18383604051611a35929190613ed0565b60405180910390a2505050565b60045433906001600160a01b03168114611a6e5760405162461bcd60e51b8152600401610e6b90613dd2565b611a77866127a2565b611a818682612253565b15611a9f57604051634014f1a560e01b815260040160405180910390fd5b83828114611abf5760405162461bcd60e51b8152600401610e6b90613df7565b60005b81811015611b22576000878783818110611ade57611ade613d4a565b9050602002013590506000868684818110611afb57611afb613d4a565b905060200201359050611b0f8a8383612b98565b505080611b1b90613db9565b9050611ac2565b5060006001600160a01b0316876001600160a01b0316836001600160a01b03166000805160206142fe83398151915289898989604051611b659493929190613e75565b60405180910390a46004546040516001600160a01b03808a1692169030907f0a3fdbd3b9434e5fc9ade247da79eaf7e2d1707500d64db5b1560a764f626285906117f4908b908b908b908b90613e75565b60045433906001600160a01b03168114611be25760405162461bcd60e51b8152600401610e6b90613dd2565b611beb846127a2565b611bf58482612253565b15611c1357604051634014f1a560e01b815260040160405180910390fd5b611c1e848484612b98565b60408051848152602081018490526000916001600160a01b03878116929085169160008051602061431e833981519152910160405180910390a460045460408051858152602081018590526001600160a01b0387811693169130917fe0bf1306ae80358ba075e7e155d3d3100bd1cb7245f654f111d39453f756356a91015b60405180910390a450505050565b611cb3612585565b610d153382612df3565b611cc5612585565b61ffff82166000818152600b602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527fb1d02679ca901853728f6f7c39123cda2def88f2e76a14d1a05c2935f00816059101610d80565b611d31612585565b61ffff82166000818152600a602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527f1b076f90831c47b63fdc4f0786bb37b8982b57b628e166f900b25629c9241d3b9101610d80565b61ffff82166000818152600960205260409020546001600160a01b031680611dd0576040516302c2726760e61b815260040160405180910390fd5b611de2611ddc8361193a565b8461294a565b60003360405163165994d960e21b81526001600160a01b038083166004830152602482018890526044820187905291925090831690635966536490606401600060405180830381600087803b158015611e3a57600080fd5b505af1158015611e4e573d6000803e3d6000fd5b50505050611e5d8186866125fc565b60408051868152602081018690526001600160a01b03831691600091839160008051602061431e8339815191529101610f60565b611e9c338383612e67565b5050565b611ea8612585565b61ffff82166000818152600c602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527f4e3bfcc5c9ecdf35191832c1fea9acb386b20abc50dd2796f7f65e6c2f385df79101610d80565b611f14612585565b6001600160a01b038316611f3b576040516366385fa360e01b815260040160405180910390fd5b611f46838383612f48565b505050565b6060610c9382610d8c565b611f5e612585565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527fc7ba3c390578157af9596e71002363b398c7e5294bab3e788d9df3b2251bbac290602001610cd2565b611fb4612585565b61ffff8216600081815260076020908152604091829020849055815192835282018390527f152156d1d9eb3e2fc375680993f6f491dca9c47939e35f4c06a04a43a08a2f309101610d80565b3361200a816127a2565b8382811461202a5760405162461bcd60e51b8152600401610e6b90613df7565b6000871161206b5760405162461bcd60e51b815260206004820152600e60248201526d139bc81e995c9bc81bdd5d1c1d5d60921b6044820152606401610e6b565b61ffff88166000818152600a60205260409020546001600160a01b0316806120a6576040516302c2726760e61b815260040160405180910390fd5b6120b86120b2836122d5565b8a61294a565b6040516337d415bb60e01b815233906001600160a01b038316906337d415bb906120f29084908f908f908f908f908f908f90600401613eec565b600060405180830381600087803b15801561210c57600080fd5b505af1158015612120573d6000803e3d6000fd5b5050505060005b848110156121895760008a8a8381811061214357612143613d4a565b905060200201359050600089898481811061216057612160613d4a565b905060200201359050612174848383612b98565b5050808061218190613db9565b915050612127565b5060006001600160a01b0316816001600160a01b0316826001600160a01b03166000805160206142fe8339815191528c8c8c8c6040516121cc9493929190613e75565b60405180910390a46121df818c8c6125fc565b604080518c8152602081018c90526001600160a01b03831691600091839160008051602061431e83398151915291015b60405180910390a45050505050505050505050565b606061222f46613001565b60405160200161223f9190613f3b565b604051602081830303815290604052905090565b6001600160a01b03918216600090815260106020908152604080832093909416825291909152205460ff1690565b612289612585565b61ffff8216600081815260086020908152604091829020849055815192835282018390527fdd4719940454f4e3d8bc79a3d99dbc5cb7311cffee06273c4fa1a1b07f2f25809101610d80565b61ffff8116600090815260086020526040812054808203610c93575050600654919050565b60045433906001600160a01b031681146123265760405162461bcd60e51b8152600401610e6b90613dd2565b6123318484846125fc565b60408051848152602081018490526001600160a01b03808716926000929185169160008051602061431e833981519152910160405180910390a460045460408051858152602081018590526001600160a01b0387811693169130917f339e4100371ca3951325b190c421cb3c67f09635d57fc14e6aacfcb52d3873299101611c9d565b856123be816127a2565b6001600160a01b0387163314806123da57506123da8733612253565b6124385760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610e6b565b612446878787878787613109565b50505050505050565b612457612585565b6001600160a01b03811661247e576040516366385fa360e01b815260040160405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6124e1612585565b600a8111156125035760405163c64200e960e01b815260040160405180910390fd5b60038190556040518181527fd9b587d0d884e97b8e3772325d18ffc0412781f43cb5471b8eb5972667724f0190602001610cd2565b60006001600160601b038211156125625760405163c64200e960e01b815260040160405180910390fd5b506001600160601b031660609190911b6bffffffffffffffffffffffff19161790565b6000546001600160a01b031633146125b057604051632e6c18c960e11b815260040160405180910390fd5b565b600280546001600160a01b0319166001600160a01b0383169081179091556040517fc3f6f2bdf6d9c842a3bc549613cd55a1e4949821f557b66feb8d73eb7f576d9390600090a250565b6001600160601b0382106126225760405162461bcd60e51b8152600401610e6b90613fa0565b600061262e8484612538565b6000818152600e602052604090205490915061ffff8116156126685761265481846131a3565b6000838152600e6020526040902055612784565b6001600160a01b0385166000908152600f60205260408120805490918190036126e75781546000838152602080822060028085018755600194850190810490910180546001600160601b03808d16938716600c026101000a93840293021916919091179055868252600e905260409020601087901b9091179055612781565b61ffff81106127295760405162461bcd60e51b815260206004820152600e60248201526d546f6f206d616e7920747970657360901b6044820152606401610e6b565b815460018082018455600084815260208082206002850401805493909416600c026101000a6001600160601b0381810219909416938b160292909217909255858252600e90526040902061ffff8216601087901b1790555b50505b82601460008282546127969190613d8a565b90915550505050505050565b60015460405163060648d160e11b81526001600160a01b03838116600483015290911690630c0c91a290602401602060405180830381865afa1580156127ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128109190613fc6565b15610d15576040516335543b4960e21b815260040160405180910390fd5b8483811461284e5760405162461bcd60e51b8152600401610e6b90613df7565b6001600160a01b0388166128745760405162461bcd60e51b8152600401610e6b90613fe3565b3360005b828110156128e357600089898381811061289457612894613d4a565b90506020020135905060008888848181106128b1576128b1613d4a565b9050602002013590506128c58d8383612b98565b6128d08c83836125fc565b5050806128dc90613db9565b9050612878565b50886001600160a01b03168a6001600160a01b0316826001600160a01b03166000805160206142fe8339815191528b8b8b8b6040516129259493929190613e75565b60405180910390a461293e818b8b8b8b8b8b8b8b6131fc565b50505050505050505050565b60006129568284614028565b90508015806129655750803410155b6129a85760405162461bcd60e51b8152602060048201526014602482015273135a5b9d08199959481b9bdd0818dbdd995c995960621b6044820152606401610e6b565b4780156129c5576002546129c5906001600160a01b031682612df3565b50505050565b60405163b4d36d9d60e01b815233906001600160a01b038b169063b4d36d9d90612a099084908d908d908d908d908d908d908d908d90600401614047565b600060405180830381600087803b158015612a2357600080fd5b505af1158015612a37573d6000803e3d6000fd5b5086925060009150505b81811015612aa3576000878783818110612a5d57612a5d613d4a565b9050602002013590506000868684818110612a7a57612a7a613d4a565b905060200201359050612a8e858383612b98565b50508080612a9b90613db9565b915050612a41565b5060006001600160a01b0316826001600160a01b0316836001600160a01b03166000805160206142fe83398151915289898989604051612ae69493929190613e75565b60405180910390a4508760005b81811015612b555760008b8b83818110612b0f57612b0f613d4a565b90506020020135905060008a8a84818110612b2c57612b2c613d4a565b905060200201359050612b408583836125fc565b50508080612b4d90613db9565b915050612af3565b50816001600160a01b031660006001600160a01b0316836001600160a01b03166000805160206142fe8339815191528d8d8d8d60405161220f9493929190613e75565b6001600160601b038210612bbe5760405162461bcd60e51b8152600401610e6b90613fa0565b6000612bca8484612538565b6000818152600e602052604090205490915061ffff811680612c1e5760405162461bcd60e51b815260206004820152600d60248201526c4e6f6e2d6578697374616e636560981b6044820152606401610e6b565b612c28828561335b565b91506000612c368360101c90565b1115612c52576000838152600e60205260409020829055612dd4565b6000838152600e602090815260408083208390556001600160a01b0389168352600f9091529020805460018111612cb85760405162461bcd60e51b815260206004820152600a602482015269151bdad95b88131a5cdd60b21b6044820152606401610e6b565b6000612cc5600183613d33565b9050808461ffff161015612d8f576000838281548110612ce757612ce7613d4a565b600091825260209091206002820401546001909116600c026101000a90046001600160601b03169050612d1a8a82612538565b6000818152600e60205260409020805461ffff881661ffff19821681179092558654929950975082918691908110612d5457612d54613d4a565b9060005260206000209060029182820401919006600c026101000a8154816001600160601b0302191690836001600160601b03160217905550505b82805480612d9f57612d9f6140b9565b60008281526020902060026000199092019182040180546001600160601b03600c60018516026101000a021916905590555050505b8360146000828254612de69190613d33565b9091555050505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612e40576040519150601f19603f3d011682016040523d82523d6000602084013e612e45565b606091505b5050905080611f465760405163b5747cc760e01b815260040160405180910390fd5b816001600160a01b0316836001600160a01b031603612eda5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610e6b565b6001600160a01b03838116600081815260106020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191015b60405180910390a3505050565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015612f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fbb9190613fc6565b50816001600160a01b0316836001600160a01b03167ff217402c85197de87cd806653771027d1e91101ef79ab35684a580c62b91a9b583604051612f3b91815260200190565b6060816000036130285750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613052578061303c81613db9565b915061304b9050600a83613d76565b915061302c565b806001600160401b0381111561306a5761306a613d07565b6040519080825280601f01601f191660200182016040528015613094576020820181803683370190505b509250839150805b8215613101576130ad600a846140cf565b6130b8906030613d8a565b60f81b846130c583613da2565b925082815181106130d8576130d8613d4a565b60200101906001600160f81b031916908160001a9053506130fa600a84613d76565b925061309c565b505050919050565b6001600160a01b03851661312f5760405162461bcd60e51b8152600401610e6b90613fe3565b3361313b878686612b98565b6131468686866125fc565b856001600160a01b0316876001600160a01b0316826001600160a01b031660008051602061431e833981519152888860405161318c929190918252602082015260400190565b60405180910390a4612446818888888888886133ea565b60006001600160f01b0382106131cb5760405162461bcd60e51b8152600401610e6b90613fa0565b82601081901c61ffff82166131e085836140e3565b61ffff1960109190911b1661ffff909116179250505092915050565b6001600160a01b0387163b156112a15760405163bc197c8160e01b81526001600160a01b0388169063bc197c8190613246908c908c908b908b908b908b908b908b9060040161410e565b602060405180830381865afa92505050801561327f575060408051601f3d908101601f1916820190925261327c91810190614172565b60015b61332b5761328b61418f565b806308c379a0036132c4575061329f6141e5565b806132aa57506132c6565b8060405162461bcd60e51b8152600401610e6b919061364d565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610e6b565b6001600160e01b0319811663bc197c8160e01b1461293e5760405162461bcd60e51b8152600401610e6b9061426e565b60006001600160f01b0382106133835760405162461bcd60e51b8152600401610e6b90613fa0565b82601081901c61ffff8216848210156133d05760405162461bcd60e51b815260206004820152600f60248201526e42616c616e636520746f6f206c6f7760881b6044820152606401610e6b565b61ffff1693900360101b61ffff1916929092179392505050565b6001600160a01b0385163b156124465760405163f23a6e6160e01b81526001600160a01b0386169063f23a6e6190613430908a908a9089908990899089906004016142b6565b602060405180830381865afa925050508015613469575060408051601f3d908101601f1916820190925261346691810190614172565b60015b6134755761328b61418f565b6001600160e01b0319811663f23a6e6160e01b146134a55760405162461bcd60e51b8152600401610e6b9061426e565b5050505050505050565b8280546134bb90613c8e565b90600052602060002090601f0160209004810192826134dd5760008555613523565b82601f106134f65782800160ff19823516178555613523565b82800160010185558215613523579182015b82811115613523578235825591602001919060010190613508565b5061352f929150613533565b5090565b5b8082111561352f5760008155600101613534565b80356001600160a01b038116811461355f57600080fd5b919050565b6000806040838503121561357757600080fd5b61358083613548565b946020939093013593505050565b6001600160e01b031981168114610d1557600080fd5b6000602082840312156135b657600080fd5b8135610c258161358e565b6000602082840312156135d357600080fd5b5035919050565b6000602082840312156135ec57600080fd5b610c2582613548565b60005b838110156136105781810151838201526020016135f8565b838111156129c55750506000910152565b600081518084526136398160208601602086016135f5565b601f01601f19169290920160200192915050565b602081526000610c256020830184613621565b803561ffff8116811461355f57600080fd5b6000806040838503121561368557600080fd5b61368e83613660565b915061369c60208401613548565b90509250929050565b6000806000606084860312156136ba57600080fd5b6136c384613548565b95602085013595506040909401359392505050565b6000602082840312156136ea57600080fd5b610c2582613660565b600081518084526020808501945080840160005b8381101561372357815187529582019590820190600101613707565b509495945050505050565b604080825283519082018190526000906020906060840190828701845b828110156137705781516001600160601b03168452928401929084019060010161374b565b5050508381038285015261378481866136f3565b9695505050505050565b600080604083850312156137a157600080fd5b50508035926020909101359150565b60008083601f8401126137c257600080fd5b5081356001600160401b038111156137d957600080fd5b6020830191508360208260051b85010111156111fd57600080fd5b60008083601f84011261380657600080fd5b5081356001600160401b0381111561381d57600080fd5b6020830191508360208285010111156111fd57600080fd5b60008060008060008060008060a0898b03121561385157600080fd5b61385a89613548565b975061386860208a01613548565b965060408901356001600160401b038082111561388457600080fd5b6138908c838d016137b0565b909850965060608b01359150808211156138a957600080fd5b6138b58c838d016137b0565b909650945060808b01359150808211156138ce57600080fd5b506138db8b828c016137f4565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b03121561390b57600080fd5b88356001600160401b038082111561392257600080fd5b61392e8c838d016137b0565b909a50985060208b013591508082111561394757600080fd5b6139538c838d016137b0565b909850965060408b013591508082111561396c57600080fd5b6139788c838d016137b0565b909650945060608b013591508082111561399157600080fd5b506138db8b828c016137b0565b6000806000806000606086880312156139b657600080fd5b6139bf86613548565b945060208601356001600160401b03808211156139db57600080fd5b6139e789838a016137b0565b90965094506040880135915080821115613a0057600080fd5b50613a0d888289016137b0565b969995985093965092949392505050565b60008060008060408587031215613a3457600080fd5b84356001600160401b0380821115613a4b57600080fd5b613a57888389016137b0565b90965094506020870135915080821115613a7057600080fd5b50613a7d878288016137b0565b95989497509550505050565b602081526000610c2560208301846136f3565b600080600060408486031215613ab157600080fd5b613aba84613660565b925060208401356001600160401b03811115613ad557600080fd5b613ae1868287016137f4565b9497909650939450505050565b8015158114610d1557600080fd5b60008060408385031215613b0f57600080fd5b613b1883613548565b91506020830135613b2881613aee565b809150509250929050565b600080600060608486031215613b4857600080fd5b613b5184613548565b9250613b5f60208501613548565b9150604084013590509250925092565b60008060408385031215613b8257600080fd5b61358083613660565b60008060008060008060808789031215613ba457600080fd5b863595506020870135945060408701356001600160401b0380821115613bc957600080fd5b613bd58a838b016137b0565b90965094506060890135915080821115613bee57600080fd5b50613bfb89828a016137b0565b979a9699509497509295939492505050565b60008060408385031215613c2057600080fd5b61368e83613548565b60008060008060008060a08789031215613c4257600080fd5b613c4b87613548565b9550613c5960208801613548565b9450604087013593506060870135925060808701356001600160401b03811115613c8257600080fd5b613bfb89828a016137f4565b600181811c90821680613ca257607f821691505b602082108103613cc257634e487b7160e01b600052602260045260246000fd5b50919050565b60008351613cda8184602088016135f5565b835190830190613cee8183602088016135f5565b64173539b7b760d91b9101908152600501949350505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015613d4557613d45613d1d565b500390565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082613d8557613d85613d60565b500490565b60008219821115613d9d57613d9d613d1d565b500190565b600081613db157613db1613d1d565b506000190190565b600060018201613dcb57613dcb613d1d565b5060010190565b6020808252600b908201526a4f6e6c792062726964676560a81b604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b81835260006001600160fb1b03831115613e5857600080fd5b8260051b8083602087013760009401602001938452509192915050565b604081526000613e89604083018688613e3f565b8281036020840152613e9c818587613e3f565b979650505050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000613ee4602083018486613ea7565b949350505050565b60018060a01b038816815286602082015285604082015260a060608201526000613f1a60a083018688613e3f565b8281036080840152613f2d818587613e3f565b9a9950505050505050505050565b7f68747470733a2f2f646174612e65766572726973652e636f6d2f646174612f6d815267656d65726973652d60c01b602082015260008251613f848160288501602087016135f5565b64173539b7b760d91b6028939091019283015250602d01919050565b6020808252600c908201526b4f7574206f662072616e676560a01b604082015260600190565b600060208284031215613fd857600080fd5b8151610c2581613aee565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b600081600019048311821515161561404257614042613d1d565b500290565b6001600160a01b038a16815260a06020820181905260009061406c9083018a8c613e3f565b828103604084015261407f81898b613e3f565b90508281036060840152614094818789613e3f565b905082810360808401526140a9818587613e3f565b9c9b505050505050505050505050565b634e487b7160e01b600052603160045260246000fd5b6000826140de576140de613d60565b500690565b60006001600160f01b0382811684821680830382111561410557614105613d1d565b01949350505050565b6001600160a01b0389811682528816602082015260a06040820181905260009061413b908301888a613e3f565b828103606084015261414e818789613e3f565b90508281036080840152614163818587613ea7565b9b9a5050505050505050505050565b60006020828403121561418457600080fd5b8151610c258161358e565b600060033d11156141a85760046000803e5060005160e01c5b90565b601f8201601f191681016001600160401b03811182821017156141de57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d10156141f35790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561422257505050505090565b828501915081518181111561423a5750505050505090565b843d87010160208285010111156142545750505050505090565b614263602082860101876141ab565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03878116825286166020820152604081018590526060810184905260a0608082018190526000906142f19083018486613ea7565b9897505050505050505056fe4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fbc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62a264697066735822122071d342dbdbbc311f858d35bc6379f16f6881f7f05921d63b12aab3660b326dfe64736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000033280d3a65b96eb878dd711abe9b2c0dbf740579
-----Decoded View---------------
Arg [0] : _owner (address): 0x33280D3A65b96EB878dD711aBe9B2c0Dbf740579
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000033280d3a65b96eb878dd711abe9b2c0dbf740579
Deployed Bytecode Sourcemap
27550:27077:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37294:223;;;;;;;;;;-1:-1:-1;37294:223:0;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;37294:223:0;;;;;;;;45686:370;;;;;;;;;;-1:-1:-1;45686:370:0;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;45686:370:0;1019:187:1;32386:140:0;;;;;;;;;;-1:-1:-1;32386:140:0;;;;;:::i;:::-;;:::i;:::-;;9636:181;;;;;;;;;;-1:-1:-1;9636:181:0;;;;;:::i;:::-;;:::i;31730:99::-;;;;;;;;;;-1:-1:-1;31795:26:0;;;;;;;;;;;;-1:-1:-1;;;31795:26:0;;;;31730:99;;;;;;;:::i;34029:226::-;;;;;;;;;;-1:-1:-1;34029:226:0;;;;;:::i;:::-;;:::i;29843:44::-;;;;;;;;;;-1:-1:-1;29843:44:0;;;;-1:-1:-1;;;;;29843:44:0;;;;;;-1:-1:-1;;;;;2956:32:1;;;2938:51;;2926:2;2911:18;29843:44:0;2765:230:1;35290:301:0;;;;;;;;;;-1:-1:-1;35290:301:0;;;;;:::i;:::-;;:::i;37529:412::-;;;;;;;;;;-1:-1:-1;37529:412:0;;;;;:::i;:::-;;:::i;29543:41::-;;;;;;;;;;-1:-1:-1;29543:41:0;;;;;:::i;:::-;;:::i;32022:26::-;;;;;;;;;;;;;;;;29397:80;;;;;;;;;;-1:-1:-1;29397:80:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;29397:80:0;;;38499:986;;;;;;;;;;-1:-1:-1;38499:986:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;10008:302::-;;;;;;;;;;-1:-1:-1;10008:302:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5705:32:1;;;5687:51;;5769:2;5754:18;;5747:34;;;;5660:18;10008:302:0;5513:274:1;47708:450:0;;;;;;;;;;-1:-1:-1;47708:450:0;;;;;:::i;:::-;;:::i;29894:56::-;;;;;;;;;;-1:-1:-1;29894:56:0;;;;-1:-1:-1;;;;;29894:56:0;;;31937:77;;;;;;;;;;-1:-1:-1;31937:77:0;;31980:5;8114:36:1;;8102:2;8087:18;31937:77:0;7972:184:1;32534:153:0;;;;;;;;;;-1:-1:-1;32534:153:0;;;;;:::i;:::-;;:::i;35599:431::-;;;;;;;;;;-1:-1:-1;35599:431:0;;;;;:::i;:::-;;:::i;9273:43::-;;;;;;;;;;-1:-1:-1;9273:43:0;;;;-1:-1:-1;;;;;9273:43:0;;;29656:47;;;;;;;;;;-1:-1:-1;29656:47:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8559:39:1;;;8541:58;;8529:2;8514:18;29656:47:0;8397:208:1;41979:1367:0;;;;;;:::i;:::-;;:::i;52603:672::-;;;;;;;;;;-1:-1:-1;52603:672:0;;;;;:::i;:::-;;:::i;46064:516::-;;;;;;;;;;-1:-1:-1;46064:516:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;29099:34::-;;;;;;;;;;;;;;;;32695:184;;;;;;;;;;-1:-1:-1;32695:184:0;;;;;:::i;:::-;;:::i;15828:239::-;;;;;;;;;;-1:-1:-1;15828:239:0;;;;;:::i;:::-;;:::i;33828:193::-;;;;;;;;;;-1:-1:-1;33828:193:0;;;;;:::i;:::-;;:::i;51426:806::-;;;;;;;;;;-1:-1:-1;51426:806:0;;;;;:::i;:::-;;:::i;50917:501::-;;;;;;;;;;-1:-1:-1;50917:501:0;;;;;:::i;:::-;;:::i;29484:52::-;;;;;;;;;;-1:-1:-1;29484:52:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;29484:52:0;;;15789:30;;;;;;;;;;-1:-1:-1;15789:30:0;;;;-1:-1:-1;;;;;15789:30:0;;;54057:115;;;;;;;;;;-1:-1:-1;54057:115:0;;;;;:::i;:::-;;:::i;5145:20::-;;;;;;;;;;-1:-1:-1;5145:20:0;;;;-1:-1:-1;;;;;5145:20:0;;;29957:46;;;;;;;;;;-1:-1:-1;29957:46:0;;;;-1:-1:-1;;;;;29957:46:0;;;34764:276;;;;;;;;;;-1:-1:-1;34764:276:0;;;;;:::i;:::-;;:::i;31837:92::-;;;;;;;;;;-1:-1:-1;31904:17:0;;;;;;;;;;;;-1:-1:-1;;;31904:17:0;;;;31837:92;;29314:76;;;;;;;;;;-1:-1:-1;29314:76:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;29314:76:0;;;34488:268;;;;;;;;;;-1:-1:-1;34488:268:0;;;;;:::i;:::-;;:::i;37953:538::-;;;;;;:::i;:::-;;:::i;46607:155::-;;;;;;;;;;-1:-1:-1;46607:155:0;;;;;:::i;:::-;;:::i;35048:125::-;;;;;;;;;;-1:-1:-1;35148:15:0;;-1:-1:-1;;;;;35148:15:0;35048:125;;29030:24;;;;;;;;;;-1:-1:-1;29030:24:0;;;;-1:-1:-1;;;;;29030:24:0;;;34263:217;;;;;;;;;;-1:-1:-1;34263:217:0;;;;;:::i;:::-;;:::i;54180:228::-;;;;;;;;;;-1:-1:-1;54180:228:0;;;;;:::i;:::-;;:::i;35181:101::-;;;;;;;;;;-1:-1:-1;35181:101:0;;;;;:::i;:::-;;:::i;33683:137::-;;;;;;;;;;-1:-1:-1;33683:137:0;;;;;:::i;:::-;;:::i;9323:38::-;;;;;;;;;;;;;;;;32057:149;;;;;;;;;;-1:-1:-1;32057:149:0;;;;;:::i;:::-;;:::i;44426:1252::-;;;;;;:::i;:::-;;:::i;36038:251::-;;;;;;;;;;;;;:::i;47100:168::-;;;;;;;;;;-1:-1:-1;47100:168:0;;;;;:::i;:::-;;:::i;32214:164::-;;;;;;;;;;-1:-1:-1;32214:164:0;;;;;:::i;:::-;;:::i;32887:197::-;;;;;;;;;;-1:-1:-1;32887:197:0;;;;;:::i;:::-;;:::i;52240:355::-;;;;;;;;;;-1:-1:-1;52240:355:0;;;;;:::i;:::-;;:::i;47295:405::-;;;;;;;;;;-1:-1:-1;47295:405:0;;;;;:::i;:::-;;:::i;5518:214::-;;;;;;;;;;-1:-1:-1;5518:214:0;;;;;:::i;:::-;;:::i;29251:56::-;;;;;;;;;;-1:-1:-1;29251:56:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;29251:56:0;;;9370:258;;;;;;;;;;-1:-1:-1;9370:258:0;;;;;:::i;:::-;;:::i;29061:31::-;;;;;;;;;;;;;;;;37294:223;37368:7;-1:-1:-1;;;;;37392:21:0;;37388:50;;37422:16;;-1:-1:-1;;;37422:16:0;;;;;;;;;;;37388:50;37458:51;:10;:42;37469:30;37482:7;37491;37469:12;:30::i;:::-;37458:42;;;;;;;;;;;;27056:2;27043:15;;26892:175;37458:51;37451:58;37294:223;-1:-1:-1;;;37294:223:0:o;45686:370::-;45789:4;-1:-1:-1;;;;;;45827:41:0;;-1:-1:-1;;;45827:41:0;;:99;;-1:-1:-1;;;;;;;45885:41:0;;-1:-1:-1;;;45885:41:0;45827:99;:168;;;-1:-1:-1;;;;;;;45943:52:0;;-1:-1:-1;;;45943:52:0;45827:168;:221;;;-1:-1:-1;;;;;;;;;;8746:40:0;;;46012:36;45806:242;45686:370;-1:-1:-1;;45686:370:0:o;32386:140::-;5318:12;:10;:12::i;:::-;32456:16:::1;:22:::0;;;32496::::1;::::0;597:25:1;;;32496:22:0::1;::::0;585:2:1;570:18;32496:22:0::1;;;;;;;;32386:140:::0;:::o;9636:181::-;5318:12;:10;:12::i;:::-;-1:-1:-1;;;;;9717:24:0;::::1;9713:53;;9750:16;;-1:-1:-1::0;;;9750:16:0::1;;;;;;;;;;;9713:53;9779:30;9798:10;9779:18;:30::i;:::-;9636:181:::0;:::o;34029:226::-;5318:12;:10;:12::i;:::-;34128:24:::1;::::0;::::1;;::::0;;;:15:::1;:24;::::0;;;;;;;;:57;;-1:-1:-1;;;;;;34128:57:0::1;-1:-1:-1::0;;;;;34128:57:0;::::1;::::0;;::::1;::::0;;;34203:44;;16845:38:1;;;16899:18;;;16892:60;34203:44:0::1;::::0;16818:18:1;34203:44:0::1;;;;;;;;34029:226:::0;;:::o;35290:301::-;35391:6;35386:11;;35362:14;35432:17;;;:8;:17;;;;;35409:40;;35336:13;;35386:11;35362:14;35432:17;35409:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35487:1;35470:7;:14;:18;35462:42;;;;-1:-1:-1;;;35462:42:0;;17550:2:1;35462:42:0;;;17532:21:1;17589:2;17569:18;;;17562:30;-1:-1:-1;;;17608:18:1;;;17601:41;17659:18;;35462:42:0;;;;;;;;;35548:7;35557:15;35569:2;35557:11;:15::i;:::-;35531:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35517:66;;;;35290:301;;;:::o;37529:412::-;37685:6;37675:16;;37608:17;37711:26;;;:17;:26;;;;;;5025:10;;37675:16;-1:-1:-1;;;;;37711:26:0;:39;;37703:91;;;;-1:-1:-1;;;37703:91:0;;18530:2:1;37703:91:0;;;18512:21:1;18569:2;18549:18;;;18542:30;18608:34;18588:18;;;18581:62;-1:-1:-1;;;18659:18:1;;;18652:37;18706:19;;37703:91:0;18328:403:1;37703:91:0;37835:31;37846:2;37850:7;37859:6;37835:10;:31::i;:::-;37882:51;;;18910:25:1;;;18966:2;18951:18;;18944:34;;;-1:-1:-1;;;;;37882:51:0;;;37909:1;;37882:51;;-1:-1:-1;;;;;;;;;;;37882:51:0;18883:18:1;37882:51:0;;;;;;;;37597:344;;37529:412;;;:::o;29543:41::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38499:986::-;-1:-1:-1;;;;;38659:19:0;;38628:28;38659:19;;;:10;:19;;;;;38714:18;;38565:24;;;;38766:1;38749:18;;38745:197;;;-1:-1:-1;;38833:15:0;;;38846:1;38833:15;;;;;;38873:16;;;;;;;;;38833:15;;;-1:-1:-1;38499:986:0;-1:-1:-1;;38499:986:0:o;38745:197::-;38954:14;38971:18;38988:1;38971:14;:18;:::i;:::-;38954:35;;39000:16;39051:6;-1:-1:-1;;;;;39038:20:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39038:20:0;;39027:31;;39093:6;-1:-1:-1;;;;;39079:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39079:21:0;-1:-1:-1;39069:31:0;-1:-1:-1;39128:1:0;39111:367;39135:14;39131:1;:18;39111:367;;;39211:1;39207;:5;39196:16;;39242:14;39259:11;39271:1;39259:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39259:14:0;39242:31;;39309:7;39288:8;39297;39288:18;;;;;;;;:::i;:::-;;;;;;:28;-1:-1:-1;;;;;39288:28:0;;;-1:-1:-1;;;;;39288:28:0;;;;;39351:51;:10;:42;39362:30;39375:7;39384;-1:-1:-1;;;;;39362:30:0;:12;:30::i;39351:51::-;39331:7;39339:8;39331:17;;;;;;;;:::i;:::-;;;;;;;;;;:71;-1:-1:-1;39448:3:0;;39111:367;;;;38617:868;;;;38499:986;;;:::o;10008:302::-;10100:16;10127:21;10171:8;10183:1;10171:13;10167:55;;10193:29;;-1:-1:-1;;;10193:29:0;;;;;;;;;;;10167:55;10251:15;;10282:19;;-1:-1:-1;;;;;10251:15:0;;;;10269:32;;:10;:32;:::i;:::-;10235:67;;;;10008:302;;;;;;:::o;47708:450::-;47910:4;36499:24;36511:11;36499;:24::i;:::-;-1:-1:-1;;;;;47949:20:0;::::1;5025:10:::0;47949:20:::1;::::0;:60:::1;;-1:-1:-1::0;47973:36:0::1;47990:4:::0;5025:10;47100:168;:::i;47973:36::-:1;47927:160;;;::::0;-1:-1:-1;;;47927:160:0;;19974:2:1;47927:160:0::1;::::0;::::1;19956:21:1::0;20013:2;19993:18;;;19986:30;20052:34;20032:18;;;20025:62;-1:-1:-1;;;20103:18:1;;;20096:48;20161:19;;47927:160:0::1;19772:414:1::0;47927:160:0::1;48098:52;48121:4;48127:2;48131:3;;48136:7;;48145:4;;48098:22;:52::i;:::-;47708:450:::0;;;;;;;;;:::o;32534:153::-;5318:12;:10;:12::i;:::-;32609:19:::1;:25:::0;;;32652:27:::1;::::0;597:25:1;;;32652:27:0::1;::::0;585:2:1;570:18;32652:27:0::1;451:177:1::0;35599:431:0;35730:2;35720:13;;;;;35649;35720;;;;;35649;35687:2;;35675:9;;35720:13;;;;;;;;;;-1:-1:-1;;35700:33:0;-1:-1:-1;35753:2:0;35766:227;35773:5;;35766:227;;35808:8;;;35851:1;35844:8;;:96;;35929:9;35934:4;35929:2;:9;:::i;:::-;35916:24;;35844:96;;;35885:9;35890:4;35885:2;:9;:::i;:::-;35872:24;;35844:96;35832:4;35837:3;;;:::i;:::-;;;;35832:9;;;;;;;;:::i;:::-;;;;:108;-1:-1:-1;;;;;35832:108:0;;;;;;;;;35980:1;35975;:6;;35971:10;;35780:213;35766:227;;;-1:-1:-1;36017:4:0;35599:431;-1:-1:-1;;;35599:431:0:o;29656:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29656:47:0;;:::o;41979:1367::-;5025:10;36499:24;36511:11;36499;:24::i;:::-;42204:7;42237:17;42229:45:::1;;;::::0;-1:-1:-1;;;42229:45:0;;20667:2:1;42229:45:0::1;::::0;::::1;20649:21:1::0;20706:2;20686:18;;;20679:30;-1:-1:-1;;;20725:18:1;;;20718:45;20780:18;;42229:45:0::1;20465:339:1::0;42229:45:0::1;42293:35:::0;;::::1;42285:86;;;::::0;-1:-1:-1;;;42285:86:0;;21011:2:1;42285:86:0::1;::::0;::::1;20993:21:1::0;21050:2;21030:18;;;21023:30;21089:34;21069:18;;;21062:62;-1:-1:-1;;;21140:18:1;;;21133:36;21186:19;;42285:86:0::1;20809:402:1::0;42285:86:0::1;42409:10:::0;42445:20;42437:49:::1;;;::::0;-1:-1:-1;;;42437:49:0;;21418:2:1;42437:49:0::1;::::0;::::1;21400:21:1::0;21457:2;21437:18;;;21430:30;-1:-1:-1;;;21476:18:1;;;21469:46;21532:18;;42437:49:0::1;21216:340:1::0;42437:49:0::1;42505:36:::0;;::::1;42497:88;;;::::0;-1:-1:-1;;;42497:88:0;;21763:2:1;42497:88:0::1;::::0;::::1;21745:21:1::0;21802:2;21782:18;;;21775:30;21841:34;21821:18;;;21814:62;-1:-1:-1;;;21892:18:1;;;21885:37;21939:19;;42497:88:0::1;21561:403:1::0;42497:88:0::1;42606:14;42630:10;;42641:1;42630:13;;;;;;;:::i;:::-;;;;;;;42646:6;42630:22;42606:47;;42666:19;42701:9:::0;42713:1:::1;42701:13;;42696:332;42720:16;42716:1;:20;42696:332;;;42758:17;42778:10;;42789:1;42778:13;;;;;;;:::i;:::-;;;;;;;42758:33;;42832:9;42844:6;42832:18;42814:37;;:7;:37;;;42806:71;;;::::0;-1:-1:-1;;;42806:71:0;;22171:2:1;42806:71:0::1;::::0;::::1;22153:21:1::0;22210:2;22190:18;;;22183:30;-1:-1:-1;;;22229:18:1;;;22222:51;22290:18;;42806:71:0::1;21969:345:1::0;42806:71:0::1;42892:16;42911:9;;42921:1;42911:12;;;;;;;:::i;:::-;;;;;;;42892:31;;42957:1;42946:8;:12;42938:40;;;::::0;-1:-1:-1;;;42938:40:0;;22521:2:1;42938:40:0::1;::::0;::::1;22503:21:1::0;22560:2;22540:18;;;22533:30;-1:-1:-1;;;22579:18:1;;;22572:45;22634:18;;42938:40:0::1;22319:339:1::0;42938:40:0::1;42993:23;43008:8:::0;42993:23;::::1;:::i;:::-;;;42743:285;;42738:3;;;;;:::i;:::-;;;;42696:332;;;-1:-1:-1::0;43080:37:0::1;::::0;::::1;43040;43080::::0;;;:28:::1;:37;::::0;;;;;-1:-1:-1;;;;;43080:37:0::1;::::0;43128:58:::1;;43176:10;;-1:-1:-1::0;;;43176:10:0::1;;;;;;;;;;;43128:58;43199:49;43213:21;43226:7;43213:12;:21::i;:::-;43236:11;43199:13;:49::i;:::-;43261:77;43280:12;43294:10;;43306:9;;43317:7;;43326:11;;43261:18;:77::i;:::-;42169:1177;;;;;41979:1367:::0;;;;;;;;;:::o;52603:672::-;52771:9;;5025:10;;-1:-1:-1;;;;;52771:9:0;52759:21;;52751:45;;;;-1:-1:-1;;;52751:45:0;;;;;;;:::i;:::-;52827:3;52856:27;;;52848:80;;;;-1:-1:-1;;;52848:80:0;;;;;;;:::i;:::-;52946:9;52941:183;52965:9;52961:1;:13;52941:183;;;52996:10;53009:3;;53013:1;53009:6;;;;;;;:::i;:::-;;;;;;;52996:19;;53030:14;53047:7;;53055:1;53047:10;;;;;;;:::i;:::-;;;;;;;53030:27;;53086:26;53097:2;53101;53105:6;53086:10;:26::i;:::-;52981:143;;52976:3;;;;:::i;:::-;;;52941:183;;;;53177:2;-1:-1:-1;;;;;53141:53:0;53173:1;-1:-1:-1;;;;;53141:53:0;53155:8;-1:-1:-1;;;;;53141:53:0;-1:-1:-1;;;;;;;;;;;53181:3:0;;53186:7;;53141:53;;;;;;;;;:::i;:::-;;;;;;;;53239:9;;53210:57;;-1:-1:-1;;;;;53210:57:0;;;;53239:9;;53232:4;;53210:57;;;;53254:3;;;;53259:7;;;;53210:57;:::i;:::-;;;;;;;;52698:577;;52603:672;;;;;:::o;46064:516::-;46164:16;46223:8;46257:28;;;46249:82;;;;-1:-1:-1;;;46249:82:0;;24637:2:1;46249:82:0;;;24619:21:1;24676:2;24656:18;;;24649:30;24715:34;24695:18;;;24688:62;-1:-1:-1;;;24766:18:1;;;24759:39;24815:19;;46249:82:0;24435:405:1;46249:82:0;46344:30;46391:14;-1:-1:-1;;;;;46377:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46377:29:0;;46344:62;;46424:9;46419:121;46443:14;46439:1;:18;46419:121;;;46498:30;46508:8;;46517:1;46508:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;46521:3;;46525:1;46521:6;;;;;;;:::i;:::-;;;;;;;46498:9;:30::i;:::-;46479:13;46493:1;46479:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;46459:3;;;:::i;:::-;;;46419:121;;;-1:-1:-1;46559:13:0;46064:516;-1:-1:-1;;;;;;46064:516:0:o;32695:184::-;32782:16;;;32748:7;32782:16;;;:8;:16;;;;;;32815:8;;;32811:37;;-1:-1:-1;;32832:16:0;;;32695:184;-1:-1:-1;32695:184:0:o;15828:239::-;5318:12;:10;:12::i;:::-;-1:-1:-1;;;;;15908:26:0;::::1;15904:55;;15943:16;;-1:-1:-1::0;;;15943:16:0::1;;;;;;;;;;;15904:55;15972:13;:39:::0;;-1:-1:-1;;;;;;15972:39:0::1;-1:-1:-1::0;;;;;15972:39:0;::::1;::::0;;::::1;::::0;;;16029:30:::1;::::0;::::1;::::0;-1:-1:-1;;16029:30:0::1;15828:239:::0;:::o;33828:193::-;5318:12;:10;:12::i;:::-;33926:17:::1;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:34:::1;::::0;33952:7;;33926:34:::1;:::i;:::-;;33996:7;33978:35;;;34005:7;;33978:35;;;;;;;:::i;:::-;;;;;;;;33828:193:::0;;;:::o;51426:806::-;51597:9;;5025:10;;-1:-1:-1;;;;;51597:9:0;51585:21;;51577:45;;;;-1:-1:-1;;;51577:45:0;;;;;;;:::i;:::-;51633:17;51645:4;51633:11;:17::i;:::-;51667:32;51684:4;51690:8;51667:16;:32::i;:::-;51663:91;;;51723:19;;-1:-1:-1;;;51723:19:0;;;;;;;;;;;51663:91;51784:3;51813:27;;;51805:80;;;;-1:-1:-1;;;51805:80:0;;;;;;;:::i;:::-;51903:9;51898:178;51922:9;51918:1;:13;51898:178;;;51953:10;51966:3;;51970:1;51966:6;;;;;;;:::i;:::-;;;;;;;51953:19;;51987:14;52004:7;;52012:1;52004:10;;;;;;;:::i;:::-;;;;;;;51987:27;;52031:33;52047:4;52053:2;52057:6;52031:15;:33::i;:::-;51938:138;;51933:3;;;;:::i;:::-;;;51898:178;;;;52131:1;-1:-1:-1;;;;;52093:55:0;52117:4;-1:-1:-1;;;;;52093:55:0;52107:8;-1:-1:-1;;;;;52093:55:0;-1:-1:-1;;;;;;;;;;;52135:3:0;;52140:7;;52093:55;;;;;;;;;:::i;:::-;;;;;;;;52194:9;;52164:60;;-1:-1:-1;;;;;52164:60:0;;;;52194:9;;52187:4;;52164:60;;;;52211:3;;;;52216:7;;;;52164:60;:::i;50917:501::-;51063:9;;5025:10;;-1:-1:-1;;;;;51063:9:0;51051:21;;51043:45;;;;-1:-1:-1;;;51043:45:0;;;;;;;:::i;:::-;51099:17;51111:4;51099:11;:17::i;:::-;51133:32;51150:4;51156:8;51133:16;:32::i;:::-;51129:91;;;51189:19;;-1:-1:-1;;;51189:19:0;;;;;;;;;;;51129:91;51232:33;51248:4;51254:2;51258:6;51232:15;:33::i;:::-;51283:54;;;18910:25:1;;;18966:2;18951:18;;18944:34;;;51322:1:0;;-1:-1:-1;;;;;51283:54:0;;;;;;;;-1:-1:-1;;;;;;;;;;;51283:54:0;18883:18:1;51283:54:0;;;;;;;51382:9;;51353:57;;;18910:25:1;;;18966:2;18951:18;;18944:34;;;-1:-1:-1;;;;;51353:57:0;;;;51382:9;;51375:4;;51353:57;;18883:18:1;51353:57:0;;;;;;;;50990:428;50917:501;;;:::o;54057:115::-;5318:12;:10;:12::i;:::-;54128:36:::1;5025:10:::0;54157:6:::1;54128:14;:36::i;34764:276::-:0;5318:12;:10;:12::i;:::-;34876:37:::1;::::0;::::1;;::::0;;;:28:::1;:37;::::0;;;;;;;;:81;;-1:-1:-1;;;;;;34876:81:0::1;-1:-1:-1::0;;;;;34876:81:0;::::1;::::0;;::::1;::::0;;;34975:57;;16845:38:1;;;16899:18;;;16892:60;34975:57:0::1;::::0;16818:18:1;34975:57:0::1;16673:285:1::0;34488:268:0;5318:12;:10;:12::i;:::-;34598:35:::1;::::0;::::1;;::::0;;;:26:::1;:35;::::0;;;;;;;;:77;;-1:-1:-1;;;;;;34598:77:0::1;-1:-1:-1::0;;;;;34598:77:0;::::1;::::0;;::::1;::::0;;;34693:55;;16845:38:1;;;16899:18;;;16892:60;34693:55:0::1;::::0;16818:18:1;34693:55:0::1;16673:285:1::0;37953:538:0;38064:6;38054:16;;38030:14;38106:24;;;:15;:24;;;;;;-1:-1:-1;;;;;38106:24:0;;38143:53;;38186:10;;-1:-1:-1;;;38186:10:0;;;;;;;;;;;38143:53;38209:39;38223:16;38231:7;38223;:16::i;:::-;38241:6;38209:13;:39::i;:::-;38261:12;5025:10;38299:39;;-1:-1:-1;;;38299:39:0;;-1:-1:-1;;;;;25589:32:1;;;38299:39:0;;;25571:51:1;25638:18;;;25631:34;;;25681:18;;;25674:34;;;38261:27:0;;-1:-1:-1;38299:16:0;;;;;;25544:18:1;;38299:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38379:33;38390:4;38396:7;38405:6;38379:10;:33::i;:::-;38428:55;;;18910:25:1;;;18966:2;18951:18;;18944:34;;;-1:-1:-1;;;;;38428:55:0;;;38457:1;;38428:55;;-1:-1:-1;;;;;;;;;;;38428:55:0;18883:18:1;38428:55:0;18736:248:1;46607:155:0;46702:52;5025:10;46735:8;46745;46702:18;:52::i;:::-;46607:155;;:::o;34263:217::-;5318:12;:10;:12::i;:::-;34364:26:::1;::::0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;;;;:44;;-1:-1:-1;;;;;;34364:44:0::1;-1:-1:-1::0;;;;;34364:44:0;::::1;::::0;;::::1;::::0;;;34426:46;;16845:38:1;;;16899:18;;;16892:60;34426:46:0::1;::::0;16818:18:1;34426:46:0::1;16673:285:1::0;54180:228:0;5318:12;:10;:12::i;:::-;-1:-1:-1;;;;;54296:26:0;::::1;54292:55;;54331:16;;-1:-1:-1::0;;;54331:16:0::1;;;;;;;;;;;54292:55;54360:40;54375:12;54389:2;54393:6;54360:14;:40::i;:::-;54180:228:::0;;;:::o;35181:101::-;35234:13;35267:7;35271:2;35267:3;:7::i;33683:137::-;5318:12;:10;:12::i;:::-;33752:9:::1;:19:::0;;-1:-1:-1;;;;;;33752:19:0::1;-1:-1:-1::0;;;;;33752:19:0;::::1;::::0;;::::1;::::0;;;33789:23:::1;::::0;2938:51:1;;;33789:23:0::1;::::0;2926:2:1;2911:18;33789:23:0::1;2765:230:1::0;32057:149:0;5318:12;:10;:12::i;:::-;32135:16:::1;::::0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;;;;:22;;;32175:23;;25891:38:1;;;25945:18;;25938:34;;;32175:23:0::1;::::0;25864:18:1;32175:23:0::1;25719:259:1::0;44426:1252:0;5025:10;36499:24;36511:11;36499;:24::i;:::-;44625:7;44658:35;;::::1;44650:88;;;;-1:-1:-1::0;;;44650:88:0::1;;;;;;;:::i;:::-;44768:1;44757:8;:12;44749:39;;;::::0;-1:-1:-1;;;44749:39:0;;26185:2:1;44749:39:0::1;::::0;::::1;26167:21:1::0;26224:2;26204:18;;;26197:30;-1:-1:-1;;;26243:18:1;;;26236:44;26297:18;;44749:39:0::1;25983:338:1::0;44749:39:0::1;44845:6;44833:18:::0;::::1;44809:14;44901:35:::0;;;:26:::1;:35;::::0;;;;;-1:-1:-1;;;;;44901:35:0::1;::::0;44947:58:::1;;44995:10;;-1:-1:-1::0;;;44995:10:0::1;;;;;;;;;;;44947:58;45018:46;45032:21;45045:7;45032:12;:21::i;:::-;45055:8;45018:13;:46::i;:::-;45115:79;::::0;-1:-1:-1;;;45115:79:0;;5025:10;;-1:-1:-1;;;;;45115:30:0;::::1;::::0;::::1;::::0;:79:::1;::::0;5025:10;;45152:9;;45163:8;;45173:7;;;;45182:11;;;;45115:79:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;45246:9;45241:200;45265:13;45261:1;:17;45241:200;;;45300:15;45318:7;;45326:1;45318:10;;;;;;;:::i;:::-;;;;;;;45300:28;;45343:14;45360:11;;45372:1;45360:14;;;;;;;:::i;:::-;;;;;;;45343:31;;45391:38;45407:4;45413:7;45422:6;45391:15;:38::i;:::-;45285:156;;45280:3;;;;;:::i;:::-;;;;45241:200;;;;45492:1;-1:-1:-1::0;;;;;45458:59:0::1;45478:4;-1:-1:-1::0;;;;;45458:59:0::1;45472:4;-1:-1:-1::0;;;;;45458:59:0::1;-1:-1:-1::0;;;;;;;;;;;45496:7:0::1;;45505:11;;45458:59;;;;;;;;;:::i;:::-;;;;;;;;45558:37;45569:4;45575:9;45586:8;45558:10;:37::i;:::-;45611:59;::::0;;18910:25:1;;;18966:2;18951:18;;18944:34;;;-1:-1:-1;;;;;45611:59:0;::::1;::::0;45640:1:::1;::::0;45611:59;;-1:-1:-1;;;;;;;;;;;45611:59:0;18883:18:1;45611:59:0::1;;;;;;;;44590:1088;;;;44426:1252:::0;;;;;;;:::o;36038:251::-;36084:13;36220:23;36229:13;36220:8;:23::i;:::-;36142:128;;;;;;;;:::i;:::-;;;;;;;;;;;;;36110:171;;36038:251;:::o;47100:168::-;-1:-1:-1;;;;;47223:27:0;;;47199:4;47223:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;47100:168::o;32214:164::-;5318:12;:10;:12::i;:::-;32297:21:::1;::::0;::::1;;::::0;;;:13:::1;:21;::::0;;;;;;;;:27;;;32342:28;;25891:38:1;;;25945:18;;25938:34;;;32342:28:0::1;::::0;25864:18:1;32342:28:0::1;25719:259:1::0;32887:197:0;32979:21;;;32945:7;32979:21;;;:13;:21;;;;;;33017:8;;;33013:40;;-1:-1:-1;;33034:19:0;;;32887:197;-1:-1:-1;32887:197:0:o;52240:355::-;52383:9;;5025:10;;-1:-1:-1;;;;;52383:9:0;52371:21;;52363:45;;;;-1:-1:-1;;;52363:45:0;;;;;;;:::i;:::-;52421:26;52432:2;52436;52440:6;52421:10;:26::i;:::-;52465:52;;;18910:25:1;;;18966:2;18951:18;;18944:34;;;-1:-1:-1;;;;;52465:52:0;;;;52498:1;;52465:52;;;;-1:-1:-1;;;;;;;;;;;52465:52:0;18883:18:1;52465:52:0;;;;;;;52561:9;;52533:54;;;18910:25:1;;;18966:2;18951:18;;18944:34;;;-1:-1:-1;;;;;52533:54:0;;;;52561:9;;52554:4;;52533:54;;18883:18:1;52533:54:0;18736:248:1;47295:405:0;47468:4;36499:24;36511:11;36499;:24::i;:::-;-1:-1:-1;;;;;47507:20:0;::::1;5025:10:::0;47507:20:::1;::::0;:60:::1;;-1:-1:-1::0;47531:36:0::1;47548:4:::0;5025:10;47100:168;:::i;47531:36::-:1;47485:151;;;::::0;-1:-1:-1;;;47485:151:0;;27946:2:1;47485:151:0::1;::::0;::::1;27928:21:1::0;27985:2;27965:18;;;27958:30;28024:34;28004:18;;;27997:62;-1:-1:-1;;;28075:18:1;;;28068:39;28124:19;;47485:151:0::1;27744:405:1::0;47485:151:0::1;47647:45;47665:4;47671:2;47675;47679:6;47687:4;;47647:17;:45::i;:::-;47295:405:::0;;;;;;;:::o;5518:214::-;5318:12;:10;:12::i;:::-;-1:-1:-1;;;;;5595:22:0;::::1;5591:51;;5626:16;;-1:-1:-1::0;;;5626:16:0::1;;;;;;;;;;;5591:51;5681:5;::::0;;5660:37:::1;::::0;-1:-1:-1;;;;;5660:37:0;;::::1;::::0;5681:5;::::1;::::0;5660:37:::1;::::0;::::1;5708:5;:16:::0;;-1:-1:-1;;;;;;5708:16:0::1;-1:-1:-1::0;;;;;5708:16:0;;;::::1;::::0;;;::::1;::::0;;5518:214::o;9370:258::-;5318:12;:10;:12::i;:::-;9489:2:::1;9470:16;:21;9466:52;;;9500:18;;-1:-1:-1::0;;;9500:18:0::1;;;;;;;;;;;9466:52;9529:19;:38:::0;;;9585:35:::1;::::0;597:25:1;;;9585:35:0::1;::::0;585:2:1;570:18;9585:35:0::1;451:177:1::0;37006:280:0;37084:10;-1:-1:-1;;;;;37111:26:0;;37107:57;;;37146:18;;-1:-1:-1;;;37146:18:0;;;;;;;;;;;37107:57;-1:-1:-1;;;;;;37191:49:0;37220:2;37191:31;;;;-1:-1:-1;;37191:31:0;:49;;37006:280::o;5174:104::-;5224:5;;-1:-1:-1;;;;;5224:5:0;5025:10;5224:21;5220:50;;5254:16;;-1:-1:-1;;;5254:16:0;;;;;;;;;;;5220:50;5174:104::o;9825:175::-;9893:15;:50;;-1:-1:-1;;;;;;9893:50:0;-1:-1:-1;;;;;9893:50:0;;;;;;;;9959:33;;;;-1:-1:-1;;9959:33:0;9825:175;:::o;39493:1127::-;-1:-1:-1;;;;;39590:26:0;;39582:51;;;;-1:-1:-1;;;39582:51:0;;;;;;;:::i;:::-;39646:14;39663:30;39676:7;39685;39663:12;:30::i;:::-;39704:28;39735:15;;;:10;:15;;;;;;;;-1:-1:-1;27239:6:0;27227:18;;39765:32;39761:818;;39859:26;:14;39878:6;39859:18;:26::i;:::-;39841:15;;;;:10;:15;;;;;:44;39761:818;;;-1:-1:-1;;;;;39949:19:0;;39918:28;39949:19;;;:10;:19;;;;;40000:18;;39949:19;;40037:11;;;40033:535;;40109:18;;-1:-1:-1;40109:18:0;;;;;;;;40146:33;;;;;40109:18;;;;40146:33;;;;;;;;-1:-1:-1;;;;;40146:33:0;;;;;;40109:18;40146:33;40109:18;40146:33;;;;;;;;;;;;;;40198:15;;;:10;:15;;;;;40255:2;40236:21;;;40235:27;;;40198:65;;40033:535;;;40321:16;40312:25;;40304:52;;;;-1:-1:-1;;;40304:52:0;;28697:2:1;40304:52:0;;;28679:21:1;28736:2;28716:18;;;28709:30;-1:-1:-1;;;28755:18:1;;;28748:44;28809:18;;40304:52:0;28495:338:1;40304:52:0;40428:33;;;;;;;;-1:-1:-1;40428:33:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40428:33:0;;;;;;;;;;;;;;;;;;40480:15;;;:10;:15;;;;;40517:34;;;40537:2;40518:21;;;40517:34;40480:72;;40033:535;39903:676;;39761:818;40606:6;40591:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;39493:1127:0:o;36297:142::-;36367:13;;:41;;-1:-1:-1;;;36367:41:0;;-1:-1:-1;;;;;2956:32:1;;;36367:41:0;;;2938:51:1;36367:13:0;;;;:28;;2911:18:1;;36367:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36363:68;;;36417:14;;-1:-1:-1;;;36417:14:0;;;;;;;;;;;48641:784;48811:3;48840:27;;;48832:80;;;;-1:-1:-1;;;48832:80:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48931:16:0;;48923:66;;;;-1:-1:-1;;;48923:66:0;;;;;;;:::i;:::-;5025:10;49002:16;49046:219;49070:9;49066:1;:13;49046:219;;;49101:10;49114:3;;49118:1;49114:6;;;;;;;:::i;:::-;;;;;;;49101:19;;49135:14;49152:7;;49160:1;49152:10;;;;;;;:::i;:::-;;;;;;;49135:27;;49179:33;49195:4;49201:2;49205:6;49179:15;:33::i;:::-;49227:26;49238:2;49242;49246:6;49227:10;:26::i;:::-;49086:179;;49081:3;;;;:::i;:::-;;;49046:219;;;;49312:2;-1:-1:-1;;;;;49282:47:0;49306:4;-1:-1:-1;;;;;49282:47:0;49296:8;-1:-1:-1;;;;;49282:47:0;-1:-1:-1;;;;;;;;;;;49316:3:0;;49321:7;;49282:47;;;;;;;;;:::i;:::-;;;;;;;;49342:75;49378:8;49388:4;49394:2;49398:3;;49403:7;;49412:4;;49342:35;:75::i;:::-;48780:645;;48641:784;;;;;;;;:::o;36551:447::-;36629:16;36648:18;36658:8;36648:7;:18;:::i;:::-;36629:37;-1:-1:-1;36685:13:0;;;:38;;;36715:8;36702:9;:21;;36685:38;36677:71;;;;-1:-1:-1;;;36677:71:0;;29869:2:1;36677:71:0;;;29851:21:1;29908:2;29888:18;;;29881:30;-1:-1:-1;;;29927:18:1;;;29920:50;29987:18;;36677:71:0;29667:344:1;36677:71:0;36780:21;36816:12;;36812:179;;36951:15;;36920:59;;-1:-1:-1;;;;;36951:15:0;36970:8;36920:14;:59::i;:::-;36618:380;;36551:447;;:::o;43354:1064::-;43599:83;;-1:-1:-1;;;43599:83:0;;5025:10;;-1:-1:-1;;;;;43599:32:0;;;;;:83;;5025:10;;43638;;;;43650:9;;;;43661:7;;;;43670:11;;;;43599:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43749:7:0;;-1:-1:-1;43729:17:0;;-1:-1:-1;;43774:202:0;43798:9;43794:1;:13;43774:202;;;43829:14;43846:7;;43854:1;43846:10;;;;;;;:::i;:::-;;;;;;;43829:27;;43871:18;43892:11;;43904:1;43892:14;;;;;;;:::i;:::-;;;;;;;43871:35;;43923:41;43939:4;43945:6;43953:10;43923:15;:41::i;:::-;43814:162;;43809:3;;;;;:::i;:::-;;;;43774:202;;;;44027:1;-1:-1:-1;;;;;43993:59:0;44013:4;-1:-1:-1;;;;;43993:59:0;44007:4;-1:-1:-1;;;;;43993:59:0;-1:-1:-1;;;;;;;;;;;44031:7:0;;44040:11;;43993:59;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;44105:10:0;44138:9;44133:200;44157:9;44153:1;:13;44133:200;;;44188:17;44208:10;;44219:1;44208:13;;;;;;;:::i;:::-;;;;;;;44188:33;;44236:16;44255:9;;44265:1;44255:12;;;;;;;:::i;:::-;;;;;;;44236:31;;44284:37;44295:4;44301:9;44312:8;44284:10;:37::i;:::-;44173:160;;44168:3;;;;;:::i;:::-;;;;44133:200;;;;44382:4;-1:-1:-1;;;;;44350:60:0;44378:1;-1:-1:-1;;;;;44350:60:0;44364:4;-1:-1:-1;;;;;44350:60:0;-1:-1:-1;;;;;;;;;;;44388:10:0;;44400:9;;44350:60;;;;;;;;;:::i;40628:1343::-;-1:-1:-1;;;;;40730:26:0;;40722:51;;;;-1:-1:-1;;;40722:51:0;;;;;;;:::i;:::-;40786:14;40803:30;40816:7;40825;40803:12;:30::i;:::-;40844:28;40875:15;;;:10;:15;;;;;;;;-1:-1:-1;27239:6:0;27227:18;;40969:12;40960:39;;;;-1:-1:-1;;;40960:39:0;;31304:2:1;40960:39:0;;;31286:21:1;31343:2;31323:18;;;31316:30;-1:-1:-1;;;31362:18:1;;;31355:43;31415:18;;40960:39:0;31102:337:1;40960:39:0;41029:31;:14;41053:6;41029:23;:31::i;:::-;41012:48;;41103:1;41077:23;:14;27056:2;27043:15;;26892:175;41077:23;:27;41073:857;;;41154:15;;;;:10;:15;;;;;:32;;;41073:857;;;41256:1;41219:15;;;:10;:15;;;;;;;;:39;;;-1:-1:-1;;;;;41347:19:0;;;;:10;:19;;;;;41398:18;;41449:1;41440:10;;41431:34;;;;-1:-1:-1;;;41431:34:0;;31646:2:1;41431:34:0;;;31628:21:1;31685:2;31665:18;;;31658:30;-1:-1:-1;;;31704:18:1;;;31697:40;31754:18;;41431:34:0;31444:334:1;41431:34:0;41482:12;41497:10;41506:1;41497:6;:10;:::i;:::-;41482:25;;41537:4;41526:8;:15;;;41522:351;;;41562:18;41583:11;41595:4;41583:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41583:17:0;;-1:-1:-1;41643:34:0;41656:7;41583:17;41643:12;:34::i;:::-;41713:15;;;;:10;:15;;;;;;;27500:34;;;-1:-1:-1;;27501:21:0;;27500:34;;41749:54;;;41822:21;;41713:15;;-1:-1:-1;41713:15:0;-1:-1:-1;41846:11:0;;41822:21;;27500:34;41822:21;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:35;;;;;-1:-1:-1;;;;;41822:35:0;;;;;-1:-1:-1;;;;;41822:35:0;;;;;;41543:330;41522:351;41901:11;:17;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;41901:17:0;;;;;;;;;-1:-1:-1;;;;;41901:17:0;;;;;;;;;;;;;;-1:-1:-1;;;41073:857:0;41957:6;41942:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;40628:1343:0:o;3829:174::-;3910:9;3925:2;-1:-1:-1;;;;;3925:7:0;3940:6;3925:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3909:42;;;3967:4;3962:33;;3980:15;;-1:-1:-1;;;3980:15:0;;;;;;;;;;;46770:322;46916:8;-1:-1:-1;;;;;46907:17:0;:5;-1:-1:-1;;;;;46907:17:0;;46899:71;;;;-1:-1:-1;;;46899:71:0;;32327:2:1;46899:71:0;;;32309:21:1;32366:2;32346:18;;;32339:30;32405:34;32385:18;;;32378:62;-1:-1:-1;;;32456:18:1;;;32449:39;32505:19;;46899:71:0;32125:405:1;46899:71:0;-1:-1:-1;;;;;46981:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;46981:46:0;;;;;;;;;;47043:41;;1159::1;;;47043::0;;1132:18:1;47043:41:0;;;;;;;;46770:322;;;:::o;54416:208::-;54509:41;;-1:-1:-1;;;54509:41:0;;-1:-1:-1;;;;;5705:32:1;;;54509:41:0;;;5687:51:1;5754:18;;;5747:34;;;54509:29:0;;;;;5660:18:1;;54509:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54605:2;-1:-1:-1;;;;;54568:48:0;54591:12;-1:-1:-1;;;;;54568:48:0;;54609:6;54568:48;;;;597:25:1;;585:2;570:18;;451:177;53433:584:0;53488:19;53529:5;53538:1;53529:10;53525:62;;-1:-1:-1;;53565:10:0;;;;;;;;;;;;-1:-1:-1;;;53565:10:0;;;;;53433:584::o;53525:62::-;53617:5;53597:17;53658:97;53665:14;;53658:97;;53705:8;;;;:::i;:::-;;-1:-1:-1;53728:15:0;;-1:-1:-1;53741:2:0;53728:15;;:::i;:::-;;;53658:97;;;53784:6;-1:-1:-1;;;;;53774:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53774:17:0;-1:-1:-1;53765:26:0;-1:-1:-1;53850:5:0;;-1:-1:-1;53821:6:0;53866:144;53873:14;;53866:144;;53952:14;53964:2;53952:9;:14;:::i;:::-;53947:19;;:2;:19;:::i;:::-;53934:34;;53913:6;53920:10;;;:::i;:::-;;;;53913:18;;;;;;;;:::i;:::-;;;;:55;-1:-1:-1;;;;;53913:55:0;;;;;;;;-1:-1:-1;53983:15:0;53996:2;53983:15;;:::i;:::-;;;53866:144;;;53514:503;;;53433:584;;;:::o;48166:467::-;-1:-1:-1;;;;;48295:16:0;;48287:66;;;;-1:-1:-1;;;48287:66:0;;;;;;;:::i;:::-;5025:10;48410:33;48426:4;48432:2;48436:6;48410:15;:33::i;:::-;48454:26;48465:2;48469;48473:6;48454:10;:26::i;:::-;48529:2;-1:-1:-1;;;;;48498:46:0;48523:4;-1:-1:-1;;;;;48498:46:0;48513:8;-1:-1:-1;;;;;48498:46:0;-1:-1:-1;;;;;;;;;;;48533:2:0;48537:6;48498:46;;;;;;18910:25:1;;;18966:2;18951:18;;18944:34;18898:2;18883:18;;18736:248;48498:46:0;;;;;;;;48557:68;48588:8;48598:4;48604:2;48608;48612:6;48620:4;;48557:30;:68::i;25862:458::-;25930:13;-1:-1:-1;;;;;25964:25:0;;25956:50;;;;-1:-1:-1;;;25956:50:0;;;;;;;:::i;:::-;26060:1;26111:2;26098:15;;;26162:6;26150:18;;26182:24;26200:5;26098:15;26182:24;:::i;:::-;-1:-1:-1;;26249:2:0;26230:21;;;;;26229:34;;;;;;-1:-1:-1;;;25862:458:0;;;;:::o;49455:730::-;-1:-1:-1;;;;;53394:19:0;;;:23;49641:537;;49680:79;;-1:-1:-1;;;49680:79:0;;-1:-1:-1;;;;;49680:43:0;;;;;:79;;49724:8;;49734:4;;49740:3;;;;49745:7;;;;49754:4;;;;49680:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;49680:79:0;;;;;;;;-1:-1:-1;;49680:79:0;;;;;;;;;;;;:::i;:::-;;;49676:491;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;50040:6;50033:14;;-1:-1:-1;;;50033:14:0;;;;;;;;:::i;49676:491::-;;;50089:62;;-1:-1:-1;;;50089:62:0;;35475:2:1;50089:62:0;;;35457:21:1;35514:2;35494:18;;;35487:30;35553:34;35533:18;;;35526:62;-1:-1:-1;;;35604:18:1;;;35597:50;35664:19;;50089:62:0;35273:416:1;49676:491:0;-1:-1:-1;;;;;;49809:60:0;;-1:-1:-1;;;49809:60:0;49805:159;;49894:50;;-1:-1:-1;;;49894:50:0;;;;;;;:::i;26328:556::-;26401:13;-1:-1:-1;;;;;26435:25:0;;26427:50;;;;-1:-1:-1;;;26427:50:0;;;;;;;:::i;:::-;26531:1;26582:2;26569:15;;;26633:6;26621:18;;26662:15;;;;26653:44;;;;-1:-1:-1;;;26653:44:0;;36305:2:1;26653:44:0;;;36287:21:1;36344:2;36324:18;;;36317:30;-1:-1:-1;;;36363:18:1;;;36356:45;36418:18;;26653:44:0;36103:339:1;26653:44:0;26793:34;;26735:24;;;26813:2;26794:21;-1:-1:-1;;26794:21:0;26793:34;;;;;26328:556;-1:-1:-1;;;26328:556:0:o;50193:689::-;-1:-1:-1;;;;;53394:19:0;;;:23;50350:525;;50389:72;;-1:-1:-1;;;50389:72:0;;-1:-1:-1;;;;;50389:38:0;;;;;:72;;50428:8;;50438:4;;50444:2;;50448:6;;50456:4;;;;50389:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;50389:72:0;;;;;;;;-1:-1:-1;;50389:72:0;;;;;;;;;;;;:::i;:::-;;;50385:479;;;;:::i;:::-;-1:-1:-1;;;;;;50511:55:0;;-1:-1:-1;;;50511:55:0;50507:154;;50591:50;;-1:-1:-1;;;50591:50:0;;;;;;;:::i;50507:154::-;50462:214;50193:689;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:180::-;1270:6;1323:2;1311:9;1302:7;1298:23;1294:32;1291:52;;;1339:1;1336;1329:12;1291:52;-1:-1:-1;1362:23:1;;1211:180;-1:-1:-1;1211:180:1:o;1396:186::-;1455:6;1508:2;1496:9;1487:7;1483:23;1479:32;1476:52;;;1524:1;1521;1514:12;1476:52;1547:29;1566:9;1547:29;:::i;1587:258::-;1659:1;1669:113;1683:6;1680:1;1677:13;1669:113;;;1759:11;;;1753:18;1740:11;;;1733:39;1705:2;1698:10;1669:113;;;1800:6;1797:1;1794:13;1791:48;;;-1:-1:-1;;1835:1:1;1817:16;;1810:27;1587:258::o;1850:::-;1892:3;1930:5;1924:12;1957:6;1952:3;1945:19;1973:63;2029:6;2022:4;2017:3;2013:14;2006:4;1999:5;1995:16;1973:63;:::i;:::-;2090:2;2069:15;-1:-1:-1;;2065:29:1;2056:39;;;;2097:4;2052:50;;1850:258;-1:-1:-1;;1850:258:1:o;2113:220::-;2262:2;2251:9;2244:21;2225:4;2282:45;2323:2;2312:9;2308:18;2300:6;2282:45;:::i;2338:159::-;2405:20;;2465:6;2454:18;;2444:29;;2434:57;;2487:1;2484;2477:12;2502:258;2569:6;2577;2630:2;2618:9;2609:7;2605:23;2601:32;2598:52;;;2646:1;2643;2636:12;2598:52;2669:28;2687:9;2669:28;:::i;:::-;2659:38;;2716;2750:2;2739:9;2735:18;2716:38;:::i;:::-;2706:48;;2502:258;;;;;:::o;3000:322::-;3077:6;3085;3093;3146:2;3134:9;3125:7;3121:23;3117:32;3114:52;;;3162:1;3159;3152:12;3114:52;3185:29;3204:9;3185:29;:::i;:::-;3175:39;3261:2;3246:18;;3233:32;;-1:-1:-1;3312:2:1;3297:18;;;3284:32;;3000:322;-1:-1:-1;;;3000:322:1:o;3327:184::-;3385:6;3438:2;3426:9;3417:7;3413:23;3409:32;3406:52;;;3454:1;3451;3444:12;3406:52;3477:28;3495:9;3477:28;:::i;3978:435::-;4031:3;4069:5;4063:12;4096:6;4091:3;4084:19;4122:4;4151:2;4146:3;4142:12;4135:19;;4188:2;4181:5;4177:14;4209:1;4219:169;4233:6;4230:1;4227:13;4219:169;;;4294:13;;4282:26;;4328:12;;;;4363:15;;;;4255:1;4248:9;4219:169;;;-1:-1:-1;4404:3:1;;3978:435;-1:-1:-1;;;;;3978:435:1:o;4418:837::-;4684:2;4696:21;;;4766:13;;4669:18;;;4788:22;;;4636:4;;4863;;4841:2;4826:18;;;4890:15;;;4636:4;4933:202;4947:6;4944:1;4941:13;4933:202;;;5012:13;;-1:-1:-1;;;;;5008:46:1;4996:59;;5075:12;;;;5110:15;;;;4969:1;4962:9;4933:202;;;4937:3;;;5180:9;5175:3;5171:19;5166:2;5155:9;5151:18;5144:47;5208:41;5245:3;5237:6;5208:41;:::i;:::-;5200:49;4418:837;-1:-1:-1;;;;;;4418:837:1:o;5260:248::-;5328:6;5336;5389:2;5377:9;5368:7;5364:23;5360:32;5357:52;;;5405:1;5402;5395:12;5357:52;-1:-1:-1;;5428:23:1;;;5498:2;5483:18;;;5470:32;;-1:-1:-1;5260:248:1:o;5792:367::-;5855:8;5865:6;5919:3;5912:4;5904:6;5900:17;5896:27;5886:55;;5937:1;5934;5927:12;5886:55;-1:-1:-1;5960:20:1;;-1:-1:-1;;;;;5992:30:1;;5989:50;;;6035:1;6032;6025:12;5989:50;6072:4;6064:6;6060:17;6048:29;;6132:3;6125:4;6115:6;6112:1;6108:14;6100:6;6096:27;6092:38;6089:47;6086:67;;;6149:1;6146;6139:12;6164:347;6215:8;6225:6;6279:3;6272:4;6264:6;6260:17;6256:27;6246:55;;6297:1;6294;6287:12;6246:55;-1:-1:-1;6320:20:1;;-1:-1:-1;;;;;6352:30:1;;6349:50;;;6395:1;6392;6385:12;6349:50;6432:4;6424:6;6420:17;6408:29;;6484:3;6477:4;6468:6;6460;6456:19;6452:30;6449:39;6446:59;;;6501:1;6498;6491:12;6516:1210;6676:6;6684;6692;6700;6708;6716;6724;6732;6785:3;6773:9;6764:7;6760:23;6756:33;6753:53;;;6802:1;6799;6792:12;6753:53;6825:29;6844:9;6825:29;:::i;:::-;6815:39;;6873:38;6907:2;6896:9;6892:18;6873:38;:::i;:::-;6863:48;;6962:2;6951:9;6947:18;6934:32;-1:-1:-1;;;;;7026:2:1;7018:6;7015:14;7012:34;;;7042:1;7039;7032:12;7012:34;7081:70;7143:7;7134:6;7123:9;7119:22;7081:70;:::i;:::-;7170:8;;-1:-1:-1;7055:96:1;-1:-1:-1;7258:2:1;7243:18;;7230:32;;-1:-1:-1;7274:16:1;;;7271:36;;;7303:1;7300;7293:12;7271:36;7342:72;7406:7;7395:8;7384:9;7380:24;7342:72;:::i;:::-;7433:8;;-1:-1:-1;7316:98:1;-1:-1:-1;7521:3:1;7506:19;;7493:33;;-1:-1:-1;7538:16:1;;;7535:36;;;7567:1;7564;7557:12;7535:36;;7606:60;7658:7;7647:8;7636:9;7632:24;7606:60;:::i;:::-;6516:1210;;;;-1:-1:-1;6516:1210:1;;-1:-1:-1;6516:1210:1;;;;;;7685:8;-1:-1:-1;;;6516:1210:1:o;8610:1404::-;8804:6;8812;8820;8828;8836;8844;8852;8860;8913:3;8901:9;8892:7;8888:23;8884:33;8881:53;;;8930:1;8927;8920:12;8881:53;8970:9;8957:23;-1:-1:-1;;;;;9040:2:1;9032:6;9029:14;9026:34;;;9056:1;9053;9046:12;9026:34;9095:70;9157:7;9148:6;9137:9;9133:22;9095:70;:::i;:::-;9184:8;;-1:-1:-1;9069:96:1;-1:-1:-1;9272:2:1;9257:18;;9244:32;;-1:-1:-1;9288:16:1;;;9285:36;;;9317:1;9314;9307:12;9285:36;9356:72;9420:7;9409:8;9398:9;9394:24;9356:72;:::i;:::-;9447:8;;-1:-1:-1;9330:98:1;-1:-1:-1;9535:2:1;9520:18;;9507:32;;-1:-1:-1;9551:16:1;;;9548:36;;;9580:1;9577;9570:12;9548:36;9619:72;9683:7;9672:8;9661:9;9657:24;9619:72;:::i;:::-;9710:8;;-1:-1:-1;9593:98:1;-1:-1:-1;9798:2:1;9783:18;;9770:32;;-1:-1:-1;9814:16:1;;;9811:36;;;9843:1;9840;9833:12;9811:36;;9882:72;9946:7;9935:8;9924:9;9920:24;9882:72;:::i;10019:847::-;10150:6;10158;10166;10174;10182;10235:2;10223:9;10214:7;10210:23;10206:32;10203:52;;;10251:1;10248;10241:12;10203:52;10274:29;10293:9;10274:29;:::i;:::-;10264:39;;10354:2;10343:9;10339:18;10326:32;-1:-1:-1;;;;;10418:2:1;10410:6;10407:14;10404:34;;;10434:1;10431;10424:12;10404:34;10473:70;10535:7;10526:6;10515:9;10511:22;10473:70;:::i;:::-;10562:8;;-1:-1:-1;10447:96:1;-1:-1:-1;10650:2:1;10635:18;;10622:32;;-1:-1:-1;10666:16:1;;;10663:36;;;10695:1;10692;10685:12;10663:36;;10734:72;10798:7;10787:8;10776:9;10772:24;10734:72;:::i;:::-;10019:847;;;;-1:-1:-1;10019:847:1;;-1:-1:-1;10825:8:1;;10708:98;10019:847;-1:-1:-1;;;10019:847:1:o;10871:773::-;10993:6;11001;11009;11017;11070:2;11058:9;11049:7;11045:23;11041:32;11038:52;;;11086:1;11083;11076:12;11038:52;11126:9;11113:23;-1:-1:-1;;;;;11196:2:1;11188:6;11185:14;11182:34;;;11212:1;11209;11202:12;11182:34;11251:70;11313:7;11304:6;11293:9;11289:22;11251:70;:::i;:::-;11340:8;;-1:-1:-1;11225:96:1;-1:-1:-1;11428:2:1;11413:18;;11400:32;;-1:-1:-1;11444:16:1;;;11441:36;;;11473:1;11470;11463:12;11441:36;;11512:72;11576:7;11565:8;11554:9;11550:24;11512:72;:::i;:::-;10871:773;;;;-1:-1:-1;11603:8:1;-1:-1:-1;;;;10871:773:1:o;11649:261::-;11828:2;11817:9;11810:21;11791:4;11848:56;11900:2;11889:9;11885:18;11877:6;11848:56;:::i;11915:482::-;11994:6;12002;12010;12063:2;12051:9;12042:7;12038:23;12034:32;12031:52;;;12079:1;12076;12069:12;12031:52;12102:28;12120:9;12102:28;:::i;:::-;12092:38;;12181:2;12170:9;12166:18;12153:32;-1:-1:-1;;;;;12200:6:1;12197:30;12194:50;;;12240:1;12237;12230:12;12194:50;12279:58;12329:7;12320:6;12309:9;12305:22;12279:58;:::i;:::-;11915:482;;12356:8;;-1:-1:-1;12253:84:1;;-1:-1:-1;;;;11915:482:1:o;13308:118::-;13394:5;13387:13;13380:21;13373:5;13370:32;13360:60;;13416:1;13413;13406:12;13431:315;13496:6;13504;13557:2;13545:9;13536:7;13532:23;13528:32;13525:52;;;13573:1;13570;13563:12;13525:52;13596:29;13615:9;13596:29;:::i;:::-;13586:39;;13675:2;13664:9;13660:18;13647:32;13688:28;13710:5;13688:28;:::i;:::-;13735:5;13725:15;;;13431:315;;;;;:::o;13975:328::-;14052:6;14060;14068;14121:2;14109:9;14100:7;14096:23;14092:32;14089:52;;;14137:1;14134;14127:12;14089:52;14160:29;14179:9;14160:29;:::i;:::-;14150:39;;14208:38;14242:2;14231:9;14227:18;14208:38;:::i;:::-;14198:48;;14293:2;14282:9;14278:18;14265:32;14255:42;;13975:328;;;;;:::o;14308:252::-;14375:6;14383;14436:2;14424:9;14415:7;14411:23;14407:32;14404:52;;;14452:1;14449;14442:12;14404:52;14475:28;14493:9;14475:28;:::i;14565:910::-;14705:6;14713;14721;14729;14737;14745;14798:3;14786:9;14777:7;14773:23;14769:33;14766:53;;;14815:1;14812;14805:12;14766:53;14851:9;14838:23;14828:33;;14908:2;14897:9;14893:18;14880:32;14870:42;;14963:2;14952:9;14948:18;14935:32;-1:-1:-1;;;;;15027:2:1;15019:6;15016:14;15013:34;;;15043:1;15040;15033:12;15013:34;15082:70;15144:7;15135:6;15124:9;15120:22;15082:70;:::i;:::-;15171:8;;-1:-1:-1;15056:96:1;-1:-1:-1;15259:2:1;15244:18;;15231:32;;-1:-1:-1;15275:16:1;;;15272:36;;;15304:1;15301;15294:12;15272:36;;15343:72;15407:7;15396:8;15385:9;15381:24;15343:72;:::i;:::-;14565:910;;;;-1:-1:-1;14565:910:1;;-1:-1:-1;14565:910:1;;15434:8;;14565:910;-1:-1:-1;;;14565:910:1:o;15480:260::-;15548:6;15556;15609:2;15597:9;15588:7;15584:23;15580:32;15577:52;;;15625:1;15622;15615:12;15577:52;15648:29;15667:9;15648:29;:::i;15745:695::-;15851:6;15859;15867;15875;15883;15891;15944:3;15932:9;15923:7;15919:23;15915:33;15912:53;;;15961:1;15958;15951:12;15912:53;15984:29;16003:9;15984:29;:::i;:::-;15974:39;;16032:38;16066:2;16055:9;16051:18;16032:38;:::i;:::-;16022:48;;16117:2;16106:9;16102:18;16089:32;16079:42;;16168:2;16157:9;16153:18;16140:32;16130:42;;16223:3;16212:9;16208:19;16195:33;-1:-1:-1;;;;;16243:6:1;16240:30;16237:50;;;16283:1;16280;16273:12;16237:50;16322:58;16372:7;16363:6;16352:9;16348:22;16322:58;:::i;16963:380::-;17042:1;17038:12;;;;17085;;;17106:61;;17160:4;17152:6;17148:17;17138:27;;17106:61;17213:2;17205:6;17202:14;17182:18;17179:38;17176:161;;17259:10;17254:3;17250:20;17247:1;17240:31;17294:4;17291:1;17284:15;17322:4;17319:1;17312:15;17176:161;;16963:380;;;:::o;17688:635::-;17966:3;18004:6;17998:13;18020:53;18066:6;18061:3;18054:4;18046:6;18042:17;18020:53;:::i;:::-;18136:13;;18095:16;;;;18158:57;18136:13;18095:16;18192:4;18180:17;;18158:57;:::i;:::-;-1:-1:-1;;;18237:20:1;;18266:22;;;18315:1;18304:13;;17688:635;-1:-1:-1;;;;17688:635:1:o;18989:127::-;19050:10;19045:3;19041:20;19038:1;19031:31;19081:4;19078:1;19071:15;19105:4;19102:1;19095:15;19121:127;19182:10;19177:3;19173:20;19170:1;19163:31;19213:4;19210:1;19203:15;19237:4;19234:1;19227:15;19253:125;19293:4;19321:1;19318;19315:8;19312:34;;;19326:18;;:::i;:::-;-1:-1:-1;19363:9:1;;19253:125::o;19383:127::-;19444:10;19439:3;19435:20;19432:1;19425:31;19475:4;19472:1;19465:15;19499:4;19496:1;19489:15;19515:127;19576:10;19571:3;19567:20;19564:1;19557:31;19607:4;19604:1;19597:15;19631:4;19628:1;19621:15;19647:120;19687:1;19713;19703:35;;19718:18;;:::i;:::-;-1:-1:-1;19752:9:1;;19647:120::o;20191:128::-;20231:3;20262:1;20258:6;20255:1;20252:13;20249:39;;;20268:18;;:::i;:::-;-1:-1:-1;20304:9:1;;20191:128::o;20324:136::-;20363:3;20391:5;20381:39;;20400:18;;:::i;:::-;-1:-1:-1;;;20436:18:1;;20324:136::o;22663:135::-;22702:3;22723:17;;;22720:43;;22743:18;;:::i;:::-;-1:-1:-1;22790:1:1;22779:13;;22663:135::o;22803:335::-;23005:2;22987:21;;;23044:2;23024:18;;;23017:30;-1:-1:-1;;;23078:2:1;23063:18;;23056:41;23129:2;23114:18;;22803:335::o;23143:404::-;23345:2;23327:21;;;23384:2;23364:18;;;23357:30;23423:34;23418:2;23403:18;;23396:62;-1:-1:-1;;;23489:2:1;23474:18;;23467:38;23537:3;23522:19;;23143:404::o;23552:354::-;23640:19;;;23622:3;-1:-1:-1;;;;;23671:31:1;;23668:51;;;23715:1;23712;23705:12;23668:51;23751:6;23748:1;23744:14;23803:8;23796:5;23789:4;23784:3;23780:14;23767:45;23880:1;23835:18;;23855:4;23831:29;23869:13;;;-1:-1:-1;23831:29:1;;23552:354;-1:-1:-1;;23552:354:1:o;23911:519::-;24188:2;24177:9;24170:21;24151:4;24214:73;24283:2;24272:9;24268:18;24260:6;24252;24214:73;:::i;:::-;24335:9;24327:6;24323:22;24318:2;24307:9;24303:18;24296:50;24363:61;24417:6;24409;24401;24363:61;:::i;:::-;24355:69;23911:519;-1:-1:-1;;;;;;;23911:519:1:o;24845:267::-;24934:6;24929:3;24922:19;24986:6;24979:5;24972:4;24967:3;24963:14;24950:43;-1:-1:-1;25038:1:1;25013:16;;;25031:4;25009:27;;;25002:38;;;;25094:2;25073:15;;;-1:-1:-1;;25069:29:1;25060:39;;;25056:50;;24845:267::o;25117:247::-;25276:2;25265:9;25258:21;25239:4;25296:62;25354:2;25343:9;25339:18;25331:6;25323;25296:62;:::i;:::-;25288:70;25117:247;-1:-1:-1;;;;25117:247:1:o;26326:761::-;26716:1;26712;26707:3;26703:11;26699:19;26691:6;26687:32;26676:9;26669:51;26756:6;26751:2;26740:9;26736:18;26729:34;26799:6;26794:2;26783:9;26779:18;26772:34;26842:3;26837:2;26826:9;26822:18;26815:31;26650:4;26869:74;26938:3;26927:9;26923:19;26915:6;26907;26869:74;:::i;:::-;26992:9;26984:6;26980:22;26974:3;26963:9;26959:19;26952:51;27020:61;27074:6;27066;27058;27020:61;:::i;:::-;27012:69;26326:761;-1:-1:-1;;;;;;;;;;26326:761:1:o;27092:647::-;27453:34;27448:3;27441:47;-1:-1:-1;;;27513:2:1;27508:3;27504:12;27497:32;27423:3;27558:6;27552:13;27574:60;27627:6;27622:2;27617:3;27613:12;27608:2;27600:6;27596:15;27574:60;:::i;:::-;-1:-1:-1;;;27693:2:1;27653:16;;;;27685:11;;;27678:28;-1:-1:-1;27730:2:1;27722:11;;27092:647;-1:-1:-1;27092:647:1:o;28154:336::-;28356:2;28338:21;;;28395:2;28375:18;;;28368:30;-1:-1:-1;;;28429:2:1;28414:18;;28407:42;28481:2;28466:18;;28154:336::o;28838:245::-;28905:6;28958:2;28946:9;28937:7;28933:23;28929:32;28926:52;;;28974:1;28971;28964:12;28926:52;29006:9;29000:16;29025:28;29047:5;29025:28;:::i;29088:401::-;29290:2;29272:21;;;29329:2;29309:18;;;29302:30;29368:34;29363:2;29348:18;;29341:62;-1:-1:-1;;;29434:2:1;29419:18;;29412:35;29479:3;29464:19;;29088:401::o;29494:168::-;29534:7;29600:1;29596;29592:6;29588:14;29585:1;29582:21;29577:1;29570:9;29563:17;29559:45;29556:71;;;29607:18;;:::i;:::-;-1:-1:-1;29647:9:1;;29494:168::o;30016:1081::-;-1:-1:-1;;;;;30497:32:1;;30479:51;;30517:3;30561:2;30546:18;;30539:31;;;-1:-1:-1;;30593:74:1;;30647:19;;30639:6;30631;30593:74;:::i;:::-;30715:9;30707:6;30703:22;30698:2;30687:9;30683:18;30676:50;30749:61;30803:6;30795;30787;30749:61;:::i;:::-;30735:75;;30858:9;30850:6;30846:22;30841:2;30830:9;30826:18;30819:50;30892:61;30946:6;30938;30930;30892:61;:::i;:::-;30878:75;;31002:9;30994:6;30990:22;30984:3;30973:9;30969:19;30962:51;31030:61;31084:6;31076;31068;31030:61;:::i;:::-;31022:69;30016:1081;-1:-1:-1;;;;;;;;;;;;30016:1081:1:o;31783:127::-;31844:10;31839:3;31835:20;31832:1;31825:31;31875:4;31872:1;31865:15;31899:4;31896:1;31889:15;32535:112;32567:1;32593;32583:35;;32598:18;;:::i;:::-;-1:-1:-1;32632:9:1;;32535:112::o;32652:238::-;32692:3;-1:-1:-1;;;;;32759:10:1;;;32789;;;32819:12;;;32811:21;;32808:47;;;32835:18;;:::i;:::-;32871:13;;32652:238;-1:-1:-1;;;;32652:238:1:o;32895:908::-;-1:-1:-1;;;;;33322:15:1;;;33304:34;;33374:15;;33369:2;33354:18;;33347:43;33284:3;33421:2;33406:18;;33399:31;;;33247:4;;33453:74;;33507:19;;33499:6;33491;33453:74;:::i;:::-;33575:9;33567:6;33563:22;33558:2;33547:9;33543:18;33536:50;33609:61;33663:6;33655;33647;33609:61;:::i;:::-;33595:75;;33719:9;33711:6;33707:22;33701:3;33690:9;33686:19;33679:51;33747:50;33790:6;33782;33774;33747:50;:::i;:::-;33739:58;32895:908;-1:-1:-1;;;;;;;;;;;32895:908:1:o;33808:249::-;33877:6;33930:2;33918:9;33909:7;33905:23;33901:32;33898:52;;;33946:1;33943;33936:12;33898:52;33978:9;33972:16;33997:30;34021:5;33997:30;:::i;34062:179::-;34097:3;34139:1;34121:16;34118:23;34115:120;;;34185:1;34182;34179;34164:23;-1:-1:-1;34222:1:1;34216:8;34211:3;34207:18;34115:120;34062:179;:::o;34246:346::-;34356:2;34337:13;;-1:-1:-1;;34333:27:1;34321:40;;-1:-1:-1;;;;;34376:34:1;;34412:22;;;34373:62;34370:185;;;34477:10;34472:3;34468:20;34465:1;34458:31;34512:4;34509:1;34502:15;34540:4;34537:1;34530:15;34370:185;34571:2;34564:22;-1:-1:-1;;34246:346:1:o;34597:671::-;34636:3;34678:4;34660:16;34657:26;34654:39;;;34597:671;:::o;34654:39::-;34720:2;34714:9;-1:-1:-1;;34785:16:1;34781:25;;34778:1;34714:9;34757:50;34836:4;34830:11;34860:16;-1:-1:-1;;;;;34966:2:1;34959:4;34951:6;34947:17;34944:25;34939:2;34931:6;34928:14;34925:45;34922:58;;;34973:5;;;;;34597:671;:::o;34922:58::-;35010:6;35004:4;35000:17;34989:28;;35046:3;35040:10;35073:2;35065:6;35062:14;35059:27;;;35079:5;;;;;;34597:671;:::o;35059:27::-;35163:2;35144:16;35138:4;35134:27;35130:36;35123:4;35114:6;35109:3;35105:16;35101:27;35098:69;35095:82;;;35170:5;;;;;;34597:671;:::o;35095:82::-;35186:57;35237:4;35228:6;35220;35216:19;35212:30;35206:4;35186:57;:::i;:::-;-1:-1:-1;35259:3:1;;34597:671;-1:-1:-1;;;;;34597:671:1:o;35694:404::-;35896:2;35878:21;;;35935:2;35915:18;;;35908:30;35974:34;35969:2;35954:18;;35947:62;-1:-1:-1;;;36040:2:1;36025:18;;36018:38;36088:3;36073:19;;35694:404::o;36447:588::-;-1:-1:-1;;;;;36754:15:1;;;36736:34;;36806:15;;36801:2;36786:18;;36779:43;36853:2;36838:18;;36831:34;;;36896:2;36881:18;;36874:34;;;36716:3;36939;36924:19;;36917:32;;;36679:4;;36966:63;;37009:19;;37001:6;36993;36966:63;:::i;:::-;36958:71;36447:588;-1:-1:-1;;;;;;;;36447:588:1:o
Swarm Source
ipfs://1d9fbe26287866c52ee9aab93432f3000137878b2d49faab5ce386da0541d869
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.