More Info
Private Name Tags
ContractCreator
Latest 11 from a total of 11 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 17565376 | 505 days ago | IN | 0 ETH | 0.00133546 | ||||
Approve | 17545676 | 508 days ago | IN | 0 ETH | 0.00065089 | ||||
Approve | 17545604 | 508 days ago | IN | 0 ETH | 0.00067412 | ||||
Withdraw Fees | 14572604 | 945 days ago | IN | 0 ETH | 0.00321149 | ||||
Set Fee To | 12296725 | 1299 days ago | IN | 0 ETH | 0.00379789 | ||||
Transfer Ownersh... | 12296716 | 1299 days ago | IN | 0 ETH | 0.00503118 | ||||
Cook | 12258303 | 1305 days ago | IN | 0 ETH | 0.0123887 | ||||
Set Fee To | 12122645 | 1326 days ago | IN | 0 ETH | 0.00647309 | ||||
Transfer Ownersh... | 12120943 | 1326 days ago | IN | 0 ETH | 0.00353592 | ||||
Set Swapper | 12120941 | 1326 days ago | IN | 0 ETH | 0.00469334 | ||||
0x61010060 | 12120940 | 1326 days ago | IN | 0 ETH | 0.57355018 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
KashiPairMediumRiskV1
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-27 */ // SPDX-License-Identifier: UNLICENSED // Kashi Lending Medium Risk // __ __ __ __ _____ __ __ // | |/ .---.-.-----| |--|__| | |_.-----.-----.--| |__.-----.-----. // | <| _ |__ --| | | | | -__| | _ | | | _ | // |__|\__|___._|_____|__|__|__| |_______|_____|__|__|_____|__|__|__|___ | // |_____| // Copyright (c) 2021 BoringCrypto - All rights reserved // Twitter: @Boring_Crypto // Special thanks to: // @0xKeno - for all his invaluable contributions // @burger_crypto - for the idea of trying to let the LPs benefit from liquidations // Version: 22-Feb-2021 pragma solidity 0.6.12; pragma experimental ABIEncoderV2; // solhint-disable avoid-low-level-calls // solhint-disable no-inline-assembly // solhint-disable not-rely-on-time // File @boringcrypto/boring-solidity/contracts/libraries/[email protected] // License-Identifier: MIT /// @notice A library for performing overflow-/underflow-safe math, /// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math). library BoringMath { function add(uint256 a, uint256 b) internal pure returns (uint256 c) { require((c = a + b) >= b, "BoringMath: Add Overflow"); } function sub(uint256 a, uint256 b) internal pure returns (uint256 c) { require((c = a - b) <= a, "BoringMath: Underflow"); } function mul(uint256 a, uint256 b) internal pure returns (uint256 c) { require(b == 0 || (c = a * b) / b == a, "BoringMath: Mul Overflow"); } function to128(uint256 a) internal pure returns (uint128 c) { require(a <= uint128(-1), "BoringMath: uint128 Overflow"); c = uint128(a); } function to64(uint256 a) internal pure returns (uint64 c) { require(a <= uint64(-1), "BoringMath: uint64 Overflow"); c = uint64(a); } function to32(uint256 a) internal pure returns (uint32 c) { require(a <= uint32(-1), "BoringMath: uint32 Overflow"); c = uint32(a); } } /// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128. library BoringMath128 { function add(uint128 a, uint128 b) internal pure returns (uint128 c) { require((c = a + b) >= b, "BoringMath: Add Overflow"); } function sub(uint128 a, uint128 b) internal pure returns (uint128 c) { require((c = a - b) <= a, "BoringMath: Underflow"); } } // File @boringcrypto/boring-solidity/contracts/[email protected] // License-Identifier: MIT // Audit on 5-Jan-2021 by Keno and BoringCrypto // Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol // Edited by BoringCrypto contract BoringOwnableData { address public owner; address public pendingOwner; } contract BoringOwnable is BoringOwnableData { event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /// @notice `owner` defaults to msg.sender on construction. constructor() public { owner = msg.sender; emit OwnershipTransferred(address(0), msg.sender); } /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. /// Can only be invoked by the current `owner`. /// @param newOwner Address of the new owner. /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`. /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise. function transferOwnership( address newOwner, bool direct, bool renounce ) public onlyOwner { if (direct) { // Checks require(newOwner != address(0) || renounce, "Ownable: zero address"); // Effects emit OwnershipTransferred(owner, newOwner); owner = newOwner; pendingOwner = address(0); } else { // Effects pendingOwner = newOwner; } } /// @notice Needs to be called by `pendingOwner` to claim ownership. function claimOwnership() public { address _pendingOwner = pendingOwner; // Checks require(msg.sender == _pendingOwner, "Ownable: caller != pending owner"); // Effects emit OwnershipTransferred(owner, _pendingOwner); owner = _pendingOwner; pendingOwner = address(0); } /// @notice Only allows the `owner` to execute the function. modifier onlyOwner() { require(msg.sender == owner, "Ownable: caller is not the owner"); _; } } // File @boringcrypto/boring-solidity/contracts/[email protected] // License-Identifier: MIT // Based on code and smartness by Ross Campbell and Keno // Uses immutable to store the domain separator to reduce gas usage // If the chain id changes due to a fork, the forked chain will calculate on the fly. contract Domain { bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256("EIP712Domain(uint256 chainId,address verifyingContract)"); // See https://eips.ethereum.org/EIPS/eip-191 string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = "\x19\x01"; // solhint-disable var-name-mixedcase bytes32 private immutable _DOMAIN_SEPARATOR; uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID; /// @dev Calculate the DOMAIN_SEPARATOR function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) { return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this))); } constructor() public { uint256 chainId; assembly { chainId := chainid() } _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId); } /// @dev Return the DOMAIN_SEPARATOR // It's named internal to allow making it public from the contract that uses it by creating a simple view function // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator. // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() public view returns (bytes32) { uint256 chainId; assembly { chainId := chainid() } return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId); } function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) { digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash)); } } // File @boringcrypto/boring-solidity/contracts/[email protected] // License-Identifier: MIT // solhint-disable no-inline-assembly // solhint-disable not-rely-on-time // Data part taken out for building of contracts that receive delegate calls contract ERC20Data { /// @notice owner > balance mapping. mapping(address => uint256) public balanceOf; /// @notice owner > spender > allowance mapping. mapping(address => mapping(address => uint256)) public allowance; /// @notice owner > nonce mapping. Used in `permit`. mapping(address => uint256) public nonces; } contract ERC20 is ERC20Data, Domain { event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); /// @notice Transfers `amount` tokens from `msg.sender` to `to`. /// @param to The address to move the tokens. /// @param amount of the tokens to move. /// @return (bool) Returns True if succeeded. function transfer(address to, uint256 amount) public returns (bool) { // If `amount` is 0, or `msg.sender` is `to` nothing happens if (amount != 0) { uint256 srcBalance = balanceOf[msg.sender]; require(srcBalance >= amount, "ERC20: balance too low"); if (msg.sender != to) { require(to != address(0), "ERC20: no zero address"); // Moved down so low balance calls safe some gas balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1 } } emit Transfer(msg.sender, to, amount); return true; } /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`. /// @param from Address to draw tokens from. /// @param to The address to move the tokens. /// @param amount The token amount to move. /// @return (bool) Returns True if succeeded. function transferFrom( address from, address to, uint256 amount ) public returns (bool) { // If `amount` is 0, or `from` is `to` nothing happens if (amount != 0) { uint256 srcBalance = balanceOf[from]; require(srcBalance >= amount, "ERC20: balance too low"); if (from != to) { uint256 spenderAllowance = allowance[from][msg.sender]; // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20). if (spenderAllowance != type(uint256).max) { require(spenderAllowance >= amount, "ERC20: allowance too low"); allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked } require(to != address(0), "ERC20: no zero address"); // Moved down so other failed calls safe some gas balanceOf[from] = srcBalance - amount; // Underflow is checked balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1 } } emit Transfer(from, to, amount); return true; } /// @notice Approves `amount` from sender to be spend by `spender`. /// @param spender Address of the party that can draw from msg.sender's account. /// @param amount The maximum collective amount that `spender` can draw. /// @return (bool) Returns True if approved. function approve(address spender, uint256 amount) public returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; /// @notice Approves `value` from `owner_` to be spend by `spender`. /// @param owner_ Address of the owner. /// @param spender The address of the spender that gets approved to draw from `owner_`. /// @param value The maximum collective amount that `spender` can draw. /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds). function permit( address owner_, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external { require(owner_ != address(0), "ERC20: Owner cannot be 0"); require(block.timestamp < deadline, "ERC20: Expired"); require( ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) == owner_, "ERC20: Invalid Signature" ); allowance[owner_][spender] = value; emit Approval(owner_, spender, value); } } // File @boringcrypto/boring-solidity/contracts/interfaces/[email protected] // License-Identifier: MIT interface IMasterContract { /// @notice Init function that gets called from `BoringFactory.deploy`. /// Also kown as the constructor for cloned contracts. /// Any ETH send to `BoringFactory.deploy` ends up here. /// @param data Can be abi encoded arguments or anything else. function init(bytes calldata data) external payable; } // File @boringcrypto/boring-solidity/contracts/libraries/[email protected] // License-Identifier: MIT struct Rebase { uint128 elastic; uint128 base; } /// @notice A rebasing library using overflow-/underflow-safe math. library RebaseLibrary { using BoringMath for uint256; using BoringMath128 for uint128; /// @notice Calculates the base value in relationship to `elastic` and `total`. function toBase( Rebase memory total, uint256 elastic, bool roundUp ) internal pure returns (uint256 base) { if (total.elastic == 0) { base = elastic; } else { base = elastic.mul(total.base) / total.elastic; if (roundUp && base.mul(total.elastic) / total.base < elastic) { base = base.add(1); } } } /// @notice Calculates the elastic value in relationship to `base` and `total`. function toElastic( Rebase memory total, uint256 base, bool roundUp ) internal pure returns (uint256 elastic) { if (total.base == 0) { elastic = base; } else { elastic = base.mul(total.elastic) / total.base; if (roundUp && elastic.mul(total.base) / total.elastic < base) { elastic = elastic.add(1); } } } /// @notice Add `elastic` to `total` and doubles `total.base`. /// @return (Rebase) The new total. /// @return base in relationship to `elastic`. function add( Rebase memory total, uint256 elastic, bool roundUp ) internal pure returns (Rebase memory, uint256 base) { base = toBase(total, elastic, roundUp); total.elastic = total.elastic.add(elastic.to128()); total.base = total.base.add(base.to128()); return (total, base); } /// @notice Sub `base` from `total` and update `total.elastic`. /// @return (Rebase) The new total. /// @return elastic in relationship to `base`. function sub( Rebase memory total, uint256 base, bool roundUp ) internal pure returns (Rebase memory, uint256 elastic) { elastic = toElastic(total, base, roundUp); total.elastic = total.elastic.sub(elastic.to128()); total.base = total.base.sub(base.to128()); return (total, elastic); } /// @notice Add `elastic` and `base` to `total`. function add( Rebase memory total, uint256 elastic, uint256 base ) internal pure returns (Rebase memory) { total.elastic = total.elastic.add(elastic.to128()); total.base = total.base.add(base.to128()); return total; } /// @notice Subtract `elastic` and `base` to `total`. function sub( Rebase memory total, uint256 elastic, uint256 base ) internal pure returns (Rebase memory) { total.elastic = total.elastic.sub(elastic.to128()); total.base = total.base.sub(base.to128()); return total; } } // File @boringcrypto/boring-solidity/contracts/interfaces/[email protected] // License-Identifier: MIT interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); /// @notice EIP 2612 function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } // File @boringcrypto/boring-solidity/contracts/libraries/[email protected] // License-Identifier: MIT library BoringERC20 { bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol() bytes4 private constant SIG_NAME = 0x06fdde03; // name() bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals() bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256) bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256) function returnDataToString(bytes memory data) internal pure returns (string memory) { if (data.length >= 64) { return abi.decode(data, (string)); } else if (data.length == 32) { uint8 i = 0; while (i < 32 && data[i] != 0) { i++; } bytes memory bytesArray = new bytes(i); for (i = 0; i < 32 && data[i] != 0; i++) { bytesArray[i] = data[i]; } return string(bytesArray); } else { return "???"; } } /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string. /// @param token The address of the ERC-20 token contract. /// @return (string) Token symbol. function safeSymbol(IERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL)); return success ? returnDataToString(data) : "???"; } /// @notice Provides a safe ERC20.name version which returns '???' as fallback string. /// @param token The address of the ERC-20 token contract. /// @return (string) Token name. function safeName(IERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME)); return success ? returnDataToString(data) : "???"; } /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. /// @param token The address of the ERC-20 token contract. /// @return (uint8) Token decimals. function safeDecimals(IERC20 token) internal view returns (uint8) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS)); return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; } } // File @sushiswap/bentobox-sdk/contracts/[email protected] // License-Identifier: MIT interface IBatchFlashBorrower { function onBatchFlashLoan( address sender, IERC20[] calldata tokens, uint256[] calldata amounts, uint256[] calldata fees, bytes calldata data ) external; } // File @sushiswap/bentobox-sdk/contracts/[email protected] // License-Identifier: MIT interface IFlashBorrower { function onFlashLoan( address sender, IERC20 token, uint256 amount, uint256 fee, bytes calldata data ) external; } // File @sushiswap/bentobox-sdk/contracts/[email protected] // License-Identifier: MIT interface IStrategy { // Send the assets to the Strategy and call skim to invest them function skim(uint256 amount) external; // Harvest any profits made converted to the asset and pass them to the caller function harvest(uint256 balance, address sender) external returns (int256 amountAdded); // Withdraw assets. The returned amount can differ from the requested amount due to rounding. // The actualAmount should be very close to the amount. The difference should NOT be used to report a loss. That's what harvest is for. function withdraw(uint256 amount) external returns (uint256 actualAmount); // Withdraw all assets in the safest way possible. This shouldn't fail. function exit(uint256 balance) external returns (int256 amountAdded); } // File @sushiswap/bentobox-sdk/contracts/[email protected] // License-Identifier: MIT interface IBentoBoxV1 { event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress); event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share); event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver); event LogRegisterProtocol(address indexed protocol); event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved); event LogStrategyDivest(address indexed token, uint256 amount); event LogStrategyInvest(address indexed token, uint256 amount); event LogStrategyLoss(address indexed token, uint256 amount); event LogStrategyProfit(address indexed token, uint256 amount); event LogStrategyQueued(address indexed token, address indexed strategy); event LogStrategySet(address indexed token, address indexed strategy); event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage); event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share); event LogWhiteListMasterContract(address indexed masterContract, bool approved); event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); function balanceOf(IERC20, address) external view returns (uint256); function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results); function batchFlashLoan( IBatchFlashBorrower borrower, address[] calldata receivers, IERC20[] calldata tokens, uint256[] calldata amounts, bytes calldata data ) external; function claimOwnership() external; function deploy( address masterContract, bytes calldata data, bool useCreate2 ) external payable; function deposit( IERC20 token_, address from, address to, uint256 amount, uint256 share ) external payable returns (uint256 amountOut, uint256 shareOut); function flashLoan( IFlashBorrower borrower, address receiver, IERC20 token, uint256 amount, bytes calldata data ) external; function harvest( IERC20 token, bool balance, uint256 maxChangeAmount ) external; function masterContractApproved(address, address) external view returns (bool); function masterContractOf(address) external view returns (address); function nonces(address) external view returns (uint256); function owner() external view returns (address); function pendingOwner() external view returns (address); function pendingStrategy(IERC20) external view returns (IStrategy); function permitToken( IERC20 token, address from, address to, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function registerProtocol() external; function setMasterContractApproval( address user, address masterContract, bool approved, uint8 v, bytes32 r, bytes32 s ) external; function setStrategy(IERC20 token, IStrategy newStrategy) external; function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external; function strategy(IERC20) external view returns (IStrategy); function strategyData(IERC20) external view returns ( uint64 strategyStartDate, uint64 targetPercentage, uint128 balance ); function toAmount( IERC20 token, uint256 share, bool roundUp ) external view returns (uint256 amount); function toShare( IERC20 token, uint256 amount, bool roundUp ) external view returns (uint256 share); function totals(IERC20) external view returns (Rebase memory totals_); function transfer( IERC20 token, address from, address to, uint256 share ) external; function transferMultiple( IERC20 token, address from, address[] calldata tos, uint256[] calldata shares ) external; function transferOwnership( address newOwner, bool direct, bool renounce ) external; function whitelistMasterContract(address masterContract, bool approved) external; function whitelistedMasterContracts(address) external view returns (bool); function withdraw( IERC20 token_, address from, address to, uint256 amount, uint256 share ) external returns (uint256 amountOut, uint256 shareOut); } // File contracts/interfaces/IOracle.sol // License-Identifier: MIT interface IOracle { /// @notice Get the latest exchange rate. /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. /// For example: /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256)); /// @return success if no valid (recent) rate is available, return false else true. /// @return rate The rate of the requested asset / pair / pool. function get(bytes calldata data) external returns (bool success, uint256 rate); /// @notice Check the last exchange rate without any state changes. /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. /// For example: /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256)); /// @return success if no valid (recent) rate is available, return false else true. /// @return rate The rate of the requested asset / pair / pool. function peek(bytes calldata data) external view returns (bool success, uint256 rate); /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek(). /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. /// For example: /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256)); /// @return rate The rate of the requested asset / pair / pool. function peekSpot(bytes calldata data) external view returns (uint256 rate); /// @notice Returns a human readable (short) name about this oracle. /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. /// For example: /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256)); /// @return (string) A human readable symbol name about this oracle. function symbol(bytes calldata data) external view returns (string memory); /// @notice Returns a human readable name about this oracle. /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. /// For example: /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256)); /// @return (string) A human readable name about this oracle. function name(bytes calldata data) external view returns (string memory); } // File contracts/interfaces/ISwapper.sol // License-Identifier: MIT interface ISwapper { /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper. /// Swaps it for at least 'amountToMin' of token 'to'. /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer. /// Returns the amount of tokens 'to' transferred to BentoBox. /// (The BentoBox skim function will be used by the caller to get the swapped funds). function swap( IERC20 fromToken, IERC20 toToken, address recipient, uint256 shareToMin, uint256 shareFrom ) external returns (uint256 extraShare, uint256 shareReturned); /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom), /// this should be less than or equal to amountFromMax. /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper. /// Swaps it for exactly 'exactAmountTo' of token 'to'. /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer. /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom). /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom). /// (The BentoBox skim function will be used by the caller to get the swapped funds). function swapExact( IERC20 fromToken, IERC20 toToken, address recipient, address refundTo, uint256 shareFromSupplied, uint256 shareToExact ) external returns (uint256 shareUsed, uint256 shareReturned); } // File contracts/KashiPair.sol // License-Identifier: UNLICENSED // Kashi Lending Medium Risk /// @title KashiPair /// @dev This contract allows contract calls to any contract (except BentoBox) /// from arbitrary callers thus, don't trust calls from this contract in any circumstances. contract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract { using BoringMath for uint256; using BoringMath128 for uint128; using RebaseLibrary for Rebase; using BoringERC20 for IERC20; event LogExchangeRate(uint256 rate); event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization); event LogAddCollateral(address indexed from, address indexed to, uint256 share); event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction); event LogRemoveCollateral(address indexed from, address indexed to, uint256 share); event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction); event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part); event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part); event LogFeeTo(address indexed newFeeTo); event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction); // Immutables (for MasterContract and all clones) IBentoBoxV1 public immutable bentoBox; KashiPairMediumRiskV1 public immutable masterContract; // MasterContract variables address public feeTo; mapping(ISwapper => bool) public swappers; // Per clone variables // Clone init settings IERC20 public collateral; IERC20 public asset; IOracle public oracle; bytes public oracleData; // Total amounts uint256 public totalCollateralShare; // Total collateral supplied Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers // User balances mapping(address => uint256) public userCollateralShare; // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol) mapping(address => uint256) public userBorrowPart; /// @notice Exchange and interest rate tracking. /// This is 'cached' here because calls to Oracles can be very expensive. uint256 public exchangeRate; struct AccrueInfo { uint64 interestPerSecond; uint64 lastAccrued; uint128 feesEarnedFraction; } AccrueInfo public accrueInfo; // ERC20 'variables' function symbol() external view returns (string memory) { return string(abi.encodePacked("km", collateral.safeSymbol(), "/", asset.safeSymbol(), "-", oracle.symbol(oracleData))); } function name() external view returns (string memory) { return string(abi.encodePacked("Kashi Medium Risk ", collateral.safeName(), "/", asset.safeName(), "-", oracle.name(oracleData))); } function decimals() external view returns (uint8) { return asset.safeDecimals(); } // totalSupply for ERC20 compatibility function totalSupply() public view returns (uint256) { return totalAsset.base; } // Settings for the Medium Risk KashiPair uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75% uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77% uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math) uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70% uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80% uint256 private constant UTILIZATION_PRECISION = 1e18; uint256 private constant FULL_UTILIZATION = 1e18; uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION; uint256 private constant FACTOR_PRECISION = 1e18; uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear uint256 private constant EXCHANGE_RATE_PRECISION = 1e18; uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12% uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5; // Fees uint256 private constant PROTOCOL_FEE = 10000; // 10% uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5; uint256 private constant BORROW_OPENING_FEE = 50; // 0.05% uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5; /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`. constructor(IBentoBoxV1 bentoBox_) public { bentoBox = bentoBox_; masterContract = this; } /// @notice Serves as the constructor for clones, as clones can't have a regular constructor /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData) function init(bytes calldata data) public payable override { require(address(collateral) == address(0), "KashiPair: already initialized"); (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes)); require(address(collateral) != address(0), "KashiPair: bad pair"); accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100% } /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees. function accrue() public { AccrueInfo memory _accrueInfo = accrueInfo; // Number of seconds since accrue was called uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued; if (elapsedTime == 0) { return; } _accrueInfo.lastAccrued = uint64(block.timestamp); Rebase memory _totalBorrow = totalBorrow; if (_totalBorrow.base == 0) { // If there are no borrows, reset the interest rate if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) { _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND; emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0); } accrueInfo = _accrueInfo; return; } uint256 extraAmount = 0; uint256 feeFraction = 0; Rebase memory _totalAsset = totalAsset; // Accrue interest extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18; _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128()); uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic); uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount; _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128()); totalAsset.base = _totalAsset.base.add(feeFraction.to128()); totalBorrow = _totalBorrow; // Update interest rate uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount; if (utilization < MINIMUM_TARGET_UTILIZATION) { uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION; uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime)); _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale); if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) { _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum } } else if (utilization > MAXIMUM_TARGET_UTILIZATION) { uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX; uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime)); uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY; if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) { newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum } _accrueInfo.interestPerSecond = uint64(newInterestPerSecond); } emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization); accrueInfo = _accrueInfo; } /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`. /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls. function _isSolvent( address user, bool open, uint256 _exchangeRate ) internal view returns (bool) { // accrue must have already been called! uint256 borrowPart = userBorrowPart[user]; if (borrowPart == 0) return true; uint256 collateralShare = userCollateralShare[user]; if (collateralShare == 0) return false; Rebase memory _totalBorrow = totalBorrow; return bentoBox.toAmount( collateral, collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul( open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE ), false ) >= // Moved exchangeRate here instead of dividing the other side to preserve more precision borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base; } /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body. modifier solvent() { _; require(_isSolvent(msg.sender, false, exchangeRate), "KashiPair: user insolvent"); } /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset. /// This function is supposed to be invoked if needed because Oracle queries can be expensive. /// @return updated True if `exchangeRate` was updated. /// @return rate The new exchange rate. function updateExchangeRate() public returns (bool updated, uint256 rate) { (updated, rate) = oracle.get(oracleData); if (updated) { exchangeRate = rate; emit LogExchangeRate(rate); } else { // Return the old rate if fetching wasn't successful rate = exchangeRate; } } /// @dev Helper function to move tokens. /// @param token The ERC-20 token. /// @param share The amount in shares to add. /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True. /// Only used for accounting checks. /// @param skim If True, only does a balance check on this contract. /// False if tokens from msg.sender in `bentoBox` should be transferred. function _addTokens( IERC20 token, uint256 share, uint256 total, bool skim ) internal { if (skim) { require(share <= bentoBox.balanceOf(token, address(this)).sub(total), "KashiPair: Skim too much"); } else { bentoBox.transfer(token, msg.sender, address(this), share); } } /// @notice Adds `collateral` from msg.sender to the account `to`. /// @param to The receiver of the tokens. /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender. /// False if tokens from msg.sender in `bentoBox` should be transferred. /// @param share The amount of shares to add for `to`. function addCollateral( address to, bool skim, uint256 share ) public { userCollateralShare[to] = userCollateralShare[to].add(share); uint256 oldTotalCollateralShare = totalCollateralShare; totalCollateralShare = oldTotalCollateralShare.add(share); _addTokens(collateral, share, oldTotalCollateralShare, skim); emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share); } /// @dev Concrete implementation of `removeCollateral`. function _removeCollateral(address to, uint256 share) internal { userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share); totalCollateralShare = totalCollateralShare.sub(share); emit LogRemoveCollateral(msg.sender, to, share); bentoBox.transfer(collateral, address(this), to, share); } /// @notice Removes `share` amount of collateral and transfers it to `to`. /// @param to The receiver of the shares. /// @param share Amount of shares to remove. function removeCollateral(address to, uint256 share) public solvent { // accrue must be called because we check solvency accrue(); _removeCollateral(to, share); } /// @dev Concrete implementation of `addAsset`. function _addAsset( address to, bool skim, uint256 share ) internal returns (uint256 fraction) { Rebase memory _totalAsset = totalAsset; uint256 totalAssetShare = _totalAsset.elastic; uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true); fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare; if (_totalAsset.base.add(fraction.to128()) < 1000) { return 0; } totalAsset = _totalAsset.add(share, fraction); balanceOf[to] = balanceOf[to].add(fraction); emit Transfer(address(0), to, fraction); _addTokens(asset, share, totalAssetShare, skim); emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction); } /// @notice Adds assets to the lending pair. /// @param to The address of the user to receive the assets. /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender. /// False if tokens from msg.sender in `bentoBox` should be transferred. /// @param share The amount of shares to add. /// @return fraction Total fractions added. function addAsset( address to, bool skim, uint256 share ) public returns (uint256 fraction) { accrue(); fraction = _addAsset(to, skim, share); } /// @dev Concrete implementation of `removeAsset`. function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) { Rebase memory _totalAsset = totalAsset; uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true); share = fraction.mul(allShare) / _totalAsset.base; balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction); emit Transfer(msg.sender, address(0), fraction); _totalAsset.elastic = _totalAsset.elastic.sub(share.to128()); _totalAsset.base = _totalAsset.base.sub(fraction.to128()); require(_totalAsset.base >= 1000, "Kashi: below minimum"); totalAsset = _totalAsset; emit LogRemoveAsset(msg.sender, to, share, fraction); bentoBox.transfer(asset, address(this), to, share); } /// @notice Removes an asset from msg.sender and transfers it to `to`. /// @param to The user that receives the removed assets. /// @param fraction The amount/fraction of assets held to remove. /// @return share The amount of shares transferred to `to`. function removeAsset(address to, uint256 fraction) public returns (uint256 share) { accrue(); share = _removeAsset(to, fraction); } /// @dev Concrete implementation of `borrow`. function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) { uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true); userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part); emit LogBorrow(msg.sender, to, amount, feeAmount, part); share = bentoBox.toShare(asset, amount, false); Rebase memory _totalAsset = totalAsset; require(_totalAsset.base >= 1000, "Kashi: below minimum"); _totalAsset.elastic = _totalAsset.elastic.sub(share.to128()); totalAsset = _totalAsset; bentoBox.transfer(asset, address(this), to, share); } /// @notice Sender borrows `amount` and transfers it to `to`. /// @return part Total part of the debt held by borrowers. /// @return share Total amount in shares borrowed. function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) { accrue(); (part, share) = _borrow(to, amount); } /// @dev Concrete implementation of `repay`. function _repay( address to, bool skim, uint256 part ) internal returns (uint256 amount) { (totalBorrow, amount) = totalBorrow.sub(part, true); userBorrowPart[to] = userBorrowPart[to].sub(part); uint256 share = bentoBox.toShare(asset, amount, true); uint128 totalShare = totalAsset.elastic; _addTokens(asset, share, uint256(totalShare), skim); totalAsset.elastic = totalShare.add(share.to128()); emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part); } /// @notice Repays a loan. /// @param to Address of the user this payment should go. /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender. /// False if tokens from msg.sender in `bentoBox` should be transferred. /// @param part The amount to repay. See `userBorrowPart`. /// @return amount The total amount repayed. function repay( address to, bool skim, uint256 part ) public returns (uint256 amount) { accrue(); amount = _repay(to, skim, part); } // Functions that need accrue to be called uint8 internal constant ACTION_ADD_ASSET = 1; uint8 internal constant ACTION_REPAY = 2; uint8 internal constant ACTION_REMOVE_ASSET = 3; uint8 internal constant ACTION_REMOVE_COLLATERAL = 4; uint8 internal constant ACTION_BORROW = 5; uint8 internal constant ACTION_GET_REPAY_SHARE = 6; uint8 internal constant ACTION_GET_REPAY_PART = 7; uint8 internal constant ACTION_ACCRUE = 8; // Functions that don't need accrue to be called uint8 internal constant ACTION_ADD_COLLATERAL = 10; uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11; // Function on BentoBox uint8 internal constant ACTION_BENTO_DEPOSIT = 20; uint8 internal constant ACTION_BENTO_WITHDRAW = 21; uint8 internal constant ACTION_BENTO_TRANSFER = 22; uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23; uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24; // Any external call (except to BentoBox) uint8 internal constant ACTION_CALL = 30; int256 internal constant USE_VALUE1 = -1; int256 internal constant USE_VALUE2 = -2; /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`. function _num( int256 inNum, uint256 value1, uint256 value2 ) internal pure returns (uint256 outNum) { outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2); } /// @dev Helper function for depositing into `bentoBox`. function _bentoDeposit( bytes memory data, uint256 value, uint256 value1, uint256 value2 ) internal returns (uint256, uint256) { (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256)); amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors share = int256(_num(share, value1, value2)); return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share)); } /// @dev Helper function to withdraw from the `bentoBox`. function _bentoWithdraw( bytes memory data, uint256 value1, uint256 value2 ) internal returns (uint256, uint256) { (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256)); return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2)); } /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure. /// Calls to `bentoBox` are not allowed for obvious security reasons. /// This also means that calls made from this contract shall *not* be trusted. function _call( uint256 value, bytes memory data, uint256 value1, uint256 value2 ) internal returns (bytes memory, uint8) { (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) = abi.decode(data, (address, bytes, bool, bool, uint8)); if (useValue1 && !useValue2) { callData = abi.encodePacked(callData, value1); } else if (!useValue1 && useValue2) { callData = abi.encodePacked(callData, value2); } else if (useValue1 && useValue2) { callData = abi.encodePacked(callData, value1, value2); } require(callee != address(bentoBox) && callee != address(this), "KashiPair: can't call"); (bool success, bytes memory returnData) = callee.call{value: value}(callData); require(success, "KashiPair: call failed"); return (returnData, returnValues); } struct CookStatus { bool needsSolvencyCheck; bool hasAccrued; } /// @notice Executes a set of actions and allows composability (contract calls) to other contracts. /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations). /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions. /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`. /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments. /// @return value1 May contain the first positioned return value of the last executed action (if applicable). /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable). function cook( uint8[] calldata actions, uint256[] calldata values, bytes[] calldata datas ) external payable returns (uint256 value1, uint256 value2) { CookStatus memory status; for (uint256 i = 0; i < actions.length; i++) { uint8 action = actions[i]; if (!status.hasAccrued && action < 10) { accrue(); status.hasAccrued = true; } if (action == ACTION_ADD_COLLATERAL) { (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool)); addCollateral(to, skim, _num(share, value1, value2)); } else if (action == ACTION_ADD_ASSET) { (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool)); value1 = _addAsset(to, skim, _num(share, value1, value2)); } else if (action == ACTION_REPAY) { (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool)); _repay(to, skim, _num(part, value1, value2)); } else if (action == ACTION_REMOVE_ASSET) { (int256 fraction, address to) = abi.decode(datas[i], (int256, address)); value1 = _removeAsset(to, _num(fraction, value1, value2)); } else if (action == ACTION_REMOVE_COLLATERAL) { (int256 share, address to) = abi.decode(datas[i], (int256, address)); _removeCollateral(to, _num(share, value1, value2)); status.needsSolvencyCheck = true; } else if (action == ACTION_BORROW) { (int256 amount, address to) = abi.decode(datas[i], (int256, address)); (value1, value2) = _borrow(to, _num(amount, value1, value2)); status.needsSolvencyCheck = true; } else if (action == ACTION_UPDATE_EXCHANGE_RATE) { (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256)); (bool updated, uint256 rate) = updateExchangeRate(); require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), "KashiPair: rate not ok"); } else if (action == ACTION_BENTO_SETAPPROVAL) { (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) = abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32)); bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s); } else if (action == ACTION_BENTO_DEPOSIT) { (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2); } else if (action == ACTION_BENTO_WITHDRAW) { (value1, value2) = _bentoWithdraw(datas[i], value1, value2); } else if (action == ACTION_BENTO_TRANSFER) { (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256)); bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2)); } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) { (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[])); bentoBox.transferMultiple(token, msg.sender, tos, shares); } else if (action == ACTION_CALL) { (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2); if (returnValues == 1) { (value1) = abi.decode(returnData, (uint256)); } else if (returnValues == 2) { (value1, value2) = abi.decode(returnData, (uint256, uint256)); } } else if (action == ACTION_GET_REPAY_SHARE) { int256 part = abi.decode(datas[i], (int256)); value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true); } else if (action == ACTION_GET_REPAY_PART) { int256 amount = abi.decode(datas[i], (int256)); value1 = totalBorrow.toBase(_num(amount, value1, value2), false); } } if (status.needsSolvencyCheck) { require(_isSolvent(msg.sender, false, exchangeRate), "KashiPair: user insolvent"); } } /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low. /// @param users An array of user addresses. /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user. /// @param to Address of the receiver in open liquidations if `swapper` is zero. /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`. /// @param open True to perform a open liquidation else False. function liquidate( address[] calldata users, uint256[] calldata maxBorrowParts, address to, ISwapper swapper, bool open ) public { // Oracle can fail but we still need to allow liquidations (, uint256 _exchangeRate) = updateExchangeRate(); accrue(); uint256 allCollateralShare; uint256 allBorrowAmount; uint256 allBorrowPart; Rebase memory _totalBorrow = totalBorrow; Rebase memory bentoBoxTotals = bentoBox.totals(collateral); for (uint256 i = 0; i < users.length; i++) { address user = users[i]; if (!_isSolvent(user, open, _exchangeRate)) { uint256 borrowPart; { uint256 availableBorrowPart = userBorrowPart[user]; borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i]; userBorrowPart[user] = availableBorrowPart.sub(borrowPart); } uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false); uint256 collateralShare = bentoBoxTotals.toBase( borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) / (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION), false ); userCollateralShare[user] = userCollateralShare[user].sub(collateralShare); emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare); emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart); // Keep totals allCollateralShare = allCollateralShare.add(collateralShare); allBorrowAmount = allBorrowAmount.add(borrowAmount); allBorrowPart = allBorrowPart.add(borrowPart); } } require(allBorrowAmount != 0, "KashiPair: all are solvent"); _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128()); _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128()); totalBorrow = _totalBorrow; totalCollateralShare = totalCollateralShare.sub(allCollateralShare); uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true); if (!open) { // Closed liquidation using a pre-approved swapper for the benefit of the LPs require(masterContract.swappers(swapper), "KashiPair: Invalid swapper"); // Swaps the users' collateral for the borrowed asset bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare); swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare); uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic)); uint256 extraShare = returnedShare.sub(allBorrowShare); uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee // solhint-disable-next-line reentrancy bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare); totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128()); emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0); } else { // Swap using a swapper freely chosen by the caller // Open (flash) liquidation: get proceeds first and provide the borrow after bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare); if (swapper != ISwapper(0)) { swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare); } bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare); totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128()); } } /// @notice Withdraws the fees accumulated. function withdrawFees() public { accrue(); address _feeTo = masterContract.feeTo(); uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction; balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction); emit Transfer(address(0), _feeTo, _feesEarnedFraction); accrueInfo.feesEarnedFraction = 0; emit LogWithdrawFees(_feeTo, _feesEarnedFraction); } /// @notice Used to register and enable or disable swapper contracts used in closed liquidations. /// MasterContract Only Admin function. /// @param swapper The address of the swapper contract that conforms to `ISwapper`. /// @param enable True to enable the swapper. To disable use False. function setSwapper(ISwapper swapper, bool enable) public onlyOwner { swappers[swapper] = enable; } /// @notice Sets the beneficiary of fees accrued in liquidations. /// MasterContract Only Admin function. /// @param newFeeTo The address of the receiver. function setFeeTo(address newFeeTo) public onlyOwner { feeTo = newFeeTo; emit LogFeeTo(newFeeTo); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IBentoBoxV1","name":"bentoBox_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"accruedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeFraction","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"rate","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"utilization","type":"uint256"}],"name":"LogAccrue","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"share","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fraction","type":"uint256"}],"name":"LogAddAsset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"share","type":"uint256"}],"name":"LogAddCollateral","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"part","type":"uint256"}],"name":"LogBorrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"}],"name":"LogExchangeRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newFeeTo","type":"address"}],"name":"LogFeeTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"share","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fraction","type":"uint256"}],"name":"LogRemoveAsset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"share","type":"uint256"}],"name":"LogRemoveCollateral","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"part","type":"uint256"}],"name":"LogRepay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feeTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"feesEarnedFraction","type":"uint256"}],"name":"LogWithdrawFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accrue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"accrueInfo","outputs":[{"internalType":"uint64","name":"interestPerSecond","type":"uint64"},{"internalType":"uint64","name":"lastAccrued","type":"uint64"},{"internalType":"uint128","name":"feesEarnedFraction","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"skim","type":"bool"},{"internalType":"uint256","name":"share","type":"uint256"}],"name":"addAsset","outputs":[{"internalType":"uint256","name":"fraction","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"skim","type":"bool"},{"internalType":"uint256","name":"share","type":"uint256"}],"name":"addCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bentoBox","outputs":[{"internalType":"contract IBentoBoxV1","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"borrow","outputs":[{"internalType":"uint256","name":"part","type":"uint256"},{"internalType":"uint256","name":"share","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collateral","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"actions","type":"uint8[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes[]","name":"datas","type":"bytes[]"}],"name":"cook","outputs":[{"internalType":"uint256","name":"value1","type":"uint256"},{"internalType":"uint256","name":"value2","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"maxBorrowParts","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"contract ISwapper","name":"swapper","type":"address"},{"internalType":"bool","name":"open","type":"bool"}],"name":"liquidate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"masterContract","outputs":[{"internalType":"contract KashiPairMediumRiskV1","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"fraction","type":"uint256"}],"name":"removeAsset","outputs":[{"internalType":"uint256","name":"share","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"share","type":"uint256"}],"name":"removeCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"skim","type":"bool"},{"internalType":"uint256","name":"part","type":"uint256"}],"name":"repay","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFeeTo","type":"address"}],"name":"setFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ISwapper","name":"swapper","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setSwapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ISwapper","name":"","type":"address"}],"name":"swappers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAsset","outputs":[{"internalType":"uint128","name":"elastic","type":"uint128"},{"internalType":"uint128","name":"base","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBorrow","outputs":[{"internalType":"uint128","name":"elastic","type":"uint128"},{"internalType":"uint128","name":"base","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCollateralShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"bool","name":"direct","type":"bool"},{"internalType":"bool","name":"renounce","type":"bool"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateExchangeRate","outputs":[{"internalType":"bool","name":"updated","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userBorrowPart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userCollateralShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101006040523480156200001257600080fd5b50604051620061d2380380620061d28339810160408190526200003591620000fe565b4660a08190526200004681620000a8565b60805250600380546001600160a01b031916339081179091556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606091821b1660c05230901b60e0526200014d565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692188230604051602001620000e1939291906200012e565b604051602081830303815290604052805190602001209050919050565b60006020828403121562000110578081fd5b81516001600160a01b038116811462000127578182fd5b9392505050565b92835260208301919091526001600160a01b0316604082015260600190565b60805160a05160c05160601c60e05160601c615fae6200022460003980610dca5280611f9052806122805280612949525080611487528061164f5280611727528061189a5280611a3f5280611b6e5280611ee7528061204b528061217b528061223a5280612414528061255d52806126c15280612dd7528061332c528061343452806134f652806136de528061379e52806139985280613c665280613db55280613ede528061406b528061412152806141fd5280614382528061467d5280614704525080610cf3525080610d285250615fae6000f3fe6080604052600436106102c25760003560e01c8063656f3d641161017f5780638da5cb5b116100e1578063d8dfeb451161008a578063f46901ed11610064578063f46901ed1461078b578063f8ba4cff146107ab578063f9557ccb146107c0576102c2565b8063d8dfeb4514610741578063dd62ed3e14610756578063e30c397814610776576102c2565b8063b27c0e74116100bb578063b27c0e74146106e8578063cd446e221461070c578063d505accf14610721576102c2565b80638da5cb5b1461069e57806395d89b41146106b3578063a9059cbb146106c8576102c2565b80637dc0d1d011610143578063860ffea11161011d578063860ffea11461063e578063876467f81461065e5780638cad7fbe1461067e576102c2565b80637dc0d1d0146105e65780637ecebe00146105fb5780638285ef401461061b576102c2565b8063656f3d64146105695780636b2ace871461057c57806370a082311461059157806374645ff3146105b157806376ee101b146105c6576102c2565b8063313ce56711610228578063473e3ce7116101ec5780634b8a3529116101c65780634b8a3529146105135780634ddf47d4146105415780634e71e0c814610554576102c2565b8063473e3ce7146104c9578063476343ee146104de57806348e4163e146104f3576102c2565b8063313ce567146104485780633644e5151461046a57806338d52e0f1461047f5780633ba0b9a9146104945780633f2617cb146104a9576102c2565b806315294c401161028a5780631c9e379b116102645780631c9e379b146103e85780632317ef671461040857806323b872dd14610428576102c2565b806315294c401461038657806318160ddd146103b35780631b51e940146103c8576102c2565b8063017e7e58146102c757806302ce728f146102f257806306fdde0314610315578063078dfbe714610337578063095ea7b314610359575b600080fd5b3480156102d357600080fd5b506102dc6107d5565b6040516102e991906155d0565b60405180910390f35b3480156102fe57600080fd5b506103076107e4565b6040516102e9929190615628565b34801561032157600080fd5b5061032a6108c1565b6040516102e991906156b2565b34801561034357600080fd5b50610357610352366004614e55565b610999565b005b34801561036557600080fd5b50610379610374366004614ece565b610a89565b6040516102e9919061561d565b34801561039257600080fd5b506103a66103a1366004614e9f565b610af4565b6040516102e99190615638565b3480156103bf57600080fd5b506103a6610b11565b3480156103d457600080fd5b506103a66103e3366004614e9f565b610b27565b3480156103f457600080fd5b506103a6610403366004614c3e565b610b3c565b34801561041457600080fd5b506103a6610423366004614ece565b610b4e565b34801561043457600080fd5b50610379610443366004614da5565b610b69565b34801561045457600080fd5b5061045d610cd1565b6040516102e99190615e1c565b34801561047657600080fd5b506103a6610cee565b34801561048b57600080fd5b506102dc610d4e565b3480156104a057600080fd5b506103a6610d5d565b3480156104b557600080fd5b506103576104c43660046152df565b610d63565b3480156104d557600080fd5b506103a6610db8565b3480156104ea57600080fd5b50610357610dbe565b3480156104ff57600080fd5b506103a661050e366004614c3e565b610f2e565b34801561051f57600080fd5b5061053361052e366004614ece565b610f40565b6040516102e9929190615dcc565b61035761054f3660046150b0565b610f8e565b34801561056057600080fd5b50610357611071565b610533610577366004614f9e565b6110ff565b34801561058857600080fd5b506102dc611a3d565b34801561059d57600080fd5b506103a66105ac366004614c3e565b611a61565b3480156105bd57600080fd5b5061032a611a73565b3480156105d257600080fd5b506103576105e1366004614ef9565b611b01565b3480156105f257600080fd5b506102dc61260b565b34801561060757600080fd5b506103a6610616366004614c3e565b61261a565b34801561062757600080fd5b5061063061262c565b6040516102e9929190615db2565b34801561064a57600080fd5b50610357610659366004614e9f565b612646565b34801561066a57600080fd5b50610357610679366004614ece565b612727565b34801561068a57600080fd5b50610379610699366004614c3e565b612767565b3480156106aa57600080fd5b506102dc61277c565b3480156106bf57600080fd5b5061032a61278b565b3480156106d457600080fd5b506103796106e3366004614ece565b61284f565b3480156106f457600080fd5b506106fd61291a565b6040516102e993929190615df0565b34801561071857600080fd5b506102dc612947565b34801561072d57600080fd5b5061035761073c366004614de5565b61296b565b34801561074d57600080fd5b506102dc612b0c565b34801561076257600080fd5b506103a6610771366004614d6d565b612b1b565b34801561078257600080fd5b506102dc612b38565b34801561079757600080fd5b506103576107a6366004614c3e565b612b47565b3480156107b757600080fd5b50610357612bbb565b3480156107cc57600080fd5b50610630613187565b6005546001600160a01b031681565b60095460405163d6d7d52560e01b815260009182916001600160a01b039091169063d6d7d5259061081a90600a906004016156c5565b6040805180830381600087803b15801561083357600080fd5b505af1158015610847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086b919061504f565b909250905081156108b85760108190556040517f9f9192b5edb17356c524e08d9e025c8e2f6307e6ea52fb7968faa3081f51c3c8906108ab908390615638565b60405180910390a16108bd565b506010545b9091565b6007546060906108d9906001600160a01b03166131a1565b6008546108ee906001600160a01b03166131a1565b60095460405163355a219b60e21b81526001600160a01b039091169063d568866c9061091f90600a906004016156c5565b60006040518083038186803b15801561093757600080fd5b505afa15801561094b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610973919081019061536e565b604051602001610985939291906154e6565b604051602081830303815290604052905090565b6003546001600160a01b031633146109cc5760405162461bcd60e51b81526004016109c390615b90565b60405180910390fd5b8115610a68576001600160a01b0383161515806109e65750805b610a025760405162461bcd60e51b81526004016109c3906159b0565b6003546040516001600160a01b038086169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0385166001600160a01b031991821617909155600480549091169055610a84565b600480546001600160a01b0319166001600160a01b0385161790555b505050565b3360008181526001602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610ae2908690615638565b60405180910390a35060015b92915050565b6000610afe612bbb565b610b09848484613266565b949350505050565b600c54600160801b90046001600160801b031690565b6000610b31612bbb565b610b0984848461349f565b600e6020526000908152604090205481565b6000610b58612bbb565b610b62838361374a565b9392505050565b60008115610c8e576001600160a01b03841660009081526020819052604090205482811015610baa5760405162461bcd60e51b81526004016109c390615c68565b836001600160a01b0316856001600160a01b031614610c8c576001600160a01b03851660009081526001602090815260408083203384529091529020546000198114610c395783811015610c105760405162461bcd60e51b81526004016109c390615ac3565b6001600160a01b0386166000908152600160209081526040808320338452909152902084820390555b6001600160a01b038516610c5f5760405162461bcd60e51b81526004016109c390615942565b506001600160a01b0380861660009081526020819052604080822086850390559186168152208054840190555b505b826001600160a01b0316846001600160a01b0316600080516020615f5983398151915284604051610cbf9190615638565b60405180910390a35060019392505050565b600854600090610ce9906001600160a01b0316613a11565b905090565b6000467f00000000000000000000000000000000000000000000000000000000000000008114610d2657610d2181613aca565b610d48565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b6008546001600160a01b031681565b60105481565b6003546001600160a01b03163314610d8d5760405162461bcd60e51b81526004016109c390615b90565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b600b5481565b610dc6612bbb565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b158015610e2157600080fd5b505afa158015610e35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e599190614c5a565b6011546001600160a01b038216600090815260208190526040902054919250600160801b90046001600160801b031690610e939082613b1e565b6001600160a01b038316600081815260208190526040808220939093559151909190600080516020615f5983398151915290610ed0908590615638565b60405180910390a3601180546001600160801b031690556040516001600160a01b038316907fbe641c3ffc44b2d6c184f023fa4ed7bda4b6ffa71e03b3c98ae0c776da1f17e790610f22908490615638565b60405180910390a25050565b600f6020526000908152604090205481565b600080610f4b612bbb565b610f558484613b41565b8092508193505050610f6b336000601054613e2f565b610f875760405162461bcd60e51b81526004016109c390615b59565b9250929050565b6007546001600160a01b031615610fb75760405162461bcd60e51b81526004016109c39061590b565b610fc381830183615235565b805160079060009060089082906009908290610fe690600a9060208a0190614a71565b5081546001600160a01b0398891661010092830a908102908a021990911617909155825497871691810a918202918702199097161790558154958416940a938402938302199094169290921790925550600754166110565760405162461bcd60e51b81526004016109c390615a8c565b50506011805467ffffffffffffffff19166312e687c0179055565b6004546001600160a01b031633811461109c5760405162461bcd60e51b81526004016109c390615bc5565b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b039092166001600160a01b0319928316179055600480549091169055565b60008061110a614aeb565b60005b888110156119ff5760008a8a8381811061112357fe5b9050602002016020810190611138919061541d565b9050826020015115801561114f5750600a8160ff16105b156111645761115c612bbb565b600160208401525b60ff8116600a14156111be57600080600089898681811061118157fe5b90506020028101906111939190615e2a565b8101906111a09190615348565b9250925092506111b68282610659868c8c613faa565b5050506119f6565b60ff81166001141561121f5760008060008989868181106111db57fe5b90506020028101906111ed9190615e2a565b8101906111fa9190615348565b9250925092506112158282611210868c8c613faa565b61349f565b97505050506119f6565b60ff81166002141561127f57600080600089898681811061123c57fe5b905060200281019061124e9190615e2a565b81019061125b9190615348565b9250925092506112768282611271868c8c613faa565b613266565b505050506119f6565b60ff8116600314156112da5760008088888581811061129a57fe5b90506020028101906112ac9190615e2a565b8101906112b99190615324565b915091506112d1816112cc848a8a613faa565b61374a565b965050506119f6565b60ff811660041415611337576000808888858181106112f557fe5b90506020028101906113079190615e2a565b8101906113149190615324565b9150915061132c81611327848a8a613faa565b613fd2565b5050600183526119f6565b60ff81166005141561139a5760008088888581811061135257fe5b90506020028101906113649190615e2a565b8101906113719190615324565b9150915061138981611384848a8a613faa565b613b41565b6001875290975095506119f6915050565b60ff8116600b14156114395760008060008989868181106113b757fe5b90506020028101906113c99190615e2a565b8101906113d6919061507c565b9250925092506000806113e76107e4565b915091508415806113f55750815b801561140057508381115b8015611413575082158061141357508281115b61142f5760405162461bcd60e51b81526004016109c390615d44565b50505050506119f6565b60ff811660181415611518576000806000806000808c8c8981811061145a57fe5b905060200281019061146c9190615e2a565b8101906114799190614c76565b9550955095509550955095507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c0a47c938787878787876040518763ffffffff1660e01b81526004016114db969594939291906155e4565b600060405180830381600087803b1580156114f557600080fd5b505af1158015611509573d6000803e3d6000fd5b505050505050505050506119f6565b60ff8116601414156115a05761159687878481811061153357fe5b90506020028101906115459190615e2a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92508c915086905081811061158857fe5b9050602002013587876140e0565b90955093506119f6565b60ff81166015141561160b576115968787848181106115bb57fe5b90506020028101906115cd9190615e2a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508992508891506141d69050565b60ff8116601614156116e357600080600089898681811061162857fe5b905060200281019061163a9190615e2a565b8101906116479190614da5565b9250925092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f18d03cc84338561168a868e8e613faa565b6040518563ffffffff1660e01b81526004016116a99493929190615769565b600060405180830381600087803b1580156116c357600080fd5b505af11580156116d7573d6000803e3d6000fd5b505050505050506119f6565b60ff81166017141561177757600060608089898681811061170057fe5b90506020028101906117129190615e2a565b81019061171f9190615163565b9250925092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630fca8843843385856040518563ffffffff1660e01b81526004016116a994939291906157c7565b60ff8116601e141561185157606060006117f98b8b8681811061179657fe5b905060200201358a8a878181106117a957fe5b90506020028101906117bb9190615e2a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508b91506142c49050565b915091508060ff1660011415611824578180602001905181019061181d91906153e2565b965061184a565b8060ff166002141561184a578180602001905181019061184491906153fa565b90975095505b50506119f6565b60ff81166006141561197957600087878481811061186b57fe5b905060200281019061187d9190615e2a565b81019061188a919061530c565b6008549091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163da5139ca91166119016118d1858b8b613faa565b60408051808201909152600d546001600160801b038082168352600160801b90910416602082015290600161447a565b60016040518463ffffffff1660e01b81526004016119219392919061588d565b60206040518083038186803b15801561193957600080fd5b505afa15801561194d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197191906153e2565b9550506119f6565b60ff8116600714156119f657600087878481811061199357fe5b90506020028101906119a59190615e2a565b8101906119b2919061530c565b90506119f26119c2828888613faa565b60408051808201909152600d546001600160801b038082168352600160801b909104166020820152906000614513565b9550505b5060010161110d565b50805115611a3157611a15336000601054613e2f565b611a315760405162461bcd60e51b81526004016109c390615b59565b50965096945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006020819052908152604090205481565b600a805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611af95780601f10611ace57610100808354040283529160200191611af9565b820191906000526020600020905b815481529060010190602001808311611adc57829003601f168201915b505050505081565b6000611b0b6107e4565b915050611b16612bbb565b6000806000611b23614aeb565b5060408051808201909152600d546001600160801b038082168352600160801b909104166020820152611b54614aeb565b600754604051634ffe34db60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811692634ffe34db92611ba79291909116906004016155d0565b604080518083038186803b158015611bbe57600080fd5b505afa158015611bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf691906153a0565b905060005b8c811015611e1d5760008e8e83818110611c1157fe5b9050602002016020810190611c269190614c3e565b9050611c33818a8a613e2f565b611e14576001600160a01b0381166000908152600f6020526040812054808f8f86818110611c5d57fe5b9050602002013511611c81578e8e85818110611c7557fe5b90506020020135611c83565b805b9150611c8f818361458c565b6001600160a01b0384166000908152600f60205260408120919091559050611cb886838361447a565b90506000611cf369152d02c7e14af6800000611ce18d611cdb866201b5806145af565b906145af565b81611ce857fe5b889190046000614513565b6001600160a01b0385166000908152600e6020526040902054909150611d19908261458c565b6001600160a01b038086166000908152600e60205260409020919091558d1615611d43578c611d45565b8d5b6001600160a01b0316846001600160a01b03167f8ad4d3ff00da092c7ad9a573ea4f5f6a3dffc6712dc06d3f78f49b862297c40283604051611d879190615638565b60405180910390a36001600160a01b03808516908e1615611da8578d611daa565b335b6001600160a01b03167fc8e512d8f188ca059984b5853d2bf653da902696b8512785b182b2c813789a6e8486604051611de4929190615dcc565b60405180910390a3611df68a82613b1e565b9950611e028983613b1e565b9850611e0e8884613b1e565b97505050505b50600101611bfb565b5083611e3b5760405162461bcd60e51b81526004016109c390615979565b611e58611e47856145e6565b83516001600160801b031690614613565b6001600160801b03168252611e83611e6f846145e6565b60208401516001600160801b031690614613565b6001600160801b03908116602084018190528351600d80546001600160801b03191691841691909117909216600160801b909102179055600b54611ec7908661458c565b600b55600854604051636d289ce560e11b81526000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263da5139ca92611f22921690899060019060040161588d565b60206040518083038186803b158015611f3a57600080fd5b505afa158015611f4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7291906153e2565b90508761240757604051634656bfdf60e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638cad7fbe90611fc5908c906004016155d0565b60206040518083038186803b158015611fdd57600080fd5b505afa158015611ff1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120159190615033565b6120315760405162461bcd60e51b81526004016109c390615cd6565b600754604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc9261208a92919091169030908e908c90600401615769565b600060405180830381600087803b1580156120a457600080fd5b505af11580156120b8573d6000803e3d6000fd5b50506007546008546040516371a1ff0960e11b81526001600160a01b03808f16955063e343fe1294506120f8938116921690309087908d90600401615793565b6040805180830381600087803b15801561211157600080fd5b505af1158015612125573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214991906153fa565b5050600c54600854604051633de222bb60e21b815260009261220c926001600160801b03909116916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f7888aec926121b6929190911690309060040161574f565b60206040518083038186803b1580156121ce57600080fd5b505afa1580156121e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220691906153e2565b9061458c565b9050600061221a828461458c565b90506000620186a061222e836127106145af565b8161223557fe5b0490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f18d03cc600860009054906101000a90046001600160a01b0316307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b1580156122d757600080fd5b505afa1580156122eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230f9190614c5a565b856040518563ffffffff1660e01b815260040161232f9493929190615769565b600060405180830381600087803b15801561234957600080fd5b505af115801561235d573d6000803e3d6000fd5b5050505061239161237f61237a838661458c90919063ffffffff16565b6145e6565b600c546001600160801b031690614642565b600c80546001600160801b0319166001600160801b0392909216919091179055306001600160a01b038d167f30a8c4f9ab5af7e1309ca87c32377d1a83366c5990472dbf9d262450eae14e386123e7858561458c565b60006040516123f7929190615dcc565b60405180910390a35050506125fb565b6007546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163f18d03cc919081169030908d161561244f578c612451565b8d5b8a6040518563ffffffff1660e01b81526004016124719493929190615769565b600060405180830381600087803b15801561248b57600080fd5b505af115801561249f573d6000803e3d6000fd5b505050506001600160a01b03891615612543576007546008546040516371a1ff0960e11b81526001600160a01b03808d169363e343fe12936124ef93918316921690339087908d90600401615793565b6040805180830381600087803b15801561250857600080fd5b505af115801561251c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254091906153fa565b50505b600854604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc9261259c929190911690339030908790600401615769565b600060405180830381600087803b1580156125b657600080fd5b505af11580156125ca573d6000803e3d6000fd5b505050506125da61237f826145e6565b600c80546001600160801b0319166001600160801b03929092169190911790555b5050505050505050505050505050565b6009546001600160a01b031681565b60026020526000908152604090205481565b600d546001600160801b0380821691600160801b90041682565b6001600160a01b0383166000908152600e60205260409020546126699082613b1e565b6001600160a01b0384166000908152600e6020526040902055600b5461268f8183613b1e565b600b556007546126aa906001600160a01b0316838386614671565b836001600160a01b0316836126bf57336126e1565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b03167f9ed03113de523cebfe5e49d5f8e12894b1c0d42ce805990461726444c90eab87846040516127199190615638565b60405180910390a350505050565b61272f612bbb565b6127398282613fd2565b612747336000601054613e2f565b6127635760405162461bcd60e51b81526004016109c390615b59565b5050565b60066020526000908152604090205460ff1681565b6003546001600160a01b031681565b6007546060906127a3906001600160a01b0316614778565b6008546127b8906001600160a01b0316614778565b60095460405163634ce26b60e11b81526001600160a01b039091169063c699c4d6906127e990600a906004016156c5565b60006040518083038186803b15801561280157600080fd5b505afa158015612815573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261283d919081019061536e565b60405160200161098593929190615563565b600081156128e95733600090815260208190526040902054828110156128875760405162461bcd60e51b81526004016109c390615c68565b336001600160a01b038516146128e7576001600160a01b0384166128bd5760405162461bcd60e51b81526004016109c390615942565b3360009081526020819052604080822085840390556001600160a01b038616825290208054840190555b505b826001600160a01b0316336001600160a01b0316600080516020615f5983398151915284604051610ae29190615638565b6011546001600160401b0380821691600160401b810490911690600160801b90046001600160801b031683565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001600160a01b0387166129915760405162461bcd60e51b81526004016109c390615bfa565b8342106129b05760405162461bcd60e51b81526004016109c390615b31565b6001600160a01b0387166000818152600260209081526040918290208054600181810190925592519092612a2e92612a13927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928e928e928e92918e9101615641565b604051602081830303815290604052805190602001206147bf565b85858560405160008152602001604052604051612a4e9493929190615694565b6020604051602081039080840390855afa158015612a70573d6000803e3d6000fd5b505050602060405103516001600160a01b031614612aa05760405162461bcd60e51b81526004016109c390615d7b565b6001600160a01b038088166000818152600160209081526040808320948b168084529490915290819020889055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590612afb908990615638565b60405180910390a350505050505050565b6007546001600160a01b031681565b600160209081526000928352604080842090915290825290205481565b6004546001600160a01b031681565b6003546001600160a01b03163314612b715760405162461bcd60e51b81526004016109c390615b90565b600580546001600160a01b0319166001600160a01b0383169081179091556040517fcf1d3f17e521c635e0d20b8acba94ba170afc041d0546d46dafa09d3c9c19eb390600090a250565b612bc3614b02565b50604080516060810182526011546001600160401b038082168352600160401b82041660208301819052600160801b9091046001600160801b03169282019290925290420380612c14575050613185565b6001600160401b0342166020830152612c2b614aeb565b5060408051808201909152600d546001600160801b038082168352600160801b9091041660208201819052612d225782516001600160401b03166312e687c014612cb5576312e687c08084526040517f33af5ce86e8438eff54589f85332916444457dfa8685493fbd579b809097026b91612cac91600091829182906158b0565b60405180910390a15b5050805160118054602084015160409094015167ffffffffffffffff199091166001600160401b03938416176fffffffffffffffff00000000000000001916600160401b9390941692909202929092176001600160801b03908116600160801b9190921602179055613185565b600080612d2d614aeb565b5060408051808201909152600c546001600160801b038082168352600160801b9091048116602083015286518551670de0b6b3a764000092612d7f928992611cdb9216906001600160401b03166145af565b81612d8657fe5b049250612da6612d95846145e6565b85516001600160801b031690614642565b6001600160801b03168085526008548251604051630acc462360e31b8152600093612e679390926001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811693635662311893612e1193921691908890600401615861565b60206040518083038186803b158015612e2957600080fd5b505afa158015612e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e6191906153e2565b90613b1e565b90506000620186a0612e7b866127106145af565b81612e8257fe5b04905081612ea684602001516001600160801b0316836145af90919063ffffffff16565b81612ead57fe5b049350612ed0612ebc856145e6565b60408a01516001600160801b031690614642565b6001600160801b03166040890152612efe612eea856145e6565b60208501516001600160801b031690614642565b600c80546001600160801b03908116600160801b9382168402179091558751600d805460208b01516001600160801b031990911692841692831784169316909302919091179091556000908390612f5d90670de0b6b3a76400006145af565b81612f6457fe5b0490506709b6e64a8ec600008110156130265760006709b6e64a8ec60000612f98670de0b6b3a7640000611cdb838661458c565b81612f9f57fe5b0490506000612fcd612fb58b611cdb85806145af565b7054a2b63d65d79d094abb6688000000000090613b1e565b8b519091508190612ff8906001600160401b03167054a2b63d65d79d094abb668800000000006145af565b81612fff57fe5b046001600160401b0316808c526304b9a1f0111561301f576304b9a1f08b525b50506130d7565b670b1a2bc2ec5000008111156130d75760006702c68af0bb14000061305f670de0b6b3a7640000611cdb85670b1a2bc2ec50000061458c565b8161306657fe5b049050600061307c612fb58b611cdb85806145af565b8b519091506000907054a2b63d65d79d094abb66880000000000906130aa906001600160401b0316846145af565b816130b157fe5b0490506449d48246008111156130c957506449d48246005b6001600160401b03168b5250505b88516040517f33af5ce86e8438eff54589f85332916444457dfa8685493fbd579b809097026b9161310d918991899186906158b0565b60405180910390a1505086516011805460208a01516040909a015167ffffffffffffffff199091166001600160401b03938416176fffffffffffffffff00000000000000001916600160401b93909a1692909202989098176001600160801b03908116600160801b9190921602179096555050505050505b565b600c546001600160801b0380821691600160801b90041682565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009183916001600160a01b038616916131e89190615481565b600060405180830381855afa9150503d8060008114613223576040519150601f19603f3d011682016040523d82523d6000602084013e613228565b606091505b50915091508161325357604051806040016040528060038152602001623f3f3f60e81b81525061325c565b61325c816147f7565b925050505b919050565b60408051808201909152600d546001600160801b038082168352600160801b90910416602082015260009061329d9083600161495c565b8151600d80546020948501516001600160801b03908116600160801b029381166001600160801b031990921691909117169190911790556001600160a01b0386166000908152600f9092526040909120549091506132fb908361458c565b6001600160a01b038086166000908152600f6020526040808220939093556008549251636d289ce560e11b815290927f000000000000000000000000000000000000000000000000000000000000000083169263da5139ca926133699290911690869060019060040161588d565b60206040518083038186803b15801561338157600080fd5b505afa158015613395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133b991906153e2565b600c546008549192506001600160801b0316906133e1906001600160a01b0316838388614671565b6133fd6133ed836145e6565b6001600160801b03831690614642565b600c80546001600160801b0319166001600160801b03929092169190911790556001600160a01b038616856134325733613454565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b03167fc8e512d8f188ca059984b5853d2bf653da902696b8512785b182b2c813789a6e858760405161348e929190615dcc565b60405180910390a350509392505050565b60006134a9614aeb565b50604080518082018252600c546001600160801b03808216808452600160801b90920481166020840152600854600d549451636d289ce560e11b8152939492936000936001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169463da5139ca94613532949216921690600190600401615861565b60206040518083038186803b15801561354a57600080fd5b505afa15801561355e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358291906153e2565b83516001600160801b031601905080156135c457806135b784602001516001600160801b0316876145af90919063ffffffff16565b816135be57fe5b046135c6565b845b93506103e86135eb6135d7866145e6565b60208601516001600160801b031690614642565b6001600160801b031610156136065760009350505050610b62565b6136118386866149d1565b8051600c80546020938401516001600160801b03908116600160801b029381166001600160801b031990921691909117169190911790556001600160a01b038816600090815290819052604090205461366a9085613b1e565b6001600160a01b038816600081815260208190526040808220939093559151909190600080516020615f59833981519152906136a7908890615638565b60405180910390a36008546136c7906001600160a01b0316868489614671565b866001600160a01b0316866136dc57336136fe565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b03167f30a8c4f9ab5af7e1309ca87c32377d1a83366c5990472dbf9d262450eae14e388787604051613738929190615dcc565b60405180910390a35050509392505050565b6000613754614aeb565b50604080518082018252600c546001600160801b038082168352600160801b90910481166020830152600854600d549351636d289ce560e11b815292936000936001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169463da5139ca946137db94921692911690600190600401615861565b60206040518083038186803b1580156137f357600080fd5b505afa158015613807573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061382b91906153e2565b825160208401516001600160801b039182169290920192501661384e85836145af565b8161385557fe5b336000908152602081905260409020549190049350613874908561458c565b33600081815260208190526040808220939093559151600080516020615f59833981519152906138a5908890615638565b60405180910390a36138b9611e47846145e6565b6001600160801b031682526138d0611e6f856145e6565b6001600160801b0316602083018190526103e811156139015760405162461bcd60e51b81526004016109c390615c31565b8151600c805460208501516001600160801b03908116600160801b029381166001600160801b031990921691909117169190911790556040516001600160a01b0386169033907f6e853a5fd6b51d773691f542ebac8513c9992a51380d4c342031056a64114228906139769087908990615dcc565b60405180910390a3600854604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc926139d792919091169030908a908990600401615769565b600060405180830381600087803b1580156139f157600080fd5b505af1158015613a05573d6000803e3d6000fd5b50505050505092915050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b179052905160009182916060916001600160a01b03861691613a589190615481565b600060405180830381855afa9150503d8060008114613a93576040519150601f19603f3d011682016040523d82523d6000602084013e613a98565b606091505b5091509150818015613aab575080516020145b613ab657601261325c565b8080602001905181019061325c9190615439565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692188230604051602001613b0193929190615675565b604051602081830303815290604052805190602001209050919050565b81810181811015610aee5760405162461bcd60e51b81526004016109c390615a55565b60008080620186a0613b548560326145af565b81613b5b57fe5b049050613b9b613b6b8583613b1e565b60408051808201909152600d546001600160801b038082168352600160801b909104166020820152906001614a12565b8151600d80546020948501516001600160801b03908116600160801b029381166001600160801b03199092169190911716919091179055336000908152600f909252604090912054909350613bf09084613b1e565b336000818152600f6020526040908190209290925590516001600160a01b03871691907f3a5151e57d3bc9798e7853034ac52293d1a0e12a2b44725e75b03b21f86477a690613c4490889086908990615dda565b60405180910390a3600854604051636d289ce560e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263da5139ca92613ca4929190911690889060009060040161588d565b60206040518083038186803b158015613cbc57600080fd5b505afa158015613cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cf491906153e2565b9150613cfe614aeb565b5060408051808201909152600c546001600160801b038082168352600160801b90910416602082018190526103e81115613d4a5760405162461bcd60e51b81526004016109c390615c31565b613d67613d56846145e6565b82516001600160801b031690614613565b6001600160801b03908116808352600c805460208501518416600160801b026001600160801b0319909116909217909216179055600854604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc92613df492919091169030908b908990600401615769565b600060405180830381600087803b158015613e0e57600080fd5b505af1158015613e22573d6000803e3d6000fd5b5050505050509250929050565b6001600160a01b0383166000908152600f602052604081205480613e57576001915050610b62565b6001600160a01b0385166000908152600e602052604090205480613e8057600092505050610b62565b613e88614aeb565b5060408051808201909152600d546001600160801b03808216808452600160801b909204166020830181905290613ec6908790611cdb9087906145af565b81613ecd57fe5b600754919004906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163566231189116613f2d8a613f1857620124f8613f1d565b62012cc85b611cdb886509184e72a0006145af565b60006040518463ffffffff1660e01b8152600401613f4d9392919061588d565b60206040518083038186803b158015613f6557600080fd5b505afa158015613f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f9d91906153e2565b1015979650505050505050565b600080841215613fca576000198414613fc35781613fc5565b825b610b09565b509192915050565b336000908152600e6020526040902054613fec908261458c565b336000908152600e6020526040902055600b54614009908261458c565b600b556040516001600160a01b0383169033907f8ad4d3ff00da092c7ad9a573ea4f5f6a3dffc6712dc06d3f78f49b862297c40290614049908590615638565b60405180910390a3600754604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc926140aa929190911690309087908790600401615769565b600060405180830381600087803b1580156140c457600080fd5b505af11580156140d8573d6000803e3d6000fd5b505050505050565b600080600080600080898060200190518101906140fd919061511c565b9350935093509350614110828989613faa565b915061411d818989613faa565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166302b9446c8a86338787876040518763ffffffff1660e01b8152600401614174959493929190615793565b60408051808303818588803b15801561418c57600080fd5b505af11580156141a0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906141c591906153fa565b955095505050505094509492505050565b600080600080600080888060200190518101906141f3919061511c565b93509350935093507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166397da6d30853386614238878e8e613faa565b614243878f8f613faa565b6040518663ffffffff1660e01b8152600401614263959493929190615793565b6040805180830381600087803b15801561427c57600080fd5b505af1158015614290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142b491906153fa565b9550955050505050935093915050565b606060008060606000806000898060200190518101906142e49190614ce3565b945094509450945094508280156142f9575081155b1561432757838960405160200161431192919061549d565b6040516020818303038152906040529350614380565b821580156143325750815b1561434a57838860405160200161431192919061549d565b8280156143545750815b156143805783898960405160200161436e939291906154bf565b60405160208183030381529060405293505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316141580156143cb57506001600160a01b0385163014155b6143e75760405162461bcd60e51b81526004016109c390615afa565b60006060866001600160a01b03168d876040516144049190615481565b60006040518083038185875af1925050503d8060008114614441576040519150601f19603f3d011682016040523d82523d6000602084013e614446565b606091505b5091509150816144685760405162461bcd60e51b81526004016109c3906159e7565b9c919b50909950505050505050505050565b600083602001516001600160801b031660001415614499575081610b62565b602084015184516001600160801b03918216916144b8918691166145af565b816144bf57fe5b04905081801561450357508284600001516001600160801b03166144f986602001516001600160801b0316846145af90919063ffffffff16565b8161450057fe5b04105b15610b6257610b09816001613b1e565b82516000906001600160801b031661452c575081610b62565b835160208501516001600160801b039182169161454b918691166145af565b8161455257fe5b04905081801561450357508284602001516001600160801b03166144f986600001516001600160801b0316846145af90919063ffffffff16565b80820382811115610aee5760405162461bcd60e51b81526004016109c3906158d4565b60008115806145ca575050808202828282816145c757fe5b04145b610aee5760405162461bcd60e51b81526004016109c390615d0d565b60006001600160801b0382111561460f5760405162461bcd60e51b81526004016109c390615a1e565b5090565b8082036001600160801b038084169082161115610aee5760405162461bcd60e51b81526004016109c3906158d4565b8181016001600160801b038083169082161015610aee5760405162461bcd60e51b81526004016109c390615a55565b80156146ed576146c9827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f7888aec87306040518363ffffffff1660e01b81526004016121b692919061574f565b8311156146e85760405162461bcd60e51b81526004016109c390615c9f565b614772565b604051633c6340f360e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc9061473f908790339030908990600401615769565b600060405180830381600087803b15801561475957600080fd5b505af115801561476d573d6000803e3d6000fd5b505050505b50505050565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009183916001600160a01b038616916131e89190615481565b600060405180604001604052806002815260200161190160f01b8152506147e4610cee565b83604051602001613b01939291906154bf565b6060604082511061481d5781806020019051810190614816919061536e565b9050613261565b81516020141561493c5760005b60208160ff161080156148595750828160ff168151811061484757fe5b01602001516001600160f81b03191615155b156148665760010161482a565b60608160ff166001600160401b038111801561488157600080fd5b506040519080825280601f01601f1916602001820160405280156148ac576020820181803683370190505b509050600091505b60208260ff161080156148e35750838260ff16815181106148d157fe5b01602001516001600160f81b03191615155b1561493357838260ff16815181106148f757fe5b602001015160f81c60f81b818360ff168151811061491157fe5b60200101906001600160f81b031916908160001a9053506001909101906148b4565b91506132619050565b506040805180820190915260038152623f3f3f60e81b6020820152613261565b614964614aeb565b600061497185858561447a565b905061499061497f826145e6565b86516001600160801b031690614613565b6001600160801b031685526149bb6149a7856145e6565b60208701516001600160801b031690614613565b6001600160801b03166020860152939492505050565b6149d9614aeb565b6149e5612d95846145e6565b6001600160801b031684526149fc6135d7836145e6565b6001600160801b03166020850152509192915050565b614a1a614aeb565b6000614a27858585614513565b9050614a46614a35856145e6565b86516001600160801b031690614642565b6001600160801b031685526149bb614a5d826145e6565b60208701516001600160801b031690614642565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614ab257805160ff1916838001178555614adf565b82800160010185558215614adf579182015b82811115614adf578251825591602001919060010190614ac4565b5061460f929150614b22565b604080518082019091526000808252602082015290565b604080516060810182526000808252602082018190529181019190915290565b5b8082111561460f5760008155600101614b23565b8035610aee81615f0e565b60008083601f840112614b53578182fd5b5081356001600160401b03811115614b69578182fd5b6020830191508360208083028501011115610f8757600080fd5b600082601f830112614b93578081fd5b8135614ba6614ba182615e94565b615e6e565b818152915060208083019084810181840286018201871015614bc757600080fd5b60005b84811015614be657813584529282019290820190600101614bca565b505050505092915050565b600082601f830112614c01578081fd5b8151614c0f614ba182615eb3565b9150808252836020828501011115614c2657600080fd5b614c37816020840160208601615ee2565b5092915050565b600060208284031215614c4f578081fd5b8135610b6281615f0e565b600060208284031215614c6b578081fd5b8151610b6281615f0e565b60008060008060008060c08789031215614c8e578182fd5b8635614c9981615f0e565b95506020870135614ca981615f0e565b94506040870135614cb981615f26565b93506060870135614cc981615f49565b9598949750929560808101359460a0909101359350915050565b600080600080600060a08688031215614cfa578283fd5b8551614d0581615f0e565b60208701519095506001600160401b03811115614d20578384fd5b614d2c88828901614bf1565b9450506040860151614d3d81615f26565b6060870151909350614d4e81615f26565b6080870151909250614d5f81615f49565b809150509295509295909350565b60008060408385031215614d7f578182fd5b8235614d8a81615f0e565b91506020830135614d9a81615f0e565b809150509250929050565b600080600060608486031215614db9578081fd5b8335614dc481615f0e565b92506020840135614dd481615f0e565b929592945050506040919091013590565b600080600080600080600060e0888a031215614dff578485fd5b8735614e0a81615f0e565b96506020880135614e1a81615f0e565b955060408801359450606088013593506080880135614e3881615f49565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215614e69578081fd5b8335614e7481615f0e565b92506020840135614e8481615f26565b91506040840135614e9481615f26565b809150509250925092565b600080600060608486031215614eb3578081fd5b8335614ebe81615f0e565b92506020840135614dd481615f26565b60008060408385031215614ee0578182fd5b8235614eeb81615f0e565b946020939093013593505050565b600080600080600080600060a0888a031215614f13578081fd5b87356001600160401b0380821115614f29578283fd5b614f358b838c01614b42565b909950975060208a0135915080821115614f4d578283fd5b50614f5a8a828b01614b42565b9096509450506040880135614f6e81615f0e565b92506060880135614f7e81615f0e565b91506080880135614f8e81615f26565b8091505092959891949750929550565b60008060008060008060608789031215614fb6578384fd5b86356001600160401b0380821115614fcc578586fd5b614fd88a838b01614b42565b90985096506020890135915080821115614ff0578586fd5b614ffc8a838b01614b42565b90965094506040890135915080821115615014578384fd5b5061502189828a01614b42565b979a9699509497509295939492505050565b600060208284031215615044578081fd5b8151610b6281615f26565b60008060408385031215615061578182fd5b825161506c81615f26565b6020939093015192949293505050565b600080600060608486031215615090578081fd5b833561509b81615f26565b95602085013595506040909401359392505050565b600080602083850312156150c2578182fd5b82356001600160401b03808211156150d8578384fd5b818501915085601f8301126150eb578384fd5b8135818111156150f9578485fd5b86602082850101111561510a578485fd5b60209290920196919550909350505050565b60008060008060808587031215615131578182fd5b845161513c81615f0e565b602086015190945061514d81615f0e565b6040860151606090960151949790965092505050565b600080600060608486031215615177578081fd5b833561518281615f0e565b92506020848101356001600160401b038082111561519e578384fd5b818701915087601f8301126151b1578384fd5b81356151bf614ba182615e94565b81815284810190848601868402860187018c10156151db578788fd5b8795505b83861015615205576151f18c82614b37565b8352600195909501949186019186016151df565b5096505050604087013592508083111561521d578384fd5b505061522b86828701614b83565b9150509250925092565b6000806000806080858703121561524a578182fd5b843561525581615f0e565b9350602085013561526581615f0e565b9250604085013561527581615f0e565b915060608501356001600160401b0381111561528f578182fd5b8501601f8101871361529f578182fd5b80356152ad614ba182615eb3565b8181528860208385010111156152c1578384fd5b81602084016020830137908101602001929092525092959194509250565b600080604083850312156152f1578182fd5b82356152fc81615f0e565b91506020830135614d9a81615f26565b60006020828403121561531d578081fd5b5035919050565b60008060408385031215615336578182fd5b823591506020830135614d9a81615f0e565b60008060006060848603121561535c578081fd5b833592506020840135614e8481615f0e565b60006020828403121561537f578081fd5b81516001600160401b03811115615394578182fd5b610b0984828501614bf1565b6000604082840312156153b1578081fd5b6153bb6040615e6e565b82516153c681615f34565b815260208301516153d681615f34565b60208201529392505050565b6000602082840312156153f3578081fd5b5051919050565b6000806040838503121561540c578182fd5b505080516020909101519092909150565b60006020828403121561542e578081fd5b8135610b6281615f49565b60006020828403121561544a578081fd5b8151610b6281615f49565b6000815180845261546d816020860160208601615ee2565b601f01601f19169290920160200192915050565b60008251615493818460208701615ee2565b9190910192915050565b600083516154af818460208801615ee2565b9190910191825250602001919050565b600084516154d1818460208901615ee2565b91909101928352506020820152604001919050565b600071025b0b9b4349026b2b234bab6902934b9b5960751b82528451615513816012850160208901615ee2565b602f60f81b6012918401918201528451615534816013840160208901615ee2565b602d60f81b601392909101918201528351615556816014840160208801615ee2565b0160140195945050505050565b6000616b6d60f01b82528451615580816002850160208901615ee2565b602f60f81b60029184019182015284516155a1816003840160208901615ee2565b602d60f81b6003929091019182015283516155c3816004840160208801615ee2565b0160040195945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b039687168152949095166020850152911515604084015260ff166060830152608082015260a081019190915260c00190565b901515815260200190565b9115158252602082015260400190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b92835260208301919091526001600160a01b0316604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610b626020830184615455565b600060208083018184528285546001808216600081146156ec576001811461570a57615742565b60028304607f16855260ff1983166040890152606088019350615742565b6002830480865261571a8a615ed6565b885b828110156157385781548b82016040015290840190880161571c565b8a01604001955050505b5091979650505050505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b03958616815293851660208501529190931660408301526060820192909252608081019190915260a00190565b6000608082016001600160a01b0380881684526020818816818601526080604086015282875180855260a0870191508289019450855b8181101561581b5785518516835294830194918301916001016157fd565b50508581036060870152865180825290820193509150808601845b8381101561585257815185529382019390820190600101615836565b50929998505050505050505050565b6001600160a01b039390931683526001600160801b039190911660208301521515604082015260600190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b93845260208401929092526001600160401b03166040830152606082015260800190565b60208082526015908201527f426f72696e674d6174683a20556e646572666c6f770000000000000000000000604082015260600190565b6020808252601e908201527f4b61736869506169723a20616c726561647920696e697469616c697a65640000604082015260600190565b60208082526016908201527f45524332303a206e6f207a65726f206164647265737300000000000000000000604082015260600190565b6020808252601a908201527f4b61736869506169723a20616c6c2061726520736f6c76656e74000000000000604082015260600190565b60208082526015908201527f4f776e61626c653a207a65726f20616464726573730000000000000000000000604082015260600190565b60208082526016908201527f4b61736869506169723a2063616c6c206661696c656400000000000000000000604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b60208082526013908201527f4b61736869506169723a20626164207061697200000000000000000000000000604082015260600190565b60208082526018908201527f45524332303a20616c6c6f77616e636520746f6f206c6f770000000000000000604082015260600190565b60208082526015908201527f4b61736869506169723a2063616e27742063616c6c0000000000000000000000604082015260600190565b6020808252600e908201526d115490cc8c0e88115e1c1a5c995960921b604082015260600190565b60208082526019908201527f4b61736869506169723a207573657220696e736f6c76656e7400000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b60208082526018908201527f45524332303a204f776e65722063616e6e6f7420626520300000000000000000604082015260600190565b60208082526014908201527f4b617368693a2062656c6f77206d696e696d756d000000000000000000000000604082015260600190565b60208082526016908201527f45524332303a2062616c616e636520746f6f206c6f7700000000000000000000604082015260600190565b60208082526018908201527f4b61736869506169723a20536b696d20746f6f206d7563680000000000000000604082015260600190565b6020808252601a908201527f4b61736869506169723a20496e76616c69642073776170706572000000000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b60208082526016908201527f4b61736869506169723a2072617465206e6f74206f6b00000000000000000000604082015260600190565b60208082526018908201527f45524332303a20496e76616c6964205369676e61747572650000000000000000604082015260600190565b6001600160801b0392831681529116602082015260400190565b918252602082015260400190565b9283526020830191909152604082015260600190565b6001600160401b0393841681529190921660208201526001600160801b03909116604082015260600190565b60ff91909116815260200190565b6000808335601e19843603018112615e40578283fd5b8301803591506001600160401b03821115615e59578283fd5b602001915036819003821315610f8757600080fd5b6040518181016001600160401b0381118282101715615e8c57600080fd5b604052919050565b60006001600160401b03821115615ea9578081fd5b5060209081020190565b60006001600160401b03821115615ec8578081fd5b50601f01601f191660200190565b60009081526020902090565b60005b83811015615efd578181015183820152602001615ee5565b838111156147725750506000910152565b6001600160a01b0381168114615f2357600080fd5b50565b8015158114615f2357600080fd5b6001600160801b0381168114615f2357600080fd5b60ff81168114615f2357600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207b83c3046d5b5cdea841391fbf5b44a623b5ba55a1561e673aabd513203b99ab64736f6c634300060c0033000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd643966
Deployed Bytecode
0x6080604052600436106102c25760003560e01c8063656f3d641161017f5780638da5cb5b116100e1578063d8dfeb451161008a578063f46901ed11610064578063f46901ed1461078b578063f8ba4cff146107ab578063f9557ccb146107c0576102c2565b8063d8dfeb4514610741578063dd62ed3e14610756578063e30c397814610776576102c2565b8063b27c0e74116100bb578063b27c0e74146106e8578063cd446e221461070c578063d505accf14610721576102c2565b80638da5cb5b1461069e57806395d89b41146106b3578063a9059cbb146106c8576102c2565b80637dc0d1d011610143578063860ffea11161011d578063860ffea11461063e578063876467f81461065e5780638cad7fbe1461067e576102c2565b80637dc0d1d0146105e65780637ecebe00146105fb5780638285ef401461061b576102c2565b8063656f3d64146105695780636b2ace871461057c57806370a082311461059157806374645ff3146105b157806376ee101b146105c6576102c2565b8063313ce56711610228578063473e3ce7116101ec5780634b8a3529116101c65780634b8a3529146105135780634ddf47d4146105415780634e71e0c814610554576102c2565b8063473e3ce7146104c9578063476343ee146104de57806348e4163e146104f3576102c2565b8063313ce567146104485780633644e5151461046a57806338d52e0f1461047f5780633ba0b9a9146104945780633f2617cb146104a9576102c2565b806315294c401161028a5780631c9e379b116102645780631c9e379b146103e85780632317ef671461040857806323b872dd14610428576102c2565b806315294c401461038657806318160ddd146103b35780631b51e940146103c8576102c2565b8063017e7e58146102c757806302ce728f146102f257806306fdde0314610315578063078dfbe714610337578063095ea7b314610359575b600080fd5b3480156102d357600080fd5b506102dc6107d5565b6040516102e991906155d0565b60405180910390f35b3480156102fe57600080fd5b506103076107e4565b6040516102e9929190615628565b34801561032157600080fd5b5061032a6108c1565b6040516102e991906156b2565b34801561034357600080fd5b50610357610352366004614e55565b610999565b005b34801561036557600080fd5b50610379610374366004614ece565b610a89565b6040516102e9919061561d565b34801561039257600080fd5b506103a66103a1366004614e9f565b610af4565b6040516102e99190615638565b3480156103bf57600080fd5b506103a6610b11565b3480156103d457600080fd5b506103a66103e3366004614e9f565b610b27565b3480156103f457600080fd5b506103a6610403366004614c3e565b610b3c565b34801561041457600080fd5b506103a6610423366004614ece565b610b4e565b34801561043457600080fd5b50610379610443366004614da5565b610b69565b34801561045457600080fd5b5061045d610cd1565b6040516102e99190615e1c565b34801561047657600080fd5b506103a6610cee565b34801561048b57600080fd5b506102dc610d4e565b3480156104a057600080fd5b506103a6610d5d565b3480156104b557600080fd5b506103576104c43660046152df565b610d63565b3480156104d557600080fd5b506103a6610db8565b3480156104ea57600080fd5b50610357610dbe565b3480156104ff57600080fd5b506103a661050e366004614c3e565b610f2e565b34801561051f57600080fd5b5061053361052e366004614ece565b610f40565b6040516102e9929190615dcc565b61035761054f3660046150b0565b610f8e565b34801561056057600080fd5b50610357611071565b610533610577366004614f9e565b6110ff565b34801561058857600080fd5b506102dc611a3d565b34801561059d57600080fd5b506103a66105ac366004614c3e565b611a61565b3480156105bd57600080fd5b5061032a611a73565b3480156105d257600080fd5b506103576105e1366004614ef9565b611b01565b3480156105f257600080fd5b506102dc61260b565b34801561060757600080fd5b506103a6610616366004614c3e565b61261a565b34801561062757600080fd5b5061063061262c565b6040516102e9929190615db2565b34801561064a57600080fd5b50610357610659366004614e9f565b612646565b34801561066a57600080fd5b50610357610679366004614ece565b612727565b34801561068a57600080fd5b50610379610699366004614c3e565b612767565b3480156106aa57600080fd5b506102dc61277c565b3480156106bf57600080fd5b5061032a61278b565b3480156106d457600080fd5b506103796106e3366004614ece565b61284f565b3480156106f457600080fd5b506106fd61291a565b6040516102e993929190615df0565b34801561071857600080fd5b506102dc612947565b34801561072d57600080fd5b5061035761073c366004614de5565b61296b565b34801561074d57600080fd5b506102dc612b0c565b34801561076257600080fd5b506103a6610771366004614d6d565b612b1b565b34801561078257600080fd5b506102dc612b38565b34801561079757600080fd5b506103576107a6366004614c3e565b612b47565b3480156107b757600080fd5b50610357612bbb565b3480156107cc57600080fd5b50610630613187565b6005546001600160a01b031681565b60095460405163d6d7d52560e01b815260009182916001600160a01b039091169063d6d7d5259061081a90600a906004016156c5565b6040805180830381600087803b15801561083357600080fd5b505af1158015610847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086b919061504f565b909250905081156108b85760108190556040517f9f9192b5edb17356c524e08d9e025c8e2f6307e6ea52fb7968faa3081f51c3c8906108ab908390615638565b60405180910390a16108bd565b506010545b9091565b6007546060906108d9906001600160a01b03166131a1565b6008546108ee906001600160a01b03166131a1565b60095460405163355a219b60e21b81526001600160a01b039091169063d568866c9061091f90600a906004016156c5565b60006040518083038186803b15801561093757600080fd5b505afa15801561094b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610973919081019061536e565b604051602001610985939291906154e6565b604051602081830303815290604052905090565b6003546001600160a01b031633146109cc5760405162461bcd60e51b81526004016109c390615b90565b60405180910390fd5b8115610a68576001600160a01b0383161515806109e65750805b610a025760405162461bcd60e51b81526004016109c3906159b0565b6003546040516001600160a01b038086169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0385166001600160a01b031991821617909155600480549091169055610a84565b600480546001600160a01b0319166001600160a01b0385161790555b505050565b3360008181526001602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610ae2908690615638565b60405180910390a35060015b92915050565b6000610afe612bbb565b610b09848484613266565b949350505050565b600c54600160801b90046001600160801b031690565b6000610b31612bbb565b610b0984848461349f565b600e6020526000908152604090205481565b6000610b58612bbb565b610b62838361374a565b9392505050565b60008115610c8e576001600160a01b03841660009081526020819052604090205482811015610baa5760405162461bcd60e51b81526004016109c390615c68565b836001600160a01b0316856001600160a01b031614610c8c576001600160a01b03851660009081526001602090815260408083203384529091529020546000198114610c395783811015610c105760405162461bcd60e51b81526004016109c390615ac3565b6001600160a01b0386166000908152600160209081526040808320338452909152902084820390555b6001600160a01b038516610c5f5760405162461bcd60e51b81526004016109c390615942565b506001600160a01b0380861660009081526020819052604080822086850390559186168152208054840190555b505b826001600160a01b0316846001600160a01b0316600080516020615f5983398151915284604051610cbf9190615638565b60405180910390a35060019392505050565b600854600090610ce9906001600160a01b0316613a11565b905090565b6000467f00000000000000000000000000000000000000000000000000000000000000018114610d2657610d2181613aca565b610d48565b7fd179ed162ed835e5670a38223d6ed4cd3126ac057156f49b7a976feaa9923a655b91505090565b6008546001600160a01b031681565b60105481565b6003546001600160a01b03163314610d8d5760405162461bcd60e51b81526004016109c390615b90565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b600b5481565b610dc6612bbb565b60007f0000000000000000000000002cba6ab6574646badc84f0544d05059e57a5dc426001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b158015610e2157600080fd5b505afa158015610e35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e599190614c5a565b6011546001600160a01b038216600090815260208190526040902054919250600160801b90046001600160801b031690610e939082613b1e565b6001600160a01b038316600081815260208190526040808220939093559151909190600080516020615f5983398151915290610ed0908590615638565b60405180910390a3601180546001600160801b031690556040516001600160a01b038316907fbe641c3ffc44b2d6c184f023fa4ed7bda4b6ffa71e03b3c98ae0c776da1f17e790610f22908490615638565b60405180910390a25050565b600f6020526000908152604090205481565b600080610f4b612bbb565b610f558484613b41565b8092508193505050610f6b336000601054613e2f565b610f875760405162461bcd60e51b81526004016109c390615b59565b9250929050565b6007546001600160a01b031615610fb75760405162461bcd60e51b81526004016109c39061590b565b610fc381830183615235565b805160079060009060089082906009908290610fe690600a9060208a0190614a71565b5081546001600160a01b0398891661010092830a908102908a021990911617909155825497871691810a918202918702199097161790558154958416940a938402938302199094169290921790925550600754166110565760405162461bcd60e51b81526004016109c390615a8c565b50506011805467ffffffffffffffff19166312e687c0179055565b6004546001600160a01b031633811461109c5760405162461bcd60e51b81526004016109c390615bc5565b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b039092166001600160a01b0319928316179055600480549091169055565b60008061110a614aeb565b60005b888110156119ff5760008a8a8381811061112357fe5b9050602002016020810190611138919061541d565b9050826020015115801561114f5750600a8160ff16105b156111645761115c612bbb565b600160208401525b60ff8116600a14156111be57600080600089898681811061118157fe5b90506020028101906111939190615e2a565b8101906111a09190615348565b9250925092506111b68282610659868c8c613faa565b5050506119f6565b60ff81166001141561121f5760008060008989868181106111db57fe5b90506020028101906111ed9190615e2a565b8101906111fa9190615348565b9250925092506112158282611210868c8c613faa565b61349f565b97505050506119f6565b60ff81166002141561127f57600080600089898681811061123c57fe5b905060200281019061124e9190615e2a565b81019061125b9190615348565b9250925092506112768282611271868c8c613faa565b613266565b505050506119f6565b60ff8116600314156112da5760008088888581811061129a57fe5b90506020028101906112ac9190615e2a565b8101906112b99190615324565b915091506112d1816112cc848a8a613faa565b61374a565b965050506119f6565b60ff811660041415611337576000808888858181106112f557fe5b90506020028101906113079190615e2a565b8101906113149190615324565b9150915061132c81611327848a8a613faa565b613fd2565b5050600183526119f6565b60ff81166005141561139a5760008088888581811061135257fe5b90506020028101906113649190615e2a565b8101906113719190615324565b9150915061138981611384848a8a613faa565b613b41565b6001875290975095506119f6915050565b60ff8116600b14156114395760008060008989868181106113b757fe5b90506020028101906113c99190615e2a565b8101906113d6919061507c565b9250925092506000806113e76107e4565b915091508415806113f55750815b801561140057508381115b8015611413575082158061141357508281115b61142f5760405162461bcd60e51b81526004016109c390615d44565b50505050506119f6565b60ff811660181415611518576000806000806000808c8c8981811061145a57fe5b905060200281019061146c9190615e2a565b8101906114799190614c76565b9550955095509550955095507f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd6439666001600160a01b031663c0a47c938787878787876040518763ffffffff1660e01b81526004016114db969594939291906155e4565b600060405180830381600087803b1580156114f557600080fd5b505af1158015611509573d6000803e3d6000fd5b505050505050505050506119f6565b60ff8116601414156115a05761159687878481811061153357fe5b90506020028101906115459190615e2a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92508c915086905081811061158857fe5b9050602002013587876140e0565b90955093506119f6565b60ff81166015141561160b576115968787848181106115bb57fe5b90506020028101906115cd9190615e2a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508992508891506141d69050565b60ff8116601614156116e357600080600089898681811061162857fe5b905060200281019061163a9190615e2a565b8101906116479190614da5565b9250925092507f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd6439666001600160a01b031663f18d03cc84338561168a868e8e613faa565b6040518563ffffffff1660e01b81526004016116a99493929190615769565b600060405180830381600087803b1580156116c357600080fd5b505af11580156116d7573d6000803e3d6000fd5b505050505050506119f6565b60ff81166017141561177757600060608089898681811061170057fe5b90506020028101906117129190615e2a565b81019061171f9190615163565b9250925092507f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd6439666001600160a01b0316630fca8843843385856040518563ffffffff1660e01b81526004016116a994939291906157c7565b60ff8116601e141561185157606060006117f98b8b8681811061179657fe5b905060200201358a8a878181106117a957fe5b90506020028101906117bb9190615e2a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508b91506142c49050565b915091508060ff1660011415611824578180602001905181019061181d91906153e2565b965061184a565b8060ff166002141561184a578180602001905181019061184491906153fa565b90975095505b50506119f6565b60ff81166006141561197957600087878481811061186b57fe5b905060200281019061187d9190615e2a565b81019061188a919061530c565b6008549091506001600160a01b037f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd64396681169163da5139ca91166119016118d1858b8b613faa565b60408051808201909152600d546001600160801b038082168352600160801b90910416602082015290600161447a565b60016040518463ffffffff1660e01b81526004016119219392919061588d565b60206040518083038186803b15801561193957600080fd5b505afa15801561194d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197191906153e2565b9550506119f6565b60ff8116600714156119f657600087878481811061199357fe5b90506020028101906119a59190615e2a565b8101906119b2919061530c565b90506119f26119c2828888613faa565b60408051808201909152600d546001600160801b038082168352600160801b909104166020820152906000614513565b9550505b5060010161110d565b50805115611a3157611a15336000601054613e2f565b611a315760405162461bcd60e51b81526004016109c390615b59565b50965096945050505050565b7f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd64396681565b60006020819052908152604090205481565b600a805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611af95780601f10611ace57610100808354040283529160200191611af9565b820191906000526020600020905b815481529060010190602001808311611adc57829003601f168201915b505050505081565b6000611b0b6107e4565b915050611b16612bbb565b6000806000611b23614aeb565b5060408051808201909152600d546001600160801b038082168352600160801b909104166020820152611b54614aeb565b600754604051634ffe34db60e01b81526001600160a01b037f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd643966811692634ffe34db92611ba79291909116906004016155d0565b604080518083038186803b158015611bbe57600080fd5b505afa158015611bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf691906153a0565b905060005b8c811015611e1d5760008e8e83818110611c1157fe5b9050602002016020810190611c269190614c3e565b9050611c33818a8a613e2f565b611e14576001600160a01b0381166000908152600f6020526040812054808f8f86818110611c5d57fe5b9050602002013511611c81578e8e85818110611c7557fe5b90506020020135611c83565b805b9150611c8f818361458c565b6001600160a01b0384166000908152600f60205260408120919091559050611cb886838361447a565b90506000611cf369152d02c7e14af6800000611ce18d611cdb866201b5806145af565b906145af565b81611ce857fe5b889190046000614513565b6001600160a01b0385166000908152600e6020526040902054909150611d19908261458c565b6001600160a01b038086166000908152600e60205260409020919091558d1615611d43578c611d45565b8d5b6001600160a01b0316846001600160a01b03167f8ad4d3ff00da092c7ad9a573ea4f5f6a3dffc6712dc06d3f78f49b862297c40283604051611d879190615638565b60405180910390a36001600160a01b03808516908e1615611da8578d611daa565b335b6001600160a01b03167fc8e512d8f188ca059984b5853d2bf653da902696b8512785b182b2c813789a6e8486604051611de4929190615dcc565b60405180910390a3611df68a82613b1e565b9950611e028983613b1e565b9850611e0e8884613b1e565b97505050505b50600101611bfb565b5083611e3b5760405162461bcd60e51b81526004016109c390615979565b611e58611e47856145e6565b83516001600160801b031690614613565b6001600160801b03168252611e83611e6f846145e6565b60208401516001600160801b031690614613565b6001600160801b03908116602084018190528351600d80546001600160801b03191691841691909117909216600160801b909102179055600b54611ec7908661458c565b600b55600854604051636d289ce560e11b81526000916001600160a01b037f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd64396681169263da5139ca92611f22921690899060019060040161588d565b60206040518083038186803b158015611f3a57600080fd5b505afa158015611f4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7291906153e2565b90508761240757604051634656bfdf60e11b81526001600160a01b037f0000000000000000000000002cba6ab6574646badc84f0544d05059e57a5dc421690638cad7fbe90611fc5908c906004016155d0565b60206040518083038186803b158015611fdd57600080fd5b505afa158015611ff1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120159190615033565b6120315760405162461bcd60e51b81526004016109c390615cd6565b600754604051633c6340f360e21b81526001600160a01b037f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd64396681169263f18d03cc9261208a92919091169030908e908c90600401615769565b600060405180830381600087803b1580156120a457600080fd5b505af11580156120b8573d6000803e3d6000fd5b50506007546008546040516371a1ff0960e11b81526001600160a01b03808f16955063e343fe1294506120f8938116921690309087908d90600401615793565b6040805180830381600087803b15801561211157600080fd5b505af1158015612125573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214991906153fa565b5050600c54600854604051633de222bb60e21b815260009261220c926001600160801b03909116916001600160a01b037f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd64396681169263f7888aec926121b6929190911690309060040161574f565b60206040518083038186803b1580156121ce57600080fd5b505afa1580156121e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220691906153e2565b9061458c565b9050600061221a828461458c565b90506000620186a061222e836127106145af565b8161223557fe5b0490507f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd6439666001600160a01b031663f18d03cc600860009054906101000a90046001600160a01b0316307f0000000000000000000000002cba6ab6574646badc84f0544d05059e57a5dc426001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b1580156122d757600080fd5b505afa1580156122eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230f9190614c5a565b856040518563ffffffff1660e01b815260040161232f9493929190615769565b600060405180830381600087803b15801561234957600080fd5b505af115801561235d573d6000803e3d6000fd5b5050505061239161237f61237a838661458c90919063ffffffff16565b6145e6565b600c546001600160801b031690614642565b600c80546001600160801b0319166001600160801b0392909216919091179055306001600160a01b038d167f30a8c4f9ab5af7e1309ca87c32377d1a83366c5990472dbf9d262450eae14e386123e7858561458c565b60006040516123f7929190615dcc565b60405180910390a35050506125fb565b6007546001600160a01b037f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd64396681169163f18d03cc919081169030908d161561244f578c612451565b8d5b8a6040518563ffffffff1660e01b81526004016124719493929190615769565b600060405180830381600087803b15801561248b57600080fd5b505af115801561249f573d6000803e3d6000fd5b505050506001600160a01b03891615612543576007546008546040516371a1ff0960e11b81526001600160a01b03808d169363e343fe12936124ef93918316921690339087908d90600401615793565b6040805180830381600087803b15801561250857600080fd5b505af115801561251c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254091906153fa565b50505b600854604051633c6340f360e21b81526001600160a01b037f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd64396681169263f18d03cc9261259c929190911690339030908790600401615769565b600060405180830381600087803b1580156125b657600080fd5b505af11580156125ca573d6000803e3d6000fd5b505050506125da61237f826145e6565b600c80546001600160801b0319166001600160801b03929092169190911790555b5050505050505050505050505050565b6009546001600160a01b031681565b60026020526000908152604090205481565b600d546001600160801b0380821691600160801b90041682565b6001600160a01b0383166000908152600e60205260409020546126699082613b1e565b6001600160a01b0384166000908152600e6020526040902055600b5461268f8183613b1e565b600b556007546126aa906001600160a01b0316838386614671565b836001600160a01b0316836126bf57336126e1565b7f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd6439665b6001600160a01b03167f9ed03113de523cebfe5e49d5f8e12894b1c0d42ce805990461726444c90eab87846040516127199190615638565b60405180910390a350505050565b61272f612bbb565b6127398282613fd2565b612747336000601054613e2f565b6127635760405162461bcd60e51b81526004016109c390615b59565b5050565b60066020526000908152604090205460ff1681565b6003546001600160a01b031681565b6007546060906127a3906001600160a01b0316614778565b6008546127b8906001600160a01b0316614778565b60095460405163634ce26b60e11b81526001600160a01b039091169063c699c4d6906127e990600a906004016156c5565b60006040518083038186803b15801561280157600080fd5b505afa158015612815573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261283d919081019061536e565b60405160200161098593929190615563565b600081156128e95733600090815260208190526040902054828110156128875760405162461bcd60e51b81526004016109c390615c68565b336001600160a01b038516146128e7576001600160a01b0384166128bd5760405162461bcd60e51b81526004016109c390615942565b3360009081526020819052604080822085840390556001600160a01b038616825290208054840190555b505b826001600160a01b0316336001600160a01b0316600080516020615f5983398151915284604051610ae29190615638565b6011546001600160401b0380821691600160401b810490911690600160801b90046001600160801b031683565b7f0000000000000000000000002cba6ab6574646badc84f0544d05059e57a5dc4281565b6001600160a01b0387166129915760405162461bcd60e51b81526004016109c390615bfa565b8342106129b05760405162461bcd60e51b81526004016109c390615b31565b6001600160a01b0387166000818152600260209081526040918290208054600181810190925592519092612a2e92612a13927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928e928e928e92918e9101615641565b604051602081830303815290604052805190602001206147bf565b85858560405160008152602001604052604051612a4e9493929190615694565b6020604051602081039080840390855afa158015612a70573d6000803e3d6000fd5b505050602060405103516001600160a01b031614612aa05760405162461bcd60e51b81526004016109c390615d7b565b6001600160a01b038088166000818152600160209081526040808320948b168084529490915290819020889055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590612afb908990615638565b60405180910390a350505050505050565b6007546001600160a01b031681565b600160209081526000928352604080842090915290825290205481565b6004546001600160a01b031681565b6003546001600160a01b03163314612b715760405162461bcd60e51b81526004016109c390615b90565b600580546001600160a01b0319166001600160a01b0383169081179091556040517fcf1d3f17e521c635e0d20b8acba94ba170afc041d0546d46dafa09d3c9c19eb390600090a250565b612bc3614b02565b50604080516060810182526011546001600160401b038082168352600160401b82041660208301819052600160801b9091046001600160801b03169282019290925290420380612c14575050613185565b6001600160401b0342166020830152612c2b614aeb565b5060408051808201909152600d546001600160801b038082168352600160801b9091041660208201819052612d225782516001600160401b03166312e687c014612cb5576312e687c08084526040517f33af5ce86e8438eff54589f85332916444457dfa8685493fbd579b809097026b91612cac91600091829182906158b0565b60405180910390a15b5050805160118054602084015160409094015167ffffffffffffffff199091166001600160401b03938416176fffffffffffffffff00000000000000001916600160401b9390941692909202929092176001600160801b03908116600160801b9190921602179055613185565b600080612d2d614aeb565b5060408051808201909152600c546001600160801b038082168352600160801b9091048116602083015286518551670de0b6b3a764000092612d7f928992611cdb9216906001600160401b03166145af565b81612d8657fe5b049250612da6612d95846145e6565b85516001600160801b031690614642565b6001600160801b03168085526008548251604051630acc462360e31b8152600093612e679390926001600160a01b037f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd643966811693635662311893612e1193921691908890600401615861565b60206040518083038186803b158015612e2957600080fd5b505afa158015612e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e6191906153e2565b90613b1e565b90506000620186a0612e7b866127106145af565b81612e8257fe5b04905081612ea684602001516001600160801b0316836145af90919063ffffffff16565b81612ead57fe5b049350612ed0612ebc856145e6565b60408a01516001600160801b031690614642565b6001600160801b03166040890152612efe612eea856145e6565b60208501516001600160801b031690614642565b600c80546001600160801b03908116600160801b9382168402179091558751600d805460208b01516001600160801b031990911692841692831784169316909302919091179091556000908390612f5d90670de0b6b3a76400006145af565b81612f6457fe5b0490506709b6e64a8ec600008110156130265760006709b6e64a8ec60000612f98670de0b6b3a7640000611cdb838661458c565b81612f9f57fe5b0490506000612fcd612fb58b611cdb85806145af565b7054a2b63d65d79d094abb6688000000000090613b1e565b8b519091508190612ff8906001600160401b03167054a2b63d65d79d094abb668800000000006145af565b81612fff57fe5b046001600160401b0316808c526304b9a1f0111561301f576304b9a1f08b525b50506130d7565b670b1a2bc2ec5000008111156130d75760006702c68af0bb14000061305f670de0b6b3a7640000611cdb85670b1a2bc2ec50000061458c565b8161306657fe5b049050600061307c612fb58b611cdb85806145af565b8b519091506000907054a2b63d65d79d094abb66880000000000906130aa906001600160401b0316846145af565b816130b157fe5b0490506449d48246008111156130c957506449d48246005b6001600160401b03168b5250505b88516040517f33af5ce86e8438eff54589f85332916444457dfa8685493fbd579b809097026b9161310d918991899186906158b0565b60405180910390a1505086516011805460208a01516040909a015167ffffffffffffffff199091166001600160401b03938416176fffffffffffffffff00000000000000001916600160401b93909a1692909202989098176001600160801b03908116600160801b9190921602179096555050505050505b565b600c546001600160801b0380821691600160801b90041682565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009183916001600160a01b038616916131e89190615481565b600060405180830381855afa9150503d8060008114613223576040519150601f19603f3d011682016040523d82523d6000602084013e613228565b606091505b50915091508161325357604051806040016040528060038152602001623f3f3f60e81b81525061325c565b61325c816147f7565b925050505b919050565b60408051808201909152600d546001600160801b038082168352600160801b90910416602082015260009061329d9083600161495c565b8151600d80546020948501516001600160801b03908116600160801b029381166001600160801b031990921691909117169190911790556001600160a01b0386166000908152600f9092526040909120549091506132fb908361458c565b6001600160a01b038086166000908152600f6020526040808220939093556008549251636d289ce560e11b815290927f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd64396683169263da5139ca926133699290911690869060019060040161588d565b60206040518083038186803b15801561338157600080fd5b505afa158015613395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133b991906153e2565b600c546008549192506001600160801b0316906133e1906001600160a01b0316838388614671565b6133fd6133ed836145e6565b6001600160801b03831690614642565b600c80546001600160801b0319166001600160801b03929092169190911790556001600160a01b038616856134325733613454565b7f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd6439665b6001600160a01b03167fc8e512d8f188ca059984b5853d2bf653da902696b8512785b182b2c813789a6e858760405161348e929190615dcc565b60405180910390a350509392505050565b60006134a9614aeb565b50604080518082018252600c546001600160801b03808216808452600160801b90920481166020840152600854600d549451636d289ce560e11b8152939492936000936001600160a01b037f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd64396681169463da5139ca94613532949216921690600190600401615861565b60206040518083038186803b15801561354a57600080fd5b505afa15801561355e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358291906153e2565b83516001600160801b031601905080156135c457806135b784602001516001600160801b0316876145af90919063ffffffff16565b816135be57fe5b046135c6565b845b93506103e86135eb6135d7866145e6565b60208601516001600160801b031690614642565b6001600160801b031610156136065760009350505050610b62565b6136118386866149d1565b8051600c80546020938401516001600160801b03908116600160801b029381166001600160801b031990921691909117169190911790556001600160a01b038816600090815290819052604090205461366a9085613b1e565b6001600160a01b038816600081815260208190526040808220939093559151909190600080516020615f59833981519152906136a7908890615638565b60405180910390a36008546136c7906001600160a01b0316868489614671565b866001600160a01b0316866136dc57336136fe565b7f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd6439665b6001600160a01b03167f30a8c4f9ab5af7e1309ca87c32377d1a83366c5990472dbf9d262450eae14e388787604051613738929190615dcc565b60405180910390a35050509392505050565b6000613754614aeb565b50604080518082018252600c546001600160801b038082168352600160801b90910481166020830152600854600d549351636d289ce560e11b815292936000936001600160a01b037f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd64396681169463da5139ca946137db94921692911690600190600401615861565b60206040518083038186803b1580156137f357600080fd5b505afa158015613807573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061382b91906153e2565b825160208401516001600160801b039182169290920192501661384e85836145af565b8161385557fe5b336000908152602081905260409020549190049350613874908561458c565b33600081815260208190526040808220939093559151600080516020615f59833981519152906138a5908890615638565b60405180910390a36138b9611e47846145e6565b6001600160801b031682526138d0611e6f856145e6565b6001600160801b0316602083018190526103e811156139015760405162461bcd60e51b81526004016109c390615c31565b8151600c805460208501516001600160801b03908116600160801b029381166001600160801b031990921691909117169190911790556040516001600160a01b0386169033907f6e853a5fd6b51d773691f542ebac8513c9992a51380d4c342031056a64114228906139769087908990615dcc565b60405180910390a3600854604051633c6340f360e21b81526001600160a01b037f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd64396681169263f18d03cc926139d792919091169030908a908990600401615769565b600060405180830381600087803b1580156139f157600080fd5b505af1158015613a05573d6000803e3d6000fd5b50505050505092915050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b179052905160009182916060916001600160a01b03861691613a589190615481565b600060405180830381855afa9150503d8060008114613a93576040519150601f19603f3d011682016040523d82523d6000602084013e613a98565b606091505b5091509150818015613aab575080516020145b613ab657601261325c565b8080602001905181019061325c9190615439565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692188230604051602001613b0193929190615675565b604051602081830303815290604052805190602001209050919050565b81810181811015610aee5760405162461bcd60e51b81526004016109c390615a55565b60008080620186a0613b548560326145af565b81613b5b57fe5b049050613b9b613b6b8583613b1e565b60408051808201909152600d546001600160801b038082168352600160801b909104166020820152906001614a12565b8151600d80546020948501516001600160801b03908116600160801b029381166001600160801b03199092169190911716919091179055336000908152600f909252604090912054909350613bf09084613b1e565b336000818152600f6020526040908190209290925590516001600160a01b03871691907f3a5151e57d3bc9798e7853034ac52293d1a0e12a2b44725e75b03b21f86477a690613c4490889086908990615dda565b60405180910390a3600854604051636d289ce560e11b81526001600160a01b037f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd64396681169263da5139ca92613ca4929190911690889060009060040161588d565b60206040518083038186803b158015613cbc57600080fd5b505afa158015613cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cf491906153e2565b9150613cfe614aeb565b5060408051808201909152600c546001600160801b038082168352600160801b90910416602082018190526103e81115613d4a5760405162461bcd60e51b81526004016109c390615c31565b613d67613d56846145e6565b82516001600160801b031690614613565b6001600160801b03908116808352600c805460208501518416600160801b026001600160801b0319909116909217909216179055600854604051633c6340f360e21b81526001600160a01b037f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd64396681169263f18d03cc92613df492919091169030908b908990600401615769565b600060405180830381600087803b158015613e0e57600080fd5b505af1158015613e22573d6000803e3d6000fd5b5050505050509250929050565b6001600160a01b0383166000908152600f602052604081205480613e57576001915050610b62565b6001600160a01b0385166000908152600e602052604090205480613e8057600092505050610b62565b613e88614aeb565b5060408051808201909152600d546001600160801b03808216808452600160801b909204166020830181905290613ec6908790611cdb9087906145af565b81613ecd57fe5b600754919004906001600160a01b037f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd64396681169163566231189116613f2d8a613f1857620124f8613f1d565b62012cc85b611cdb886509184e72a0006145af565b60006040518463ffffffff1660e01b8152600401613f4d9392919061588d565b60206040518083038186803b158015613f6557600080fd5b505afa158015613f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f9d91906153e2565b1015979650505050505050565b600080841215613fca576000198414613fc35781613fc5565b825b610b09565b509192915050565b336000908152600e6020526040902054613fec908261458c565b336000908152600e6020526040902055600b54614009908261458c565b600b556040516001600160a01b0383169033907f8ad4d3ff00da092c7ad9a573ea4f5f6a3dffc6712dc06d3f78f49b862297c40290614049908590615638565b60405180910390a3600754604051633c6340f360e21b81526001600160a01b037f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd64396681169263f18d03cc926140aa929190911690309087908790600401615769565b600060405180830381600087803b1580156140c457600080fd5b505af11580156140d8573d6000803e3d6000fd5b505050505050565b600080600080600080898060200190518101906140fd919061511c565b9350935093509350614110828989613faa565b915061411d818989613faa565b90507f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd6439666001600160a01b03166302b9446c8a86338787876040518763ffffffff1660e01b8152600401614174959493929190615793565b60408051808303818588803b15801561418c57600080fd5b505af11580156141a0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906141c591906153fa565b955095505050505094509492505050565b600080600080600080888060200190518101906141f3919061511c565b93509350935093507f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd6439666001600160a01b03166397da6d30853386614238878e8e613faa565b614243878f8f613faa565b6040518663ffffffff1660e01b8152600401614263959493929190615793565b6040805180830381600087803b15801561427c57600080fd5b505af1158015614290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142b491906153fa565b9550955050505050935093915050565b606060008060606000806000898060200190518101906142e49190614ce3565b945094509450945094508280156142f9575081155b1561432757838960405160200161431192919061549d565b6040516020818303038152906040529350614380565b821580156143325750815b1561434a57838860405160200161431192919061549d565b8280156143545750815b156143805783898960405160200161436e939291906154bf565b60405160208183030381529060405293505b7f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd6439666001600160a01b0316856001600160a01b0316141580156143cb57506001600160a01b0385163014155b6143e75760405162461bcd60e51b81526004016109c390615afa565b60006060866001600160a01b03168d876040516144049190615481565b60006040518083038185875af1925050503d8060008114614441576040519150601f19603f3d011682016040523d82523d6000602084013e614446565b606091505b5091509150816144685760405162461bcd60e51b81526004016109c3906159e7565b9c919b50909950505050505050505050565b600083602001516001600160801b031660001415614499575081610b62565b602084015184516001600160801b03918216916144b8918691166145af565b816144bf57fe5b04905081801561450357508284600001516001600160801b03166144f986602001516001600160801b0316846145af90919063ffffffff16565b8161450057fe5b04105b15610b6257610b09816001613b1e565b82516000906001600160801b031661452c575081610b62565b835160208501516001600160801b039182169161454b918691166145af565b8161455257fe5b04905081801561450357508284602001516001600160801b03166144f986600001516001600160801b0316846145af90919063ffffffff16565b80820382811115610aee5760405162461bcd60e51b81526004016109c3906158d4565b60008115806145ca575050808202828282816145c757fe5b04145b610aee5760405162461bcd60e51b81526004016109c390615d0d565b60006001600160801b0382111561460f5760405162461bcd60e51b81526004016109c390615a1e565b5090565b8082036001600160801b038084169082161115610aee5760405162461bcd60e51b81526004016109c3906158d4565b8181016001600160801b038083169082161015610aee5760405162461bcd60e51b81526004016109c390615a55565b80156146ed576146c9827f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd6439666001600160a01b031663f7888aec87306040518363ffffffff1660e01b81526004016121b692919061574f565b8311156146e85760405162461bcd60e51b81526004016109c390615c9f565b614772565b604051633c6340f360e21b81526001600160a01b037f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd643966169063f18d03cc9061473f908790339030908990600401615769565b600060405180830381600087803b15801561475957600080fd5b505af115801561476d573d6000803e3d6000fd5b505050505b50505050565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009183916001600160a01b038616916131e89190615481565b600060405180604001604052806002815260200161190160f01b8152506147e4610cee565b83604051602001613b01939291906154bf565b6060604082511061481d5781806020019051810190614816919061536e565b9050613261565b81516020141561493c5760005b60208160ff161080156148595750828160ff168151811061484757fe5b01602001516001600160f81b03191615155b156148665760010161482a565b60608160ff166001600160401b038111801561488157600080fd5b506040519080825280601f01601f1916602001820160405280156148ac576020820181803683370190505b509050600091505b60208260ff161080156148e35750838260ff16815181106148d157fe5b01602001516001600160f81b03191615155b1561493357838260ff16815181106148f757fe5b602001015160f81c60f81b818360ff168151811061491157fe5b60200101906001600160f81b031916908160001a9053506001909101906148b4565b91506132619050565b506040805180820190915260038152623f3f3f60e81b6020820152613261565b614964614aeb565b600061497185858561447a565b905061499061497f826145e6565b86516001600160801b031690614613565b6001600160801b031685526149bb6149a7856145e6565b60208701516001600160801b031690614613565b6001600160801b03166020860152939492505050565b6149d9614aeb565b6149e5612d95846145e6565b6001600160801b031684526149fc6135d7836145e6565b6001600160801b03166020850152509192915050565b614a1a614aeb565b6000614a27858585614513565b9050614a46614a35856145e6565b86516001600160801b031690614642565b6001600160801b031685526149bb614a5d826145e6565b60208701516001600160801b031690614642565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614ab257805160ff1916838001178555614adf565b82800160010185558215614adf579182015b82811115614adf578251825591602001919060010190614ac4565b5061460f929150614b22565b604080518082019091526000808252602082015290565b604080516060810182526000808252602082018190529181019190915290565b5b8082111561460f5760008155600101614b23565b8035610aee81615f0e565b60008083601f840112614b53578182fd5b5081356001600160401b03811115614b69578182fd5b6020830191508360208083028501011115610f8757600080fd5b600082601f830112614b93578081fd5b8135614ba6614ba182615e94565b615e6e565b818152915060208083019084810181840286018201871015614bc757600080fd5b60005b84811015614be657813584529282019290820190600101614bca565b505050505092915050565b600082601f830112614c01578081fd5b8151614c0f614ba182615eb3565b9150808252836020828501011115614c2657600080fd5b614c37816020840160208601615ee2565b5092915050565b600060208284031215614c4f578081fd5b8135610b6281615f0e565b600060208284031215614c6b578081fd5b8151610b6281615f0e565b60008060008060008060c08789031215614c8e578182fd5b8635614c9981615f0e565b95506020870135614ca981615f0e565b94506040870135614cb981615f26565b93506060870135614cc981615f49565b9598949750929560808101359460a0909101359350915050565b600080600080600060a08688031215614cfa578283fd5b8551614d0581615f0e565b60208701519095506001600160401b03811115614d20578384fd5b614d2c88828901614bf1565b9450506040860151614d3d81615f26565b6060870151909350614d4e81615f26565b6080870151909250614d5f81615f49565b809150509295509295909350565b60008060408385031215614d7f578182fd5b8235614d8a81615f0e565b91506020830135614d9a81615f0e565b809150509250929050565b600080600060608486031215614db9578081fd5b8335614dc481615f0e565b92506020840135614dd481615f0e565b929592945050506040919091013590565b600080600080600080600060e0888a031215614dff578485fd5b8735614e0a81615f0e565b96506020880135614e1a81615f0e565b955060408801359450606088013593506080880135614e3881615f49565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215614e69578081fd5b8335614e7481615f0e565b92506020840135614e8481615f26565b91506040840135614e9481615f26565b809150509250925092565b600080600060608486031215614eb3578081fd5b8335614ebe81615f0e565b92506020840135614dd481615f26565b60008060408385031215614ee0578182fd5b8235614eeb81615f0e565b946020939093013593505050565b600080600080600080600060a0888a031215614f13578081fd5b87356001600160401b0380821115614f29578283fd5b614f358b838c01614b42565b909950975060208a0135915080821115614f4d578283fd5b50614f5a8a828b01614b42565b9096509450506040880135614f6e81615f0e565b92506060880135614f7e81615f0e565b91506080880135614f8e81615f26565b8091505092959891949750929550565b60008060008060008060608789031215614fb6578384fd5b86356001600160401b0380821115614fcc578586fd5b614fd88a838b01614b42565b90985096506020890135915080821115614ff0578586fd5b614ffc8a838b01614b42565b90965094506040890135915080821115615014578384fd5b5061502189828a01614b42565b979a9699509497509295939492505050565b600060208284031215615044578081fd5b8151610b6281615f26565b60008060408385031215615061578182fd5b825161506c81615f26565b6020939093015192949293505050565b600080600060608486031215615090578081fd5b833561509b81615f26565b95602085013595506040909401359392505050565b600080602083850312156150c2578182fd5b82356001600160401b03808211156150d8578384fd5b818501915085601f8301126150eb578384fd5b8135818111156150f9578485fd5b86602082850101111561510a578485fd5b60209290920196919550909350505050565b60008060008060808587031215615131578182fd5b845161513c81615f0e565b602086015190945061514d81615f0e565b6040860151606090960151949790965092505050565b600080600060608486031215615177578081fd5b833561518281615f0e565b92506020848101356001600160401b038082111561519e578384fd5b818701915087601f8301126151b1578384fd5b81356151bf614ba182615e94565b81815284810190848601868402860187018c10156151db578788fd5b8795505b83861015615205576151f18c82614b37565b8352600195909501949186019186016151df565b5096505050604087013592508083111561521d578384fd5b505061522b86828701614b83565b9150509250925092565b6000806000806080858703121561524a578182fd5b843561525581615f0e565b9350602085013561526581615f0e565b9250604085013561527581615f0e565b915060608501356001600160401b0381111561528f578182fd5b8501601f8101871361529f578182fd5b80356152ad614ba182615eb3565b8181528860208385010111156152c1578384fd5b81602084016020830137908101602001929092525092959194509250565b600080604083850312156152f1578182fd5b82356152fc81615f0e565b91506020830135614d9a81615f26565b60006020828403121561531d578081fd5b5035919050565b60008060408385031215615336578182fd5b823591506020830135614d9a81615f0e565b60008060006060848603121561535c578081fd5b833592506020840135614e8481615f0e565b60006020828403121561537f578081fd5b81516001600160401b03811115615394578182fd5b610b0984828501614bf1565b6000604082840312156153b1578081fd5b6153bb6040615e6e565b82516153c681615f34565b815260208301516153d681615f34565b60208201529392505050565b6000602082840312156153f3578081fd5b5051919050565b6000806040838503121561540c578182fd5b505080516020909101519092909150565b60006020828403121561542e578081fd5b8135610b6281615f49565b60006020828403121561544a578081fd5b8151610b6281615f49565b6000815180845261546d816020860160208601615ee2565b601f01601f19169290920160200192915050565b60008251615493818460208701615ee2565b9190910192915050565b600083516154af818460208801615ee2565b9190910191825250602001919050565b600084516154d1818460208901615ee2565b91909101928352506020820152604001919050565b600071025b0b9b4349026b2b234bab6902934b9b5960751b82528451615513816012850160208901615ee2565b602f60f81b6012918401918201528451615534816013840160208901615ee2565b602d60f81b601392909101918201528351615556816014840160208801615ee2565b0160140195945050505050565b6000616b6d60f01b82528451615580816002850160208901615ee2565b602f60f81b60029184019182015284516155a1816003840160208901615ee2565b602d60f81b6003929091019182015283516155c3816004840160208801615ee2565b0160040195945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b039687168152949095166020850152911515604084015260ff166060830152608082015260a081019190915260c00190565b901515815260200190565b9115158252602082015260400190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b92835260208301919091526001600160a01b0316604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610b626020830184615455565b600060208083018184528285546001808216600081146156ec576001811461570a57615742565b60028304607f16855260ff1983166040890152606088019350615742565b6002830480865261571a8a615ed6565b885b828110156157385781548b82016040015290840190880161571c565b8a01604001955050505b5091979650505050505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b03958616815293851660208501529190931660408301526060820192909252608081019190915260a00190565b6000608082016001600160a01b0380881684526020818816818601526080604086015282875180855260a0870191508289019450855b8181101561581b5785518516835294830194918301916001016157fd565b50508581036060870152865180825290820193509150808601845b8381101561585257815185529382019390820190600101615836565b50929998505050505050505050565b6001600160a01b039390931683526001600160801b039190911660208301521515604082015260600190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b93845260208401929092526001600160401b03166040830152606082015260800190565b60208082526015908201527f426f72696e674d6174683a20556e646572666c6f770000000000000000000000604082015260600190565b6020808252601e908201527f4b61736869506169723a20616c726561647920696e697469616c697a65640000604082015260600190565b60208082526016908201527f45524332303a206e6f207a65726f206164647265737300000000000000000000604082015260600190565b6020808252601a908201527f4b61736869506169723a20616c6c2061726520736f6c76656e74000000000000604082015260600190565b60208082526015908201527f4f776e61626c653a207a65726f20616464726573730000000000000000000000604082015260600190565b60208082526016908201527f4b61736869506169723a2063616c6c206661696c656400000000000000000000604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b60208082526013908201527f4b61736869506169723a20626164207061697200000000000000000000000000604082015260600190565b60208082526018908201527f45524332303a20616c6c6f77616e636520746f6f206c6f770000000000000000604082015260600190565b60208082526015908201527f4b61736869506169723a2063616e27742063616c6c0000000000000000000000604082015260600190565b6020808252600e908201526d115490cc8c0e88115e1c1a5c995960921b604082015260600190565b60208082526019908201527f4b61736869506169723a207573657220696e736f6c76656e7400000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b60208082526018908201527f45524332303a204f776e65722063616e6e6f7420626520300000000000000000604082015260600190565b60208082526014908201527f4b617368693a2062656c6f77206d696e696d756d000000000000000000000000604082015260600190565b60208082526016908201527f45524332303a2062616c616e636520746f6f206c6f7700000000000000000000604082015260600190565b60208082526018908201527f4b61736869506169723a20536b696d20746f6f206d7563680000000000000000604082015260600190565b6020808252601a908201527f4b61736869506169723a20496e76616c69642073776170706572000000000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b60208082526016908201527f4b61736869506169723a2072617465206e6f74206f6b00000000000000000000604082015260600190565b60208082526018908201527f45524332303a20496e76616c6964205369676e61747572650000000000000000604082015260600190565b6001600160801b0392831681529116602082015260400190565b918252602082015260400190565b9283526020830191909152604082015260600190565b6001600160401b0393841681529190921660208201526001600160801b03909116604082015260600190565b60ff91909116815260200190565b6000808335601e19843603018112615e40578283fd5b8301803591506001600160401b03821115615e59578283fd5b602001915036819003821315610f8757600080fd5b6040518181016001600160401b0381118282101715615e8c57600080fd5b604052919050565b60006001600160401b03821115615ea9578081fd5b5060209081020190565b60006001600160401b03821115615ec8578081fd5b50601f01601f191660200190565b60009081526020902090565b60005b83811015615efd578181015183820152602001615ee5565b838111156147725750506000910152565b6001600160a01b0381168114615f2357600080fd5b50565b8015158114615f2357600080fd5b6001600160801b0381168114615f2357600080fd5b60ff81168114615f2357600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207b83c3046d5b5cdea841391fbf5b44a623b5ba55a1561e673aabd513203b99ab64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd643966
-----Decoded View---------------
Arg [0] : bentoBox_ (address): 0xF5BCE5077908a1b7370B9ae04AdC565EBd643966
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd643966
Deployed Bytecode Sourcemap
30594:33988:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31866:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41334:363;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;33282:202::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3778:506::-;;;;;;;;;;-1:-1:-1;3778:506:0;;;;;:::i;:::-;;:::i;:::-;;10514:205;;;;;;;;;;-1:-1:-1;10514:205:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;49176:187::-;;;;;;;;;;-1:-1:-1;49176:187:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33640:94::-;;;;;;;;;;;;;:::i;45435:199::-;;;;;;;;;;-1:-1:-1;45435:199:0;;;;;:::i;:::-;;:::i;32504:54::-;;;;;;;;;;-1:-1:-1;32504:54:0;;;;;:::i;:::-;;:::i;46778:154::-;;;;;;;;;;-1:-1:-1;46778:154:0;;;;;:::i;:::-;;:::i;9000:1219::-;;;;;;;;;;-1:-1:-1;9000:1219:0;;;;;:::i;:::-;;:::i;33492:96::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;6421:268::-;;;;;;;;;;;;;:::i;32030:19::-;;;;;;;;;;;;;:::i;32846:27::-;;;;;;;;;;;;;:::i;64166:113::-;;;;;;;;;;-1:-1:-1;64166:113:0;;;;;:::i;:::-;;:::i;32138:35::-;;;;;;;;;;;;;:::i;63426:422::-;;;;;;;;;;;;;:::i;32655:49::-;;;;;;;;;;-1:-1:-1;32655:49:0;;;;;:::i;:::-;;:::i;47984:170::-;;;;;;;;;;-1:-1:-1;47984:170:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;35824:445::-;;;;;;:::i;:::-;;:::i;4366:340::-;;;;;;;;;;;;;:::i;54048:4503::-;;;;;;:::i;:::-;;:::i;31727:37::-;;;;;;;;;;;;;:::i;7228:44::-;;;;;;;;;;-1:-1:-1;7228:44:0;;;;;:::i;:::-;;:::i;32084:23::-;;;;;;;;;;;;;:::i;59160:4209::-;;;;;;;;;;-1:-1:-1;59160:4209:0;;;;;:::i;:::-;;:::i;32056:21::-;;;;;;;;;;;;;:::i;7462:41::-;;;;;;;;;;-1:-1:-1;7462:41:0;;;;;:::i;:::-;;:::i;32339:25::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;42885:467::-;;;;;;;;;;-1:-1:-1;42885:467:0;;;;;:::i;:::-;;:::i;43953:194::-;;;;;;;;;;-1:-1:-1;43953:194:0;;;;;:::i;:::-;;:::i;31893:41::-;;;;;;;;;;-1:-1:-1;31893:41:0;;;;;:::i;:::-;;:::i;2924:20::-;;;;;;;;;;;;;:::i;33080:194::-;;;;;;;;;;;;;:::i;7942:751::-;;;;;;;;;;-1:-1:-1;7942:751:0;;;;;:::i;:::-;;:::i;33017:28::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;31771:53::-;;;;;;;;;;;;;:::i;11348:665::-;;;;;;;;;;-1:-1:-1;11348:665:0;;;;;:::i;:::-;;:::i;31999:24::-;;;;;;;;;;;;;:::i;7333:64::-;;;;;;;;;;-1:-1:-1;7333:64:0;;;;;:::i;:::-;;:::i;2951:27::-;;;;;;;;;;;;;:::i;64457:122::-;;;;;;;;;;-1:-1:-1;64457:122:0;;;;;:::i;:::-;;:::i;36376:3227::-;;;;;;;;;;;;;:::i;32209:24::-;;;;;;;;;;;;;:::i;31866:20::-;;;-1:-1:-1;;;;;31866:20:0;;:::o;41334:363::-;41437:6;;:22;;-1:-1:-1;;;41437:22:0;;41380:12;;;;-1:-1:-1;;;;;41437:6:0;;;;:10;;:22;;41448:10;;41437:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41419:40;;-1:-1:-1;41419:40:0;-1:-1:-1;41472:218:0;;;;41500:12;:19;;;41539:21;;;;;;41515:4;;41539:21;:::i;:::-;;;;;;;;41472:218;;;-1:-1:-1;41666:12:0;;41472:218;41334:363;;:::o;33282:202::-;33400:10;;33321:13;;33400:21;;-1:-1:-1;;;;;33400:10:0;:19;:21::i;:::-;33428:5;;:16;;-1:-1:-1;;;;;33428:5:0;:14;:16::i;:::-;33451:6;;:23;;-1:-1:-1;;;33451:23:0;;-1:-1:-1;;;;;33451:6:0;;;;:11;;:23;;33463:10;;33451:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33451:23:0;;;;;;;;;;;;:::i;:::-;33361:114;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33347:129;;33282:202;:::o;3778:506::-;4834:5;;-1:-1:-1;;;;;4834:5:0;4820:10;:19;4812:64;;;;-1:-1:-1;;;4812:64:0;;;;;;;:::i;:::-;;;;;;;;;3917:6:::1;3913:364;;;-1:-1:-1::0;;;;;3971:22:0;::::1;::::0;::::1;::::0;:34:::1;;;3997:8;3971:34;3963:68;;;;-1:-1:-1::0;;;3963:68:0::1;;;;;;;:::i;:::-;4098:5;::::0;4077:37:::1;::::0;-1:-1:-1;;;;;4077:37:0;;::::1;::::0;4098:5:::1;::::0;4077:37:::1;::::0;4098:5:::1;::::0;4077:37:::1;4129:5;:16:::0;;-1:-1:-1;;;;;4129:16:0;::::1;-1:-1:-1::0;;;;;;4129:16:0;;::::1;;::::0;;;4160:12:::1;:25:::0;;;;::::1;::::0;;3913:364:::1;;;4242:12;:23:::0;;-1:-1:-1;;;;;;4242:23:0::1;-1:-1:-1::0;;;;;4242:23:0;::::1;;::::0;;3913:364:::1;3778:506:::0;;;:::o;10514:205::-;10607:10;10580:4;10597:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;10597:30:0;;;;;;;;;;:39;;;10652:37;10580:4;;10597:30;;10652:37;;;;10630:6;;10652:37;:::i;:::-;;;;;;;;-1:-1:-1;10707:4:0;10514:205;;;;;:::o;49176:187::-;49278:14;49305:8;:6;:8::i;:::-;49333:22;49340:2;49344:4;49350;49333:6;:22::i;:::-;49324:31;49176:187;-1:-1:-1;;;;49176:187:0:o;33640:94::-;33711:10;:15;-1:-1:-1;;;33711:15:0;;-1:-1:-1;;;;;33711:15:0;;33640:94::o;45435:199::-;45541:16;45570:8;:6;:8::i;:::-;45600:26;45610:2;45614:4;45620:5;45600:9;:26::i;32504:54::-;;;;;;;;;;;;;:::o;46778:154::-;46845:13;46871:8;:6;:8::i;:::-;46898:26;46911:2;46915:8;46898:12;:26::i;:::-;46890:34;46778:154;-1:-1:-1;;;46778:154:0:o;9000:1219::-;9114:4;9199:11;;9195:953;;-1:-1:-1;;;;;9248:15:0;;9227:18;9248:15;;;;;;;;;;;9286:20;;;;9278:55;;;;-1:-1:-1;;;9278:55:0;;;;;;;:::i;:::-;9362:2;-1:-1:-1;;;;;9354:10:0;:4;-1:-1:-1;;;;;9354:10:0;;9350:787;;-1:-1:-1;;;;;9412:15:0;;9385:24;9412:15;;;:9;:15;;;;;;;;9428:10;9412:27;;;;;;;;-1:-1:-1;;9563:37:0;;9559:251;;9653:6;9633:16;:26;;9625:63;;;;-1:-1:-1;;;9625:63:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9711:15:0;;;;;;:9;:15;;;;;;;;9727:10;9711:27;;;;;;;9741:25;;;9711:55;;9559:251;-1:-1:-1;;;;;9836:16:0;;9828:51;;;;-1:-1:-1;;;9828:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;9950:15:0;;;:9;:15;;;;;;;;;;;9968:19;;;9950:37;;10030:13;;;;;;:23;;;;;;9350:787;9195:953;;10178:2;-1:-1:-1;;;;;10163:26:0;10172:4;-1:-1:-1;;;;;10163:26:0;-1:-1:-1;;;;;;;;;;;10182:6:0;10163:26;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;10207:4:0;9000:1219;;;;;:::o;33492:96::-;33560:5;;33535;;33560:20;;-1:-1:-1;;;;;33560:5:0;:18;:20::i;:::-;33553:27;;33492:96;:::o;6421:268::-;6470:7;6551:9;6599:25;6588:36;;:93;;6647:34;6673:7;6647:25;:34::i;:::-;6588:93;;;6627:17;6588:93;6581:100;;;6421:268;:::o;32030:19::-;;;-1:-1:-1;;;;;32030:19:0;;:::o;32846:27::-;;;;:::o;64166:113::-;4834:5;;-1:-1:-1;;;;;4834:5:0;4820:10;:19;4812:64;;;;-1:-1:-1;;;4812:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;64245:17:0;;;::::1;;::::0;;;:8:::1;:17;::::0;;;;:26;;-1:-1:-1;;64245:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;64166:113::o;32138:35::-;;;;:::o;63426:422::-;63468:8;:6;:8::i;:::-;63487:14;63504;-1:-1:-1;;;;;63504:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63567:10;:29;-1:-1:-1;;;;;63627:17:0;;63537:27;63627:17;;;;;;;;;;;;;-1:-1:-1;;;;63567:29:0;;-1:-1:-1;;;;;63567:29:0;;63627:42;;63567:29;63627:21;:42::i;:::-;-1:-1:-1;;;;;63607:17:0;;:9;:17;;;;;;;;;;;:62;;;;63685:49;;63607:17;;:9;-1:-1:-1;;;;;;;;;;;63685:49:0;;;63714:19;;63685:49;:::i;:::-;;;;;;;;63745:10;:33;;-1:-1:-1;;;;;63745:33:0;;;63796:44;;-1:-1:-1;;;;;63796:44:0;;;;;;;63820:19;;63796:44;:::i;:::-;;;;;;;;63426:422;;:::o;32655:49::-;;;;;;;;;;;;;:::o;47984:170::-;48052:12;48066:13;48092:8:::1;:6;:8::i;:::-;48127:19;48135:2;48139:6;48127:7;:19::i;:::-;48111:35;;;;;;;;40955:43:::0;40966:10;40978:5;40985:12;;40955:10;:43::i;:::-;40947:81;;;;-1:-1:-1;;;40947:81:0;;;;;;;:::i;:::-;47984:170;;;;;:::o;35824:445::-;35910:10;;-1:-1:-1;;;;;35910:10:0;35902:33;35894:76;;;;-1:-1:-1;;;35894:76:0;;;;;;;:::i;:::-;36023:50;;;;36034:4;36023:50;:::i;:::-;35981:92;;35982:10;;;;35994:5;;35982:10;;36001:6;;35982:10;;35981:92;;36009:10;;35981:92;;;;;:::i;:::-;-1:-1:-1;35981:92:0;;-1:-1:-1;;;;;35981:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36100:10:0;;;36084:65;;;;-1:-1:-1;;;36084:65:0;;;;;;;:::i;:::-;-1:-1:-1;;36162:10:0;:67;;-1:-1:-1;;36162:67:0;34555:9;36162:67;;;35824:445::o;4366:340::-;4434:12;;-1:-1:-1;;;;;4434:12:0;4486:10;:27;;4478:72;;;;-1:-1:-1;;;4478:72:0;;;;;;;:::i;:::-;4609:5;;4588:42;;-1:-1:-1;;;;;4588:42:0;;;;4609:5;;4588:42;;4609:5;;4588:42;4641:5;:21;;-1:-1:-1;;;;;4641:21:0;;;-1:-1:-1;;;;;;4641:21:0;;;;;;4673:12;:25;;;;;;;4366:340::o;54048:4503::-;54199:14;54215;54242:24;;:::i;:::-;54282:9;54277:4116;54297:18;;;54277:4116;;;54337:12;54352:7;;54360:1;54352:10;;;;;;;;;;;;;;;;;;;;:::i;:::-;54337:25;;54382:6;:17;;;54381:18;:33;;;;;54412:2;54403:6;:11;;;54381:33;54377:125;;;54435:8;:6;:8::i;:::-;54482:4;54462:17;;;:24;54377:125;54520:31;;;49943:2;54520:31;54516:3866;;;54573:12;54587:10;54599:9;54623:5;;54629:1;54623:8;;;;;;;;;;;;;;;;;;:::i;:::-;54612:45;;;;;;;:::i;:::-;54572:85;;;;;;54676:52;54690:2;54694:4;54700:27;54705:5;54712:6;54720;54700:4;:27::i;54676:52::-;54516:3866;;;;;;54754:26;;;49462:1;54754:26;54750:3632;;;54802:12;54816:10;54828:9;54852:5;;54858:1;54852:8;;;;;;;;;;;;;;;;;;:::i;:::-;54841:45;;;;;;;:::i;:::-;54801:85;;;;;;54914:48;54924:2;54928:4;54934:27;54939:5;54946:6;54954;54934:4;:27::i;:::-;54914:9;:48::i;:::-;54905:57;;54750:3632;;;;;;54988:22;;;49509:1;54988:22;54984:3398;;;55032:11;55045:10;55057:9;55081:5;;55087:1;55081:8;;;;;;;;;;;;;;;;;;:::i;:::-;55070:45;;;;;;;:::i;:::-;55031:84;;;;;;55134:44;55141:2;55145:4;55151:26;55156:4;55162:6;55170;55151:4;:26::i;:::-;55134:6;:44::i;:::-;;54984:3398;;;;;;55204:29;;;49563:1;55204:29;55200:3182;;;55255:15;55272:10;55297:5;;55303:1;55297:8;;;;;;;;;;;;;;;;;;:::i;:::-;55286:39;;;;;;;:::i;:::-;55254:71;;;;55353:48;55366:2;55370:30;55375:8;55385:6;55393;55370:4;:30::i;:::-;55353:12;:48::i;:::-;55344:57;;55200:3182;;;;;55427:34;;;49622:1;55427:34;55423:2959;;;55483:12;55497:10;55522:5;;55528:1;55522:8;;;;;;;;;;;;;;;;;;:::i;:::-;55511:39;;;;;;;:::i;:::-;55482:68;;;;55569:50;55587:2;55591:27;55596:5;55603:6;55611;55591:4;:27::i;:::-;55569:17;:50::i;:::-;-1:-1:-1;;55666:4:0;55638:32;;55423:2959;;;55696:23;;;49670:1;55696:23;55692:2690;;;55741:13;55756:10;55781:5;;55787:1;55781:8;;;;;;;;;;;;;;;;;;:::i;:::-;55770:39;;;;;;;:::i;:::-;55740:69;;;;55847:41;55855:2;55859:28;55864:6;55872;55880;55859:4;:28::i;:::-;55847:7;:41::i;:::-;55935:4;55907:32;;55828:60;;-1:-1:-1;55828:60:0;-1:-1:-1;55692:2690:0;;-1:-1:-1;;55692:2690:0;;55965:37;;;50006:2;55965:37;55961:2421;;;56024:16;56042:15;56059;56089:5;;56095:1;56089:8;;;;;;;;;;;;;;;;;;:::i;:::-;56078:46;;;;;;;:::i;:::-;56023:101;;;;;;56144:12;56158;56174:20;:18;:20::i;:::-;56143:51;;;;56223:11;56222:12;:23;;;;56238:7;56222:23;56221:43;;;;;56257:7;56250:4;:14;56221:43;:79;;;;-1:-1:-1;56269:12:0;;;:30;;;56292:7;56285:4;:14;56269:30;56213:114;;;;-1:-1:-1;;;56213:114:0;;;;;;;:::i;:::-;55961:2421;;;;;;;;56353:34;;;50333:2;56353:34;56349:2033;;;56409:12;56423:23;56448:13;56463:7;56472:9;56483;56528:5;;56534:1;56528:8;;;;;;;;;;;;;;;;;;:::i;:::-;56517:71;;;;;;;:::i;:::-;56408:180;;;;;;;;;;;;56607:8;-1:-1:-1;;;;;56607:34:0;;56642:4;56648:15;56665:8;56675:1;56678;56681;56607:76;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56349:2033;;;;;;;;;56709:30;;;50093:2;56709:30;56705:1677;;;56779:50;56793:5;;56799:1;56793:8;;;;;;;;;;;;;;;;;;:::i;:::-;56779:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56803:6:0;;-1:-1:-1;56803:6:0;;-1:-1:-1;56810:1:0;;-1:-1:-1;56803:9:0;;;;;;;;;;;;;56814:6;56822;56779:13;:50::i;:::-;56760:69;;-1:-1:-1;56760:69:0;-1:-1:-1;56705:1677:0;;;56855:31;;;50150:2;56855:31;56851:1531;;;56926:40;56941:5;;56947:1;56941:8;;;;;;;;;;;;;;;;;;:::i;:::-;56926:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56951:6:0;;-1:-1:-1;56959:6:0;;-1:-1:-1;56926:14:0;;-1:-1:-1;56926:40:0:i;56851:1531::-;56992:31;;;50207:2;56992:31;56988:1394;;;57045:12;57059:10;57071:12;57098:5;;57104:1;57098:8;;;;;;;;;;;;;;;;;;:::i;:::-;57087:47;;;;;;;:::i;:::-;57044:90;;;;;;57153:8;-1:-1:-1;;;;;57153:17:0;;57171:5;57178:10;57190:2;57194:27;57199:5;57206:6;57214;57194:4;:27::i;:::-;57153:69;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56988:1394;;;;;;57248:40;;;50273:2;57248:40;57244:1138;;;57310:12;57324:20;57346:23;57384:5;;57390:1;57384:8;;;;;;;;;;;;;;;;;;:::i;:::-;57373:52;;;;;;;:::i;:::-;57309:116;;;;;;57444:8;-1:-1:-1;;;;;57444:25:0;;57470:5;57477:10;57489:3;57494:6;57444:57;;;;;;;;;;;;;;;;;;:::i;57244:1138::-;57527:21;;;50429:2;57527:21;57523:859;;;57570:23;57595:18;57617:42;57623:6;;57630:1;57623:9;;;;;;;;;;;;;57634:5;;57640:1;57634:8;;;;;;;;;;;;;;;;;;:::i;:::-;57617:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57644:6:0;;-1:-1:-1;57652:6:0;;-1:-1:-1;57617:5:0;;-1:-1:-1;57617:42:0:i;:::-;57569:90;;;;57684:12;:17;;57700:1;57684:17;57680:243;;;57748:10;57737:33;;;;;;;;;;;;:::i;:::-;57726:44;;57680:243;;;57800:12;:17;;57816:1;57800:17;57796:127;;;57872:10;57861:42;;;;;;;;;;;;:::i;:::-;57842:61;;-1:-1:-1;57842:61:0;-1:-1:-1;57796:127:0;57523:859;;;;;57948:32;;;49727:1;57948:32;57944:438;;;58001:11;58026:5;;58032:1;58026:8;;;;;;;;;;;;;;;;;;:::i;:::-;58015:30;;;;;;;:::i;:::-;58090:5;;58001:44;;-1:-1:-1;;;;;;58073:8:0;:16;;;;;58090:5;58097:55;58119:26;58001:44;58130:6;58138;58119:4;:26::i;:::-;58097:21;;;;;;;;;:11;:21;-1:-1:-1;;;;;58097:21:0;;;;;-1:-1:-1;;;58097:21:0;;;;;;;;;58147:4;58097:21;:55::i;:::-;58154:4;58073:86;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58064:95;;57944:438;;;;58185:31;;;49783:1;58185:31;58181:201;;;58237:13;58264:5;;58270:1;58264:8;;;;;;;;;;;;;;;;;;:::i;:::-;58253:30;;;;;;;:::i;:::-;58237:46;;58311:55;58330:28;58335:6;58343;58351;58330:4;:28::i;:::-;58311:18;;;;;;;;;:11;:18;-1:-1:-1;;;;;58311:18:0;;;;;-1:-1:-1;;;58311:18:0;;;;;;;;;58360:5;58311:18;:55::i;:::-;58302:64;;58181:201;;-1:-1:-1;54317:3:0;;54277:4116;;;-1:-1:-1;58409:25:0;;58405:139;;;58459:43;58470:10;58482:5;58489:12;;58459:10;:43::i;:::-;58451:81;;;;-1:-1:-1;;;58451:81:0;;;;;;;:::i;:::-;54048:4503;;;;;;;;;;:::o;31727:37::-;;;:::o;7228:44::-;;;;;;;;;;;;;;:::o;32084:23::-;;;;;;;;;;;;;;;-1:-1:-1;;32084:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59160:4209::-;59422:21;59447:20;:18;:20::i;:::-;59419:48;;;59478:8;:6;:8::i;:::-;59499:26;59536:23;59570:21;59602:26;;:::i;:::-;-1:-1:-1;59602:40:0;;;;;;;;;59631:11;59602:40;-1:-1:-1;;;;;59602:40:0;;;;;-1:-1:-1;;;59602:40:0;;;;;;;;59653:28;;:::i;:::-;59700:10;;59684:27;;-1:-1:-1;;;59684:27:0;;-1:-1:-1;;;;;59684:8:0;:15;;;;;:27;;59700:10;;;;;59684:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59653:58;;59727:9;59722:1492;59742:16;;;59722:1492;;;59780:12;59795:5;;59801:1;59795:8;;;;;;;;;;;;;;;;;;;;:::i;:::-;59780:23;;59823:37;59834:4;59840;59846:13;59823:10;:37::i;:::-;59818:1385;;-1:-1:-1;;;;;59971:20:0;;59881:18;59971:20;;;:14;:20;;;;;;;60027:14;;60042:1;60027:17;;;;;;;;;;;;;:39;:81;;60091:14;;60106:1;60091:17;;;;;;;;;;;;;60027:81;;;60069:19;60027:81;60014:94;-1:-1:-1;60154:35:0;:19;60014:94;60154:23;:35::i;:::-;-1:-1:-1;;;;;60131:20:0;;;;;;:14;:20;;;;;:58;;;;:20;-1:-1:-1;60250:41:0;:12;60273:10;60131:20;60250:22;:41::i;:::-;60227:64;-1:-1:-1;60310:23:0;60357:254;60497:58;60405:59;60450:13;60405:40;60227:64;35003:6;60405:16;:40::i;:::-;:44;;:59::i;:::-;:151;;;;;60357:14;;60405:151;;60583:5;60357:21;:254::i;:::-;-1:-1:-1;;;;;60660:25:0;;;;;;:19;:25;;;;;;60310:301;;-1:-1:-1;60660:46:0;;60310:301;60660:29;:46::i;:::-;-1:-1:-1;;;;;60632:25:0;;;;;;;:19;:25;;;;;:74;;;;60756:22;;;:46;;60794:7;60756:46;;;60781:2;60756:46;-1:-1:-1;;;;;60730:90:0;60750:4;-1:-1:-1;;;;;60730:90:0;;60804:15;60730:90;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;60844:96:0;;;;60853:22;;;:54;;60899:7;60853:54;;;60878:10;60853:54;-1:-1:-1;;;;;60844:96:0;;60915:12;60929:10;60844:96;;;;;;;:::i;:::-;;;;;;;;61014:39;:18;61037:15;61014:22;:39::i;:::-;60993:60;-1:-1:-1;61090:33:0;:15;61110:12;61090:19;:33::i;:::-;61072:51;-1:-1:-1;61158:29:0;:13;61176:10;61158:17;:29::i;:::-;61142:45;;59818:1385;;;;-1:-1:-1;59760:3:0;;59722:1492;;;-1:-1:-1;61232:20:0;61224:59;;;;-1:-1:-1;;;61224:59:0;;;;;;;:::i;:::-;61317:49;61342:23;:15;:21;:23::i;:::-;61317:20;;-1:-1:-1;;;;;61317:24:0;;;:49::i;:::-;-1:-1:-1;;;;;61294:72:0;;;61397:44;61419:21;:13;:19;:21::i;:::-;61397:17;;;;-1:-1:-1;;;;;61397:21:0;;;:44::i;:::-;-1:-1:-1;;;;;61377:64:0;;;:17;;;:64;;;61452:26;;:11;:26;;-1:-1:-1;;;;;;61452:26:0;;;;;;;;;;;-1:-1:-1;;;61452:26:0;;;;;;61512:20;;:44;;61537:18;61512:24;:44::i;:::-;61489:20;:67;61611:5;;61594:46;;-1:-1:-1;;;61594:46:0;;61569:22;;-1:-1:-1;;;;;61594:8:0;:16;;;;;:46;;61611:5;;61618:15;;61611:5;;61594:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61569:71;;61658:4;61653:1709;;61778:32;;-1:-1:-1;;;61778:32:0;;-1:-1:-1;;;;;61778:14:0;:23;;;;:32;;61802:7;;61778:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61770:71;;;;-1:-1:-1;;;61770:71:0;;;;;;;:::i;:::-;61943:10;;61925:82;;-1:-1:-1;;;61925:82:0;;-1:-1:-1;;;;;61925:8:0;:17;;;;;:82;;61943:10;;;;;61963:4;;61978:7;;61988:18;;61925:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62035:10:0;;62047:5;;62022:82;;-1:-1:-1;;;62022:82:0;;-1:-1:-1;;;;;62022:12:0;;;;-1:-1:-1;62022:12:0;;-1:-1:-1;62022:82:0;;62035:10;;;62047:5;;62062:4;;62069:14;;62085:18;;62022:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;62198:10:0;:18;62164:5;;62145:40;;-1:-1:-1;;;62145:40:0;;62121:21;;62145:73;;-1:-1:-1;;;;;62198:18:0;;;;-1:-1:-1;;;;;62145:8:0;:18;;;;;:40;;62164:5;;;;;62179:4;;62145:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;;:73::i;:::-;62121:97;-1:-1:-1;62233:18:0;62254:33;62121:97;62272:14;62254:17;:33::i;:::-;62233:54;-1:-1:-1;62302:16:0;35219:3;62321:28;62233:54;35152:5;62321:14;:28::i;:::-;:51;;;;;;62302:70;;62467:8;-1:-1:-1;;;;;62467:17:0;;62485:5;;;;;;;;;-1:-1:-1;;;;;62485:5:0;62500:4;62507:14;-1:-1:-1;;;;;62507:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62531:8;62467:73;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62576:59;62599:35;:27;62617:8;62599:13;:17;;:27;;;;:::i;:::-;:33;:35::i;:::-;62576:10;:18;-1:-1:-1;;;;;62576:18:0;;:22;:59::i;:::-;62555:10;:80;;-1:-1:-1;;;;;;62555:80:0;-1:-1:-1;;;;;62555:80:0;;;;;;;;;;62693:4;-1:-1:-1;;;;;62655:73:0;;;62700:24;:10;62715:8;62700:14;:24::i;:::-;62726:1;62655:73;;;;;;;:::i;:::-;;;;;;;;61653:1709;;;;;;62934:10;;-1:-1:-1;;;;;62916:8:0;:17;;;;;62934:10;;;;62954:4;;62961:22;;;:46;;62999:7;62961:46;;;62986:2;62961:46;63009:18;62916:112;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;63047:22:0;;;63043:142;;63103:10;;63115:5;;63090:79;;-1:-1:-1;;;63090:79:0;;-1:-1:-1;;;;;63090:12:0;;;;;;:79;;63103:10;;;;63115:5;;63122:10;;63134:14;;63150:18;;63090:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;63043:142;63219:5;;63201:67;;-1:-1:-1;;;63201:67:0;;-1:-1:-1;;;;;63201:8:0;:17;;;;;:67;;63219:5;;;;;63226:10;;63246:4;;63253:14;;63201:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63304:46;63327:22;:14;:20;:22::i;63304:46::-;63283:10;:67;;-1:-1:-1;;;;;;63283:67:0;-1:-1:-1;;;;;63283:67:0;;;;;;;;;;61653:1709;59160:4209;;;;;;;;;;;;;;:::o;32056:21::-;;;-1:-1:-1;;;;;32056:21:0;;:::o;7462:41::-;;;;;;;;;;;;;:::o;32339:25::-;;;-1:-1:-1;;;;;32339:25:0;;;;-1:-1:-1;;;32339:25:0;;;;:::o;42885:467::-;-1:-1:-1;;;;;43024:23:0;;;;;;:19;:23;;;;;;:34;;43052:5;43024:27;:34::i;:::-;-1:-1:-1;;;;;42998:23:0;;;;;;:19;:23;;;;;:60;43103:20;;43157:34;43103:20;43185:5;43157:27;:34::i;:::-;43134:20;:57;43213:10;;43202:60;;-1:-1:-1;;;;;43213:10:0;43225:5;43232:23;43257:4;43202:10;:60::i;:::-;43334:2;-1:-1:-1;;;;;43278:66:0;43295:4;:37;;43322:10;43295:37;;;43310:8;43295:37;-1:-1:-1;;;;;43278:66:0;;43338:5;43278:66;;;;;;:::i;:::-;;;;;;;;42885:467;;;;:::o;43953:194::-;44092:8:::1;:6;:8::i;:::-;44111:28;44129:2;44133:5;44111:17;:28::i;:::-;40955:43:::0;40966:10;40978:5;40985:12;;40955:10;:43::i;:::-;40947:81;;;;-1:-1:-1;;;40947:81:0;;;;;;;:::i;:::-;43953:194;;:::o;31893:41::-;;;;;;;;;;;;;;;:::o;2924:20::-;;;-1:-1:-1;;;;;2924:20:0;;:::o;33080:194::-;33184:10;;33121:13;;33184:23;;-1:-1:-1;;;;;33184:10:0;:21;:23::i;:::-;33214:5;;:18;;-1:-1:-1;;;;;33214:5:0;:16;:18::i;:::-;33239:6;;:25;;-1:-1:-1;;;33239:25:0;;-1:-1:-1;;;;;33239:6:0;;;;:13;;:25;;33253:10;;33239:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33239:25:0;;;;;;;;;;;;:::i;:::-;33161:104;;;;;;;;;;:::i;7942:751::-;8004:4;8095:11;;8091:525;;8154:10;8123:18;8144:21;;;;;;;;;;;8188:20;;;;8180:55;;;;-1:-1:-1;;;8180:55:0;;;;;;;:::i;:::-;8254:10;-1:-1:-1;;;;;8254:16:0;;;8250:355;;-1:-1:-1;;;;;8299:16:0;;8291:51;;;;-1:-1:-1;;;8291:51:0;;;;;;;:::i;:::-;8422:10;8412:9;:21;;;;;;;;;;;8436:19;;;8412:43;;-1:-1:-1;;;;;8498:13:0;;;;;;:23;;;;;;8250:355;8091:525;;8652:2;-1:-1:-1;;;;;8631:32:0;8640:10;-1:-1:-1;;;;;8631:32:0;-1:-1:-1;;;;;;;;;;;8656:6:0;8631:32;;;;;;:::i;33017:28::-;;;-1:-1:-1;;;;;33017:28:0;;;;-1:-1:-1;;;33017:28:0;;;;;;-1:-1:-1;;;33017:28:0;;-1:-1:-1;;;;;33017:28:0;;:::o;31771:53::-;;;:::o;11348:665::-;-1:-1:-1;;;;;11559:20:0;;11551:57;;;;-1:-1:-1;;;11551:57:0;;;;;;;:::i;:::-;11645:8;11627:15;:26;11619:53;;;;-1:-1:-1;;;11619:53:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11705:155:0;;11747:21;11794:14;;;:6;:14;;;;;;;;;:16;;11705:128;11794:16;;;;;;11736:85;;11705:128;;11715:108;;11736:85;;10881:66;;11854:6;;11778:7;;11787:5;;11794:16;11812:8;;11736:85;;:::i;:::-;;;;;;;;;;;;;11726:96;;;;;;11715:10;:108::i;:::-;11825:1;11828;11831;11705:128;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11705:155:0;;11683:229;;;;-1:-1:-1;;;11683:229:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11923:17:0;;;;;;;:9;:17;;;;;;;;:26;;;;;;;;;;;;;;:34;;;11973:32;;;;;11952:5;;11973:32;:::i;:::-;;;;;;;;11348:665;;;;;;;:::o;31999:24::-;;;-1:-1:-1;;;;;31999:24:0;;:::o;7333:64::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;2951:27::-;;;-1:-1:-1;;;;;2951:27:0;;:::o;64457:122::-;4834:5;;-1:-1:-1;;;;;4834:5:0;4820:10;:19;4812:64;;;;-1:-1:-1;;;4812:64:0;;;;;;;:::i;:::-;64521:5:::1;:16:::0;;-1:-1:-1;;;;;;64521:16:0::1;-1:-1:-1::0;;;;;64521:16:0;::::1;::::0;;::::1;::::0;;;64553:18:::1;::::0;::::1;::::0;-1:-1:-1;;64553:18:0::1;64457:122:::0;:::o;36376:3227::-;36412:29;;:::i;:::-;-1:-1:-1;36412:42:0;;;;;;;;36444:10;36412:42;-1:-1:-1;;;;;36412:42:0;;;;;-1:-1:-1;;;36412:42:0;;;;;;;;;-1:-1:-1;;;36412:42:0;;;-1:-1:-1;;;;;36412:42:0;;;;;;;;;36541:15;:41;;36593:55;;36630:7;;;;36593:55;-1:-1:-1;;;;;36691:15:0;36658:49;:23;;;:49;36720:26;;:::i;:::-;-1:-1:-1;36720:40:0;;;;;;;;;36749:11;36720:40;-1:-1:-1;;;;;36720:40:0;;;;;-1:-1:-1;;;36720:40:0;;;;;;;;;;36771:413;;36883:29;;-1:-1:-1;;;;;36883:61:0;34555:9;36883:61;36879:234;;34555:9;36965:60;;;37049:48;;;;;;36965:29;;;;;;37049:48;:::i;:::-;;;;;;;;36879:234;-1:-1:-1;;37127:24:0;;:10;:24;;;;;;;;;;;-1:-1:-1;;37127:24:0;;;-1:-1:-1;;;;;37127:24:0;;;;-1:-1:-1;;37127:24:0;-1:-1:-1;;;37127:24:0;;;;;;;;;;;;-1:-1:-1;;;;;37127:24:0;;;-1:-1:-1;;;37127:24:0;;;;;;;;37166:7;;36771:413;37196:19;37230;37264:25;;:::i;:::-;-1:-1:-1;37264:38:0;;;;;;;;;37292:10;37264:38;-1:-1:-1;;;;;37264:38:0;;;;;-1:-1:-1;;;37264:38:0;;;;;;;;;37391:29;;37365:20;;37441:4;;37357:81;;37426:11;;37357:64;;:29;;-1:-1:-1;;;;;37357:64:0;:33;:64::i;:81::-;:88;;;;;;37343:102;;37479:45;37504:19;:11;:17;:19::i;:::-;37479:20;;-1:-1:-1;;;;;37479:24:0;;;:45::i;:::-;-1:-1:-1;;;;;37456:68:0;;;;37579:5;;37586:19;;37561:52;;-1:-1:-1;;;37561:52:0;;37456:20;;37561:78;;37456:68;;-1:-1:-1;;;;;37561:8:0;:17;;;;;:52;;37579:5;;;37586:19;37456:20;;37561:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;:78::i;:::-;37535:104;-1:-1:-1;37652:17:0;35219:3;37672:29;:11;35152:5;37672:15;:29::i;:::-;:52;;;;;;37652:72;;37817:15;37783:31;37797:11;:16;;;-1:-1:-1;;;;;37783:31:0;:9;:13;;:31;;;;:::i;:::-;:49;;;;;;37769:63;;37876:55;37911:19;:11;:17;:19::i;:::-;37876:30;;;;-1:-1:-1;;;;;37876:34:0;;;:55::i;:::-;-1:-1:-1;;;;;37843:88:0;:30;;;:88;37960:41;37981:19;:11;:17;:19::i;:::-;37960:16;;;;-1:-1:-1;;;;;37960:20:0;;;:41::i;:::-;37942:10;:59;;-1:-1:-1;;;;;37942:59:0;;;-1:-1:-1;;;37942:59:0;;;;;;;;;38012:26;;:11;:26;;;;;;-1:-1:-1;;;;;;38012:26:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38165:15:0;;38106:56;;34271:4;38106:33;:56::i;:::-;:74;;;;;;38084:96;;34132:4;38195:11;:40;38191:1273;;;38252:19;34132:4;38274:65;34487:4;38274:43;34132:4;38305:11;38274:30;:43::i;:65::-;:94;;;;;;;-1:-1:-1;38383:13:0;38399:70;38423:45;38456:11;38423:28;38274:94;;38423:15;:28::i;:45::-;34817:8;;38399:23;:70::i;:::-;38531:29;;38383:86;;-1:-1:-1;38383:86:0;;38523:63;;-1:-1:-1;;;;;38523:38:0;34817:8;38523:42;:63::i;:::-;:71;;;;;;-1:-1:-1;;;;;38484:111:0;;;;34642:8;-1:-1:-1;38612:180:0;;;34642:8;38696:59;;38612:180;38191:1273;;;;;34204:4;38813:11;:40;38809:655;;;38870:18;34391:45;38891:65;34326:4;38891:43;:11;34204:4;38891:15;:43::i;:65::-;:94;;;;;;;-1:-1:-1;39000:13:0;39016:68;39040:43;39071:11;39040:26;38891:94;;39040:14;:26::i;39016:68::-;39138:29;;39000:84;;-1:-1:-1;39099:28:0;;34817:8;;39130:49;;-1:-1:-1;;;;;39130:38:0;39000:84;39130:42;:49::i;:::-;:71;;;;;;;-1:-1:-1;34731:12:0;39220:50;;39216:162;;;-1:-1:-1;34731:12:0;39216:162;-1:-1:-1;;;;;39392:60:0;;;-1:-1:-1;;38809:655:0;39517:29;;39481:79;;;;;;39491:11;;39504;;39548;;39481:79;:::i;:::-;;;;;;;;-1:-1:-1;;39571:24:0;;:10;:24;;;;;;;;;;;-1:-1:-1;;39571:24:0;;;-1:-1:-1;;;;;39571:24:0;;;;-1:-1:-1;;39571:24:0;-1:-1:-1;;;39571:24:0;;;;;;;;;;;;-1:-1:-1;;;;;39571:24:0;;;-1:-1:-1;;;39571:24:0;;;;;;;;;-1:-1:-1;;;;;;36376:3227:0;:::o;32209:24::-;;;-1:-1:-1;;;;;32209:24:0;;;;-1:-1:-1;;;32209:24:0;;;;:::o;18239:244::-;18382:32;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18382:32:0;-1:-1:-1;;;18382:32:0;;;18356:59;;18294:13;;18321:12;;18294:13;;-1:-1:-1;;;;;18356:25:0;;;:59;;18382:32;18356:59;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18320:95;;;;18433:7;:42;;;;;;;;;;;;;;;-1:-1:-1;;;18433:42:0;;;;;;18443:24;18462:4;18443:18;:24::i;:::-;18426:49;;;;18239:244;;;;:::o;48212:571::-;48368:15;;;;;;;;;:11;:15;-1:-1:-1;;;;;48368:15:0;;;;;-1:-1:-1;;;48368:15:0;;;;;;;;48317:14;;48368:27;;48384:4;48390;48368:15;:27::i;:::-;48344:51;;48345:11;48344:51;;;;;;;-1:-1:-1;;;;;48344:51:0;;;-1:-1:-1;;;48344:51:0;;;;-1:-1:-1;;;;;;48344:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;48427:18:0;;48345:11;48427:18;;;:14;:18;;;;;;;;48344:51;;-1:-1:-1;48427:28:0;;48450:4;48427:22;:28::i;:::-;-1:-1:-1;;;;;48406:18:0;;;;;;;:14;:18;;;;;;:49;;;;48501:5;;48484:37;;-1:-1:-1;;;48484:37:0;;48406:18;;48484:8;:16;;;;;:37;;48501:5;;;;48508:6;;48501:5;;48484:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48553:10;:18;48593:5;;48468:53;;-1:-1:-1;;;;;;48553:18:0;;48582:51;;-1:-1:-1;;;;;48593:5:0;48468:53;48553:18;48628:4;48582:10;:51::i;:::-;48665:29;48680:13;:5;:11;:13::i;:::-;-1:-1:-1;;;;;48665:14:0;;;;:29::i;:::-;48644:10;:50;;-1:-1:-1;;;;;;48644:50:0;-1:-1:-1;;;;;48644:50:0;;;;;;;;;;-1:-1:-1;;;;;48710:65:0;;48719:4;:37;;48746:10;48719:37;;;48734:8;48719:37;-1:-1:-1;;;;;48710:65:0;;48762:6;48770:4;48710:65;;;;;;;:::i;:::-;;;;;;;;48212:571;;;;;;;:::o;44208:827::-;44317:16;44346:25;;:::i;:::-;-1:-1:-1;44346:38:0;;;;;;;;44374:10;44346:38;-1:-1:-1;;;;;44346:38:0;;;;;;-1:-1:-1;;;44346:38:0;;;;;;;;;44509:5;;44516:11;:19;44492:50;;-1:-1:-1;;;44492:50:0;;44346:38;;;;-1:-1:-1;;;;;;;44492:8:0;:16;;;;;:50;;44509:5;;;44516:19;;44346:38;;44492:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44470:19;;-1:-1:-1;;;;;44470:72:0;;;-1:-1:-1;44564:13:0;;:62;;44618:8;44588:27;44598:11;:16;;;-1:-1:-1;;;;;44588:27:0;:5;:9;;:27;;;;:::i;:::-;:38;;;;;;44564:62;;;44580:5;44564:62;44553:73;;44682:4;44641:38;44662:16;:8;:14;:16::i;:::-;44641;;;;-1:-1:-1;;;;;44641:20:0;;;:38::i;:::-;-1:-1:-1;;;;;44641:45:0;;44637:86;;;44710:1;44703:8;;;;;;;44637:86;44746:32;:11;44762:5;44769:8;44746:15;:32::i;:::-;44733:45;;:10;:45;;;;;;;-1:-1:-1;;;;;44733:45:0;;;-1:-1:-1;;;44733:45:0;;;;-1:-1:-1;;;;;;44733:45:0;;;;;;;;;;;;;;-1:-1:-1;;;;;44805:13:0;;44733:45;44805:13;;;;;;;;;;;:27;;44823:8;44805:17;:27::i;:::-;-1:-1:-1;;;;;44789:13:0;;:9;:13;;;;;;;;;;;:43;;;;44848:34;;44789:13;;:9;-1:-1:-1;;;;;;;;;;;44848:34:0;;;44873:8;;44848:34;:::i;:::-;;;;;;;;44904:5;;44893:47;;-1:-1:-1;;;;;44904:5:0;44911;44918:15;44935:4;44893:10;:47::i;:::-;45007:2;-1:-1:-1;;;;;44956:71:0;44968:4;:37;;44995:10;44968:37;;;44983:8;44968:37;-1:-1:-1;;;;;44956:71:0;;45011:5;45018:8;44956:71;;;;;;;:::i;:::-;;;;;;;;44208:827;;;;;;;;:::o;45698:798::-;45768:13;45794:25;;:::i;:::-;-1:-1:-1;45794:38:0;;;;;;;;45822:10;45794:38;-1:-1:-1;;;;;45794:38:0;;;;;-1:-1:-1;;;45794:38:0;;;;;;;;;45901:5;;45908:11;:19;45884:50;;-1:-1:-1;;;45884:50:0;;45794:38;;-1:-1:-1;;;;;;;45884:8:0;:16;;;;;:50;;45901:5;;;45908:19;;;45794:38;;45884:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45862:19;;45978:16;;;;-1:-1:-1;;;;;45862:72:0;;;;;;;;-1:-1:-1;45953:41:0;:22;:8;45862:72;45953:12;:22::i;:::-;:41;;;;;46039:10;46029:9;:21;;;;;;;;;;;45953:41;;;;-1:-1:-1;46029:35:0;;46055:8;46029:25;:35::i;:::-;46015:10;46005:9;:21;;;;;;;;;;;:59;;;;46080:42;;-1:-1:-1;;;;;;;;;;;46080:42:0;;;46113:8;;46080:42;:::i;:::-;;;;;;;;46155:38;46179:13;:5;:11;:13::i;46155:38::-;-1:-1:-1;;;;;46133:60:0;;;46223:38;46244:16;:8;:14;:16::i;46223:38::-;-1:-1:-1;;;;;46204:57:0;:16;;;:57;;;46300:4;-1:-1:-1;46280:24:0;46272:57;;;;-1:-1:-1;;;46272:57:0;;;;;;;:::i;:::-;46340:24;;:10;:24;;;;;;-1:-1:-1;;;;;46340:24:0;;;-1:-1:-1;;;46340:24:0;;;;-1:-1:-1;;;;;;46340:24:0;;;;;;;;;;;;;;46380:47;;-1:-1:-1;;;;;46380:47:0;;;46395:10;;46380:47;;;;46411:5;;46418:8;;46380:47;:::i;:::-;;;;;;;;46456:5;;46438:50;;-1:-1:-1;;;46438:50:0;;-1:-1:-1;;;;;46438:8:0;:17;;;;;:50;;46456:5;;;;;46471:4;;46478:2;;46482:5;;46438:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45698:798;;;;;;:::o;18690:263::-;18829:36;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18829:36:0;-1:-1:-1;;;18829:36:0;;;18803:63;;18749:5;;;;18782:17;;-1:-1:-1;;;;;18803:25:0;;;:63;;18829:36;18803:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18767:99;;;;18884:7;:28;;;;;18895:4;:11;18910:2;18895:17;18884:28;:61;;18943:2;18884:61;;;18926:4;18915:25;;;;;;;;;;;;:::i;5706:187::-;5780:7;5296:68;5861:7;5878:4;5817:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5807:78;;;;;;5800:85;;5706:187;;;:::o;1207:141::-;1300:5;;;1295:16;;;;1287:53;;;;-1:-1:-1;;;1287:53:0;;;;;;;:::i;46991:798::-;47054:12;;;35349:3;47114:30;:6;35275:2;47114:10;:30::i;:::-;:61;;;;;;;-1:-1:-1;47252:44:0;47268:21;:6;47114:61;47268:10;:21::i;:::-;47252:15;;;;;;;;;:11;:15;-1:-1:-1;;;;;47252:15:0;;;;;-1:-1:-1;;;47252:15:0;;;;;;;;;47291:4;47252:15;:44::i;:::-;47230:66;;47231:11;47230:66;;;;;;;-1:-1:-1;;;;;47230:66:0;;;-1:-1:-1;;;47230:66:0;;;;-1:-1:-1;;;;;;47230:66:0;;;;;;;;;;;;;;47351:10;47231:11;47336:26;;;:14;:26;;;;;;;;47230:66;;-1:-1:-1;47336:36:0;;47230:66;47336:30;:36::i;:::-;47322:10;47307:26;;;;:14;:26;;;;;;;:65;;;;47388:50;;-1:-1:-1;;;;;47388:50:0;;;47322:10;47388:50;;;;47414:6;;47422:9;;47433:4;;47388:50;:::i;:::-;;;;;;;;47476:5;;47459:38;;-1:-1:-1;;;47459:38:0;;-1:-1:-1;;;;;47459:8:0;:16;;;;;:38;;47476:5;;;;;47483:6;;47476:5;;47459:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47451:46;;47508:25;;:::i;:::-;-1:-1:-1;47508:38:0;;;;;;;;;47536:10;47508:38;-1:-1:-1;;;;;47508:38:0;;;;;-1:-1:-1;;;47508:38:0;;;;;;;;;;47585:4;-1:-1:-1;47565:24:0;47557:57;;;;-1:-1:-1;;;47557:57:0;;;;;;;:::i;:::-;47647:38;47671:13;:5;:11;:13::i;:::-;47647:19;;-1:-1:-1;;;;;47647:23:0;;;:38::i;:::-;-1:-1:-1;;;;;47625:60:0;;;;;;47696:10;:24;;;;;;;;-1:-1:-1;;;47696:24:0;-1:-1:-1;;;;;;47696:24:0;;;;;;;;;;;;47749:5;;47731:50;;-1:-1:-1;;;47731:50:0;;-1:-1:-1;;;;;47731:8:0;:17;;;;;:50;;47749:5;;;;;47764:4;;47771:2;;47775:5;;47731:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46991:798;;;;;;;:::o;39825:964::-;-1:-1:-1;;;;;40038:20:0;;39950:4;40038:20;;;:14;:20;;;;;;40073:15;40069:32;;40097:4;40090:11;;;;;40069:32;-1:-1:-1;;;;;40138:25:0;;40112:23;40138:25;;;:19;:25;;;;;;40178:20;40174:38;;40207:5;40200:12;;;;;;40174:38;40225:26;;:::i;:::-;-1:-1:-1;40225:40:0;;;;;;;;;40254:11;40225:40;-1:-1:-1;;;;;40225:40:0;;;;;;-1:-1:-1;;;40225:40:0;;;;;;;;;;;40706:55;;40747:13;;40706:36;;:10;;:14;:36::i;:55::-;:75;;;;;40334:10;;40706:75;;;;-1:-1:-1;;;;;40298:8:0;:17;;;;;40334:10;40363:185;40467:4;:62;;33844:5;40467:62;;;33916:5;40467:62;40363:77;:15;40383:56;40363:19;:77::i;:185::-;40567:5;40298:289;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:483;;;39825:964;-1:-1:-1;;;;;;;39825:964:0:o;50642:230::-;50759:14;50804:1;50795:5;:10;;:69;;-1:-1:-1;;50826:5:0;:19;:37;;50857:6;50826:37;;;50848:6;50826:37;50795:69;;;-1:-1:-1;50816:5:0;;50786:78;-1:-1:-1;;50642:230:0:o;43421:347::-;43549:10;43529:31;;;;:19;:31;;;;;;:42;;43565:5;43529:35;:42::i;:::-;43515:10;43495:31;;;;:19;:31;;;;;:76;43605:20;;:31;;43630:5;43605:24;:31::i;:::-;43582:20;:54;43652:42;;-1:-1:-1;;;;;43652:42:0;;;43672:10;;43652:42;;;;43688:5;;43652:42;:::i;:::-;;;;;;;;43723:10;;43705:55;;-1:-1:-1;;;43705:55:0;;-1:-1:-1;;;;;43705:8:0;:17;;;;;:55;;43723:10;;;;;43743:4;;43750:2;;43754:5;;43705:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43421:347;;:::o;50942:558::-;51092:7;51101;51122:12;51136:10;51148:13;51163:12;51190:4;51179:51;;;;;;;;;;;;:::i;:::-;51121:109;;;;;;;;51257:28;51262:6;51270;51278;51257:4;:28::i;:::-;51241:45;;51360:27;51365:5;51372:6;51380;51360:4;:27::i;:::-;51345:43;;51406:8;-1:-1:-1;;;;;51406:16:0;;51430:5;51437;51444:10;51456:2;51468:6;51485:5;51406:86;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51399:93;;;;;;;;50942:558;;;;;;;:::o;51571:390::-;51698:7;51707;51728:12;51742:10;51754:13;51769:12;51796:4;51785:51;;;;;;;;;;;;:::i;:::-;51727:109;;;;;;;;51854:8;-1:-1:-1;;;;;51854:17:0;;51872:5;51879:10;51891:2;51895:28;51900:6;51908;51916;51895:4;:28::i;:::-;51925:27;51930:5;51937:6;51945;51925:4;:27::i;:::-;51854:99;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51847:106;;;;;;;;51571:390;;;;;;:::o;52239:964::-;52381:12;52395:5;52414:14;52430:21;52453:14;52469;52485:18;52531:4;52520:53;;;;;;;;;;;;:::i;:::-;52413:160;;;;;;;;;;52590:9;:23;;;;;52604:9;52603:10;52590:23;52586:322;;;52658:8;52668:6;52641:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52630:45;;52586:322;;;52698:9;52697:10;:23;;;;;52711:9;52697:23;52693:215;;;52765:8;52775:6;52748:34;;;;;;;;;:::i;52693:215::-;52804:9;:22;;;;;52817:9;52804:22;52800:108;;;52871:8;52881:6;52889;52854:42;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52843:53;;52800:108;52946:8;-1:-1:-1;;;;;52928:27:0;:6;-1:-1:-1;;;;;52928:27:0;;;:54;;;;-1:-1:-1;;;;;;52959:23:0;;52977:4;52959:23;;52928:54;52920:88;;;;-1:-1:-1;;;52920:88:0;;;;;;;:::i;:::-;53022:12;53036:23;53063:6;-1:-1:-1;;;;;53063:11:0;53082:5;53089:8;53063:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53021:77;;;;53117:7;53109:42;;;;-1:-1:-1;;;53109:42:0;;;;;;;:::i;:::-;53170:10;53182:12;;-1:-1:-1;52239:964:0;;-1:-1:-1;;;;;;;;;;52239:964:0:o;13454:437::-;13579:15;13611:5;:10;;;-1:-1:-1;;;;;13611:15:0;13625:1;13611:15;13607:277;;;-1:-1:-1;13653:4:0;13607:277;;;13726:10;;;;13709:13;;-1:-1:-1;;;;;13700:36:0;;;;:23;;:4;;:23;:8;:23::i;:::-;:36;;;;;;13690:46;;13755:7;:57;;;;;13808:4;13792:5;:13;;;-1:-1:-1;;;;;13766:39:0;:23;13778:5;:10;;;-1:-1:-1;;;;;13766:23:0;:7;:11;;:23;;;;:::i;:::-;:39;;;;;;:46;13755:57;13751:122;;;13843:14;:7;13855:1;13843:11;:14::i;12930:431::-;13084:13;;13055:12;;-1:-1:-1;;;;;13084:18:0;13080:274;;-1:-1:-1;13126:7:0;13080:274;;;13199:13;;13185:10;;;;-1:-1:-1;;;;;13173:39:0;;;;:23;;:7;;:23;:11;:23::i;:::-;:39;;;;;;13166:46;;13231:7;:57;;;;;13281:7;13268:5;:10;;;-1:-1:-1;;;;;13242:36:0;:23;13251:5;:13;;;-1:-1:-1;;;;;13242:23:0;:4;:8;;:23;;;;:::i;1356:138::-;1449:5;;;1444:16;;;;1436:50;;;;-1:-1:-1;;;1436:50:0;;;;;;;:::i;1502:155::-;1560:9;1590:6;;;:30;;-1:-1:-1;;1605:5:0;;;1619:1;1614;1605:5;1614:1;1600:15;;;;;:20;1590:30;1582:67;;;;-1:-1:-1;;;1582:67:0;;;;;;;:::i;1665:161::-;1714:9;-1:-1:-1;;;;;1744:16:0;;;1736:57;;;;-1:-1:-1;;;1736:57:0;;;;;;;:::i;:::-;-1:-1:-1;1816:1:0;1665:161::o;2439:138::-;2532:5;;;-1:-1:-1;;;;;2527:16:0;;;;;;;;2519:50;;;;-1:-1:-1;;;2519:50:0;;;;;;;:::i;2290:141::-;2383:5;;;-1:-1:-1;;;;;2378:16:0;;;;;;;;2370:53;;;;-1:-1:-1;;;2370:53:0;;;;;;;:::i;42152:370::-;42294:4;42290:225;;;42332:51;42377:5;42332:8;-1:-1:-1;;;;;42332:18:0;;42351:5;42366:4;42332:40;;;;;;;;;;;;;;;;:::i;:51::-;42323:5;:60;;42315:97;;;;-1:-1:-1;;;42315:97:0;;;;;;;:::i;:::-;42290:225;;;42445:58;;-1:-1:-1;;;42445:58:0;;-1:-1:-1;;;;;42445:8:0;:17;;;;:58;;42463:5;;42470:10;;42490:4;;42497:5;;42445:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42290:225;42152:370;;;;:::o;17789:248::-;17934:34;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17934:34:0;-1:-1:-1;;;17934:34:0;;;17908:61;;17846:13;;17873:12;;17846:13;;-1:-1:-1;;;;;17908:25:0;;;:61;;17934:34;17908:61;:::i;6697:204::-;6758:14;6821:40;;;;;;;;;;;;;-1:-1:-1;;;6821:40:0;;;6863:18;:16;:18::i;:::-;6883:8;6804:88;;;;;;;;;;:::i;16996:587::-;17066:13;17111:2;17096:4;:11;:17;17092:484;;17148:4;17137:26;;;;;;;;;;;;:::i;:::-;17130:33;;;;17092:484;17185:4;:11;17200:2;17185:17;17181:395;;;17219:7;17245:69;17256:2;17252:1;:6;;;:22;;;;;17262:4;17267:1;17262:7;;;;;;;;;;;;;;-1:-1:-1;;;;;;17262:7:0;:12;;17252:22;17245:69;;;17295:3;;17245:69;;;17328:23;17364:1;17354:12;;-1:-1:-1;;;;;17354:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17354:12:0;;17328:38;;17390:1;17386:5;;17381:99;17397:2;17393:1;:6;;;:22;;;;;17403:4;17408:1;17403:7;;;;;;;;;;;;;;-1:-1:-1;;;;;;17403:7:0;:12;;17393:22;17381:99;;;17457:4;17462:1;17457:7;;;;;;;;;;;;;;;;;;17441:10;17452:1;17441:13;;;;;;;;;;;;;:23;-1:-1:-1;;;;;17441:23:0;;;;;;;;-1:-1:-1;17417:3:0;;;;;17381:99;;;17508:10;-1:-1:-1;17494:25:0;;-1:-1:-1;17494:25:0;17181:395;-1:-1:-1;17552:12:0;;;;;;;;;;;;-1:-1:-1;;;17552:12:0;;;;;;14582:358;14701:13;;:::i;:::-;14716:15;14754:31;14764:5;14771:4;14777:7;14754:9;:31::i;:::-;14744:41;;14812:34;14830:15;:7;:13;:15::i;:::-;14812:13;;-1:-1:-1;;;;;14812:17:0;;;:34::i;:::-;-1:-1:-1;;;;;14796:50:0;;;14870:28;14885:12;:4;:10;:12::i;:::-;14870:10;;;;-1:-1:-1;;;;;14870:14:0;;;:28::i;:::-;-1:-1:-1;;;;;14857:41:0;:10;;;:41;:10;;14582:358;-1:-1:-1;;;14582:358:0:o;15002:281::-;15124:13;;:::i;:::-;15166:34;15184:15;:7;:13;:15::i;15166:34::-;-1:-1:-1;;;;;15150:50:0;;;15224:28;15239:12;:4;:10;:12::i;15224:28::-;-1:-1:-1;;;;;15211:41:0;:10;;;:41;-1:-1:-1;15211:10:0;;15002:281;-1:-1:-1;;15002:281:0:o;14060:352::-;14182:13;;:::i;:::-;14197:12;14229:31;14236:5;14243:7;14252;14229:6;:31::i;:::-;14222:38;;14287:34;14305:15;:7;:13;:15::i;:::-;14287:13;;-1:-1:-1;;;;;14287:17:0;;;:34::i;:::-;-1:-1:-1;;;;;14271:50:0;;;14345:28;14360:12;:4;:10;:12::i;:::-;14345:10;;;;-1:-1:-1;;;;;14345:14:0;;;:28::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;5:130;72:20;;97:33;72:20;97:33;:::i;611:352::-;;;741:3;734:4;726:6;722:17;718:27;708:2;;-1:-1;;749:12;708:2;-1:-1;779:20;;-1:-1;;;;;808:30;;805:2;;;-1:-1;;841:12;805:2;885:4;877:6;873:17;861:29;;936:3;885:4;;920:6;916:17;877:6;902:32;;899:41;896:2;;;953:1;;943:12;2487:707;;2604:3;2597:4;2589:6;2585:17;2581:27;2571:2;;-1:-1;;2612:12;2571:2;2659:6;2646:20;2681:80;2696:64;2753:6;2696:64;:::i;:::-;2681:80;:::i;:::-;2789:21;;;2672:89;-1:-1;2833:4;2846:14;;;;2821:17;;;2935;;;2926:27;;;;2923:36;-1:-1;2920:2;;;2972:1;;2962:12;2920:2;2997:1;2982:206;3007:6;3004:1;3001:13;2982:206;;;7378:20;;3075:50;;3139:14;;;;3167;;;;3029:1;3022:9;2982:206;;;2986:14;;;;;2564:630;;;;:::o;4787:442::-;;4899:3;4892:4;4884:6;4880:17;4876:27;4866:2;;-1:-1;;4907:12;4866:2;4947:6;4941:13;4969:64;4984:48;5025:6;4984:48;:::i;4969:64::-;4960:73;;5053:6;5046:5;5039:21;5157:3;5089:4;5148:6;5081;5139:16;;5136:25;5133:2;;;5174:1;;5164:12;5133:2;5184:39;5216:6;5089:4;5115:5;5111:16;5089:4;5081:6;5077:17;5184:39;:::i;:::-;;4859:370;;;;:::o;7859:241::-;;7963:2;7951:9;7942:7;7938:23;7934:32;7931:2;;;-1:-1;;7969:12;7931:2;85:6;72:20;97:33;124:5;97:33;:::i;8107:263::-;;8222:2;8210:9;8201:7;8197:23;8193:32;8190:2;;;-1:-1;;8228:12;8190:2;226:6;220:13;238:33;265:5;238:33;:::i;8377:891::-;;;;;;;8577:3;8565:9;8556:7;8552:23;8548:33;8545:2;;;-1:-1;;8584:12;8545:2;371:6;358:20;383:41;418:5;383:41;:::i;:::-;8636:71;-1:-1;8744:2;8791:22;;358:20;383:41;358:20;383:41;:::i;:::-;8752:71;-1:-1;8860:2;8896:22;;3640:20;3665:30;3640:20;3665:30;:::i;:::-;8868:60;-1:-1;8965:2;9002:22;;7654:20;7679:31;7654:20;7679:31;:::i;:::-;8539:729;;;;-1:-1;8539:729;;9071:3;9111:22;;3909:20;;9180:3;9220:22;;;3909:20;;-1:-1;8539:729;-1:-1;;8539:729::o;9275:906::-;;;;;;9467:3;9455:9;9446:7;9442:23;9438:33;9435:2;;;-1:-1;;9474:12;9435:2;528:6;522:13;540:41;575:5;540:41;:::i;:::-;9666:2;9651:18;;9645:25;9526:82;;-1:-1;;;;;;9679:30;;9676:2;;;-1:-1;;9712:12;9676:2;9742:73;9807:7;9798:6;9787:9;9783:22;9742:73;:::i;:::-;9732:83;;;9852:2;9903:9;9899:22;3782:13;3800:30;3824:5;3800:30;:::i;:::-;9968:2;10015:22;;3782:13;9860:71;;-1:-1;3800:30;3782:13;3800:30;:::i;:::-;10084:3;10133:22;;7798:13;9976:71;;-1:-1;7816:31;7798:13;7816:31;:::i;:::-;10093:72;;;;9429:752;;;;;;;;:::o;10188:366::-;;;10309:2;10297:9;10288:7;10284:23;10280:32;10277:2;;;-1:-1;;10315:12;10277:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;10367:63;-1:-1;10467:2;10506:22;;72:20;97:33;72:20;97:33;:::i;:::-;10475:63;;;;10271:283;;;;;:::o;10561:491::-;;;;10699:2;10687:9;10678:7;10674:23;10670:32;10667:2;;;-1:-1;;10705:12;10667:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;10757:63;-1:-1;10857:2;10896:22;;72:20;97:33;72:20;97:33;:::i;:::-;10661:391;;10865:63;;-1:-1;;;10965:2;11004:22;;;;7378:20;;10661:391::o;11059:991::-;;;;;;;;11263:3;11251:9;11242:7;11238:23;11234:33;11231:2;;;-1:-1;;11270:12;11231:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;11322:63;-1:-1;11422:2;11461:22;;72:20;97:33;72:20;97:33;:::i;:::-;11430:63;-1:-1;11530:2;11569:22;;7378:20;;-1:-1;11638:2;11677:22;;7378:20;;-1:-1;11746:3;11784:22;;7654:20;7679:31;7654:20;7679:31;:::i;:::-;11225:825;;;;-1:-1;11225:825;;;;11755:61;11853:3;11893:22;;3909:20;;-1:-1;11962:3;12002:22;;;3909:20;;11225:825;-1:-1;;11225:825::o;12057:479::-;;;;12189:2;12177:9;12168:7;12164:23;12160:32;12157:2;;;-1:-1;;12195:12;12157:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;12247:63;-1:-1;12347:2;12383:22;;3640:20;3665:30;3640:20;3665:30;:::i;:::-;12355:60;-1:-1;12452:2;12488:22;;3640:20;3665:30;3640:20;3665:30;:::i;:::-;12460:60;;;;12151:385;;;;;:::o;12543:485::-;;;;12678:2;12666:9;12657:7;12653:23;12649:32;12646:2;;;-1:-1;;12684:12;12646:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;12736:63;-1:-1;12836:2;12872:22;;3640:20;3665:30;3640:20;3665:30;:::i;13035:366::-;;;13156:2;13144:9;13135:7;13131:23;13127:32;13124:2;;;-1:-1;;13162:12;13124:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;13214:63;13314:2;13353:22;;;;7378:20;;-1:-1;;;13118:283::o;13408:1083::-;;;;;;;;13664:3;13652:9;13643:7;13639:23;13635:33;13632:2;;;-1:-1;;13671:12;13632:2;13729:17;13716:31;-1:-1;;;;;13767:18;13759:6;13756:30;13753:2;;;-1:-1;;13789:12;13753:2;13827:80;13899:7;13890:6;13879:9;13875:22;13827:80;:::i;:::-;13809:98;;-1:-1;13809:98;-1:-1;13972:2;13957:18;;13944:32;;-1:-1;13985:30;;;13982:2;;;-1:-1;;14018:12;13982:2;;14056:80;14128:7;14119:6;14108:9;14104:22;14056:80;:::i;:::-;14038:98;;-1:-1;14038:98;-1:-1;;14173:2;14212:22;;72:20;97:33;72:20;97:33;:::i;:::-;14181:63;-1:-1;14281:2;14337:22;;5828:20;5853:50;5828:20;5853:50;:::i;:::-;14289:80;-1:-1;14406:3;14443:22;;3640:20;3665:30;3640:20;3665:30;:::i;:::-;14415:60;;;;13626:865;;;;;;;;;;:::o;14498:977::-;;;;;;;14750:2;14738:9;14729:7;14725:23;14721:32;14718:2;;;-1:-1;;14756:12;14718:2;14814:17;14801:31;-1:-1;;;;;14852:18;14844:6;14841:30;14838:2;;;-1:-1;;14874:12;14838:2;14912:78;14982:7;14973:6;14962:9;14958:22;14912:78;:::i;:::-;14894:96;;-1:-1;14894:96;-1:-1;15055:2;15040:18;;15027:32;;-1:-1;15068:30;;;15065:2;;;-1:-1;;15101:12;15065:2;15139:80;15211:7;15202:6;15191:9;15187:22;15139:80;:::i;:::-;15121:98;;-1:-1;15121:98;-1:-1;15284:2;15269:18;;15256:32;;-1:-1;15297:30;;;15294:2;;;-1:-1;;15330:12;15294:2;;15368:91;15451:7;15442:6;15431:9;15427:22;15368:91;:::i;:::-;14712:763;;;;-1:-1;14712:763;;-1:-1;14712:763;;15350:109;;14712:763;-1:-1;;;14712:763::o;15482:257::-;;15594:2;15582:9;15573:7;15569:23;15565:32;15562:2;;;-1:-1;;15600:12;15562:2;3788:6;3782:13;3800:30;3824:5;3800:30;:::i;15746:393::-;;;15875:2;15863:9;15854:7;15850:23;15846:32;15843:2;;;-1:-1;;15881:12;15843:2;3788:6;3782:13;3800:30;3824:5;3800:30;:::i;:::-;16041:2;16091:22;;;;7526:13;15933:71;;7526:13;;-1:-1;;;15837:302::o;16146:485::-;;;;16281:2;16269:9;16260:7;16256:23;16252:32;16249:2;;;-1:-1;;16287:12;16249:2;3653:6;3640:20;3665:30;3689:5;3665:30;:::i;:::-;16339:60;16436:2;16475:22;;7378:20;;-1:-1;16544:2;16583:22;;;7378:20;;16243:388;-1:-1;;;16243:388::o;16638:365::-;;;16761:2;16749:9;16740:7;16736:23;16732:32;16729:2;;;-1:-1;;16767:12;16729:2;16825:17;16812:31;-1:-1;;;;;16863:18;16855:6;16852:30;16849:2;;;-1:-1;;16885:12;16849:2;16970:6;16959:9;16955:22;;;4107:3;4100:4;4092:6;4088:17;4084:27;4074:2;;-1:-1;;4115:12;4074:2;4158:6;4145:20;16863:18;4177:6;4174:30;4171:2;;;-1:-1;;4207:12;4171:2;4302:3;16761:2;4282:17;4243:6;4268:32;;4265:41;4262:2;;;-1:-1;;4309:12;4262:2;16761;4239:17;;;;;16905:82;;-1:-1;16723:280;;-1:-1;;;;16723:280::o;17552:714::-;;;;;17739:3;17727:9;17718:7;17714:23;17710:33;17707:2;;;-1:-1;;17746:12;17707:2;5503:6;5497:13;5515:48;5557:5;5515:48;:::i;:::-;17924:2;17982:22;;522:13;17798:89;;-1:-1;540:41;522:13;540:41;:::i;:::-;18051:2;18100:22;;6127:13;18169:2;18218:22;;;6127:13;17701:565;;17932:82;;-1:-1;17701:565;-1:-1;;;17701:565::o;18273:793::-;;;;18476:2;18464:9;18455:7;18451:23;18447:32;18444:2;;;-1:-1;;18482:12;18444:2;5332:6;5319:20;5344:48;5386:5;5344:48;:::i;:::-;18534:78;-1:-1;18677:2;18662:18;;;18649:32;-1:-1;;;;;18690:30;;;18687:2;;;-1:-1;;18723:12;18687:2;18814:6;18803:9;18799:22;;;1106:3;1099:4;1091:6;1087:17;1083:27;1073:2;;-1:-1;;1114:12;1073:2;1161:6;1148:20;1183:80;1198:64;1255:6;1198:64;:::i;1183:80::-;1291:21;;;1348:14;;;;1323:17;;;1437;;;1428:27;;;;1425:36;-1:-1;1422:2;;;-1:-1;;1464:12;1422:2;-1:-1;1490:10;;1484:206;1509:6;1506:1;1503:13;1484:206;;;1589:37;1622:3;1610:10;1589:37;:::i;:::-;1577:50;;1531:1;1524:9;;;;;1641:14;;;;1669;;1484:206;;;-1:-1;18743:88;-1:-1;;;18896:2;18881:18;;18868:32;;-1:-1;18909:30;;;18906:2;;;-1:-1;;18942:12;18906:2;;;18972:78;19042:7;19033:6;19022:9;19018:22;18972:78;:::i;:::-;18962:88;;;18438:628;;;;;:::o;19073:813::-;;;;;19283:3;19271:9;19262:7;19258:23;19254:33;19251:2;;;-1:-1;;19290:12;19251:2;5332:6;5319:20;5344:48;5386:5;5344:48;:::i;:::-;19342:78;-1:-1;19457:2;19511:22;;5319:20;5344:48;5319:20;5344:48;:::i;:::-;19465:78;-1:-1;19580:2;19635:22;;5658:20;5683:49;5658:20;5683:49;:::i;:::-;19588:79;-1:-1;19732:2;19717:18;;19704:32;-1:-1;;;;;19745:30;;19742:2;;;-1:-1;;19778:12;19742:2;19838:22;;4432:4;4420:17;;4416:27;-1:-1;4406:2;;-1:-1;;4447:12;4406:2;4494:6;4481:20;4516:64;4531:48;4572:6;4531:48;:::i;4516:64::-;4600:6;4593:5;4586:21;4704:3;19457:2;4695:6;4628;4686:16;;4683:25;4680:2;;;-1:-1;;4711:12;4680:2;76607:6;19457:2;4628:6;4624:17;19457:2;4662:5;4658:16;76584:30;76645:16;;;19457:2;76645:16;76638:27;;;;-1:-1;19245:641;;;;-1:-1;19245:641;-1:-1;19245:641::o;20175:394::-;;;20310:2;20298:9;20289:7;20285:23;20281:32;20278:2;;;-1:-1;;20316:12;20278:2;5841:6;5828:20;5853:50;5897:5;5853:50;:::i;:::-;20368:80;-1:-1;20485:2;20521:22;;3640:20;3665:30;3640:20;3665:30;:::i;20576:239::-;;20679:2;20667:9;20658:7;20654:23;20650:32;20647:2;;;-1:-1;;20685:12;20647:2;-1:-1;5981:20;;20641:174;-1:-1;20641:174::o;20822:380::-;;;20950:2;20938:9;20929:7;20925:23;20921:32;20918:2;;;-1:-1;;20956:12;20918:2;5994:6;5981:20;21008:62;;21107:2;21158:9;21154:22;358:20;383:41;418:5;383:41;:::i;21209:499::-;;;;21351:2;21339:9;21330:7;21326:23;21322:32;21319:2;;;-1:-1;;21357:12;21319:2;5994:6;5981:20;21409:62;;21508:2;21559:9;21555:22;358:20;383:41;418:5;383:41;:::i;21715:362::-;;21840:2;21828:9;21819:7;21815:23;21811:32;21808:2;;;-1:-1;;21846:12;21808:2;21897:17;21891:24;-1:-1;;;;;21927:6;21924:30;21921:2;;;-1:-1;;21957:12;21921:2;21987:74;22053:7;22044:6;22033:9;22029:22;21987:74;:::i;22084:309::-;;22222:2;22210:9;22201:7;22197:23;22193:32;22190:2;;;-1:-1;;22228:12;22190:2;6821:20;22222:2;6821:20;:::i;:::-;7254:6;7248:13;7266:33;7293:5;7266:33;:::i;:::-;6901:86;;7048:2;7113:22;;7248:13;7266:33;7248:13;7266:33;:::i;:::-;7048:2;7063:16;;7056:86;7067:5;22184:209;-1:-1;;;22184:209::o;22400:263::-;;22515:2;22503:9;22494:7;22490:23;22486:32;22483:2;;;-1:-1;;22521:12;22483:2;-1:-1;7526:13;;22477:186;-1:-1;22477:186::o;22670:399::-;;;22802:2;22790:9;22781:7;22777:23;22773:32;22770:2;;;-1:-1;;22808:12;22770:2;-1:-1;;7526:13;;22971:2;23021:22;;;7526:13;;;;;-1:-1;22764:305::o;23076:237::-;;23178:2;23166:9;23157:7;23153:23;23149:32;23146:2;;;-1:-1;;23184:12;23146:2;7667:6;7654:20;7679:31;7704:5;7679:31;:::i;23320:259::-;;23433:2;23421:9;23412:7;23408:23;23404:32;23401:2;;;-1:-1;;23439:12;23401:2;7804:6;7798:13;7816:31;7841:5;7816:31;:::i;26177:343::-;;26319:5;71390:12;72193:6;72188:3;72181:19;26412:52;26457:6;72230:4;72225:3;72221:14;72230:4;26438:5;26434:16;26412:52;:::i;:::-;77202:7;77186:14;-1:-1;;77182:28;26476:39;;;;72230:4;26476:39;;26267:253;-1:-1;;26267:253::o;39393:271::-;;26687:5;71390:12;26798:52;26843:6;26838:3;26831:4;26824:5;26820:16;26798:52;:::i;:::-;26862:16;;;;;39527:137;-1:-1;;39527:137::o;39671:410::-;;26687:5;71390:12;26798:52;26843:6;26838:3;26831:4;26824:5;26820:16;26798:52;:::i;:::-;26862:16;;;;25969:37;;;-1:-1;26831:4;40044:12;;39833:248;-1:-1;39833:248::o;40088:549::-;;26687:5;71390:12;26798:52;26843:6;26838:3;26831:4;26824:5;26820:16;26798:52;:::i;:::-;26862:16;;;;25969:37;;;-1:-1;26831:4;40489:12;;25969:37;40600:12;;;40278:359;-1:-1;40278:359::o;41204:1398::-;;-1:-1;;;30423:11;30416:41;26687:5;71390:12;26798:52;26843:6;30400:2;30480:3;30476:12;26831:4;26824:5;26820:16;26798:52;:::i;:::-;-1:-1;;;30400:2;26862:16;;;;;;38119:24;71390:12;;26798:52;71390:12;38162:11;;;26831:4;26820:16;;26798:52;:::i;:::-;-1:-1;;;38162:11;26862:16;;;;;;;35438:24;71390:12;;26798:52;71390:12;35481:11;;;26831:4;26820:16;;26798:52;:::i;:::-;26862:16;35481:11;26862:16;;41739:863;-1:-1;;;;;41739:863::o;42609:1398::-;;-1:-1;;;35789:11;35782:25;26687:5;71390:12;26798:52;26843:6;35767:1;35830:3;35826:11;26831:4;26824:5;26820:16;26798:52;:::i;:::-;-1:-1;;;35767:1;26862:16;;;;;;38119:24;71390:12;;26798:52;71390:12;38162:11;;;26831:4;26820:16;;26798:52;:::i;:::-;-1:-1;;;38162:11;26862:16;;;;;;;35438:24;71390:12;;26798:52;71390:12;35481:11;;;26831:4;26820:16;;26798:52;:::i;:::-;26862:16;35481:11;26862:16;;43144:863;-1:-1;;;;;43144:863::o;44014:222::-;-1:-1;;;;;74063:54;;;;24160:37;;44141:2;44126:18;;44112:124::o;44243:760::-;-1:-1;;;;;74063:54;;;24160:37;;74063:54;;;;44665:2;44650:18;;24160:37;73356:13;;73349:21;44742:2;44727:18;;25852:34;74382:4;74371:16;44821:2;44806:18;;39346:35;44904:3;44889:19;;25969:37;44988:3;44973:19;;25969:37;;;;44500:3;44485:19;;44471:532::o;45010:210::-;73356:13;;73349:21;25852:34;;45131:2;45116:18;;45102:118::o;45227:321::-;73356:13;;73349:21;25852:34;;45534:2;45519:18;;25969:37;45376:2;45361:18;;45347:201::o;45555:222::-;25969:37;;;45682:2;45667:18;;45653:124::o;45784:780::-;25969:37;;;-1:-1;;;;;74063:54;;;46216:2;46201:18;;24160:37;74063:54;;;;46299:2;46284:18;;24160:37;46382:2;46367:18;;25969:37;46465:3;46450:19;;25969:37;;;;46549:3;46534:19;;25969:37;46051:3;46036:19;;46022:542::o;46571:444::-;25969:37;;;46918:2;46903:18;;25969:37;;;;-1:-1;;;;;74063:54;47001:2;46986:18;;24160:37;46754:2;46739:18;;46725:290::o;47022:548::-;25969:37;;;74382:4;74371:16;;;;47390:2;47375:18;;39346:35;47473:2;47458:18;;25969:37;47556:2;47541:18;;25969:37;47229:3;47214:19;;47200:370::o;47577:306::-;;47722:2;47743:17;47736:47;47797:76;47722:2;47711:9;47707:18;47859:6;47797:76;:::i;47890:300::-;;48032:2;;48021:9;48017:18;48032:2;48053:17;48046:47;-1:-1;27030:5;27024:12;27064:1;;27053:9;27049:17;27077:1;27072:247;;;;27330:1;27325:400;;;;27042:683;;27072:247;27146:1;27131:17;;27150:4;27127:28;72181:19;;-1:-1;;27258:25;;72221:14;;;27246:38;27298:14;;;;-1:-1;27072:247;;27325:400;27394:1;27383:9;27379:17;72193:6;72188:3;72181:19;27502:37;27533:5;27502:37;:::i;:::-;-1:-1;27563:130;27577:6;27574:1;27571:13;27563:130;;;27636:14;;27623:11;;;72221:14;27623:11;27616:35;27670:15;;;;27592:12;;27563:130;;;27707:11;;72221:14;27707:11;;-1:-1;;;27042:683;-1:-1;48099:81;;48003:187;-1:-1;;;;;;;48003:187::o;48725:363::-;-1:-1;;;;;74063:54;;;27830:70;;74063:54;;49074:2;49059:18;;24160:37;48895:2;48880:18;;48866:222::o;49095:602::-;-1:-1;;;;;74063:54;;;27830:70;;74063:54;;;49517:2;49502:18;;24029:58;74063:54;;49600:2;49585:18;;24160:37;49683:2;49668:18;;25969:37;;;;49329:3;49314:19;;49300:397::o;49704:714::-;-1:-1;;;;;74063:54;;;27830:70;;74063:54;;;50154:2;50139:18;;24029:58;74063:54;;;;50237:2;50222:18;;24160:37;50320:2;50305:18;;25969:37;;;;50403:3;50388:19;;25969:37;;;;49966:3;49951:19;;49937:481::o;50425:898::-;;50759:3;50748:9;50744:19;-1:-1;;;;;74074:42;73166:5;74063:54;27837:3;27830:70;50947:2;74074:42;73166:5;74063:54;50947:2;50936:9;50932:18;24029:58;50759:3;50984:2;50973:9;50969:18;50962:48;51024:108;24553:5;71390:12;72193:6;72188:3;72181:19;72221:14;50748:9;72221:14;24565:93;;50947:2;24729:5;70922:14;24741:21;;-1:-1;24768:260;24793:6;24790:1;24787:13;24768:260;;;24854:13;;74063:54;;24160:37;;71921:14;;;;23740;;;;24815:1;24808:9;24768:260;;;-1:-1;;51170:20;;;51165:2;51150:18;;51143:48;71390:12;;72181:19;;;72221:14;;;;-1:-1;71390:12;-1:-1;70922:14;;;-1:-1;25497:260;25522:6;25519:1;25516:13;25497:260;;;25583:13;;25969:37;;23922:14;;;;71921;;;;24815:1;25537:9;25497:260;;;-1:-1;51197:116;;50730:593;-1:-1;;;;;;;;;50730:593::o;53409:462::-;-1:-1;;;;;74063:54;;;;27830:70;;-1:-1;;;;;73943:46;;;;53780:2;53765:18;;38711:50;73356:13;73349:21;53857:2;53842:18;;25852:34;53601:2;53586:18;;53572:299::o;53878:462::-;-1:-1;;;;;74063:54;;;;27830:70;;54249:2;54234:18;;25969:37;;;;73356:13;73349:21;54326:2;54311:18;;25852:34;54070:2;54055:18;;54041:299::o;55160:600::-;28679:58;;;55574:2;55559:18;;28679:58;;;;-1:-1;;;;;74269:30;55655:2;55640:18;;39231:36;55746:2;55731:18;;28679:58;55393:3;55378:19;;55364:396::o;56084:416::-;56284:2;56298:47;;;29695:2;56269:18;;;72181:19;29731:23;72221:14;;;29711:44;29774:12;;;56255:245::o;56507:416::-;56707:2;56721:47;;;30025:2;56692:18;;;72181:19;30061:32;72221:14;;;30041:53;30113:12;;;56678:245::o;56930:416::-;57130:2;57144:47;;;30727:2;57115:18;;;72181:19;30763:24;72221:14;;;30743:45;30807:12;;;57101:245::o;57353:416::-;57553:2;57567:47;;;31058:2;57538:18;;;72181:19;31094:28;72221:14;;;31074:49;31142:12;;;57524:245::o;57776:416::-;57976:2;57990:47;;;31393:2;57961:18;;;72181:19;31429:23;72221:14;;;31409:44;31472:12;;;57947:245::o;58199:416::-;58399:2;58413:47;;;31723:2;58384:18;;;72181:19;31759:24;72221:14;;;31739:45;31803:12;;;58370:245::o;58622:416::-;58822:2;58836:47;;;32054:2;58807:18;;;72181:19;32090:30;72221:14;;;32070:51;32140:12;;;58793:245::o;59045:416::-;59245:2;59259:47;;;32391:2;59230:18;;;72181:19;32427:26;72221:14;;;32407:47;32473:12;;;59216:245::o;59468:416::-;59668:2;59682:47;;;32724:2;59653:18;;;72181:19;32760:21;72221:14;;;32740:42;32801:12;;;59639:245::o;59891:416::-;60091:2;60105:47;;;33052:2;60076:18;;;72181:19;33088:26;72221:14;;;33068:47;33134:12;;;60062:245::o;60314:416::-;60514:2;60528:47;;;33385:2;60499:18;;;72181:19;33421:23;72221:14;;;33401:44;33464:12;;;60485:245::o;60737:416::-;60937:2;60951:47;;;33715:2;60922:18;;;72181:19;-1:-1;;;72221:14;;;33731:37;33787:12;;;60908:245::o;61160:416::-;61360:2;61374:47;;;34038:2;61345:18;;;72181:19;34074:27;72221:14;;;34054:48;34121:12;;;61331:245::o;61583:416::-;61783:2;61797:47;;;61768:18;;;72181:19;34408:34;72221:14;;;34388:55;34462:12;;;61754:245::o;62006:416::-;62206:2;62220:47;;;62191:18;;;72181:19;34749:34;72221:14;;;34729:55;34803:12;;;62177:245::o;62429:416::-;62629:2;62643:47;;;35054:2;62614:18;;;72181:19;35090:26;72221:14;;;35070:47;35136:12;;;62600:245::o;62852:416::-;63052:2;63066:47;;;36076:2;63037:18;;;72181:19;36112:22;72221:14;;;36092:43;36154:12;;;63023:245::o;63275:416::-;63475:2;63489:47;;;36405:2;63460:18;;;72181:19;36441:24;72221:14;;;36421:45;36485:12;;;63446:245::o;63698:416::-;63898:2;63912:47;;;36736:2;63883:18;;;72181:19;36772:26;72221:14;;;36752:47;36818:12;;;63869:245::o;64121:416::-;64321:2;64335:47;;;37069:2;64306:18;;;72181:19;37105:28;72221:14;;;37085:49;37153:12;;;64292:245::o;64544:416::-;64744:2;64758:47;;;37404:2;64729:18;;;72181:19;37440:26;72221:14;;;37420:47;37486:12;;;64715:245::o;64967:416::-;65167:2;65181:47;;;37737:2;65152:18;;;72181:19;37773:24;72221:14;;;37753:45;37817:12;;;65138:245::o;65390:416::-;65590:2;65604:47;;;38412:2;65575:18;;;72181:19;38448:26;72221:14;;;38428:47;38494:12;;;65561:245::o;65813:333::-;-1:-1;;;;;73943:46;;;38591:37;;73943:46;;66132:2;66117:18;;38591:37;65968:2;65953:18;;65939:207::o;66382:349::-;25969:37;;;66717:2;66702:18;;28679:58;66545:2;66530:18;;66516:215::o;67078:444::-;25969:37;;;67425:2;67410:18;;25969:37;;;;67508:2;67493:18;;25969:37;67261:2;67246:18;;67232:290::o;68088:436::-;-1:-1;;;;;74269:30;;;39231:36;;74269:30;;;;68427:2;68412:18;;39231:36;-1:-1;;;;;73943:46;;;68510:2;68495:18;;38591:37;68267:2;68252:18;;68238:286::o;68531:214::-;74382:4;74371:16;;;;39346:35;;68654:2;68639:18;;68625:120::o;68752:506::-;;;68887:11;68874:25;68938:48;;68962:8;68946:14;68942:29;68938:48;68918:18;68914:73;68904:2;;-1:-1;;68991:12;68904:2;69018:33;;69072:18;;;-1:-1;;;;;;69099:30;;69096:2;;;-1:-1;;69132:12;69096:2;68977:4;69160:13;;-1:-1;68946:14;69192:38;;;69182:49;;69179:2;;;69244:1;;69234:12;69265:256;69327:2;69321:9;69353:17;;;-1:-1;;;;;69413:34;;69449:22;;;69410:62;69407:2;;;69485:1;;69475:12;69407:2;69327;69494:22;69305:216;;-1:-1;69305:216::o;69528:304::-;;-1:-1;;;;;69679:6;69676:30;69673:2;;;-1:-1;;69709:12;69673:2;-1:-1;69754:4;69742:17;;;69807:15;;69610:222::o;70150:321::-;;-1:-1;;;;;70285:6;70282:30;70279:2;;;-1:-1;;70315:12;70279:2;-1:-1;77202:7;70369:17;-1:-1;;70365:33;70456:4;70446:15;;70216:255::o;71123:157::-;;71217:14;;;71259:4;71246:18;;;71176:104::o;76680:268::-;76745:1;76752:101;76766:6;76763:1;76760:13;76752:101;;;76833:11;;;76827:18;76814:11;;;76807:39;76788:2;76781:10;76752:101;;;76868:6;76865:1;76862:13;76859:2;;;-1:-1;;76745:1;76915:16;;76908:27;76729:219::o;77223:117::-;-1:-1;;;;;77310:5;74063:54;77285:5;77282:35;77272:2;;77331:1;;77321:12;77272:2;77266:74;:::o;77487:111::-;77568:5;73356:13;73349:21;77546:5;77543:32;77533:2;;77589:1;;77579:12;78319:117;-1:-1;;;;;78406:5;73943:46;78381:5;78378:35;78368:2;;78427:1;;78417:12;78567:113;74382:4;78650:5;74371:16;78627:5;78624:33;78614:2;;78671:1;;78661:12
Swarm Source
ipfs://7b83c3046d5b5cdea841391fbf5b44a623b5ba55a1561e673aabd513203b99ab
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.